<<

El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Antonio Carrillo Ledesma y Karla Ivonne González Rosas Facultad de Ciencias, UNAM http://academicos.fciencias.unam.mx/antoniocarrillo

Una copia de este trabajo se puede descargar de la página: https://sites.google.com/ciencias.unam.mx/acl/en-desarrollo

Con…namiento 2020-2021, Versión 1.0 1

1El presente trabajo está licenciado bajo un esquema Creative Commons Atribución CompartirIgual (CC-BY-SA) 4.0 Internacional. Los textos que compo- nen el presente trabajo se publican bajo formas de licenciamiento que permiten la copia, la redistribución y la realización de obras derivadas siempre y cuando éstas se distribuyan bajo las mismas licencias libres y se cite la fuente. ¡Copiaeste libro! ... Compartir no es delito. El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Índice

1 Introducción 7 1.1 Propietario y Libre ...... 7 1.1.1 Software Propietario ...... 8 1.1.2 Software Libre ...... 9 1.2 El Cómputo en las Carreras de Ciencias ...... 11 1.2.1 Algunos Cursos que Usan Cómputo ...... 14 1.3 Paquetes de Cómputo de Uso Común ...... 17 1.3.1 Sistemas Operativos ...... 21 1.3.2 Paquetes de Cálculo Numérico ...... 21 1.3.3 Paquetes de Cálculo Simbólico ...... 22 1.3.4 Paquetes Estadísticos ...... 23 1.3.5 Paquetes O…máticos ...... 24 1.3.6 Lenguajes de Programación y Entornos de Desarrollo . 24 1.3.7 Otros Programas de Cómputo ...... 24 1.4 Sobre los Ejemplos de este Trabajo ...... 25 1.5 Agradecimientos ...... 25

2 Sistemas Operativos 26 2.1 Windows ...... 43 2.2 y BSD ...... 49 2.3 Mac OS y macOS Big Sur 11 ...... 51 2.4 GNU/ ...... 53 2.5 Android ...... 62 2.6 Chromebook y Chrome OS ...... 65 2.7 Otros Sistemas Operativos ...... 68

3 Paquetes de Cálculo Numérico 73 3.1 MATLAB ...... 76 3.2 Octave ...... 77 3.3 FreeMat ...... 77 3.4 ...... 79 3.5 Julia ...... 80 3.6 Scipy ...... 82 3.7 Ventajas, Desventajas y Carencias ...... 83 3.8 Desde la Nube ...... 86

[email protected] 1 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

4 Paquetes de Cálculo Simbólico 88 4.1 Mathematica ...... 91 4.2 Maple ...... 95 4.3 ...... 97 4.4 Ventajas, Desventajas y Carencias ...... 99 4.5 Desde la Nube ...... 100

5 Paquetes Estadísticos 101 5.1 SPSS ...... 103 5.2 ...... 104 5.3 SAS ...... 104 5.4 Ventajas, Desventajas y Carencias ...... 106 5.5 Desde la Nube ...... 107

6 Paquetes O…máticos 108 6.1 Hojas de Cálculo ...... 109 6.2 Bases de Datos ...... 111 6.3 Herramientas de Presentación y Multimedia ...... 113 6.4 Procesamiento de Imágenes ...... 114 6.5 Procesamiento de Textos ...... 115 6.6 Desde la Nube ...... 117

7 Lenguajes de Programación 118 7.1 Conceptos Transversales ...... 127 7.2 Algo de Programación ...... 134 7.3 Introducción a los Paradigmas de Programación ...... 146 7.4 Errores de Redondeo y de Aritmética en la Programación .. 155 7.5 Trabajando con Punto Flotante ...... 166 7.6 Documentación Código Fuente ...... 175 7.6.1 Documentar en , C++ y ...... 176 7.6.2 Documentar en Python ...... 185

8 Entornos de Desarrollo y Herramientas de Programación 189 8.1 Java ...... 191 8.2 C y C++ ...... 199 8.3 Fortran ...... 206 8.4 Python ...... 211 8.5 Herramientas de Programación ...... 227 [email protected] 2 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

8.5.1 ¿Qué es eso de ASCII, ISO-8859-1 y UTF-8? ..... 233 8.5.2 Uso de Espacios o Tabuladores en Fuentes ...... 237 8.5.3 Comparar Contenido de Fuentes ...... 239 8.5.4 Astyle ...... 239 8.5.5 Compilación y la Optimización del Ejecutable ..... 241 8.5.6 Análisis de Rendimiento y Depuración ...... 246 8.5.7 Mejora del Rendimiento en Python ...... 250 8.5.8 ...... 256 8.5.9 Otras opciones ...... 274 8.6 Programando Desde la Nube ...... 276

9 Bases de Datos 280 9.1 Clasi…cación ...... 280 9.2 ¿Qué son las bases de datos SQL? ...... 282 9.2.1 Lenguaje de de…nición de datos (DDL) ...... 284 9.2.2 Lenguaje de manipulación de datos DML ...... 285 9.3 ¿Qué son las bases de datos NoSQL? ...... 294 9.3.1 SQL en comparación con NoSQL ...... 298 9.3.2 SQL en comparación con Terminología NoSQL ..... 300 9.4 Programando en Diferentes Manejadores de Bases de Datos .. 305 9.4.1 MySQL y MariaDB ...... 306 9.4.2 PostgreSQL ...... 309 9.4.3 SQLite ...... 312 9.4.4 MongoDB ...... 314 9.5 Programando desde la Web ...... 317 9.5.1 MySQL y MariaDB ...... 317 9.5.2 PostgreSQL ...... 318 9.5.3 SQLite ...... 319 9.5.4 MongoDB ...... 320

10 Otros Programas de Cómputo 323 10.1 Otros Programas Matemáticos ...... 323 10.2 Programas de Visualización y Gra…cación ...... 324 10.3 Navegadores Web ...... 326 10.4 Compresores y Descompresores de Archivos ...... 327 10.5 Virtualización ...... 329 10.6 Desde la Nube ...... 330

[email protected] 3 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

11 Seguridad, Privacidad y Vigilancia 331 11.1 Amenazas a la Ciberseguridad ...... 345 11.2 Recomendaciones de Ciberseguridad ...... 350 11.2.1 Contraseñas Robustas ...... 351 11.2.2 Encriptar Discos o Archivos ...... 353 11.2.3 Sistema Operativo ...... 357 11.2.4 Máquinas Virtuales ...... 360 11.2.5 Navegación Segura ...... 362 11.2.6 Banca en Línea Segura ...... 365 11.2.7 Uso Seguro de las Herramientas de la Nube ...... 366 11.2.8 Teléfonos Inteligentes y Tabletas ...... 367 11.2.9 Redes Sociales ...... 370 11.2.10 Videoconferencias ...... 375 11.2.11 Seguridad de la Red ...... 377 11.2.12 Ataques con Técnicas de Inteligencia Social ...... 382 11.3 Meltdown, Spectre y lo que se Acumule ...... 383 11.4 Distribuciones de Linux «Seguras y para Penetración» .... 390

12 Consideraciones y Comentarios Finales 398 12.1 Integración del Cómputo en las Carreras de Ciencias ..... 399 12.2 Ventajas, Desventajas y Carencias del Software Libre ..... 400 12.3 Comentarios Finales ...... 401

13 Apéndice A: Cómputo en Instituciones Educativas 404

14 Apéndice B: Software Libre y Propietario 408 14.1 Software Libre ...... 408 14.1.1 Tipos de Licencias ...... 411 14.2 Software Propietario ...... 418 14.3 Implicaciones Económico-Políticas del Software Libre ..... 419 14.4 Nuevas Licencias para Responder a Nuevas Necesidades .... 423 14.5 La Nube y el Código Abierto ...... 424

15 Apéndice C: El Sistema GNU/Linux 428 15.1 Sistema de Archivos y Estructura de Directorios ...... 433 15.2 Interfaz de Usuario ...... 444 15.2.1 Interfaz Grá…ca de Usuario ...... 445 15.2.2 Línea de Comandos y Órdenes ...... 449 [email protected] 4 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

15.3 Trabajando en Línea de Comandos ...... 456 15.4 Desde la Nube ...... 491

16 Apéndice D: Programación Orientada a Objetos Java vs Python495 16.1 Ejemplo de Clases Java vs Python ...... 495 16.2 Atributos de Objetos ...... 497 16.3 Métodos y Funciones ...... 508 16.4 Herencia y Polimor…smo ...... 509 16.5 Re‡exión ...... 518

17 Apéndice E: Máquinas Virtuales 523 17.1 Tipos de Máquinas Virtuales ...... 524 17.2 Técnicas de Virtualización ...... 525 17.3 Otras Formas de Virtualización ...... 526 17.4 Aplicaciones de las Máquinas Virtuales de Sistema ...... 528 17.5 Ventajas y Desventajas ...... 529 17.5.1 Ventajas ...... 530 17.5.2 Desventajas ...... 532 17.5.3 Consideraciones Técnicas y Legales de la Virtualización 533 17.6 Máquinas Virtuales en la Educación, Ciencias e Ingeniería .. 534 17.7 ¿Qué Necesito para Crear y Usar una Máquina Virtual? .... 536 17.8 ¿Cómo Funciona una Máquina Virtual? ...... 539 17.9 Aplicaciones y Paquetes Disponibles ...... 540 17.10Acceso a Datos Desde una Máquina Virtual ...... 546 17.11Desde la Nube ...... 547

18 Apéndice F: Creación, Uso y Optimización de Máquinas Vir- tuales Usando QEMU/KVM 550 18.1 Tipo de Virtualización Soportado por la Máquina Huésped .. 553 18.2 Salida Grá…ca de la Virtualización Usando VNC ...... 557 18.3 Usando un Sistema Operativo Live como una Máquina Virtual 559 18.4 Usando un Archivo ISO como una Máquina Virtual ...... 560 18.5 Creación de Máquinas Virtuales ...... 561 18.6 Uso de Virtualización Dentro de Otra Virtualización ...... 564 18.7 Manipulación del Estado de la Máquina Virtual ...... 565 18.8 Optimización de Imágenes ...... 565 18.8.1 Trabajar con una Imagen Virtual sin que se Altere .. 566 18.8.2 Aumento de Desempeño ...... 566 [email protected] 5 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

18.9 Uso de Máquinas Virtuales de VirtualBox en KVM/QEMU .. 570 18.10Conversión de Máquinas Virtuales a KVM/QEMU ...... 571 18.11Comunicación de las Máquinas Virtuales con el Sistema An- …trión e ...... 575 18.12Signi…cado de las Banderas de /proc/cpuinfo ...... 579

19 Bibliografía 585

[email protected] 6 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

1 Introducción

La Facultad de Ciencias de la Universidad Nacional Autónoma de México es una institución de educación superior que tiene como misión formar cientí…cos en las áreas de biología, física y matemáticas; realizar investigación y su difusión; hacer la divulgación que permita elevar sustancialmente la cultura cientí…ca del país; y propiciar la vinculación con los sectores de la sociedad. El Departamento de Matemáticas de la Facultad de Ciencias atiende a las carreras de Actuaría, Ciencias de la Computación, Matemáticas, Matemáti- cas Aplicadas y los cursos de Matemáticas de las demás carreras de la Fa- cultad (véase [1]), preparando alumnos que estudian, plantean, formulan y aplican modelos de contenido matemático, con el …n de proveer información para la planeación, previsión y la toma de decisiones, para resolver problemas Económicos, Sociales y de Ciencias e Ingenierías. Por lo anterior, un eje fundamental de desarrollo, es el que se re…ere a la formación en cómputo. Ante los retos que el vertiginoso y dinámico cambio enfrenta el mundo global en que vivimos, ante las exigencias de la sociedad de la información se requiere el manejo de las Tecnologías de la Información y de la Comunicación (TIC) por ello, el modelo educativo de cualquier ca- rrera universitaria y en particular las carreras en la Facultad de Ciencias de la UNAM, tiene la necesidad imperiosa de atender una formación computa- cional como parte integral de una formación omnilateral de los educandos; por ello, la Facultad de Ciencias cuenta, para lograr este objetivo, con asig- naturas que hacen uso de Laboratorios y Talleres de cómputo para ponerse al día en el manejo de esta importante herramienta. Los Laboratorios y Talleres de cómputo de los Edi…cios Tlahuizcalpan, Yelizcalli, Amoxcalli y en el Nuevo Edi…cio cuentan con el equipo y programas de cómputo que permiten estar a la vanguardia y que facilitan el trabajo académico en las materias que cursan los estudiantes.

1.1 Software Propietario y Libre Con el constante aumento de la comercialización de las computadoras y su relativo bajo costo, las computadoras se han convertido en un objeto om- nipresente, ya que estas se encuentran en las actividades cotidianas de mi- llones de usuarios, en formas tan diversas como teléfonos celulares, tabletas, computadoras portátiles y de escritorio, etc. Las computadoras por si solas no resuelven los problemas para los que [email protected] 7 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM los usuarios las compran. El Software — Sistema operativo y los programas de aplicaciones— son los que realmente generan las soluciones al interactuar uno o más paquetes informáticos con los datos del usuario. También, es común que al comprar una computadora, en el costo total, se integre el del sistema operativo, aplicaciones o…máticas y de antivirus, sean estos usados por el usuario o no; y en la mayoría de los casos no es posible solicitar que no sean incluidos en el costo de la computadora. Por otro lado, el Software comercial suele quedar obsoleto muy rápido, ya que constantemente se le agregan nuevas funcionalidades al mismo y estas en general son vendidas como versiones independientes de la adquirida original- mente. Esto obliga al usuario — si quiere hacer uso de ellas— a comprar las nuevas versiones del Software para satisfacer sus crecientes necesidades infor- máticas. Por lo anterior y dada la creciente complejidad de los paquetes de cómputo y el alto costo de desarrollo de aplicaciones innovadoras, en muchos casos, el costo total del Software que comúnmente los usuarios instalan — y que no necesariamente usan las capacidades avanzadas del programa, por las cuales el Software tiene un alto costo comercial— en su computadora, suele ser más caro que el propio equipo en el que se ejecutan.

1.1.1 Software Propietario En entornos comerciales, es posible por parte de la empresa, adquirir y man- tener actualizado el Software necesario para sus actividades comerciales, pues el costo del mismo se traslada al consumidor …nal del bien o servicio que la empresa proporcione. En entornos educativos, de instituciones sin …nes lu- crativos e incluso, el sector gubernamental, no se cuenta con los recursos necesarios para adquirir y mantener actualizado el Software necesario para todas y cada una de las aplicaciones usadas en las computadoras, ya que en general, las licencias de uso del Software propietario son asignadas en forma individual a cada computadora y no es fácilmente transferible a otra computadora. Dado que existe una gran demanda de programas de cómputo tanto de uso común como especializado por nuestras crecientes necesidades informáti- cas, y por la gran cantidad de recursos económicos involucrados, existe una gran cantidad de empresas que tratan de satisfacer dichas necesidades, para generar y comercializar, además de proveer la adecuada documentación y opciones de capacitación que permita a las empresas contratar recursos hu- manos capacitados. [email protected] 8 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Por otro lado, generalmente se deja la investigación y desarrollo de pro- ductos computacionales nuevos o innovadores a grandes empresas o Universi- dades — que cuenten con la infraestructura y el capital humano, que muchas veces es de alto riesgo— con la capacidad de analizar, diseñar y programar las herramientas que requieran para sus procesos de investigación, enseñanza o desarrollo. Existe hoy en día, una gran cantidad de paquetes y sistemas operativos comerciales de Software propietario (véase apéndice 14.2) que mediante un pago oneroso, permiten a los usuarios de los mismos ser productivos en todas y cada una de las ramas comerciales que involucra nuestra vida globalizada, pero el licenciamiento del uso de los programas comerciales es en extremo restrictivo en su uso y más en su distribución.

1.1.2 Software Libre El Software libre (véase apéndice 14.1) son programas de cómputo — el sis- tema operativo, paquetes de uso común y especializados— , desarrollados por usua-rios y para usuarios que, entre otras cosas, comparten el código fuente, el programa ejecutable y dan libertades para estudiar, adaptar y redistribuir a quien así lo requiera el programa y todos sus derivados. El Software libre es desarrollado por una creciente y pujante comunidad de programadores y usuarios que tratan de poner la mayor cantidad de pro- gramas a disposición de todos los interesados, tal que, le permitan al usuario promedio sacar el mayor provecho de la computadora que use.

¿Qué es el Software Libre? La de…nición exacta y sus diversas variantes se plasman en el apéndice 14, pero podemos entender el espíritu a través de los documentos de la fundación para el Software libre (véase [19], [20], [12], [13], [11] y [15]). El Software libre concierne a la libertad de los usuarios para ejecutar, copiar, distribuir, cambiar y mejorar el Software:

0. La libertad de usar el programa, con cualquier propósito.

1. La libertad de estudiar cómo funciona el programa y modi…carlo, adap- tándolo a tus necesidades.

2. La libertad de distribuir copias del programa, con lo cual puedes ayudar a tu prójimo. [email protected] 9 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

3. La libertad de mejorar el programa y hacer públicas esas mejoras a los demás, de modo que toda la comunidad se bene…cie.

La lista de proyectos de este tipo es realmente impresionante (véase [19], [18] y [16]). Algunos han conseguido un uso y alta calidad, por ejemplo el compilador GCC (véase [21]), el Kernel de Linux (véase [22]) y el sistema operativo GNU/Linux (véase [23]) y Android (véase [6]). Mientras que otros proyectos han caído en el olvido, pero en la gran mayoría, se tiene copia del código fuente que permitiría a quienes esten interesados en dicho proyecto, el poder revivirlo y en su caso ampliarlo. La característica más importante que aparece típicamente en un proyecto de este tipo, es que un conjunto de personas separadas a gran distancia, sean capaces, a través de la Web, de los e-mail y de foros, de aunar sus esfuerzos para crear, mejorar, distribuir un producto, de forma que todos ellos se bene…cian unos de otros. Evidentemente, la mayor parte del peso recae en los desarrolladores, pero también es necesaria una difusión para que los usuarios documenten, encuentren errores, hagan foros de discusión, etc.

¿Por qué se Interesan los Autores, Alumnos y Profesores Univer- sitarios, en el Software Libre? Porque bajo el Software libre subyace la idea de compartir conocimiento y favorecer la existencia de nuevas ideas; y ¿qué es investigar y enseñar sino crear conocimiento y procurar que los alumnos aprendan e incluso vayan más allá de lo aprendido? Se comparte la idea, que el espíritu del Software libre es similar al que debería reinar en las instituciones educativas. Concretando estas ideas, profesores e investigadores necesitan herramien- tas para la investigación y docencia, y estas deben de tener una calidad mínima y ser fácilmente distribuibles entre los alumnos. En muchos casos las compañías desarrolladoras y distribuidoras de programas de cómputo no han sabido ofrecer sus productos con la ‡exibilidad adecuada para las labores docentes o, en otros casos, los productos desarrollados no tienen la calidad esperada. El Software libre es aún joven, pese a las decenas de miles de proyectos actuales (véase [16] y [17]) — en los que se trabaja constantemente en mejo- la parte computacional de los algoritmos involucrados en el proyecto, haciendo y puliendo interfaces grá…cas, generando ayuda en línea así como la documentación necesaria para que usuarios noveles y avanzados usen la [email protected] 10 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM mayor cantidad de opciones programadas — existen muchas otras necesi- dades profesionales y de investigación que requieren el desarrollo innovador de programas de cómputo para automatizarlas y hacerlas e…cientes. Esto queda plasmado en las decenas de proyectos que a diario son registrados en las páginas especializadas en busca de difusión y apoyo para su proyecto (véase [16] y [17]). En los últimos años, muchos proyectos han pasado de ser simples pro- gramas en línea de comandos a complejas aplicaciones multiplataforma — se ejecutan en distintos sistemas operativos como son Windows, Linux, Unix, Mac OS, Android— con ambientes grá…cos multimedia que en muchos casos han superado a sus contrapartes comerciales — por ejemplo los navegadores Web— . Para muestra de este maravilloso avance, tomemos el proyecto del sistema operativo Android, que actualmente ejecuta en millones de equipos — como celulares, tabletas, electrodomésticos, etc.— y en los cuales se pueden descargar miles de aplicaciones y esta soportado por una gran cantidad de usuarios y empresas comerciales como e IBM. Este ha logrado des- plazar a muchos de sus competidores por sus múltiples bondades y bajo costo de desarrollo, al reusar miles de aplicaciones ya existentes que usan Software libre y permitir desarrollar otro tanto de aplicaciones bajo una plataforma que se ejecutará en los más diversos procesadores. Además, el uso de Software libre y su posibilidad de ampliarlo y/o es- pecializarlo según sea necesario, ha permitido crear de forma cada vez más rápida y con…able; y poner a disposición de un gran público programas de uso común, así como especializado que satisfagan las nuevas necesidades de los usuarios.

1.2 El Cómputo en las Carreras de Ciencias Existe una gran variedad de programas de cómputo que permite automatizar, la cada vez más creciente cantidad de tareas inherentes al desarrollo de las actividades profesionales y de investigación; y en particular en la Carrera de Actuaría, Ciencias de la Computación, Matemáticas, Matemáticas Aplicadas y los cursos de Matemáticas de las demás carreras de la Facultad. Es común que las grandes y pequeñas empresas compren programas de cómputo especializados — algunos con un alto costo comercial— para inver- tir lo menos posible en el desarrollo de herramientas computacionales que satisfagan sus necesidades. Donde es común que una empresa desarrolle más de una versión del programa, donde al menos una versión es libre y ge- [email protected] 11 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM neralmente usada como versión de desarrollo y prueba; y las demás versiones sean propietarias y sean comercializadas, dando como servicios adicionales el soporte y capacitación del mismo. La capacitación en el uso de dichos programas es cada vez más, delegada a las formadoras de recursos humanos, entre las que destacan las universidades. La capacitación de capital humano especializado en uno o más paquetes de cómputo, requiere por un lado el conocimiento teórico que sustente el funcionamiento del paquete y por otro lado contar con la plataforma com- putacional adecuada — Hardware y Software— para ejecutar dicho paquete. El creciente costo monetario de la licencia de uso de un paquete de cómputo — y no necesariamente incluye las versiones siguientes del mismo— implica un gasto no justi…cable para la gran mayoría de las universidades a nivel mundial. En las universidades, no se busca enseñar el uso de uno o más paquetes de cómputo per se, la enseñanza de herramientas de cómputo, es un proceso inherente a la adquisición de conocimiento de las diferentes materias que es necesario cursar para egresar de una carrera universitaria. Así, mediante el uso de uno o más paquetes similares de bajo o nulo costo se puede enseñar los conocimientos necesarios que le permitirán al educando conocer en poco tiempo las peculiaridades de los paquetes especializados y de alto costo usados en las empresas.

El Software libre tiene miles de proyectos actualmente activos (véase [16] y [17]), estos tratan de satisfacer la gran mayoría de las necesidades de los usuarios noveles y avanzados; y por el uso de dicho Software no es necesario pagar grandes cantidades de dinero. Además, todas las actualizaciones y nuevas versiones de los paquetes por lo general son puestas en la red para que se puedan descargar y ser usadas por cualquier usuario, sin recurrir a gastos onerosos. Esto queda de mani…esto en uno de los proyectos insignia del Software libre, como lo es el Kernel Linux (véase [22]), que en su versión 3.10 cuenta con más de quince millones de líneas de código y en la versión 4.12 cuenta con 24,170,860 líneas de código; que ha sido creado desde 1990 hasta la fecha por miles de programadores distribuidos por todo el mundo e intercomuni- cados casi exclusivamente por Internet. Este proyecto es la base de diversas distribuciones de sistemas operativos — entre ellos de Android, y Debian GNU/Linux entre otras cientos de distribuciones— que se ejecutan en aparatos tan heterogéneos como electrodomésticos, teléfonos celulares, [email protected] 12 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM tabletas, computadoras portátiles y de escritorio, así como en la mayoría de las supercomputadoras. Además, estos sistemas operativos se ejecuten en una gran gama de procesadores, tanto de última generación como en los ya clásicos 80386. Basándose en los proyectos de Software libre, existen diversas distribu- ciones de sistemas operativos como Debian GNU/Linux (véase [23]) que inte- gra más de cuarenta mil aplicaciones todas ellas de Software libre que permite ejecutar todos los programas de cómputo de uso común — dado que también soporta la virtualización (véase [48], [54], [47] y [46]), es posible ejecutar otros sistemas operativos como Windows dentro del propio sistema operativo de Software libre— . En el caso de Software comercial o propietario como MATLAB (véase [35]), SAS (véase [42]), SPSS (véase [43]), O¢ ce (véase [24]) entre otros, se ha invertido una gran cantidad de trabajo y recursos económicos para generar interfaces de usuario pulidas y perfectamente integradas, así como, una gran cantidad de ayuda y en algunos casos con un asistente vir- tual en el mismo paquete para que guíen al usuario en su uso. La docu- mentación integrada del paquete, se complementa con una gran cantidad de ayuda en línea, libros, artículos y páginas blancas — en algunos casos en más de 80 idiomas— que detallan como usar el Software para solucionar una gran gama de problemas de diversos grupos de usuarios, tanto usuarios ocasionales como especializados. En el caso de que el Software sea usado en ambientes universitarios, estos cuentan con guías, tutoriales o centros de entrenamiento que capacitan en cada uno de los tópicos necesarios para dominar el paquete hasta llegar a dominar las opciones avanzadas del mismo. En contraste, en el Software libre, es común que en muchos proyectos incipientes, la documentación, ayuda en línea e interfaz grá…ca es un aspecto poco logrado. En muchos casos, los entornos de trabajo (IDEs) son dejados a otros proyectos. De tal forma que los creadores — programadores— del paquete, se centren en el desarrollo computacional de la infraestructura base del paquete, delegando a otros, las partes que tienen que con el usuario …nal y la documentación del mismo. Por ejemplo el paquete de que se encarga de la visualización de grá…cas en y tres dimensiones es usado por decenas de paquetes en línea de comandos — por ejemplo Python, , C y C++— que cuando requieren hacer grá…cas se las solicitan a dicho paquete, de esta forma se reutiliza lo ya creado y se simpli…ca por mucho el desarrollo del paquete, permitiendo a los desarrolladores centrarse en las características que necesitan programar para innovar y satisfacer las crecientes necesidades [email protected] 13 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM de los usuarios. Por el incipiente desarrollo de las aplicaciones de Software libre que com- piten con el Software privativo o comercial al que estamos tan acostumbra- dos a usar — programas para cálculo numérico y simbólico, estadístico y de o…mática, entre otros, comúnmente usados para la enseñanza y resolución de problemas cientí…cos y técnicos— , al menos en un corto plazo, el Soft- ware libre parece no ser una opción viable de reemplazo. Pero ya son lo su…cientemente maduras para ser tomadas en cuenta, en un ambiente de tra- bajo multiplataforma cada vez más competitivo, en donde es necesario que el usuario — estudiante y eventual profesionista— tenga acceso a todos y cada uno de los paquetes de cómputo que se le muestran en clase, así como en las prácticas profesionales, que le permitan adquirir soltura y pericia en el uso de los mismos.

1.2.1 Algunos Cursos que Usan Cómputo En la Facultad de Ciencias, cada semestre, se imparten centenas de cursos — algunos compartidos por las distintas carreras y otros especí…cos de la ca- rreras de Actuaría, Ciencias de la Computación, Matemáticas, Matemáticas Aplicadas y los cursos de Mátemáticas de las demás carreras de la Facultad— y desde hace varios años, crece semestre a semestre el número de cursos1 que solicitan hacer uso de equipos de cómputo y tener acceso a múltiples versiones de paquetería especializada (véase apéndice 13), algunos de estos cursos son (véase [2]):

Cálculo Diferencial e Integral I  Geometría Analítica I  Problemas Socio-Económicos de México  Taller de Herramientas Computacionales  Cálculo Diferencial e Integral II  Geometría Analítica II  1 Los cursos solicitan, desde el uso de un equipo de cómputo y un proyector, hasta la asignación de una máquina por estudiante que tenga instalado múltiples programas especializados corriendo en más de un sistema operativo. [email protected] 14 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Matemáticas Financieras  Programación  Cálculo Diferencial e Integral III  Probabilidad I  Programación II  Manejo de Datos  Taller de Modelación I  Cálculo Diferencial e Integral IV  Finanzas I  Matemáticas Actuariales del Seguro de Personas I  Probabilidad II  Estadística I  Finanzas II  Investigación de Operaciones  Matemáticas Actuariales del Seguro de Personas II  Taller de Modelación II  Economía I  Estadística II  Matemáticas Actuariales del Seguro de Daños  Procesos Estocásticos  Sistemas Dinámicos no Lineales  Análisis Numérico  Demografía I  [email protected] 15 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Demografía Avanzada  Estadística III  Seguridad Social  Pensiones Privadas  Teoría del Riesgo  Administración de Riesgos  Almacenes y Minería de Datos  Administración de Riesgos Financieros  Análisis de Regresión  Análisis Multivariado  Bases de Datos  Ecuaciones Diferenciales Ordinarias  Ecuaciones Diferenciales Parciales  Carteras de Inversión  Demografía II  Econometría I  Econometría II  Estadística Bayesiana  Diseño de Experimentos  Fianzas  Inteligencia Arti…cial  Muestreo  Planeación Estratégica  [email protected] 16 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Modelos no Paramétricos y de Regresión  Productos Financieros Derivados I  Productos Financieros Derivados II  Optimización Numérica  Álgebra Matricial Numérica  Reaseguro  Redes de Computadoras  Seminario de Aplicaciones Actuariales  Seminario de Matemáticas Aplicadas  Seminario de Matemáticas Actuariales Aplicadas  Solución Numérica de Ecuaciones Diferenciales Ordinarias  Solución Numérica de Ecuaciones Diferenciales Parciales  Simulación Estocástica  Sistemas Dinámicos Discretos  Teoría de Grá…cas  Teoría de Juegos en Economía  Temas Selectos de Análisis Numérico  Valuación de Opciones  1.3 Paquetes de Cómputo de Uso Común Dada la diversidad de cursos y la gran cantidad de profesores y ayudantes de los mismos, el abanico de paquetes de cómputo solicitados es grande (véase apéndice 13), entre los que destacan (véase [2]):

Java JRE y JDK  [email protected] 17 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Code Blocks IDE  NetBeans IDE  DrJava IDE  IntelliJ IDEA  BlueJ IDE  SciTE  JetBrains IDE  SharpDevelop IDE  Alice  DFD  C IDE  Developer Studio-Fortran IDE   SDK  Compaq Visual Fortran  Microsoft O¢ ce  Libre O¢ ce  OpenO¢ ce  MathType  Scienti…c WorkPlace  Microsoft SQL Server  PostgreSQL  SPSS  [email protected] 18 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

PSPP  SAS  Vensim PLE  Statgraphics  GPower  EViews  Systat  Stata  Statistica  ITSM2000  R  Tinn-R  RStudio   MATLAB  Scilab  Octave  FreeMat  Maple  Mathematica  NetLogo  GeoGebra  Compresores y descompresores de archivos Winzip, WinRAR, 7-  [email protected] 19 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

SSH Secure File Transfer  PDFCreator  Adobe Reader  Navegadores de páginas Web: , , Mozilla,  Konquerror

Estos paquetes pueden ser clasi…cados de forma burda en:

Sistemas Operativos  Programas de Cálculo Numérico  Programas de Cálculo Simbólico  Programas de Estadística  Programas O…máticos  Lenguajes de Programación y Entornos de Desarrollo  Programación Desde la Nube  Otros Programas de Cómputo 

En el presente trabajo, nos centraremos en los rubros más usados, pero el tipo de programas usados, las plataformas de ejecución soportada y las diferentes versiones de un mismo paquete que solicitan los profesores y ayu- dantes, crecen constantemente, así mismo, su complejidad y en su caso, el costo monetario de las licencias de uso también se incrementa de manera onerosa.

[email protected] 20 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

1.3.1 Sistemas Operativos Los sistemas operativos son un conjunto de programas de cómputo que ges- tionan los recursos de Hardware y provee servicios a los programas de apli- caciones, ejecutándose en modo privilegiado respecto a los restantes. Entre los más usados tenemos:

Windows  Linux  Mac OS  Android  UNIX  Hay cientos de sistemas operativos y miles de distribuciones, pero los usuarios están más familiarizados con Windows para equipos de escritorio y en dispositivos móviles Android. En cualquier sistema operativo es posible ejecutar una gran variedad de paquetes de cómputo y más ahora con la vir- tualización, es posible ejecutar múltiples sistemas operativos y sus paquetes correspondientes simultáneamente en un mismo equipo de cómputo (véase apéndice 17).

1.3.2 Paquetes de Cálculo Numérico Los paquetes de cálculo numérico, son programas matemáticos que ofrecen un entorno de desarrollo integrado (IDE) con un lenguaje de programación propio. Entre sus prestaciones básicas se hallan:

Manejo de números reales y complejos  La manipulación de vectores y matrices tanto reales como complejas  Manejo de funciones elementales y especiales  Resolución de problemas de álgebra lineal  Resolución de ecuaciones no lineales  La representación de datos y funciones  [email protected] 21 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

La implementación de algoritmos  Integración de funciones  Máximos y mínimos de funciones  Manipulación de polinomios  Integración de ecuaciones diferenciales  Gra…cación de funciones en 2D y 3D  La comunicación con programas en otros lenguajes y con otros dispositivos  de Hardware

1.3.3 Paquetes de Cálculo Simbólico Los paquetes de cálculo Simbólico, son programas matemáticos que realizan manipulación algebraica y ofrecen un entorno de desarrollo integrado (IDE) con un lenguaje de programación propio. Entre sus prestaciones básicas se hallan:

Expresiones y funciones simbólicas  Simpli…car expresiones  Manejo de polinomios  Ecuaciones e inecuaciones  Evaluar una relación  Factorización  Resolver ecuaciones y sistemas de ecuaciones  Integrar y diferenciar expresiones  Matrices con parámetros  Computación matemática  Teoría de números  [email protected] 22 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Análisis de datos  Computación geométrica  Manipulación algebraica  1.3.4 Paquetes Estadísticos Los paquetes estadísticos, son programas matemáticos que ofrecen un entorno de desarrollo integrado (IDE) con un lenguaje de programación propio. Entre sus prestaciones básicas destacan:

Análisis de datos mediante operadores para cálculos sobre arreglos, matrices  y/o tablas

Tablas cruzadas  Reordenamiento de datos  Análisis de la varianza (ANOVA)  Frecuencias  Estadística descriptiva  Estadística lineal  Estadística no lineal  Bioestadística  Pruebas estadísticas clásicas  Análisis de serie de temporales  Modelos de regresión  Clasi…cación  Fiabilidad  Categorías  Clustering  [email protected] 23 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Validación de datos  Tendencias  Grá…cos y diagramas  1.3.5 Paquetes O…máticos En la actualidad, los llamados paquetes o…máticos, no son otra cosa que programas de cómputo integrado, que permiten automatizar múltiples ta- reas que permiten idear, crear, manipular, transmitir, almacenar información necesaria en una o…cina. Entre sus prestaciones básicas destacan:

Procesamiento de Textos — con formato enriquecido y notación cientí…ca—  Hojas de cálculo  Bases de datos  Herramientas de presentación y multimedia  1.3.6 Lenguajes de Programación y Entornos de Desarrollo

Lenguajes de programación  Entornos de desarrollo integrados y editores para programación  Depuradores  Formateadores de código  Manejadores de versiones  Generadores de documentación  1.3.7 Otros Programas de Cómputo Dentro del abanico de programas que son usados en las carreras de Actuaría, Ciencias de la Computación, Matemáticas, Matemáticas Aplicadas y los cur- sos de Matemáticas de las demás carreras de la Facultad, y que no tienen cabida en los rubros anteriores, destacan: [email protected] 24 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Otros programas matemáticos  Programas de visualización y gra…cación  Programas de navegación en la red  Compresores y descompresores de archivos  Virtualización  1.4 Sobre los Ejemplos de este Trabajo La documentación y los diferentes ejemplos que se presentan en este trabajo, se encuentran disponibles en la página Web: Herramientas, para que puedan ser copiados desde el navegador y ser usados en la terminal de línea de co- mandos. En aras de que el interesado pueda correr dichos ejemplos y a…anzar sus conocimientos, además de que puedan ser usados en diferentes ámbitos a los presentados aquí.

1.5 Agradecimientos Este proyecto fue posible gracias al apoyo recibido por la Facultad de Cien- cias de la Universidad Nacional Autónoma de México (UNAM) y al tiempo robado a nuestras actividades académicas, principalmente durante el período de con…namiento de los años 2020 y 2021.

[email protected] 25 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

2 Sistemas Operativos

Actualmente tenemos 3 grandes sistemas operativos en el mercado:

Windows  Unix  Linux  De los cuales, sus dignos representantes son: Windows 112, Mac Big Sur, iOS, Android, Chrome OS y GNU3/Linux con todas sus diferentes distribu- ciones4. Y sin temor a equivocarnos aseguramos que Android es la distribu- ción de Linux más polular sobre la tierra e iOS es el más popular de los UNIX.

¿Qué es un Sistema Operativo? El conjunto de programas informáticos que permiten la administración e…caz de los recursos de una computadora es conocido como sistema operativo o Software de sistema. Estos progra- mas comienzan a trabajar apenas se enciende el equipo, ya que gestionan el Hardware desde los niveles más básicos y permiten además la interacción con el usuario. Cabe destacar que los sistemas operativos no funcionan sólo en las computadoras. Por el contrario, este tipo de sistemas se encuentran en la mayoría de los dispositivos electrónicos que utilizan microprocesadores:

2 Windows 11 es el reemplazo de , disponible a partir 5 de octubre del 2021. 3 GNU -es un acrónimo recursivo de «GNU no es UNIX» - es un sistema operativo de Software libre, es decir, respeta la libertad de los usuarios. El sistema operativo GNU consiste en paquetes de GNU además de Software libre publicado por terceras partes. 4 Una distribución de Linux es un sistema operativo compuesto por el Kernel de Linux, herramientas GNU, Software adicional y un administrador de paquetes. También puede incluir un servidor de pantalla y un entorno de escritorio que se utilizarán como sistema operativo de escritorio normal. El término es distribución de Linux (o distribución en forma abreviada) porque una entidad como Debian o Ubuntu ’distribuye’ el Kernel de Linux junto con todo el Software y las utilidades necesarias (como administrador de red, administrador de paquetes, entornos de escritorio, etc.) para que pueda ser utilizado como sistema operativo. Sus distribuciones también asumen la responsabilidad de proporcionar actualizaciones para mantener el Kernel y otras utilidades. Entonces, Linux es el Kernel, mientras que la distribución de Linux es el sistema - tivo. Esta es la razón por la que también se les conoce como sistemas operativos basados en Linux. [email protected] 26 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM el Software de sistema posibilita que el dispositivo cumpla con sus funciones -por ejemplo, un teléfono móvil o un reproductor de DVD-. El sistema operativo cumple con cinco funciones básicas:

Proporciona la interfaz del usuario -grá…ca o de texto-  La administración de recursos  La administración de archivos  La administración de tareas  El servicio de soporte y utilidades  En cuanto a la interfaz del usuario, el sistema se encarga de que el usuario pueda ejecutar programas, acceder a archivos y realizar otras tareas con la computadora. La administración de recursos permite el control del Hardware, incluyendo los periféricos y la red. El Software de sistema también se encarga de la gestión de archivos, al controlar la creación, la eliminación y el acceso a los mismos, así también, de la administración de las tareas informáticas que ejecutan los usuarios …nales. Por último, podemos mencionar que el servicio de soporte se encarga de actualizar las versiones, mejorar la seguridad del sistema, agregar nuevas utilidades, controlar los nuevos periféricos que se agregan a la computadora y corregir los errores del Software.

Tipos de Sistemas Operativos en Función de la Administración de las Tareas Podemos distinguir dos clases de sistemas operativos en función de cómo administran sus tareas, pueden ser:

Sistemas Operativos Monotarea: son sistemas operativos que úni- camente cuentan con la capacidad para realizar una tarea al mismo tiempo. Son los sistemas más antiguos, que también llevan aparejados un CPU de menor capacidad. En estos casos, si el equipo está imprimiendo, no atenderá a las nuevas órdenes, ni será capaz de iniciar un nuevo proceso hasta que el anterior haya …nalizado.

[email protected] 27 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Sistemas Operativos Multitarea: son los sistemas operativos más modernos, con capacidad para el procesamiento de varias tareas al mismo tiempo. Cuentan con la capacidad para ejecutar varios procesos en uno o más procesadores, por lo que existe la posibilidad de que sean utilizados por varios usuarios al mismo tiempo, y podrían aceptar múltiples conexiones a través de sesiones remotas.

Tipos de Sistemas Operativos en Función de la Administración de los Usuarios También es posible realizar una división de los sistemas operativos en función de la forma en la que se administran los usuarios, como vemos a continuación:

Sistema de Administración Monousuario: sólo pueden gestionar un usuario al mismo tiempo. Así, a pesar de que varios usuarios pueden tener acceso al sistema, solo un usuario puede acceder para realizar y ejecutar operaciones y programas.

Sistemas de Administración Multiusuario: se re…ere a todos aque- llos sistemas operativos que permiten el empleo de sus procesamientos y ser- vicios al mismo tiempo. Así, el sistema operativo cuenta con la capacidad de satisfacer las necesidades de varios usuarios al mismo tiempo, siendo capaz de gestionar y compartir sus recursos en función del número de usuarios que estén conectados a la vez.

¿Qué Sistema Operativo Usar? ¿Mac o Microsoft? ¿Windows o Linux? ¿Android o iOS? Son preguntas frecuentes que todos nos hemos hecho alguna vez, y es que elegir un sistema operativo, una computadora o un dispositivo móvil no es tan simple. O al menos no lo era años atrás. En la actualidad las diferencias entre sistemas operativos de escritorio son cada vez menos, hasta el punto que prácticamente cualquier servicio Online es compatible con Windows, Mac y GNU/Linux y las principales …rmas de Software crean apli- caciones para las tres plataformas principales, salvo excepciones. Lo mismo empieza a ocurrir con el Hardware. Poco tendremos que decir del sistema operativo de Apple, Mac Big Sur o iOS (ambos son derivados de Darwin BSD que es un sistema operativo tipo UNIX), ya que son los sistemas operativos más bonitos y que mejores resultados han dado a todos los usuarios que los han probado. Mac Big Sur [email protected] 28 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM es un sistema pensado para los profesionales de los sectores que necesitan de un equipo de cómputo que sea capaz de todo, como los desarrolladores, programadores, diseñadores, periodistas, fotógrafos, músicos, DJ’sy muchos más empleos que se bene…cian de este sistema operativo. Después tenemos a Windows, un sistema operativo versátil pensado sobre todo para un uso doméstico, aunque eso no quita que muchas empresas uti- licen Windows en sus equipos de cómputo ya que es un sistema operativo que puede muy buenos resultados en este aspecto. Sin embargo, llegamos a Linux, el gran desconocido por muchos. Un sistema operativo mucho más versátil que Windows y que puede ser igual o más profesional que Mac Big Sur. Sin embargo, la ventaja que tienen estos dos sistemas operativos, es que vienen ya preparados y con…gurados para el tipo de mercado al que van dirigidos, pero GNU/Linux no. Esto es una ventaja y una desventaja al mismo tiempo, ya que si tenemos práctica, podemos hacer que el sistema operativo se adapte a nuestras necesi- dades sin problemas, pero si no tienes práctica, puede que sea demasiado lo que tienes que con…gurar.

Cuota de Mercado para los Sistemas Operativos Agosto es uno de los meses en los que miles de compañías analizan el trá…co que les llega de usuarios a sus páginas Web y desde que plataformas llegan, según un informe de International Data Corporation (https://www.idc.com) en el año 2021 tenemos:

En el segmento de los sistemas operativos de escritorio basados en Linux  ha subido su cuota de mercado llegando al 3%, esto no parecerá mucho, pero si nos …jamos bien, vemos que Mac Big Sur tiene un 7.5% -basado en Unix-, Chrome OS -usa el kernel de Linux- tiene 10.8% y Windows el resto.

En el segmento de teléfonos inteligentes () y tabletas basa-  das en Android -usa el Kernel de Linux- tiene 86 % , iOS tiene 13.9 % -basado en Unix- y menos del 1% el resto de los sistemas operativos.

En el segmento de servidores se estima que más del 60% de los servi-  dores a nivel mundial usan Linux, 1% usan Unix y el resto Windows. Es de destacar que en el servicio de servidores Azure de Windows, el sistema predominante es Linux. [email protected] 29 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

En el segmento de supercomputadoras, Linux tiene la cuota más im-  portante del mercado; es utilizado por los más poderosos 500 sistemas de supercómputo de alto desempeño del mundo5.

Hay que decir, que hoy en día y tal y como están las cosas, no existe un sistema operativo que sea de…nitivo. Así que la pregunta de si GNU/Linux6 es mejor que Windows o Mac Big Sur no tiene sentido, ya que cada sistema operativo tiene sus pros y sus contras. Pero la disyuntiva sigue ahí. ¿Debemos usar Windows en nuestro equipo de cómputo?, ¿nos conviene pasarnos a Linux?. Hay razones a favor y en contra para todos los gustos.

Número de Líneas del Código Fuente de un Sistema Operativo Pese a que existen múltiples variantes de cada sistema operativo, se han dado a conocer los números de líneas de código fuente que componen la vertiente más usada de algunos sistemas operativos:

Microsoft Windows 3.1 (Abril de 1992): 3 millones de líneas ($200 USD  en 1992)

Microsoft Windows 95 (Agosto de 1995): 15 millones de líneas (Home  $109.95 y Pro$ 209.95 USD en 1995)

Microsoft Windows NT 4.0 (Julio 1996): 12 millones de líneas (5 usuar-  $809, 10 usarios $1,129 USD en 1996)

Microsoft Windows 2000 (Febrero 2000): 29 millones de líneas (Pro  $319 USD en 2000)

5 Existe el Ranking de las 500 supercomputadoras más poderosas del mundo (esta se actualiza cada seis meses en junio y noviembre) y puede ser consultada en: https://top500.org La cuota de supercomputadoras con GNU/Linux ha sido de: 2012 (94%), 2013 (95%), 2014 (97%), 2015 (97.2%), 2016 (99.6%), 2017 (99.6%), 2018 (100%), 2019 (100%), 2020 (100%). 6 Los resultados de GNU/Linux son muy satisfactorios para los desarrolladores y partícipes de la comunidad Linux, pero todavía hace falta mucho por hacer para que tenga una cuota signi…cativa en el escritorio y esto sólo será posible si los distribuidores de equipo generan un esquema más agresivo para vender máquinas con Linux preinstalado. [email protected] 30 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Microsoft Windows XP (Octubre 2001): 45 millones de líneas (Home  $175 US y Pro $ 255 USD en 2001)

Microsoft Windows Vista (Enero 2007): 50 millones de líneas (Home  Premium $239.99 USD en 2007)

Microsoft Windows 7 (Octubre 2009): 40 millones de líneas (Home  Premium $199.99 USD en 2009)

Microsoft Windows 8 (Octubre 2012): 60 millones de líneas (Home  $119.99 US y Pro $ 199.99 USD en 2013)

Microsoft Windows 10 (Julio 2015): 60 millones de líneas sin Cortana  y 65 millones de líneas con Cortana ($139.99 USD en 2019)

Sun Solaris (Octubre de 1998) 7.5 millones de líneas  6.2 (Marzo de 2000): 17millones de líneas  Red Hat Linux 7.1 (Abril de 2001): 30 millones líneas  Red Hat Linux 8.0 (Septiembre de 2002): 50 millones de líneas  Fedora Core 4 (Mayo de 2005): 76 millones de líneas  Fedora 9 (Mayo del 2008): 205 millones de líneas  Debian GNU/Linux 3.0 "Woody" (Julio de 2002): 105,000,000 líneas  Debian GNU/Linux 3.1 "Sarge" (Junio de 2005); 229,500,000 líneas  Debian GNU/Linux 7 "Wheezy" (Mayo 2013): 419 millones de líneas  Debian GNU/Linux 10 "Buster" (Julio 2019): 1,077,110,982 líneas  Debian GNU/Linux 11 "Bullseye" (Agosto 2021): 1,152,960,944 líneas  Kernel Linux 0.01 (Septiembre 1991): 8,413 líneas  Kernel Linux 1.0 (Marzo 1994): 176,250 líneas  Kernel Linux 2.6 (Diciembre 2003): 5,475,685 líneas  Kernel Linux 4.12 (Julio 2017): 24 millones líneas  [email protected] 31 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Kernel Linux 5.8 (Agosto 2020): 28 millones líneas  Kernel Linux 5.14 (Julio 2021): 29.7 millones de líneas  El Kernel o Núcleo Es un componente fundamental de cualquier sistema operativo. Es el encargado de que el Software y el Hardware de cualquier equipo de cómputo puedan trabajar juntos en un mismo sistema, para lo cual administra la memoria de los programas y procesos ejecutados, el tiempo de procesador que utilizan los programas, o se encarga de permitir el acceso y el correcto funcionamiento de periféricos y otros elementos físicos del equipo.

Kernel de Linux el núcleo del sistema operativo Linux/Unix (llamado Kernel) es un programa escrito casi en su totalidad en lenguaje C, con ex- cepción de una parte del manejo de interrupciones, expresada en el lenguaje ensamblador del procesador en el que opera, el Kernel reside permanente- mente en memoria y alguna parte de él está ejecutándose en todo momento. Pero es muy común confundir al Kernel de Linux con una distribución como Debian u Ubuntu, Linux solo es un núcleo (hay otros como son FreeBSD, NetBSD y Hurd). Durante mucho tiempo el núcleo Linux solo funcionaba en la serie de máquinas de , desde el 386 en adelante. Sin embargo, hoy día esto ya no es cierto. El núcleo Linux se ha adaptado a una larga y creciente lista de arquitecturas. Siguiendo esos pasos, la distribución Debian GNU/Linux se ha adaptado a estas plataformas. En general este proceso tiene un comienzo difícil (hay que conseguir que la libc y el enlazador dinámico funcionen sin trabas), luego sigue un trabajo relativamente largo y rutinario, de conseguir recompilar todos los paquetes bajo las nuevas arquitecturas. Debian GNU/Linux es un sistema operativo, no un núcleo (en realidad es más que un SO, ya que incluye miles de aplicaciones). Para probar esta a…rmación, aun cuando la mayor parte de adaptaciones se hacen sobre nú- cleos Linux, también existen adaptaciones basadas en los núcleos FreeBSD, NetBSD y Hurd. Linux es multiprogramado, dispone de memoria virtual, gestión de memo- ria, conectividad en red y permite bibliotecas compartidas. Linux es mul- tiplataforma y es portable a cualquier arquitectura siempre y cuando esta disponga de una versión de GCC compatible. La parte de un sistema operativo que se ejecuta sin privilegios o en es- pacio de usuario es la biblioteca del lenguaje C, que provee el entorno de [email protected] 32 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM tiempo de ejecución, y una serie de programas o herramientas que permiten la administración y uso del núcleo y proveer servicios al resto de programas en espacio de usuario, formando junto con el núcleo el sistema operativo. En un sistema con núcleo monolítico como Linux la biblioteca de lenguaje C(libc) consiste en una abstracción de acceso al núcleo. Algunas bibliotecas como la biblioteca de GNU proveen funcionalidad adicional para facilitar la vida del programador y usuario o mejorar el rendimiento de los programas. En un sistema con micronúcleo la biblioteca de lenguaje C puede gestionar sistemas de archivos o controladores además del acceso al núcleo del sistema. A los sistemas operativos que llevan Linux se les llama de forma genérica distribuciones Linux. Estas consisten en una recopilación de software que in- cluyen el núcleo Linux y el resto de programas necesarios para completar un sistema operativo. Las distribuciones más comunes son de hecho distribu- ciones GNU/Linux o distribuciones Android. El hecho de que compartan núcleo no signi…ca que sean compatibles entre sí. Una aplicación hecha para GNU/Linux no es compatible con Android sin la labor adicional necesaria para que sea multiplataforma. Las distribuciones GNU/Linux usan Linux como núcleo junto con el en- torno de tiempo de ejecución del Proyecto GNU y una serie de programas y herramientas del mismo que garantizan un sistema funcional mínimo. La mayoría de distribuciones GNU/Linux incluye software adicional como en- tornos grá…cos o navegadores Web así como los programas necesarios para permitirse instalar a sí mismas. Los programas de instalación son aporta- dos por el desarrollador de la distribución. Se les conoce como gestores de paquetes. Los creadores de una distribución también se pueden encargar de añadir con…guraciones iniciales de los distintos programas incluidos en la distribución. Las distribuciones Android incluyen el núcleo Linux junto con el entorno de ejecución y herramientas del proyecto AOSP de Google. Cada fabricante de teléfonos dispone de su propia distribución de Android a la cual modi…ca, elimina o añade programas extra: interfaces grá…cas, tiendas de aplicaciones y clientes de correo electrónico son algunos ejemplos de programas suscepti- bles de ser añadidos, modi…cados o eliminados. Además de las distribuciones de los fabricantes de teléfonos existen grupos de programadores indepen- dientes que también desarrollan distribuciones de Android. LineageOS y Replicant son dos ejemplos de distribuciones Android independientes. Los usuarios de Linux/Unix estamos acostumbrados a hablar y oír hablar [email protected] 33 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM sobre su Kernel7, el cual puede actualizarse y manipularse en cualquier dis- tribución. Sin embargo, en un sistema operativo tan centrado en el usuario y la sencillez como Windows, su Kernel es un gran desconocido.

Kernel de Windows en la década de los noventa Microsoft estaba basando sus sistemas operativos en los Kernel Windows 9x, donde el código básico tenía muchas similitudes con MS-DOS. De hecho necesitaba recurrir a él para poder operar. Paralelamente, Microsoft también estaba desarrollando otra versión de su sistema dirigido a los servidores llamada Windows NT. Ambas versiones de Windows fueron desarrollándose por separado. Win- dows NT era más bien una jugada a largo plazo, una tecnología para ir desarrollando para los Windows del mañana, y en el año 2000 dieron un nuevo paso en esa dirección. A la versión 5.0 de NT la llamaron Windows 2000, y se convirtió en un interesante participante en el sector empresarial. Tras ver la buena acogida que tuvo, Microsoft decidió llevar NT al resto de usuarios para que ambas rami…caciones convergieran. Lo hicieron en oc- tubre del 2001 con la versión 5.1 de Windows NT, que llegó al mercado con el nombre de Windows XP. Por lo tanto, esta versión marcó un antes y un después no sólo por su gran impacto en el mercado, sino porque era el prin- cipio de la aventura del Kernel Windows NT en el mundo de los usuarios comunes. Desde ese día, todas las versiones de Windows han estado basadas en este Kernel con más de 20 años de edad. La versión 5.1.2600 fue Windows XP, la 6.0.6002 fue Windows Vista, y la 6.1.7601 Windows 7. Antes hubo otros Windows Server 2008 y 2003, y después llegaron las versiones de NT 6.2.9200 llamada Windows 8, la 6.3.9600 o Windows 8, la NT 10.0, también conocida como Windows 10 y y …nalmente Windows 11. La principal característica del Kernel de Windows NT es que es bastante modular, y está basada en dos capas principales, la de usuario y la de Kernel.

7 En el caso de los sistemas derivados de Unix y Linux el Kernel lo podemos encontrar en el directorio /boot/, este directorio incluye todos los ejecutables y archivos que son necesarios en el proceso de arranque del sistema y deben ser utilizados antes que el Kernel empiece a dar las órdenes de ejecución de los diferentes módulos del sistema, aquí también es donde reside el gestor de arranque. En algunas distribuciones al usar un gestor de volúmenes lógico (Logical Volume Ma- nager, LVM) se genera un esquema de particiones con el directorio boot en una partición aparte.

[email protected] 34 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

El sistema utiliza cada una para diferentes tipos de programa. Por ejemplo, las aplicaciones se ejecutan en el modo usuario, y los componentes principales del sistema operativo en el modo Kernel. Mientras, la mayoría de los Drivers suelen usar el modo Kernel, aunque con excepciones. Es por eso que se re…eren a él como Kernel híbrido, pero sobre todo también porque permite tener subsistemas en el espacio del usuario que se comunicaban con el Kernel a través de un mecanismo de intercomunicación de procesos IPC (Interprocess Communication). Cuando ejecutas una aplicación, está accede al modo usuario, donde Win- dows crea un proceso especí…co para la aplicación. Cada aplicación tiene su dirección virtual privada, ninguna puede alterar los datos que pertenecen a otra y tampoco acceder al espacio virtual del propio sistema operativo. Es por lo tanto el modo que menos privilegios otorga, incluso el acceso al Hardware está limitado, y para pedir los servicios del sistema las aplicaciones tienen que recurrir a la interfaz de programación de aplicaciones API (Application Programming Interface) de Windows. El modo núcleo en cambio es ese en el que el código que se ejecuta en él tiene acceso directo a todo el Hardware y toda la memoria del equipo. Aquí todo el código comparte un mismo espacio virtual, y puede incluso acceder a los espacios de dirección de todos los procesos del modo usuario. Esto es peligroso, ya que si un Driver en el modo Kernel modi…ca lo que no debe, podría afectar al funcionamiento de todo el sistema operativo. Este modo núcleo está formado por servicios Executive, como el contro- lador de Caché, el gestor de comunicación, gestor de E/S, las llamadas de procedimientos locales, o los gestores de energía y memoria entre otros. Estos a su vez están formados por varios módulos que realizan tareas especí…cas, controladores de núcleo, un núcleo y una capa de abstracción del Hardware HAL (Hardware Abstraction Layer).

Diferencias entre los Kernel de Linux y Windows La principal diferencia entre el Kernel de los sistemas operativos Windows y el de Linux está en su …losofía. El desarrollado por el equipo de es de código abierto y cualquiera puede usarlo y modi…carlo, algo que le sirve para estar presente en múltiples sistemas operativos o distribuciones GNU/Linux. El Kernel de Microsoft8 en cambio es bastante más cerrado, y está hecho por

8 Para conocer la información del Kernel de Windows usando la línea de comandos podemos utilizar el siguiente comando en un cmd : [email protected] 35 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM y para el sistema operativo Windows. En esencia, en Linux adoptaron los principios de modularidad de Unix y decidieron abrir el código y las discusiones técnicas. Gracias a ello, Linux ha creado una comunidad meritocrática de desarrolladores, una en la que todos pueden colaborar y en la que cada cambio que se sugiere se debate con dureza para desechar las peores ideas y quedarse con las mejores. También se halaga a quienes consiguen mejorar las funcionalidades más veteranas. Mientras, en Windows no funciona así, los responsables del Kernel no ven con buenos ojos que se hagan propuestas que se desvíen del plan de trabajo, y asegura que hay pocos incentivos para mejorar las funcionalidades existentes que no sean prioritarias. Esto hace, a ojos de ese antiguo desarrollador, que al dársele mayor im- portancia a cumplir planes que a aceptar cambios que mejoren la calidad del producto, o al no tener tantos programadores sin experiencia, el Kernel de Windows NT siempre esté un paso por detrás en estabilidad y funcionali- dades. A nivel técnico existen similitudes entre ambos. Los dos núcleos controlan el Software del sistema de bajo nivel y las interacciones con el Hardware del ordenador a través de la capa de abstracción de Hardware (HAL). El HAL es un elemento del sistema que funciona como interfaz entre Software y Hardware, y como las API, permite que las aplicaciones sean independientes del Hardware. Los dos están escritos principalmente en C, y son capaces de manejar el almacenamiento en Caché, los controladores de dispositivos, la memoria virtual, los sistemas de archivos, los protocolos de red y las llamadas de sistema. En esencia sus funcionalidades son las mismas, aunque la manera de llevarlas a cabo es diferente. Así como el Kernel de Windows tiene dos modos, y por lo tanto se le considera híbrido, la gran diferencia es que el de Linux sólo tiene una capa,

systeminfo …ndstr /B /C:"OS Name" /C:"OS Version" j Y en :

Get-CimInstance Win32_OperatingSystem Select-Object Caption, CS- DVersion, ServicePackMajorVersion, BuildNumberj FL j o

[System.Environment]::OSVersion.Version [email protected] 36 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM o sea que es un núcleo monolítico. Eso sí, pese a ser más sencillo en este as- pecto, para funcionar correctamente tiene su núcleo dividido en tres subcapas diferentes. Ambos gestionan los problemas de memoria de forma parecida. Tienen sistemas de "Swapping" para mover un proceso o parte de él temporalmente de la memoria principal a una secundaria de almacenamiento en el caso de que en la principal haya poco espacio. Windows lo hace en los …cheros Page…le.sys y Swap…le.sys, mientras que Linux lo suele hacer en una partición, aunque también lo puede hacer en uno o varios …cheros o deshabilitarlo. Por lo tanto, podemos decir que la principal diferencia entre ambos es la manera en que se desarrolla cada uno. Además, el Kernel de Linux es mucho más sencillo, lo cual es bueno para los desarrolladores. Mientras, el de Windows intenta poner una capa de protección en su modo usuario para que los usuarios con menos conocimientos tienen menos posibilidades de dañar el sistema, y su estructura lo hace más estable frente, por ejemplo a fallos del Driver grá…co. Pero todo esto ya está cambiando, en las últimas versiones de Windows 10, Microsoft está integrando el Kernel de Linux a su propio Kernel y esto ha permitido usar Linux dentro de Windows 10 de forma nativa gracias al llamado Windows Subsystem for Linux (WSL, WSL2 WSLg), lo cual ha permitido mejorar la estabilidad y desempeño de Windows.

Kernel de Android Durante la última conferencia de Linux Plumbers 2021, Google dio a conocer sobre el éxito de la iniciativa de mover la plataforma Android para usar un Kernel normal de Linux en lugar de usar su propia ver- sión del Kernel, que incluye cambios especí…cos para la plataforma Android. Google menciona que dicho cambio de desarrollo es debido a la decisión de pasar después del año 2023 al modelo «Upstream First» , que implica el de- sarrollo de todas las funciones nuevas del Kernel requeridas en la plataforma Android directamente en el Kernel principal de Linux y no en sus ramas se- paradas (la funcionalidad será primero se promocionará al Kernel principal y luego se usará en Android, y no al revés). Para 2023 y 2024, también se planea transferir al núcleo principal de todos los parches adicionales que quedan en la rama del Kernel común de Android. En cuanto a un futuro próximo, para la plataforma prevista para principios de octubre, se ofrecerán compilaciones del Kernel «Generic Kernel Image» (GKI), lo más parecido posible al Kernel 5.10 habitual. [email protected] 37 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Para estas compilaciones se proporcionará un lanzamiento regular de ac- tualizaciones, que se colocarán en el repositorio ci.android.com. En el Kernel de GKI, las adiciones especí…cas de Android, así como los controladores rela- cionados con el Hardware de los fabricantes de equipos originales, se mueven a módulos de Kernel separados. Esta nueva interfaz, conocida como Kernel Module Kjos, garantizará que la principal diferencia entre la imagen genérica del Kernel de Android (GKI) y la línea principal de Linux, sean solo los ganchos para todos los módulos especí…cos del proveedor. Estos módulos no están vinculados a la versión principal del Kernel y se pueden desarrollar por separado, lo que simpli…ca enormemente el mante- nimiento y la transferencia de dispositivos a nuevas ramas del Kernel. Las interfaces necesarias para los fabricantes de dispositivos se implementan en forma de ganchos que le permiten cambiar el comportamiento del Kernel sin realizar cambios en el código. En total, el Kernel Android 12-5.10 ofrece 194 ganchos comunes, similares a los puntos de seguimiento, y 107 ganchos especializados que le permiten ejecutar controladores en un contexto no atómico. En el Kernel de GKI, los fabricantes de Hardware tienen prohibido aplicar parches especí…cos al Kernel principal, y los proveedores deben suministrar los componentes para el Hardware de soporte solo en forma de módulos de Kernel adicionales, en los que se debe garantizar la compatibilidad con el Kernel principal. Debemos recordar que la plataforma Android desarrolla su propia rama del Kernel: el «Android Common Kernel» , sobre la base del cual se forman las compilaciones especí…cas separadas para cada dispositivo. Con lo cual, a partir de cada rama de Android, se proporciona a los fabricantes múltiples diseños de Kernel para sus dispositivos. Por ejemplo, ofreció una opción de tres núcleos base a la vez: 4.14, 4.19 y 5.4, y para Android 12, se ofrecerán los núcleos base 4.19, 5.4 y 5.10. La variante 5.10 está diseñada como una imagen de Kernel genérica, en la que las capacidades necesarias para los OEM se trans…eren al ‡ujo ascendente, se mueven a módulos o se trans…eren al Kernel común de Android. Antes de la llegada de GKI, el Kernel de Android pasó por varias etapas de preparación:

La primera de ellas era sobre la base de los principales Kernels LTS  (3.18, 4.4, 4.9, 4.14, 4.19, 5.4) y de los cuales se creó una bifurcación del «Android Common Kernel» , al que se transferían parches especí…cos [email protected] 38 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

para Android (anteriormente, se alcanzaba el tamaño de los cambios varios millones de líneas).

Después de ello sobre «Android Common Kernel» , los fabricantes de  chips como , Samsung y MediaTek forman el SoC Kernel, que incluye complementos para admitir Hardware.

Finalmente en el «Kernel de SoC» , los fabricantes de dispositivos crean  el «Kernel de dispositivo» , incluidos los cambios relacionados con la compatibilidad con equipos adicionales, pantallas, cámaras, sistemas de sonido, etc.

Este enfoque complicó signi…cativamente la entrega de actualizaciones con la eliminación de vulnerabilidades y la transición a nuevas ramas del Kernel. Si bien Google publica regularmente actualizaciones para su núcleo común de Android, los proveedores a menudo tardan en enviar estas actualizaciones o usan un solo Kernel durante todo el ciclo de vida del dispositivo, generando una alta fragmentación en el ecosistema Android, una obsolescencia antici- pada y en el peor de los casos brechas de seguridad.

Otros Kernels GNU/Linux Actualmente existen una gran cantidad de distribuciones de GNU/Linux que vienen muy optimizadas intentando con- seguir la mejor desenvoltura de su arquitectura y con…guraciones de serie. En el caso de la con…guración por omisión de Debian GNU/Linux y Ubuntu, están pensadas para que sean lo más robusta posible y que se use en to- das las circunstancias imaginables, por ello están optimizadas de forma muy conservadora para tener un equilibrio entre e…ciencia y consumo de energía. Pero es posible agregar uno o más Kernels GNU/Linux generados por ter- ceros que contenga las optimizaciones necesarias para hacer más e…ciente y competitivo en cuestiones de gestión y ahorro de recursos del sistema. Hay varias opciones del Kernel GNU/Linux optimizado (Liquorix viene optimizado para multimedia y Juegos, por otro lado XanMod tiene uno para propósito general, otro aplicaciones críticas en tiempo real y otro más para cálculos intensivos) de las últimas versiones estable del Kernel. Estos se pueden instalar9 mediante el uso de los comandos o (después de

9 Para ver las opciones de optimización del Kernel y como instalarlo ver la página Web de cada proyecto: Liquorix, XanMod, Linux-Libre. [email protected] 39 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM agregarlo a nuestro repositorio /etc/apt/sources.list.d/ ), de esta forma siem- pre podremos tener la última versión del Kernel junto con la actualización básica de nuestro sistema GNU/Linux. Además, sí instalamos cualquiera de los distintos Kernels, siempre podemos seleccionar alguno de los instalados al momento de arrancar nuestro equipo para usarlo deacuerdo a las actividades requeridas en ese momento. Y en caso necesario, es fácil su desinstalación y continuar usando el Kernel que teníamos por defecto. Por otro lado, existe una versión completamente libre del Kernel de GNU/Linux (Linux-Libre) el cual es un Kernel despojado de elementos de Firmware y controladores que contienen componentes no libres o fragmentos de código cuyo alcance está limitado por el fabricante. Linux-libre es el núcleo recomendado por la Foundation y una pieza principal de las distribuciones GNU totalmente libres de frag- mentos privativos o Firmwares incluidos en Linux sirven para inicializar los dispositivos o aplicarles parches que solventan fallas del Hardware que no pudieron ser corregidas antes de ser puestos a disposición de los usuarios. Además, Linux-libre deshabilita las funciones del Kernel para cargar com- ponentes no libres que no forman parte del suministro del Kernel y elimina la mención del uso de componentes no libres de la documentación. El Kernel de Linux-libre se utiliza en distribuciones como Dragora Linux, , Dyne, Bolic, gNewSense, Parabola, Musix y Kongoni.

Estabilidad del Kernel La estabilidad de un núcleo no es tan difícil. El Kernel de Unix de Mac o el Kernel de Linux están diseñados de manera diferente pero resuelven el mismo problema. El sistema operativo Windows es igualmente robusto. Eso es evidente. Pero la estabilidad real del día a día depende de otros factores. Particu- larmente en los controladores que conectan el sistema operativo al Hardware. Aquí es donde surgen las diferencias. Apple tiene el momento más fácil, porque solo admiten un pequeño con- junto de Hardware seleccionado. Eso facilita su trabajo, el objetivo es pe- queño. Apple ocasionalmente estropea esto, pero en su mayor parte, OS X ofrece una notable estabilidad diaria para las aplicaciones de escritorio. Windows tiene un trabajo mucho más difícil. El sistema operativo ad- mite una gama simplemente gigantesca de Hardware, y los fabricantes de Hardware hacen todo lo posible para proporcionar controladores de alta cal- [email protected] 40 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM idad. Este es el valor real de Windows, como paquete de controladores, es prácticamente imbatible. Linux también intenta admitir una gran variedad de Hardware. Pero muchos fabricantes de Hardware son absolutamente indiferentes a la com- patibilidad con Linux. Por lo tanto, el soporte de Hardware en Linux es mucho más impredecible. Si está ejecutando un servidor en Linux y el sis- tema solo se comunica con un disco duro y un adaptador de red, es probable que tenga una estabilidad impecable que supere la industria. Pero, si instala Linux en una computadora portátil y espera que funcione con la función de reposo / activación, la GPU, la tarjeta de sonido y un montón de extravagantes periféricos, entonces podría alejarse del rango de la estabilidad. Hay algunos controladores de código abierto, pero estos son signi…cativamente peores que las versiones de los fabricantes. Por ejemplo, una GPU puede ser 4 o 5 veces más lenta. Como usuario de escritorio de Linux, es probable que también instale apli- caciones que hacen cosas interesantes, de diversos proveedores, que pueden no estar del todo de acuerdo con las mejores prácticas.

Las Vulnerabilidades y Exposiciones Comunes El mundo está cada vez más interconectado y, como resultado de esto, la exposición a las vulne- rabilidades de seguridad también ha aumentado dramáticamente. Las com- plejidades de mantener las plataformas de cómputo actuales hacen que sea muy difícil para los desarrolladores cubrir cada punto de entrada potencial. En 2019 hubo un promedio de más de 45 vulnerabilidades y exposiciones comunes registradas por día y estas siguen en aumento año con año. Las vulnerabilidades y exposiciones comunes (Common Vulnerabilities and Exposures, CVE https://cve.mitre.org) que tienen los distintos sistemas operativos, es una lista de información registrada sobre vulnerabilidades de seguridad conocidas, en la que cada referencia tiene un número de identi- …cación CVE-ID, descripción de la vulnerabilidad, que versiones del Soft- ware están afectadas, posible solución al fallo (si existe) o como con…gu- rar para mitigar la vulnerabilidad y referencias a publicaciones o entradas de foros o Blogs donde se ha hecho pública la vulnerabilidad o se demues- tra su explotación. Además suele también mostrarse un enlace directo a la información de la base de datos de vulnerabilidades (https://nvd.nist.gov, https://openssf.org y https://docs.aws.amazon.com/security), en la que pue- den conseguirse más detalles de la vulnerabilidad y su valoración. [email protected] 41 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

El CVE-ID ofrece una nomenclatura estándar para identi…cación de la vulnerabilidad de forma inequívoca que es usada en la mayoría de repositorios de vulnerabilidades. Es de…nido y es mantenido por The MITRE Corporation (por eso a veces a la lista se la conoce por el nombre MITRE CVE List) con fondos de la National Cyber Security Division del gobierno de los Estados Unidos de América. Forma parte del llamado Security Content Automation Protocol.

Mitos en torno a Linux/Unix Hay varios mitos en torno a Linux/Unix y al Software libre, a saber:

Linux/Unix se puede usar para revivir un equipo de cómputo viejo.  La realidad es que si bien, hay múltiples distribuciones de Linux/Unix que corren en una gran cantidad de procesadores antiguos y actuales, los Drivers necesarios para reconocer periféricos como tarjetas grá…cas, de red alámbrica e inalámbrica, entre muchos otros, no tienen soporte en Linux/Unix, lo cual hará imposible su uso en Linux/Unix. Esto es cierto en cualquier computadora no importa de cuál generación es el equipo de cómputo. La verdad de todo esto, es que los fabricantes están enfocados en producir Hardware y Drivers que corran en los sistemas operativos con mayor cuota de mercado y por el momento Linux/Unix en equipos personales no son de ellos.

La compatibilidad del Hardware depende en gran medida de la versión  de Kernel de GNU/Linux instalado, es de esperarse que en versiones anteriores del Kernel cierto Hardware no se pueda detectar, pero lo contrario también pasa, hay Drivers que solo corren correctamente en versiones anteriores del Kernel y no en las últimas versiones, lo que oca- siona que muchos usuarios se desesperen al tratar de usar sus equipos con GNU/Linux. Y en caso de logar que funcione el Hardware, se fuerza a los usuarios a usar una determinada versión del Kernel (y todas las aplicaciones de la distribución) no actualizable, por la imposibilidad de hacer funcionar el Hardware del equipo en una más moderna con la consiguiente obsolescencia del Software instalado en el equipo.

Si tengo un Software ahora y quiero ejecutarlo dentro de cinco o diez  años en el futuro ¿Por qué no debería ser capaz de hacerlo? Parte de la belleza del Open es que el código fuente está disponible, [email protected] 42 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

por lo que es más fácil mantener operativo el Software, de modo que no deje de funcionar cuando alguien deja de mantenerlo. Excepto que mantener el Software en Linux/Unix se está convirtiendo en un desafío tan grande que daría igual que fuese privativo. Porque sería complicado hacerlo funcionar en un tiempo razonable, incluso siendo desarrollador, podría costar mucho trabajo y es posible dejar algo sin funcionar en el camino.

La retrocompatibilidad10 es un enorme dolor de cabeza, tomar Software  hecho para Linux/Unix de hace 10 o 5 años y ejecutarlo en una dis- tribución moderna. Cualquier cosa de mínima complejidad o que use una GUI, simplemente no funciona. Mientras la retrocompatibilidad en Windows es simplemente increíble. En Linux/Unix somos depen- dientes de los repositorios en línea, y cuando una aplicación depende de ciertas librerías que empiezan a desaparecer de esos repositorios, nos encontramos en una pesadilla. Y mientras más viejo el Software, peor.

2.1 Windows Microsoft Windows (véase [3]), conocido generalmente como Windows o MS Windows es el nombre de una familia de Software propietario (véase apéndice 14.2) de distribuciones de Software para PC, -que perdió cuota de mercado con Android hasta desaparecer-, servidores y sistemas empo- trados, desarrollados y vendidos por Microsoft y disponibles para múltiples arquitecturas, tales como x86, x86-64 y ARM. Desde un punto de vista técnico, no son sistemas operativos, sino que contienen uno (tradicionalmente MS-DOS, o el más actual, cuyo núcleo es Windows NT) junto con una amplia variedad de Software; no obstante, es usual (aunque no necesariamente correcto) denominar al conjunto como sis- tema operativo en lugar de distribución. La versión más reciente de Windows es Windows 11 para equipos person- ales (que se ofrece como actualización gratuita para los equipos con licencia válida de Windows 10 que cumplan con los requisitos mínimos de Hardware exigidos), Windows Server 2022 para servidores.

10 Siempre estamos en posibilidad de usar una Máquina Virtual que nos permite usar un programa desarrollado hace años o décadas en su entorno original, corriendo en un equipo moderno con un sistema operativo de última generación con todas las actualizaciones de seguridad pertinentes. [email protected] 43 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Windows 11 tiene al menos siete ediciones con diferente conjunto de car- acterísticas y Hardware previsto, algunas de ellas son: Home, Pro, Pro Edu- cation, Pro for Workstations, Enterprise, Education, Mixed Reality. Además habrá un modo S para la versión Home muy parecido al insustancial y limi- tado de Windows 10 S. Windows 11 también se puede descargar como una imagen ISO para in- stalaciones nuevas, ejecución en máquinas virtuales, además de ser la versión de referencia que los fabricantes OEM que usarán para preinstalaciones en equipos nuevos. Por su parte, Windows 10 tiene al menos doce ediciones con diferente con- junto de características y Hardware previsto, algunas de ellas son: Home, Pro, Enterprise, Enterprise LTBS/LTSC, Education, Mobile, S, Pro for Worksta- tion, Team, Pro Education, loT (Embedded), N y KN. Se espera que se cuente con soporte y actualizaciones hasta el 2025. Todas las ediciones mencionadas tienen la capacidad de utilizar los pa- quetes de idiomas, lo que permite múltiples idiomas de interfaz de usuario. A pesar de la múltiple cantidad de ediciones, solamente Windows Home y Pro están orientadas para el común de los usuarios y vienen instaladas en equipos nuevos. Las demás ediciones se adquieren mediante otros tipos de compra. Por su parte, Windows 10 llegó de forma o…cial y gratuita a usuarios con licencia genuina de Windows 7, Windows 8.1 y Windows 8 así como a Insiders, siendo la primera versión que buscaba la uni…cación de dispositivos (escritorio, portátiles, teléfonos inteligentes, tabletas y videoconsolas) bajo una experiencia común, con lo que se esperaba eliminar algunos problemas que se presentaron con Windows 8.1. Además está Windows PE que es un pequeño sistema operativo usado para instalar, desplegar y reparar Windows 10 en todas sus versiones de escritorio, servidor y para otras ediciones de Windows. En concreto, podemos preparar el disco antes de la instalación, instalar Windows con apps desde un disco local o una red, instalar imágenes de Windows, hacer modi…caciones en Windows sin iniciar sesión, recuperar datos perdidos y un largo etcétera.

Seguridad Una de las principales críticas que reciben los sistemas opera- tivos Windows es la debilidad del sistema en lo que a seguridad se re…ere y el alto índice de vulnerabilidades críticas. El propio Bill Gates, fundador de Microsoft, ha asegurado en repetidas ocasiones que la seguridad es objetivo [email protected] 44 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM primordial para su empresa. Partiendo de que no existe un sistema completamente libre de errores, las críticas se centran en la lentitud con la que la empresa reacciona ante un problema de seguridad que pueden llegar a meses o incluso años de diferencia desde que se avisa de la vulnerabilidad hasta que se publica la actualización que corrija dicha vulnerabilidad (parche). En algunos casos la falta de res- puesta por parte de Microsoft ha provocado que se desarrollen parches que arreglan problemas de seguridad hechos por terceros. Uno de los pilares en que se basa la seguridad de los productos Windows es la seguridad por ocultación, en general, un aspecto característico del Software propietario que sin embargo parece ser uno de los responsables de la debilidad de este sistema operativo debido a que, la propia seguridad por ocultación, constituye una infracción del uno de los principios de Kerckho¤s, el cual a…rma que la seguridad de un sistema reside en su diseño y no en una supuesta ignorancia del diseño por parte del atacante.

Windows 11 Microsoft presentó el 24 de junio del 2021 la siguiente gene- ración de su sistema operativo y que se puede descargar como actualización a partir del 5 de octubre del 2021. Windows 11 con un nuevo diseño que po- tencia las formas redondeadas y las transparencias, y enfocado a la produc- tividad. Este diseño, que incluye un modo oscuro y uno claro, está pensado para transmitir sensación de calma y sobre todo para que el usuario tenga la información siempre a mano. Esto se aprecia en nuevas funciones, como los Widgets, que pueden personalizar tarjetas de información sobre el tiempo, el trá…co, o información local. La compañía también ha rediseñado el menú de inicio y la barra de ta- reas con el acceso a aplicaciones como Teams, que ahora está integrado en Windows. Con Layouts, Windows 11 permite personalizar la apariencia y la disposición de las ventanas. El usuario también podrá personalizar escritorios según el uso, ya sea para el trabajo, para el estudio o el ocio, con con…guraciones separadas. La nueva experiencia con las aplicaciones y son el ’Docking’–cuando el portátil se conecta a un monitor–hacen posible retomar el trabajo, incluso con varias aplicaciones abiertas, en el mismo lugar donde el usuario lo dejó antes de apartarse del ordenador. Windows 11 también esta diseñado para que siempre se sienta igual tanto si se usa en una tableta y su pantalla táctil como si se usa en un ordenador con teclado. Además, mejora la experiencia [email protected] 45 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM con el lápiz óptico y teclado táctil en pantalla. Otro elemento que presenta novedades es , que ha sido rediseñada para facilitar la búsqueda de aplicaciones, e incorpora también las aplicaciones de Android, que pueden colocarse en la barra de tareas. Con Windows 11 se tendrá nueva tienda de aplicaciones, una que abrirá sus puertas a todo tipo de aplicaciones y juegos. Esto quiere decir que a partir de ahora la nueva generación de Windows contará con PWA (aplicaciones Web progresivas), UWP (aplicaciones universales) y los programas clásicos Win32 en un mismo lugar. En cuanto al tema de actualizaciones, Microsoft abandona de…nitivamente el programa de entrega de actualizaciones semestrales de Windows 10 que de- …nitivamente no pudo concretar con la estabilidad requerida. Windows 11 solo recibirá una actualización anual de características, funciones y soporte de nuevas tecnologías, lo que debería otorgarle tiempo su…ciente para de- sarrollo y pruebas, entregando versiones más pulidas. Las actualizaciones acumulativas de seguridad y corrección de errores si mantendrán el actual ciclo de entrega mensual.

Windows 365 Microsoft presentó en julio del 2021 la nueva versión de Windows en la nube que llevará el nombre de Windows 365. Este nuevo servicio de suscripción, está especialmente dirigido a empresas, que permi- tirá acceder a nuestra sesión de usuario desde cualquier equipo (el PC, el Mac, la tableta o teléfono Android, etc.), pues el Software y el sistema de archivos estarán alojados en una máquina virtual remota, por lo que la con…- guración, documentos y herramientas disponibles serán idénticos desde donde accedamos. Así, desde cualquier navegador (o bien usando la aplicación de Escritorio Remoto de Windows) podremos acceder a un Windows 11/10 disfrutando de una experiencia de arranque casi instantáneo, pero esa no será la única ventaja de esta plataforma. Aún más importante será la posibilidad de contar con varios ’ordenadores’en una misma cuenta, cada uno con distinta potencia (RAM, núcleos de procesador...) y capacidad de almacenamiento contratada, según el trabajo que necesitemos llevar a cabo en cada momento. Microsoft ya ha con…rmado que ofrecerá 12 con…guraciones de Hardware distintas para sus equipos virtualizados (iniciando en $130 pesos mexicanos por mes). Así, las empresas podrán ’crear PCs’ en cuestión de minutos y asignar cada uno a un empleado, eliminando los inconvenientes que conlleva [email protected] 46 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM el hecho de manejar Hardware físico.

Winget Windows (winget) es el gestor de paquetes de Windows 11 y 10 que permite usar comandos desde la terminal para instalar aplicaciones de forma rápida y sencilla (al más puro estilo de Linux). El único requisito para instalar winget es contar con Windows 10 1890 o versión posterior, es posible usar para actualizar una o todas las aplicaciones del sistema usando:

C: winget upgrade –all

también es posible usar WInstall interfaz grá…ca no o…cial de winget para elegir programas en un click desde una Web y luego instalarlos en Windows con winget con la misma rapidez y automatización.

Microsoft Open Source En Agosto del 2020 presentó la empresa de Red- mond el nuevo sitio Microsoft Open Source en que el público puede navegar a través de todo el ecosistema de código abierto que ha estado construyendo en los últimos años. La Web no solo muestra los proyectos Open Source de Microsoft sino que cuenta con secciones para colaborar con la comunidad, descargar herramientas, explorar su código, y hasta encontrar oportunidades de trabajo. Las dos partes más importantes de este nuevo sitio son las secciones "Get involved" y "Explore proyects". En la primera se puede revisar toda la actividad reciente en los proyectos Open Source de Microsoft alojados en GitHub, y además se cuenta con una larga lista de recursos para aprender a colaborar con proyectos de código abierto, y no necesariamente solo los que mantiene Microsoft. La segunda sección es la lista de proyectos, y ahí nos encontramos los principales proyectos Open Source mantenidos por los ingenieros de Microsoft y la comunidad. La lista de proyectos es larga y podemos encontrar los proyectos de los empleados de la empresa patrocinados a través de Microsoft FOSS Fund.

Linux Dentro de Windows Desde el 2018 se inició la integración de GNU/Linux en Windows 10, con la actualización de Windows 10 Fall Crea- Update con WSL (Windows Subsystem for Linux), se permitía instalar consolas de diversas distribuciones de GNU/Linux como un programa más. [email protected] 47 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Y en el 2020, con la llegada de Windows 10 Build 2020 con WSL2, el cual cuenta con su propio Kernel de Linux que permite instalar de manera casi nativa diversas distribuciones de GNU/Linux con todo el ambiente grá…co permitiendo tener lo mejor de ambos mundos en un mismo equipo -sin hacer uso de programas de virtualización-, incluso es posible ejecutar varias dis- tribuciones de Linux al mismo tiempo en pantalla. Para usarlo hay que tener todas las actualizaciones de Windows y activar el Subsistema de Windows para Linux (WSL11). Reiniciando el sistema, ya podemos usar distribuciones de Linux desde Microsoft Store. En el Windows Insider Preview Build 20150 ha incluido soporte para GPU de Intel, AMD y y es compatible con Direct ML (una API de bajo nivel para aprendizaje automático soportado por DirectX 12) permitiendo el uso de las capacidades de computación por GPU de WSL para Linux. En abril del 2021 se anuncio la llegada de WSLg en la que se pueden correr aplicaciones (como , Audacity, etc.) e IDEs con soporte para X11 y Wayland, PulseAudio de Linux con GUI (Graphical ) con soporte para grá…cos 3D acelerados por Hardware de forma independiente de la distribución de Linux en la que se instalaron, esta novedad está disponible a partir de la versión Windows Insider Preview Build 21364 y para todos los usuarios en Windows 10 May 2020 Update.

Android Dentro de Windows En el Windows Build 20185 ha incluido soporte para que Windows 10 permite no sólo sincronizar teléfonos Android, sino además mediante "your Phone" permite integrar las aplicaciones, noti…- caciones, mensajes, fotos, llamadas y otras opciones de teléfonos inteligentes en Android directamente en Windows, ejecutando las aplicaciones sin tener que abrirlas en el teléfono, aunque siguen proviniendo de ahí. Además en noviembre de 2020, se ha informado que existe la posibili- dad de que Microsoft permita la instalación y ejecución de aplicaciones para Android en Windows 11. Con cambios mínimos o directamente sin modi…- caciones en el código, los desarrolladores podrían enviar a Microsoft Store sus aplicaciones para que sean descargadas e instaladas en PCs, el proyecto tiene el nombre de Latte. 11 https://docs.microsoft.com/en-us/windows/wsl/install-win10

[email protected] 48 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

2.2 UNIX y BSD Unix (véase [?]) es un sistema operativo portable, multitarea y multiusuario; desarrollado en 1969 por un grupo de empleados de los laboratorios Bell de AT&T. El sistema, junto con todos los derechos fueron vendidos por AT&T a Novell Inc. Esta vendió posteriormente el Software a Santa Cruz Operation en 1995, y está, a su vez, lo revendió a Caldera Software en 2001, empresa que después se convirtió en el grupo SCO. Sin embargo, Novell siempre argumentó que solo vendió los derechos de uso del Software, pero que retuvo el Copyright sobre "UNIX". En 2010, y tras una larga batalla legal, esta ha pasado nuevamente a ser propiedad de Novell. Solo los sistemas totalmente compatibles y que se encuentran certi…ca- dos por la especi…cación Single UNIX Speci…cation pueden ser denominados "UNIX" (otros reciben la denominación «similar a un sistema Unix» ). En ocasiones, suele usarse el término "Unix tradicional" para referirse a Unix o a un sistema operativo que cuenta con las características de UNIX Versión 7 o UNIX System V o UNIX versión 6.

Berkeley o BSD (en español, «distribución de Software Berkeley» ) (véase [?]) fue un sistema operativo derivado de Unix que nace a partir de los aportes realizados a ese sistema por la Universidad de California en Berkeley. En los primeros años del sistema Unix sus creadores, los Laboratorios Bell de la compañía AT&T, autorizaron a la Universidad de Berkeley en California y a otras universidades, a utilizar el código fuente y adaptarlo a sus necesidades. Durante los años 1970 y 1980 Berkeley utilizó el sistema para sus investigaciones en materia de sistemas operativos. Cuando AT&T retiró el permiso de uso a la universidad por motivos comerciales, la universidad promovió la creación de una versión inspirada en el sistema Unix utilizando los aportes que ellos habían realizado, permi- tiendo luego su distribución con …nes académicos y al cabo de algún tiempo reduciendo al mínimo las restricciones referente a su copia, distribución o modi…cación (véase apéndice 14.1.1). Algunos sistemas operativos descendientes del sistema desarrollado por Berkeley son SunOS, FreeBSD, NetBSD, OpenBSD, DragonFlyBSD y Mac Big Sur. BSD también ha hecho grandes contribuciones en el campo de los sistemas operativos en general. Además, la licencia permisiva de BSD ha permitido que otros sistemas operativos, tanto libres como propietarios in- corporaron código BSD. Por ejemplo, Microsoft Windows ha utilizado código [email protected] 49 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM derivado de BSD en su implementación de TCP/IP, y utiliza versiones recom- piladas de la línea de comandos BSD para las herramientas de redes. También Darwin, el sistema en el cual está construido Mac Big Sur, el sistema opera- tivo de Apple, está derivado en parte de FreeBSD 5. Otros sistemas basados en Unix comerciales como Solaris también utilizan código BSD.

Algunos proyectos activos descendientes del sistema BSD son:

FreeBSD (https://www.freebsd.org/es/) Es un sistema operativo para computadoras basadas en las CPU de arqui- tectura Intel. También funciona con procesadores compatibles como AMD. Está basado en la versión 4.4 BSD-Lite del CSRG (Computer Systems Re- search Group) y fue escrito en C y C++. Tiene Licencia BSD. Este proyecto ha realizado una gran inversión de tiempo en ajustar el sistema para ofrecer las mejores condiciones de rendimiento con carga real y facilidad de uso al usuario …nal.

NetBSD (https://www.netbsd.org) Está basado en un conjunto de aplicaciones Open Source, incluyendo 4.4 BSD-Lite de la Universidad de California en Berkeley, Net/2 (Berkeley Net- working Release 2), el sistema grá…co X del MIT y aplicaciones del proyecto GNU. Tiene Licencia BSD. NetBSD ha invertido sus energías en proveer de un sistema operativo estable, multiplataforma, seguro y orientado a la inves- tigación. Está portado a 56 arquitecturas de Hardware y suele ser el primero en implementar tecnologías nuevas, como IPv6.

OpenBSD (https://www.openbsd.org) Está basado en 4.4 BSD y es un descendiente de NetBSD. El proyecto tiene el foco puesto de forma particular en la seguridad y criptografía. Los esfuerzos se centran en la portabilidad, cumplimiento de normas, correc- ción, seguridad y criptografía integrada. Tiene Licencia BSD. La …losofía del proyecto puede ser descrita en tres palabras: "Free, Functional and Secure" (Libre, Funcional y Seguro).

DragonFlyBSD (https://www.dragon‡ybsd.org) Tiene como meta ofrecer un alto rendimiento y escalabilidad bajo cualquier entorno, desde computadoras de un solo usuario hasta enormes sistemas de [email protected] 50 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM clústeres. DragonFlyBSD tiene varios objetivos técnicos a largo plazo, pero el desarrollo se centra en ofrecer una infraestructura habilitada para SMP que sea fácil de entender, mantener y desarrollar.

2.3 Mac OS y macOS Big Sur 11 Mac OS (véase [5]) -del inglés , en español Sis- tema Operativo Macintosh- es el nombre del sistema operativo propietario (véase apéndice 14.2) creado por Apple para su línea de computadoras Mac- intosh, también aplicado retroactivamente a las versiones anteriores a System 7.6, y que apareció por primera vez en System 7.5.1. Es conocido por haber sido uno de los primeros sistemas dirigidos a un gran público al contar con una interfaz grá…ca compuesta por la interacción del Mouse con ventanas, íconos y menús. Debido a la existencia del sistema operativo en los primeros años de su línea Macintosh resultó a favor de que la máquina fuera más agradable al usuario, diferenciándolo de otros sistemas contemporáneos, como MS-DOS, que eran un desafío técnico. El equipo de desarrollo del Mac OS original incluía a Bill Atkinson, Jef Raskin y Andy Hertzfeld. Este fue el comienzo del Mac OS clásico, desarrollado íntegramente por Apple, cuya primera versión vio la luz en 1985. Su desarrollo se extendería hasta la versión 9 del sistema, lanzada en 1999. A partir de la versión 10 (Mac OS X), el sistema cambió su arquitectura totalmente y comenzó a basarse en BSD Unix, sin embargo su interfaz grá…ca mantiene muchos elementos de las versiones anteriores. Hay una gran variedad de versiones sobre cómo fue desarrollado el Mac OS original y dónde se originaron las ideas subyacentes. Pese a esto, los documentos históricos prueban la existencia de una relación, en sus inicios, entre el proyecto Macintosh y el proyecto Alto de Xerox PARC. Las con- tribuciones iniciales del Sketchpad de Ivan Sutherland y el On-Line System de Doug Engelbart también fueron signi…cativas.

Versiones Antes de la introducción de los últimos sistemas basados en el microprocesador PowerPC G3, partes signi…cativas del sistema se almace- naban en la memoria física de sólo lectura de la placa base. El propósito inicial de esto fue evitar el uso de la capacidad de almacenamiento limitada de los disquetes de apoyo al sistema, dado que los primeros equipos Macintosh [email protected] 51 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM no tenían disco duro. Sólo el modelo Macintosh Classic de 1991, podía ser iniciado desde la memoria ROM. Esta arquitectura también permitió una interfaz de sistema operativo totalmente grá…ca en el nivel más bajo, sin la necesidad de una consola de sólo texto o el modo de comandos de línea. Los errores en tiempo de arranque, como la búsqueda de unidades de disco que no funcionaban, se comunicaban al usuario de manera grá…ca, generalmente con un ícono o con mensajes con el tipo de letra Chicago y un "timbre de la muerte" o una serie de pitidos. Esto contrastaba con los PCs de la época, que mostraban tales mensajes con un tipo de letra monoespaciada sobre un fondo negro, y que requerían el uso del teclado y no de un ratón, para el acceso. Para proporcionar tales detalles en un nivel bajo, Mac OS dependía del Software de la base del sistema grabado en la ROM de la placa base, lo que más tarde ayudó a garantizar que sólo los equipos de Apple o los clones bajo licencia (con el contenido de la memoria ROM protegido por derechos de autor de Apple, pudieran ejecutar Mac OS). Mac OS puede ser dividido en tres familias: La familia Mac OS Classic, basada en el código propio de Apple Com-  puter. El Sistema Operativo Mac OS X, desarrollado a partir de la familia  Mac OS Classic y NeXTSTEP, el cual estaba basado en UNIX. macOS Big Sur 11 es el reemplazo de Mac OS X, disponible a partir  de noviembre del 2020. Usando los procesadores M1 de ARM han mostrado un gran desempeño en comparación con equipos INTEL de gama alta.

Linux Dentro de IOS Es posible tener un Linux completo en IOS además de poder hacer uso de Secure Shell (SSH) a una computadora con Linux. Para la primera forma, se puede ejecutar un sistema virtualizado utilizando con iSH, que es de código abierto, pero debe instalarse utilizando la aplicación TestFlight propiedad de Apple. Alternativamente hay aplicaciones de emulador de terminal de código abierto que proporcionan herramientas de código abierto dentro de un en- torno restringido. Esta es la opción más limitada -en realidad no nos permite ejecutar Linux, pero estaremos ejecutando herramientas de Linux- pero brin- dan algunas funciones de línea de comandos. Por ejemplo: [email protected] 52 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Sandboxed Shell, con más de 80 comandos e incluye Python 2 y 3, Lua,  C, Clang, etc.

a-Shell, otorga acceso al sistema de archivos e incluye Lua, Python,  Tex, , JavaScript, C yC++, junto con Clang y Clang++; y permite instalar paquetes de Python con .

Blink Shell, permite la conexión con servidores.  iSH, es un Shell Linux que usa usermode x86 emulación y traducciones  de syscall.

2.4 GNU/Linux GNU/Linux (véase [4]) también conocido como Linux, es un sistema ope- rativo libre (véase apéndice 14.1) tipo Unix; multiplataforma, multiusuario y multitarea. El sistema es la combinación de varios proyectos, entre los cuales destacan GNU (encabezado por y la ) y el núcleo Linux (encabezado por Linus Torvalds). Su desa- rrollo es uno de los ejemplos más prominentes de Software libre: todo su código fuente puede ser utilizado, modi…cado y redistribuido libremente por cualquiera, bajo los términos de la GPL (Licencia Pública General de GNU) y otra serie de licencias libres. A pesar de que «Linux» se denomina en la jerga cotidiana al sistema operativo, este es en realidad solo el Kernel (núcleo) del sistema. La idea de hacer un sistema completo se remonta a mediados de la década de 1980 con el proyecto GNU, así como una gran cantidad de los componentes que se usan hoy en día -además del núcleo-, que van desde los compiladores de GNU hasta entornos de escritorio. Sin embargo, tras la aparición de Linux en la década de 1990 una parte signi…cativa de los medios generales y especializados han utilizado el término «Linux» para referirse a todo. Esto ha sido motivo de polémicas. Cabe señalar que existen derivados de Linux que no tienen componentes GNU -por ejemplo Android-, así como distribuciones de GNU donde Linux está ausente -por ejemplo Debian GNU/Hurd-. A GNU/Linux se le encuentra normalmente en forma de compendios conocidos como distribuciones o distros, a las cuales se les ha adicionado selecciones de aplicaciones y programas para descargar e instalar las mismas. El propósito de una distribución es ofrecer GNU/Linux como un producto …- nal que el usuario pueda instalar, cumpliendo con las necesidades de un grupo [email protected] 53 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM de usuarios o bien del público en general. Algunas de ellas son: Ubuntu, Cen- tOS, Debian, , , Fedora, Red Hat, Oracle, Zorin, MX Linux, Parrot, , Elementary, etc. Algunas de ellas son especialmente conocidas por su uso en servidores de internet y supercomputadoras -donde GNU/Linux tiene la cuota más im- portante del mercado. Según el informe de International Data Corporation (IDC), GNU/Linux es utilizado por los más poderosos 500 sistemas de super- cómputo de alto desempeño del mundo12-, en cuanto a teléfonos inteligentes y tabletas tiene una cuota de 86% y con menor participación, el sistema GNU/Linux también se usa en el segmento de las computadoras de escrito- , portátiles, computadoras de bolsillo, sistemas embebidos, videoconsolas y otros dispositivos.

Creación El proyecto GNU, iniciado en 1983 por Richard Stallman, tiene el objetivo de crear un «sistema de Software compatible con Unix compuesto enteramente de Software libre» . El trabajo comenzó en el año 1984. Más tarde, en 1985, Stallman fundó la Free Software Foundation para …nanciar el desarrollo de GNU, y escribió la Licencia Pública General de GNU en 1989. A principios de la década de 1990, muchos de los programas que se requieren en un sistema operativo -como bibliotecas, compiladores, editores de texto, el Shell Unix, y un sistema de ventanas- ya se encontraban en operación. Sin embargo otros elementos como los controladores de dispositivos y los servicios estaban incompletos. Linus Torvalds ha declarado que si el núcleo de GNU hubiera estado disponible en el momento (1991), no se habría decidido a escribir su propio núcleo. Aunque no fue liberado hasta 1992 debido a complicaciones legales, el desarrollo de BSD -de los cuales NetBSD, OpenBSD y FreeBSD descienden- es anterior al de Linux. Torvalds también ha declarado que si BSD hubiera estado disponible en ese momento, probablemente no habría creado Linux. En 1991 Torvalds asistía a la Universidad de Helsinki. Usuario de MINIX y de los programas provenientes de GNU, se mostraba interesado por los sistemas operativos. Comenzó a trabajar en su propio núcleo en ese año, frustrado por la concesión de licencias que utilizaba MINIX, que en ese mo- mento se limitaba a uso educativo. El núcleo Linux maduró hasta superar a los otros núcleos en desarro-

12 Top500.org informó, en su lista de noviembre de 2017 -y así ha continuado hasta ahora-, que las 500 supercomputadoras más potentes del mundo utilizan Linux. [email protected] 54 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM llo. Las aplicaciones GNU también reemplazaron todos los componentes de MINIX, porque era ventajoso utilizar el código libre del proyecto GNU con el nuevo sistema operativo. El código GNU con licencia bajo la GPL puede ser reutilizado en otros programas de computadora, siempre y cuando también se liberen bajo la misma licencia o una licencia compatible. Torvalds inició un cambio de su licencia original, que prohibía la redistribución comercial a la GPL. Los desarrolladores de ambas partes trabajaron para integrar com- ponentes de GNU con el núcleo Linux, consiguiendo un sistema operativo completamente funcional. Para darnos una idea del frenético crecimiento del Kernel de Linux, por ejemplo, en la versión 4.10 se añadieron 632,782 líneas de código nuevo y en el Kernel 4.12 se añadieron más 1.2 millones de líneas de código nuevas, teniendo un total de 24,170,860 líneas de código. El número de desarro- lladores involucrados fue de 1821 colaboradores y 220 empleados hicieron un promedio de 231 cambios por día, casi 10 cambios por hora, diariamente se añadieron casi 20 mil líneas de código, y casi 800 líneas por hora en dicha versión. Hay que precisar que, si bien el código alojado en el repositorio del Kernel es cuantioso, sólo una pequeña parte del mismo afectará a nuestras propias instalaciones de GNU/Linux, pues gran parte del código fuente es especí…co para cada una de las (múltiples) arquitecturas de Hardware compatibles con Linux. De hecho, a principios de 2018, Greg Kroah-Hartman (responsable de mantenimiento del código), a…rmó que "un portátil promedio usa alrededor de 2 millones de líneas de código del Kernel para funcionar correctamente", cuando en aquel momento, el Kernel completo ya contaba con 25 millones de líneas de código (que ya han aumentado a más de 28 millones en la versión 5.8). GNU/Linux puede funcionar tanto en entorno grá…co como en modo con- sola. La consola es común en distribuciones para servidores, mientras que la interfaz grá…ca está orientada al usuario …nal del hogar como empresarial. Así mismo, también existen los entornos de escritorio, que son un conjunto de programas conformado por ventanas, íconos y muchas aplicaciones que fa- cilitan el uso de la computadora. Los entornos de escritorio más populares en GNU/Linux son: GNOME, KDE, LXQt, LXDE, , , MATE, Cin- namon, , , Budgie, , , Trinity, Moksha, Ukui, entre muchos otros. [email protected] 55 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

¿Qué es lo que está llevando a la gente a probar distribuciones de GNU/Li- nux y a utilizarlas como sistema operativo principal en sus equipos de cóm- puto? A continuación, vamos a exponer una lista con las razones por las que deberías probar una distribución de GNU/Linux -ya que es una sabia elección- como sistema operativo principal en tu equipo de cómputo:

Software Libre y Código Abierto muchos usuarios de internet no conocen el signi…cado principal del Software libre ni del código abierto. Soft- ware libre son esos programas que se automani…estan, por parte de sus au- tores, que puede ser copiado, modi…cado y redistribuido con o sin cambios o mejoras. El concepto de código abierto, es el Software desarrollado y dis- tribuido libremente. Tiene bene…cios prácticos ya que si alguien tiene una idea o piensa que puede mejorar el código puede modi…carlo sin problemas.

Seguridad no descubrimos el agua tibia diciendo que el sistema ope- rativo de Microsoft es el más atacado por virus y y además, se han descubierto varios virus para Mac OS, unos que llevan ocultos mucho tiempo. Pero con GNU/Linux eso no pasa, ya que es un sistema su…cientemente seguro y que no tenemos muchos registros de ataques a esta plataforma. Aunque hay compañías Linuxeras, como Oracle, Novell, Canonical, Red Hat o SUSE, donde el grueso de distribuciones y Software Linux está man- tenido por usuarios y colectivos sin ánimo de lucro. A diferencia de Microsoft y Windows, detrás de Linux no es habitual encontrarnos con una empresa con intereses empresariales, de manera que es más fácil evitar problemas de tipo legal o violaciones de nuestra privacidad o seguridad por parte de quienes han programado esa aplicación o versión de GNU/Linux que usamos. Un ejemplo es la recopilación de datos de uso. A diferencia de los sistemas operativos comerciales, en GNU/Linux no es habitual toparse con este problema.

Es Gratis aunque Mac OS X también es gratuito, está pensado para funcionar solamente en equipos de cómputo Apple. En cuanto a Windows, a pesar de la tendencia, sigue siendo de pago, a pesar de las muchas ofertas que hizo para cambiar de Windows 7 a Windows 10. Si adquieres una computadora nueva con Windows, el precio incluye la licencia de compra. Por otro lado, todo el mundo sabe que los sistemas operativos de GNU/Linux son totalmente gratuitos y puedes instalarlos en cualquier equipo de cómputo. Las distribuciones más populares puedes [email protected] 56 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM descargarlas desde sus páginas o…ciales e instalarlas las veces que quieras y en el número de equipos de cómputo que necesites. Además, no tendremos que pagar por utilizar el Software, sin embargo, podremos donar lo que nos plazca al proyecto para que sigan mejorándolo.

Fácil de Utilizar muchos de nosotros hemos utilizado un sistema ope- rativo basado en GNU/Linux y no lo sabíamos. Aeropuertos, estaciones de tren, sistemas de gestión empresarial y ahora en el espacio con SpaceX, etc. Muchos de estos sistemas están basados en GNU/Linux. Una de las barreras que durante años ha evitado a muchos usar Linux es su complejidad. O al menos lo era cuando la mayoría de tareas debías hacerlas desde la línea de comandos. En la actualidad, distribuciones GNU/Linux como Ubuntu, Mint, Man- jaro, Debian u OpenSUSE ofrecen una interfaz similar a Windows y con todas las herramientas y aplicaciones necesarias para empezar a disfrutar desde el primer día. Si necesitas un nuevo Software, la mayoría de distribuciones cuentan con su propia tienda de aplicaciones o herramienta de gestión de aplicaciones. Todo está pensado para que cualquiera pueda manejarse sin problemas. Está claro que existen versiones de GNU/Linux complejas, pero están enfocadas a un público muy concreto. Las distribuciones domésticas cumplen con creces con los requisitos de usuarios amateurs o recién llegados.

Versatilidad con…gurar un sistema a nuestro gusto, en Windows o en Mac OS X, es algo realmente difícil, pero con los sistemas operativos basa- dos en GNU/Linux se puede tener un sistema operativo totalmente único y totalmente personalizable. La naturaleza de GNU/Linux y su …losofía de código abierto y libre hace posible que contemos con cientos de versiones diferentes. Esto implica que podamos elegir una versión de GNU/Linux, o distribución, en función de para qué la queremos. ¿Para educación? ¿Para niños? ¿Para uso doméstico? ¿Para gestión de redes? ¿Para temas de seguridad? ¿Para reciclar un PC antiguo? Incluso las hay para arreglar problemas de Windows. Esta variedad signi…ca que no sólo podemos emplear GNU/Linux en una computadora doméstica. Los ejemplos más claros son , Jetson Nano, Pine64 y Arduino13, son soluciones baratas y diminutas para montar

13 Son ordenadores del tamaño de una tarjeta de crédito que se conectan a un televisor, un [email protected] 57 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM tu propia computadora personal, tu centro multimedia o cualquier artilugio electrónico que desees diseñar. Y para hacerlo funcionar, cuentas con varias distribuciones Linux enfocadas a dicho Hardware. Usar GNU/Linux signi…ca que puedes cambiar cualquier elemento de tu sistema operativo. Me re…ero a ir más allá de los programas y aplicaciones por defecto. GNU/Linux cuenta con diferentes escritorios y gestores de ventanas, de manera que podemos elegir el que queramos, algo que permiten muchas distribuciones GNU/Linux. Mientras que Windows cuenta con un escritorio por defecto, en GNU/Linux podemos elegir entre: GNOME, KDE, LXQt, LXDE, Xfce, Unity, MATE, Cinnamon, Pantheon, Deepin, Budgie, PIXEL, Enlightenment, Trinity, Moksha, Ukui, etc. En la variedad está el gusto. Además, cualquier con…guración o elemento del sistema operativo es sus- ceptible de ser alterado. La única limitación es que seamos capaces o ten- gamos los conocimientos adecuados. Pero siempre podemos encontrar en internet un tutorial donde nos explique cómo hacerlo. Existen distribuciones de Linux de tamaño muy reducido, por ejemplo: BasicLinux ocupa 2.8 MB, requiere un procesador 386 y 3 MB de RAM y cuenta con el escritorio grá…co JWM, Nanolinux ocupa 14 MB, utiliza SLWM como escritorio y cuenta con navegador, procesador de texto, hoja de cálculo, cliente IRC, etc.

Actualizaciones del Sistema Operativo hablando de actualizaciones, sus aplicaciones se actualizan prácticamente al día, en cuanto el desarrollador lanza dicha actualización. Por lo que siempre podemos tener nuestros pro- gramas y aplicaciones actualizadas. Además para los usuarios que así lo requieran existen versiones de so- porte a largo plazo (Long-Term Support , LTS) normalmente se asocia con una aplicación o un sistema operativo para el que obtendremos seguridad, mantenimiento y (a veces) actualizaciones de funciones durante un período de tiempo más largo. Las versiones LTS se consideran las versiones más estables que se someten a pruebas exhaustivas y en su mayoría incluyen años de mejoras en el camino. Es importante tener en cuenta que una versión de Software LTS no implica necesariamente actualizaciones de funciones a menos que haya una versión más reciente de LTS. Sin embargo, obtendrá las correcciones de errores y las teclado y ratón. Es una placa que soporta varios componentes necesarios en un ordenador común y cuyo precio inicial es de 15 dólares. [email protected] 58 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM correcciones de seguridad necesarias en las actualizaciones de una versión de Soporte a largo plazo. Se recomienda una versión LTS para consumidores, negocios y empresas listos para la producción porque obtiene años de soporte de Software y sin cambios que rompan el sistema con las actualizaciones. Si observamos una versión que no es LTS para cualquier Software, generalmente es la versión más avanzada con nuevas funciones y un período corto de soporte (por ejemplo, 6-9 meses) en comparación con 3-5 años de soporte en un LTS.

Tiendas de Aplicaciones lo mejor de las distribuciones de GNU/Linux es que tienen una característica en común, sus tiendas de aplicaciones. Ya que vamos a poder instalar cualquier tipo de programa que necesitemos con un Click. Recordamos que esto es algo que Windows está intentando con su propia tienda de aplicaciones, pero no están teniendo muy buenos resultados.

Compatibilidad muchos han experimentado problemas a la hora de actualizar sus sistemas operativos con los programas que tenían instalados. Pero eso con GNU/Linux, no pasa, ya que todas sus actualizaciones tienen retrocompatibilidad a largo plazo dentro de su distribución. Hoy en día la mayoría de aplicaciones y servicios Online cuentan con ver- sión compatible para cualquier sistema operativo. Siendo más fácil crear una aplicación multiplataforma, por lo que GNU/Linux cuenta con un catálogo de Software que poco o nada tiene que envidiar a Windows o Mac OS X. En el catálogo destacan las aplicaciones gratuitas y de código abierto, pero también surgen proyectos comerciales, y en la lista se incluyen los juegos, cada vez más presentes en GNU/Linux. Seguramente hay algún Software no disponible en GNU/Linux, pero es más que probable que encontremos una alternativa o, en su defecto, que podamos ejecutarlo mediante o empleando máquinas virtuales como KVM/QEMU o VirtualBox. En cuanto al Hardware, la comunidad GNU/Linux ha avanzado mucho en la creación de controladores o Drivers para emplear cualquier dispositivo o componente en GNU/Linux. Podemos encontrarnos con alguna excepción, pero la mayoría de dispositivos cuentan con un controlador compatible por defecto.

[email protected] 59 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Está en Todas Partes GNU/Linux está presente en la infraestructura de grandes empresas como , Facebook, Net‡ix, NASA, SpaceX, el gran colisionador de hadrones o IBM y en el año 2021 llego a Marte en el sistema operativo del helicóptero que acompaña al rover Perseverance, etc. A nivel de usuario, muchos dispositivos emplean este sistema operativo, bien en alguna de sus versiones o a través de Android, que salvando las distancias, todavía conserva gran parte de su origen Linuxero. Por otro lado, las quinientas principales supercomputadoras emplean Linux como sistema operativo, ya que permite trabajar en todo tipo de entornos y situaciones. Las grandes empresas de internet hace años que vieron en GNU/Linux una gran oportunidad, y si bien a nivel usuario doméstico no está tan exten- dido, nunca había sido tan fácil dar el paso. Para hacernos una idea, sólo hay que ver la lista de empresas que apoyan a GNU/Linux a través de The . Una de las más recientes, la propia Microsoft.

La Comunidad GNU/Linux …nalmente, hay que hablar de la fabu- losa comunidad de GNU/Linux. Podemos preguntar lo que queramos en sus foros, cambiar el código, enviar tus programas, sin problemas. ¿Trabas en la con…guración? Te lo solucionan sin preocupación, ¿consejos sobre Software? Hay cientos de hilos con soluciones. Y nosotros, ponemos nuestro granito de arena con este trabajo.

Aprender a Usar Linux Existen diversos sitios Web que están enfocados a explorar detalladamente cada distribución actual o antigua, a un nivel técnico acompañado de grandes y útiles análisis técnicos sobre los mismos, lo que facilita el aprendizaje puntual sobre qué distribución usar o empezar a usar sin tanta incertidumbre, algunos de estos lugares son:

ArchiveOS https://archiveos.org  Distro Chooser https://distrochooser.de/es/  Distro Watch https://distrowatch.com  List https://lwn.net/Distributions/  ¿Qué otros sabores de GNU/Linux hay?

https://upload.wikimedia.org/wikipedia/commons/1/1b/Linux_Distribution_Timeline.svg [email protected] 60 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Existen distintas distribuciones de GNU/Linux14 para instalar, una de las más ampliamente usadas es Debian GNU/Linux15 y sus derivadas como Ubuntu. La comunidad de GNU/Linux te apoya para obtener, instalar y que de una vez por todas puedas usar GNU/Linux en tu computadora. Puedes conocer y descargar las diferentes distribuciones desde:

https://es.wikipedia.org/wiki/Anexo:Distribuciones_Linux https://en.wikipedia.org/wiki/List_of_Linux_distributions

y ver cuál es la que más te conviene:

https://en.wikipedia.org/wiki/Comparison_of_Linux_distributions

o probar alguna versión Live16:

https://livecdlist.com/

también las puedes correr como máquina virtual para VirtualBox:

https://www.osboxes.org/

o máquina virtual para QEMU/KVM:

https://docs.openstack.org/image-guide/obtain-images.html https://github.com/palmerclu¤/qemu-images https://bierbaumer.net/qemu/

14 Una lista de las distribuciones de Linux y su árbol de vida puede verse en la página Web http://futurist.se/gldt/ 15 Algunas de las razones para instalar GNU/Linux Debian están detalladas en su página Web https://www.debian.org/intro/why_debian.es.html 16 Linux es uno de los sistemas operativos pioneros en ejecutar de forma autónoma o sin instalar en la computadora, existen diferentes distribuciones Live -descargables para formato , DVD, USB- de sistemas operativos y múltiples aplicaciones almacenados en un medio extraíble, que pueden ejecutarse directamente en una computadora, estos se descargan de la Web generalmente en formato ISO.

[email protected] 61 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

por otro lado, existen diferentes servicios Web que permiten instalar, con- …gurar y usar cientos de sistemas operativos Linux y Unix desde el navegador, una muestra de estos proyectos son: Distrotest https://distrotest.net JSLinux https://bellard.org/jslinux OnWorks https://www.onworks.net

Ahora, Windows 10 Build 2020 con WSL217 (Windows Subsystem for Linux), tiene su propio Kernel de Linux que permite instalar de manera casi nativa diversas distribuciones de GNU/Linux permitiendo tener lo mejor de ambos mundos en un mismo equipo.

En la red existen múltiples sitios especializados y una amplia bibliografía para aprender a usar, administrar y optimizar cada uno de los distintos as- pectos de Linux, nosotros hemos seleccionado diversos textos que ponemos a su disposición en:

Sistemas operativos

2.5 Android Android (véase [6]) es un sistema operativo basado en el núcleo Linux (véase apéndice 14.1). Fue diseñado principalmente para dispositivos móviles con pantalla táctil, como teléfonos inteligentes, tabletas y también para relojes inteligentes, televisores y automóviles. Inicialmente fue desarrollado por An- droid Inc., empresa que Google respaldó económicamente y más tarde, en 2005, compró. Android fue presentado en 2007 junto a la fundación del (un consorcio de compañías de Hardware, Software y telecomunicaciones) para avanzar en los estándares abiertos de los disposi- tivos móviles. El primer móvil con el sistema operativo Android fue el HTC Dream y se vendió en octubre de 2008. Android es el sistema operativo móvil (SmartPhone y tabletas) más utilizado del mundo, con una cuota de mercado del 86% al año 2020, muy por encima del 13.9% de iOS. El éxito del sistema operativo lo ha convertido en objeto de litigios sobre patentes en el marco de las llamadas guerras de patentes entre las empresas de teléfonos inteligentes. Según los documentos secretos …ltrados en 2013 y 2014,

17 https://docs.microsoft.com/en-us/windows/wsl/install-win10 [email protected] 62 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM el sistema operativo es uno de los objetivos de las agencias de inteligencia internacionales. La versión básica de Android es conocida como Android Open Source Project (AOSP). El 25 de junio de 2014 en la Conferencia de Desarrolladores Google I/O, Google mostró una evolución de la marca Android, con el …n de uni…car tanto el Hardware como el Software y ampliar mercados. El 17 de mayo de 2017, se presentó . Una versión más ligera del sistema operativo para ayudar a que la mitad del mundo sin Smartphone consiga uno en menos de cinco años. Incluye versiones especiales de sus aplicaciones donde el consumo de datos se reduce al máximo.

Arquitectura del Sistema Android los componentes principales del sis- tema operativo de Android18:

Aplicaciones: las aplicaciones base incluyen un cliente de correo elec- trónico, programa de SMS, calendario, mapas, navegador, contactos y otros. Todas las aplicaciones están escritas en lenguaje de programación Java.

Marco de trabajo de aplicaciones: los desarrolladores tienen acceso completo a las mismas API del entorno de trabajo usados por las aplicaciones base. La arquitectura esta diseñada para simpli…car la reutilización de com- ponentes; cualquier aplicación puede publicar sus capacidades y cualquier otra aplicación puede luego hacer uso de esas capacidades (sujeto a reglas de seguridad del Framework). Este mismo mecanismo permite que los compo- nentes sean reemplazados por el usuario.

Bibliotecas: Android incluye un conjunto de bibliotecas de C/C++ usadas por varios componentes del sistema. Estas características se expo- nen a los desarrolladores a través del marco de trabajo de aplicaciones de Android. Algunas son: System C (implementación biblioteca C es- tándar), bibliotecas de medios, bibliotecas de grá…cos, 3D y SQLite, entre otras. 18 Android tiene la base de Linux, por ello en cualquier dispositivo que soporte dicho sistema operativo es posible instalar una aplicación para acceder a la terminal de línea de comandos -por ejemplo ConnectBot-, y en ella podemos correr los comandos de como en un sistema GNU/Linux.

[email protected] 63 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Runtime de Android: Android incluye un conjunto de bibliotecas base que proporcionan la mayor parte de las funciones disponibles en las bi- bliotecas base del lenguaje Java. Cada aplicación Android ejecuta su propio proceso, con su propia instancia de la máquina virtual . Dalvik ha sido escrito de forma que un dispositivo puede ejecutar múltiples máquinas virtuales de forma e…ciente. Dalvik ejecutaba hasta la versión 5.0 archivos en el formato de ejecutable Dalvik (.dex), el cual está optimizado para memoria mínima. La Máquina Virtual está basada en registros y corre clases compi- ladas por el compilador de Java que han sido transformadas al formato .dex por la herramienta incluida DX. Desde la versión 5.0 utiliza el ART, que compila totalmente al momento de instalación de la aplicación.

Personalización muchos conocen a Android como el sistema operativo móvil más personalizable. Pero para los que no lo saben, recordamos que está basado en el núcleo de Linux y que muchos desarrolladores están queriendo llevar Android a un sistema operativo de escritorio.

Núcleo Linux: Android depende de Linux para los servicios base del sistema como seguridad, gestión de memoria, gestión de procesos, pila de red y modelo de controladores. El núcleo también actúa como una capa de abstracción entre el Hardware y el resto del Software.

Android sobre KVM (MicroDroid) En enero de 2021 se anuncio por parte de Google que trabajan en MicroDroid, una versión minimalista de Android para máquinas virtuales sobre KVM. No es la primera alternativa a Android, nos encontramos con las capas de personalización Android Go, AOSP o las imágenes GSI. En el caso de MicroDroid, estaríamos ante una limitada imagen de Linux basada en Android, para este proyecto, Google está trabajando en adaptar la máquina virtual de Crome OS (crosvm), que ya se utiliza para ejecutar aplicaciones de Linux en Chrome OS. De esta forma con MicroDroid podría ejecutar pequeñas máquinas virtuales junto a Android, posiblemente para aplicaciones y uso relacionado con DRM, esta modi…cación constaría con el mínimo de componentes para iniciar el sistema permitiendo aislar datos entre aplicaciones y sistemas operativos en el mismo dispositivo, así como cambiar instantáneamente entre sistemas operativos.

[email protected] 64 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

2.6 Chromebook y Chrome OS Para entender la razón de ser de los Chromebooks, primero tenemos que en- tender qué es Chrome OS. Se trata de un sistema operativo creado por Google y diferente a Android. Está basado en el Kernel de Linux, y utiliza Chrome como su interfaz de usuario principal. Esto quiere decir que su aspecto es prácticamente idéntico al de Chrome, pero con algunos añadidos como una barra de tareas, un explorador de archivos y otros elementos presentes en cualquier sistema operativo. Fue anunciado a mediados del 2009 como un intento de crear un sistema basado en la nube y en aplicaciones Web. Esto hacía que, cuando se estaba conectado a internet se pudiera hacer muchas cosas gracias a herramientas como o las aplicaciones de la , pero que cuando dejaba de tener internet se limitaba mucho sus funciones. En cualquier caso, y pese a lo limitado que era en sus primeros años, poco a poco Google lo ha hecho evolucionar. Primero se empezaron a añadir opciones a las aplicaciones de Google para poderse utilizar sin conexión, algo que también bene…ció a los usuarios que usaran Chrome en otros sistemas operativos. Pero la evolución más grande fue llegando después. El primer gran paso fue el anuncio de la compatibilidad para ejecutar aplicaciones de Android, y se fue implementando directamente la tienda de aplicaciones de Android para hacer que la experiencia de instalarlas fuera tan nativa como en Android. Aun así, hay que decir que la llegada de Android a Chrome OS ha sido lenta, y han tardado algunos años en hacer que todo vaya funcionando como debería. Y a mediados de 2018 se anunció que Google Chrome también podrá uti- lizar aplicaciones creadas para los sistemas GNU/Linux. Con ello, el catálogo de aplicaciones diseñadas para funcionar sin conexión se multiplica bene…- ciando a la comunidad de desarrolladores libres, aunque también es de esperar que tarde algunos años en estar todo perfectamente integrado, ya que todavía se están lanzando poco a poco mejoras. Chrome OS es hoy en día un sistema operativo completo. Tiene lo básico, aplicaciones nativas y compatibilidad con Android, que se une al reproductor de medios, gestor de archivos, con…guración de impresoras, etcétera. Además, al igual que el navegador, Chrome OS tiene también una versión libre llamada OS, que pese a no tener la tecnología nativa de Google sirve para que la comunidad de desarrolladores independientes pueda ayudar a [email protected] 65 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM mejorarlo. Ahora bien, los Chromebook son equipos de cómputo personales que uti- lizan como sistema operativo Chrome OS, desarrollado por Google y que, a diferencia de Windows, OS X y Linux, están pensados para utilizarse perma- nentemente conectados a internet, ya que se basan casi completamente en la nube.

Chromebook Apps también se incluye un reproductor multimedia, y todo se sincroniza permanentemente en la nube. Por ello, si pretendemos utilizar un Chromebook sin conexión a internet, su funcionalidad es más limitada que la de otros equipos de cómputo. De hecho, las aplicaciones se instalan a través de Chrome Web Store, la tienda de aplicaciones integrada en Google Chrome, con lo que algunas de las herramientas más habituales (como O¢ ce o Skype, por ejemplo) tendrían que verse reemplazadas por Google Drive y Google Hangouts, aplicaciones nativas de Google.

Chrome Web Store no obstante, también se pueden utilizar de forma local sin recurrir a la red, ya que muchos de los servicios de Google disponen de un modo sin conexión que, una vez volvemos a disponer de internet, se sincronizarán sin problemas.

¿Cómo es un Chromebook? en un Chromebook podemos utilizar dispositivos USB sin problemas, como memorias y discos externos, Web- cams, teclados y ratones, y por lo general suelen venir con una cantidad de almacenamiento inferior a lo que estamos acostumbrados (ya que lo que se pretende es que todo esté en la nube, y no en nuestro disco duro local). De hecho, al adquirir uno se nos obsequia con 100 GBytes de espacio en Google Drive. Igualmente, su precio suele ser bastante asequible (desde 179 dólares o 130 euros) y no requieren de un Hardware potente para funcionar, siendo la ligereza de recursos una de sus mayores bondades. Por su parte, los equipos de cómputo portátiles con Chrome OS son lo que llamamos Chromebook, mientras que si preferimos el formato Mini PC, estaremos ante un Chrome- . El inicio del sistema es prácticamente instantáneo y todo está listo para funcionar en cuestión de segundos, y dadas sus características, un Chrome- es un equipo ideal para navegar por internet ante todo. [email protected] 66 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Se accede desde la barra de herramientas en la parte inferior de la pantalla a las aplicaciones que tengamos instaladas, que en realidad se trata de un atajo a las apps que tengamos instaladas en Google Chrome.

Chromebook Integración por supuesto, los Chromebook también son multiusuario, con la ventaja de que con simplemente iniciar sesión con otra cuenta de todo estará tal y como si lo hubiésemos con…gurado con ella (aplicaciones, servicios, historial y demás), y por este mismo mo- tivo se complementan a la perfección con otros dispositivos (ya sean equipos de cómputo, Smartphones o Tablets) en los que utilicemos los servicios de Google, gracias a la sincronización en la nube. Además, los Chromebook también presumen de no necesitar antivirus, pues al almacenarse todo en la nube la seguridad está integrada por defecto y corre por parte de Google.

Microsoft en un Chromebook En el 2020 las empresas Parallels19 y Google llegaron a un acuerdo para ofrecer a los usuarios la posibilidad de ejecutar aplicaciones Windows en Chrome OS. Ellas aseguran que en Chrome OS la integración será completa: las aplicaciones se ejecutarán cada una en su propia ventana, como las nativas, y no dentro de un Windows virtualizado. Aunque ninguna de las dos compañías ha ofrecido aún una lista de apli- caciones compatibles con esta función que será lanzada en el 2021, John Solomon (vicepresidente de Chrome OS) ha a…rmado que Microsoft O¢ ce será una de ellas. El problema es que, por ahora, estas nuevas funcionalidades no estarán disponibles para todos los usuarios de Chrome OS, sino únicamente para los de Chrome OS Enterprise, la versión empresarial del mismo.

Nota: en últimas fechas han aparecido proyectos que permiten instalar diversas distribuciones de GNU/Linux en los Chromebook, esto es debido a que Google deja de dar soporte a sus equipos después de algunos años de que salieron al mercado, pese a que el equipo es totalmente funcional.

19 Empresa (propiedad de Corel desde hace un año) desarrolladora del Software homó- nimo de virtualización que es especialmente popular entre los usuarios de Mac.

[email protected] 67 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

2.7 Otros Sistemas Operativos Sistemas Operativos para PC

1. Fuchsia OS.- Es un sistema operativo versátil y adaptable esta basado en el Zircon en desarrollo por parte de Google, está disponible desde un repositorio de Git y esta ya siendo usado en los Nest Hub, se espera su uso en la domótica que prepara Google como parte del internet de las cosas.

2. eComStation.- Seguro que muchos recuerdan el mítico OS/2 de IBM, sistema operativo que perdura con eComStation, derivado de este adap- tado al Hardware moderno. A diferencia de otras alternativas de la lista, este no es gratuito y sus precios comienzan desde 145 dólares para la versión doméstica. Muchas aplicaciones libres como , OpenO¢ ce o VLC han sido portadas a este sistema operativo.

3. .- BeOS fue un sistema operativo lanzado en el año 1991 con muy buenas intenciones a nivel de optimización e interfaz. Sin embargo, como les sucedió a muchos otros, terminó sucumbiendo en este compli- cado mercado. Su legado ha sido continuado por Haiku, un sistema de código abierto que lleva ya años en desarrollo.

4. ReactOS.- Es una alternativa a la arquitectura Windows NT de Mi- crosoft totalmente abierta que no utiliza ningún tipo de código propie- tario. No obstante, es compatible con muchos de los controladores y aplicaciones de Windows. Como punto negativo, su desarrollo no es tan rápido como muchos esperarían en un entorno tan cambiante como este.

5. FreeDOS.- Alternativa libre a DOS cuyo desarrollo sigue activo en estos momentos. Se trata de un entorno bastante estable, pero que carece de interfaz grá…ca o multitarea. Es compatible a todos los niveles con MS-DOS y sus programas.

6. Solaris.- El sucesor de SunOS, de , empezó como una distribución propietaria de UNIX, pero en 2005 fue liberado como OpenSolaris. Más tarde, Oracle compró Sun y le cambió el nombre a .

[email protected] 68 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

7. .- Basado en Open Solaris, este proyecto nació por parte de al- gunos de los ingenieros originales del sistema. En realidad, busca ser una base para crear distribuciones de este sistema operativo. OpenIn- diana es una de las más conocidas y utilizadas.

8. DexOS.- Un sistema operativo de 32 Bits escrito para la arquitectura x86 en lenguaje ensamblador. Está diseñado para programadores que desean tener acceso directo al Hardware (incluyendo CPU y grá…cos) con un código bien comentado y documentado.

9. Syllable.- Sistema operativo nacido como fork de AtheOS, un clon de AmigaOS, aunque comparte mucho código con Linux. No tiene de- masiada utilidad para los usuarios domésticos, aunque es compatible con arquitecturas x86.

10. AROS Research Operating System.- Es otro sistema que implementa en código abierto las de AmigaOS, con cuyos ejecutables es compa- tible a nivel binario en procesadores de 68k, además de ser compatible a nivel de código con otras arquitecturas como x86 para la que se ofrece de manera nativa. Es portable y puede correr hospedado en Windows, Linux y FreeBSD.

11. MenuetOS.- Llamado también como MeOS, su característica más desta- cada es que está programado completamente en lenguaje ensamblador. Está diseñado para funcionar en equipos muy básicos aunque soporta hasta 32 GigaBytes de RAM. Con decir que el sistema cabe en un dis- quete de 1.44 Megabytes, está dicho todo. Aún así se las arregla para incluir un escritorio grá…co y controladores para teclados, video, audio, USB o impresoras.

12. Visopsys.- Se trara de un sistema gratuito y libre bajo GPL que ha estado en desarrollo desde 1997, como hobby de un solo programador, Andy McLaughlin. Soporta arquitecturas x86, está escrito en C y en- samblador y no se basa en ningún sistema preexistente, si bien utiliza código del kernel Linux, ofrece herramientas comunes de GNU y parte de la interfaz grá…ca de usuario como los iconos, resultarán familiares a los usuarios de KDE Plasma.

13. mOS.- Sistema operativo usado en centros de datos y para cómputo de alto rendimiento (High Performance Computing HPC), se basa en [email protected] 69 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

el Kernel de Linux pero tiene su propio núcleo ligero LWK, el Kernel gestiona un pequeño número de núcleos de la CPU para asegurarse la compatibilidad y el LWK Kernel gestiona el resto del sistema.

14. KolibriOS.- Es un pequeño sistema operativo poderoso y rápido para PCs. Solamente requiere unos pocos megas de espacio en disco y 8 MB de RAM para funcionar, además de incluir varias aplicaciones básicas.

15. SerenityOS es un sistema operativo Unix con aspecto de Windows de los 90s creado por un único programador como un proyecto terapéutico y está pensado para equipos X86 de escritorio.

Sistemas Operativos para móviles

1. PinePhone.- Usa un sistema operativo basado en sistemas operativos de código abierto impulsado por la comunidad Linux, ha sido portado a 16 diferentes distribuciones de Linux y 7 diferentes interfaces grá…- cas de usuario como: Mobian, Manjaro con interfaz plasma, , postmarketOS, LuneOS, Mobile, Leste, , entre otros. Además la compañía Pine64 es el segundo fabricante de teléfonos (después de OpenMoko) que ofrece el arranque desde una tarjeta microSD, que permite a los usuarios probar múltiples sistemas operativos, antes de instalarse en la memoria Flash interna.

2. HarmonyOS.- Sistema operativo desarrollado por para reem- plazar a Android en sus equipos, es un sistema operativo similar a la idea de Fuchsia OS, con la idea que pueda instalarse tanto en un ordenador, como en un teléfono, tableta, relojes, como en un coche conectado, en donde todos estos dispositivos se conecten entre sí con una sola cuenta, dando así un paso hacia adelante en la utopía de la convergencia.

3. PostmarketOS.- Sistema operativo de Software libre y código abierto en desarrollo principalmente para teléfonos inteligentes y tabletas -es una idea genial, la persecución de tener Linux en los dispositivos Smart- phone, como otra alternativa a los sistemas Android e iOS-, haciéndose las primeras pruebas en teléfonos que ya no tienen uso. Distribución basada en Alpine Linux. Puede usar diferentes interfaces de usuario, [email protected] 70 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

por ejemplo Plasma Mobile, , LuneOS UI, MATE, GNOME 3 y XFCE.

4. Plasma Mobile.- Es un sistema en fase de desarrollo por KDE que permite la convergencia con los usuarios de KDE para escritorio.

5. Lomiri.- Sistema operativo basado en Linux que soporta dos sabores: Ubuntu Touch y Manjaro. Ambos basados en Unity 8 que están en constante desarrollo.

6. .- Sistema operativo móvil desarrollado por Microsoft, como sucesor de . A diferencia de su predecesor fue enfocado en el mercado de consumo en lugar del mercado empresarial.

7. OS.- Era un sistema operativo que fue producto de la alianza de varias empresas de telefonía móvil, entre las que se encuentran Nokia, Sony Ericsson y otros, el objetivo de Symbian fue crear un sistema operativo para terminales móviles.

8. BlackBerry OS.- Es un sistema operativo móvil desarrollado por Re- search In Motion para sus dispositivos BlackBerry.- Es multitarea y tiene soporte para diferentes métodos de entrada adoptados por RIM para su uso en computadoras de mano, particularmente la trackwheel, trackball, touchpad y pantallas táctiles.

9. HP webOS.- Se trata de un sistema operativo multitarea para sis- temas embebidos basado en Linux, desarrollado por Palm Inc., ahora es propiedad de Hewlett-Packard Company.

10. GrapheneOS.- Es un sistema operativo móvil centrado en la privacidad y la seguridad con compatibilidad con aplicaciones Android, que esta desarrollado como un proyecto de código abierto sin ánimo de lucro. Se centra en la investigación y el desarrollo de tecnología de privaci- dad y seguridad, incluyendo mejoras sustanciales en el Sandboxing, la mitigación de exploits y el modelo de permisos.

11. Sail…sh OS.- Es un Sistema Operativo móvil seguro y optimizado para funcionar en Smartphones y tabletas, y también fácilmente adaptable a todo tipo de dispositivos integrados y casos de uso. Es el único Sis- tema Operativo móvil independiente basado en el código abierto, sin [email protected] 71 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

ningún vínculo con las grandes corporaciones, respaldado por unos sóli- dos derechos de propiedad intelectual, que incluyen todos los derechos de propiedad intelectual y marcas comerciales. En resumen, es una plataforma abierta con un modelo de contribución de código abierto activo.

12. .- Fue un sistema operativo para teléfonos móviles desarrollado por Samsung (Bada «océano» o «mar» en coreano). Diseñado para cubrir teléfonos inteligentes de gama alta como gama baja.

[email protected] 72 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

3 Paquetes de Cálculo Numérico

El cálculo numérico permite diseñar e implementar algoritmos para que a través de números y reglas matemáticas, simular procesos matemáticos com- plejos aplicados a la resolución de problemas de Ciencias e Ingenierías. De esta forma los paquetes de cálculo numérico proporcionan todo el andamiaje para llevar a cabo todos aquellos procedimientos matemáticos susceptibles de expresarse algorítmicamente que permitan su simulación o cálculo en pro- cesos más sencillos empleando números. Los paquetes de cálculo numérico, son programas matemáticos que ofre- cen un entorno de desarrollo integrado (IDE) con un lenguaje de progra- mación propio con un amplio abanico de herramientas numéricas para la lectura, manipulación, análisis y gra…cación de datos. Entre sus prestaciones básicas se hallan:

Manejo de números reales y complejos  La manipulación de vectores y matrices tanto reales como complejas  Manejo de funciones elementales y especiales  Resolución de problemas de álgebra lineal  Resolución de ecuaciones no lineales  La representación de datos y funciones  La implementación de algoritmos  Integración de funciones  Máximos y mínimos de funciones  Manipulación de polinomios  Integración de ecuaciones diferenciales  Gra…cación de funciones en 2D y 3D  La comunicación con programas en otros lenguajes de programación y  con otros dispositivos de Hardware. [email protected] 73 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

El programa comercial líder para el cálculo numérico es MATLAB (véase [35]) de la compañía MathWorks, este paquete salió a la venta en el año de 1984 con la versión 1.0 y casi año con año, ha generado nuevas versiones de su paquete y múltiples sistemas de licenciamiento. Actualmente se comercializa la versión 7.14 (R2012a) del año 2012 con más de 8 tipos de licenciamiento. Esta empresa cuenta con más de mil empleados y o…cinas en más de doce países alrededor del mundo. La idea detrás de paquetes como MATLAB es la de emplear grupos de subrutinas escritas en principio en el lenguaje de programación FORTRAN como son las librerías LINPACK (véase [55]) y EISPACK (véase [56]) para manipular matrices y vectores y proporcionar un sencillo acceso a dicho Soft- ware y así, ser usado en los cursos de álgebra lineal y análisis numérico, sin necesidad de escribir programas en lenguajes de bajo nivel. Estos paquetes, pueden disponer de herramientas adicionales que ex- panden sus prestaciones, como son el diseño y simulación de sistemas de control. Además, se pueden ampliar las capacidades base de dichos pro- gramas con las cajas de herramientas y con los paquetes de bloques. En algunos casos existen versiones para cómputo secuencial y paralelo — tanto en memoria compartida como distribuida, también para usar los múltiples Cores grá…cos CUDA (GPUs) de las tarjetas NVIDIA— . Los paquetes de cómputo para el Cálculo Numérico más usados actual- mente son: MATLAB (véase [35]) (abreviatura de MATrix LABoratory, "labora-  torio de matrices") es un Software matemático que ofrece un entorno de desarrollo integrado (IDE) con un lenguaje de programación pro- pio (lenguaje M). Entre sus prestaciones básicas se hallan: la mani- pulación de matrices, la representación de datos y funciones, la imple- mentación de algoritmos, la creación de interfaces de usuario (GUI) y la comunicación con programas en otros lenguajes y con otros dispo- sitivos Hardware. El paquete MATLAB dispone de dos herramientas adicionales que expanden sus prestaciones, a saber, plataforma de si- mulación multidominio Simulink (véase [58]) y editor de interfaces de usuario GUIDE. Además, se pueden ampliar las capacidades de MAT- LAB con su caja de herramientas (Tool Box) y las de Simulink con los paquetes de bloques. Octave (véase [39]) es un programa de cálculo numérico de licencia  GNU (véase [15]), conocido por buscar una sintaxis similar a la de [email protected] 74 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

MATLAB, existiendo una gran compatibilidad en las funciones de cál- culo numérico.

FreeMat (véase [38]) es un programa de cálculo numérico de licencia  GPL (véase [15]) que proporciona un ambiente libre para el rápido desarrollo de prototipos para la Ciencia y la Ingeniería, además del procesamiento de datos. Es similar a MATLAB y Octave, pero cuenta con una interfaz externa de código en los lenguajes de programación C, C++ y Fortran, incluso distribuye el desarrollo de algoritmos en paralelo con la interfaz de paso de mensajes llamada MPI.

Scilab (véase [36]) es un programa de cálculo numérico de licencia Ce-  CILL compatible con GPL (véase apéndice 14.1), desarrollado princi- palmente en Francia, que incluye su propia librería para grá…cos. Es similar a MATLAB, pero no busca una compatibilidad total, como lo puede hacer FreeMat y Octave. Scilab tiene una herramienta para el diseño y simulación de sistemas de control Scicos (véase [57]) similar a Simulink (véase [58]) de MATLAB.

Julia (véase [37]) es un lenguaje de programación homoicónico, multi-  plataforma y multiparadigma de tipado dinámico de alto nivel y alto desempeño para la computación genérica, técnica y cientí…ca, con una sintaxis similar a la de otros entornos de computación similares, con licencia MIT (véase apéndice 14.1).

Scipy (véase [40]) es una librería de herramientas numéricas para Python  (véase [41]) con licencia Open Source (véase [15]). En su …losofía no ha tratado de imitar a ninguno de los paquetes anteriores y tiene detrás el respaldo de un auténtico lenguaje de programación orientado a objetos e interpretado que también puede ser compilado para ganar velocidad en la ejecución. Este hecho le con…ere una gran potencia y la capacidad de bene…ciarse de las mejoras del lenguaje base.

Existen otros paquetes que pueden ser usados en el cálculo numérico — estos poseen características que enriquecen las opciones clásicas de los pa- quetes de cálculo numérico— :

R (véase [77])  Maple (véase [74])  [email protected] 75 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Mathematica (véase [75])  Maxima (véase [76])  3.1 MATLAB El paquete MATLAB (véase [35]) tiene cientos de características, tan varia- das como el segmento de usuarios al que dicho Software esta dirigido. Al ser un paquete tan completo, es difícil que un usuario promedio use las carac- terísticas avanzadas de dicho paquete; esto repercute en que el usuario prome- dio pague un alto costo por el valor de las licencias de uso sin usar dichas características; y esto contrasta con un vertiginoso desarrollo de nuevas ca- racterísticas, que permite a la compañía lanzar una o más versiones por año, cada una con múltiples opciones de licenciamiento, según las necesidades del segmento al que estan dirigidas. Las múltiples características y los miles de usuarios, han creado una comu- nidad robusta, la que ha logrado una gran cantidad de funciones optimizadas, que han permitido la publicación de decenas libros, cientos de artículos y miles de páginas Web en los cuales se muestra como resolver diversos pro- blemas concomitantes en Ciencias e Ingenierías usando dicho paquete y la interacción con otros lenguajes como son C/C++, Fortran o Java. Entre las principales aplicaciones de MATLAB incluyen la de métodos secuenciales y paralelos para resolver problemas de álgebra lineal con matri- ces (ralas, dispersas y densas), estadística, análisis de Fourier, optimización, integración numérica, resolución de ecuaciones diferenciales ordinarias y par- ciales, creación de grá…cos y visualización de datos. Además de opciones para hacer interpolación y regresión de datos, cálculo de eigen-valores y valores singulares, etc.

Entornos de Programación Uno de los aspectos más agradables de MAT- LAB es su entorno de programación, que permite centralizar la información en un entorno de ventanas. El depurador esta también incorporado en el editor. Desgraciadamente, estas facilidades no se encuentran del todo desa- rrolladas en las otras herramientas — Octave, FreeMat, Scilab, Scipy— , pero es posible obtener la misma efectividad para las opciones básicas usando la línea de comandos.

[email protected] 76 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

3.2 Octave El paquete Octave (véase [39]), al mantener una sintaxis similar a la de MATLAB, la gran mayoría de funcionalidades básicas son compatibles. Las múltiples características y los miles de usuarios, han creado una comunidad robusta, la que ha logrado una gran cantidad de funciones optimizadas, que han permitido la publicación de decenas libros, cientos de artículos y miles de páginas Web en los cuales se muestra como resolver diversos problemas concomitantes en Ciencias e Ingenierías usando dicho paquete y la interacción con otros lenguajes como son C/C++, Fortran o Java. Entre las principales aplicaciones de Octave/MATLAB incluyen la de métodos secuenciales y paralelos para resolver problemas de álgebra lineal con matrices (ralas, dispersas y densas), estadística, análisis de Fourier, op- timización, integración numérica, resolución de ecuaciones diferenciales or- dinarias y parciales, creación de grá…cos y visualización de datos. Además de opciones para hacer interpolación y regresión de datos, cálculo de eigen- valores y valores singulares, etc. Uno de los aspectos más agradables de Octave/MATLAB es su entorno de programación, que permite centralizar la información en un entorno de ventanas. El depurador esta también incorporado en el editor.

3.3 FreeMat El paquete FreeMat (véase [38]) es un programa de cálculo numérico de li- cencia GPL (véase [15]) que proporciona un ambiente libre para el rápido desarrollo de prototipos para la Ciencia y la Ingeniería, además del proce- samiento de datos, además cuenta con una interfaz externa de código en los lenguajes de programación en C, C++ y Fortran, incluso distribuye el desa- rrollo de algoritmos en paralelo con la interfaz de paso de mensajes llamada MPI. Es similar a MATLAB, pero según sus desarrolladores es casi 95% com- patible con MATLAB, actualmente trabaja en Windows, Linux, MAC y algunas versiones de UNIX, las características soportadas son:

Manipulación de arreglos N-dimensionales (N esta limitado a 6)  Soporta enteros de 8, 16 y 32 bits y números de punto ‡otante de 32 y  64 bits y tipo complejos de 64 y 128 bits [email protected] 77 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Soporta la aritmética de todos los tipos de datos soportados  Resolución de sistemas de ecuaciones  Descomposición de eigen-valores y valores singulares  Arreglos heterogéneos  Soporte completo para la estructura de arreglos dinámicos  Soporte para FFT  Paso por referencia  Interfase para código externo C/C++/Fortran  Soporte nativo para matrices dispersas  Clases y sobrecarga de operadores  Visualización de grá…cos en dos y tres dimensiones  Algunas diferencias básicas son:

Soporte parcial para construcción de Widgets/GUI  FreeMat a MEX interfase para portar archivos de MEX de MATLAB  No implementación de GUI/Widgets  En cuanto al ambiente de desarrollo, FreeMat instala todo lo necesario para un trabajo cómodo y funcional. Ya que permite abrir el editor de texto en el cual podemos hacer la depuración del mismo, ejecutar los programas de demostración, acceder a las ventanas grá…cas, controlar la ejecución en curso, abrir …cheros y ejecutarlos, observar el estado de las variables de…nidas, entre otras cosas.

[email protected] 78 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

3.4 Scilab El paquete Scilab(véase [36]) tiene una licencia compatible con la de GPL, que por su madurez y la gran cantidad de usuarios, Universidades y Centros de Investigación que lo usan y dan retroalimentación del paquete, ha logrado ser un Software que permite hacer todas las opciones básicas de MATLAB y algunas avanzadas también, es similar a MATLAB y permite cómputo secuencial y paralelo, pero no busca una compatibilidad total, por ello hay diferencias entre ambos paquetes. Scilab provee una forma para tratar de importar código de MATLAB y generar su equivalente en Scilab. Algunas diferencias básicas son:

Funciones: Las funciones en Scilab no son consideradas como archivos  por separado — como archivos con extensión M en MATLAB— , una o más funciones pueden ser de…nidas en un solo archivo y el nom- bre de archivo no necesariamente tiene que estar relacionado con el nombre de las funciones. También, la(s) función(es) no se cargarán au- tomáticamente en Scilab, como lo es en MATLAB, después de que su nombre es invocado. Por lo general, se tiene que ejecutar el comando GETF(“funcion_name”) antes de ser capaz de utilizar la función. Las funciones también se pueden de…nir en línea con el comando: de¤, además en Scilab para ejecutar un archivo de comandos se debe de usar exec(“archivo”), en MATLAB solo es necesario escribir el nombre del archivo.

Comentarios: En MATLAB los comentarios inician con: %, en Scilab  los comentarios inician con: //

Variables: En Scilab las variables prede…nidas usualmente tienen el pre-  …jo % (%i, %inf, etc.) estas son protegidas y no pueden ser rede…nidas. MATLAB prede…ne a las variables i y j como la unidad imaginaria y pueden ocasionar problemas si se tratan de usar estas en índices de arreglos, esto no pasa en Scilab.

Variables Booleanas: En Scilab las variables booleanas son %T, %F y  0, 1 en MATLAB, ellas corresponden con los conceptos de verdadero y falso respectivamente. Haciendo uso de las variables booleanas pueden no producir el mismo valor en MATLAB como en Scilab. Por ejemplo x=[1,2]; x([1,1]) [which is NOT x([%T,%T])] retorna [1,1] en SCILAB [email protected] 79 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

y [1,2] en MATLAB. También si x es una matriz x(1:n,1)=[] or x(:)=[] no son validas en MATLAB.

Polinomios: En Scilab los polinomios y las matrices polinomiales son  de…nidas por la función poly, ellas son consideradas como vectores de coe…cientes en MATLAB.

Gra…cación: Excepto para los grá…cos simples plot y mesh en MATLAB  y plot3D en Scilab, estos no son compatibles y no siempre es posible obtener grá…cos con la calidad de MATLAB.

En Scilab existe un tipo de dato distinto, las listas, que en la práctica  permiten de…nir una nueva clase. Aunque hay también celdas y estruc- turas como en MATLAB, Scilab en sus últimas versiones recomienda usar las listas.

Estas y otras diferencias hacen que no sean compatibles los programas de MATLAB en Scilab, pero si se usa como una plataforma en la cual se le enseñe a los alumnos la sintaxis del paquete, Scilab proporciona todas las capacidades básicas de MATLAB. Por otro lado, Scilab tiene una interfaz para integrar funciones escritas en C o Fortran de manera relativamente sencilla, al menos para los tipos de datos habituales. También, puede ser llamado desde un programa en Fortran, C, C++ o Java las rutinas de Scilab, o incluso traducir un programa de Scilab a Fortran. En cuanto al ambiente de desarrollo, Scilab instala todo lo necesario para un trabajo cómodo y funcional. Ya que permite abrir el editor de texto en el cual podemos hacer la depuración del mismo, ejecutar los programas de demostración, acceder a las ventanas grá…cas, controlar la ejecución en curso, abrir …cheros y ejecutarlos, observar el estado de las variables de…nidas, entre otras cosas.

3.5 Julia es un lenguaje de programación homoicónico, multiplataforma y multipa- radigma (véase [37]) -soporta programación orientada a objetos, por proce- dimientos, funcional y meta además de multietapas- de tipado dinámico de alto nivel y alto desempeño para la computación genérica, técnica y cientí…ca, [email protected] 80 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM con una sintaxis similar a la de otros entornos de computación similares, con licencia MIT (véase apéndice 14.1). Dispone de un compilador avanzado (JIT), mecanismos para la ejecu- ción en paralelo y distribuida, además de una extensa biblioteca de funciones matemáticas. La biblioteca, desarrollada fundamentalmente en Julia, tam- bién contiene código desarrollado en C o Fortran, para el álgebra lineal, ge- neración de números aleatorios, procesamiento de señales, y procesamiento de cadenas. Adicionalmente, la comunidad de desarrolladores de Julia con- tribuye con la creación y distribución de paquetes externos a través del gestor de paquetes integrado de Julia a un paso acelerado. IJulia es el resultado de la colaboración entre las comunidades de IPython y Julia, provee de una poderosa interfaz grá…ca basada en el navegador para Julia. Algunas características básicas son:

El despacho múltiple: permite de…nir el comportamiento de las fun-  ciones a través de diversas combinaciones de tipos de argumentos

Sistema de tipado dinámico: tipos para la documentación, la opti-  mización y el despacho de funciones

Buen desempeño, acercándose al de lenguajes estáticamente compilados  como C

Gestor de paquetes integrado  Macros tipo Lisp y otras herramientas para la meta-programación  Llamar funciones de Python: mediante el paquete PyCall  Llamar funciones de C directamente: sin necesidad de usar envoltorios  u APIs especiales

Poderosas características de línea de comandos para gestionar otros  procesos

Diseñado para la computación paralela y distribuida  Corutinas: hilos ligeros  Los tipos de…nidos por el usuario son tan rápidos y compactos como  los tipos estándar integrados. [email protected] 81 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Generación automática de código e…ciente y especializado para dife-  rentes tipos de argumentos

Conversiones y promociones para tipos numéricos y de otros tipos, ele-  gantes y extensibles

Soporte e…ciente para , incluyendo UTF-8 pero sin limitarse  solo a este

Es de uso general, pero tiene todo lo necesario para hacer ciencia de  datos, aprendizaje automático, ecuaciones diferenciales, resolvedores de sistemas lineales, etc.

Julia incluye una terminal interactiva, llamada REPL en donde se puede visualizar automáticamente los resultados de la ejecución del programa o segmento de código. Tanto el compilador justo a tiempo (JIT) basado en LLVM así como el diseño del lenguaje le permiten a Julia acercarse e incluso igualar a menudo el desempeño de C. Julia no le impone al usuario ningún estilo de paralelismo en particular. En vez de esto, le provee con bloques de construcción clave para la computación distribuida, logrando hacer lo su…- cientemente ‡exible el soporte de varios estilos de paralelismo y permitiendo que los usuarios añadan más.

3.6 Scipy El paquete Scipy (véase [40]) es parte de Python (véase [41]) y es imposible condensar en unas pocas páginas todas las posibilidades de un lenguaje de propósito general como Python. Al ser este un lenguaje interpretado, puede teclearse línea a línea desde la entrada de comandos, pero también es posible usar …cheros, estos por claridad suelen tener la extensión .py, este podría ser ejecutado con la orden python nombre_…chero.py. En este sentido es similar a MATLAB. Ya que en su …losofía no ha tratado de imitar a ningún otro paquete y tiene detrás el respaldo de un auténtico lenguaje de programación orientado a objetos e interpretado que también puede ser compilado para ganar veloci- dad en la ejecución. Este hecho le con…ere una gran potencia y la capacidad de bene…ciarse de las mejoras del lenguaje base y posee herramientas secuen- ciales y paralelas — en memoria compartida y distribuida además de usar los Cores grá…cos CUDA (GPUs) de las tarjetas NVIDIA— . [email protected] 82 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Algunas diferencias básicas son:

La sintaxis para introducir arreglos debe de incluir comas entre los  elementos. Además, debe haber tantos símbolos “[”como dimensiones del arreglo — y sus correspondientes cierres— .

Los índices en los arreglos empiezan en 0.  Es posible indicar el tipo de dato de cada elemento del arreglo en su  creación.

Existen verdaderas operaciones entre enteros, como en C.  Salvo los tipos de datos muy simples, todos los demás objetos que se  pasan de una función lo hacen por referencia.

En los arreglos de dos dimensiones las operaciones * y / se realizan  elemento a elemento. La multiplicación de matrices y la multiplicación por la inversa deben hacerse con dot e inv. Pero también se puede usar el tipo matrix en lugar de un arreglo, donde se recupera una sintaxis similar a MATLAB.

En cuanto al entorno de programación por omisión se tiene acceso a IDLE (véase [61]), el entorno de desarrollo típico de Python. Permite compatibilizar una ventana interactiva con la edición de los programas. La ventana inte- ractiva es similar a una consola normal de IPython (véase [62]), pero permite ver de forma grá…ca los módulos accesibles, las clases y sus métodos, y sobre todo, una ventana de depuración que puede ser de gran ayuda. Existen otros entornos de programación como son Pydev (véase [63]), el cual es un programa que permite desarrollar código dentro del entorno de programación (véase [64]). Otra opción es usar The Python IDE (véase [65]), el cual es un auténtico entorno de desarrollo y gestión de proyectos de Python, este permite trabajar varias ventanas e incorpora el depurador.

3.7 Ventajas, Desventajas y Carencias Notemos que el tener múltiples herramientas para realizar operaciones ele- mentales y avanzadas de cálculo numérico, es en sí misma una gran ventaja. Para los centros universitarios y usuarios ocasionales, las herramientas de [email protected] 83 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Software libre son una herramienta invaluable. En el caso de empresas o usuarios avanzados que requieren usar opciones especializadas o generadas por terceros, MATLAB destaca como la mejor herramienta de trabajo. Pero hay que hacer notar que:

Funcionalidades básicas: Todos los paquetes implementan las funciona-  lidades básicas, ya que todos llevan años desarrollándose.

Funcionalidades especializadas: Por mucho, MATLAB tiene implemen-  tadas cientos de funciones especializadas que pueden ser muy útiles para usuarios avanzados, pero rara vez son usados por los usuarios noveles o cotidianos.

Grá…cos e imágenes: Todos los paquetes permiten hacer grá…cos en 2D  y 3D y controlar las marcas, poner títulos, etc. Pero los que mejores prestaciones tienen para los usuarios …nales son MATLAB, FreeMat y Scilab.

Potencia del lenguaje de programación: En este caso Scipy destaca por  su modularidad, por tener una orientación a objetos más convencional, por su mayor precisión en los tipos de datos y porqué Python posee muchos módulos que permiten integrar otras tareas típicas de progra- mación con el cálculo numérico.

Fiabilidad: En los paquetes en desarrollo son comunes las caídas del  programa, pero MATLAB destaca por ser más …able que los demás.

Información: MATLAB es el paquete con una abundante bibliografía  y la propia ayuda del programa. FreeMat y Octave también tiene manuales aceptables y mucha información en Internet, aunque la ayuda es escasa. La documentación de Scipy es algo escasa, pero se esta trabajando en ella. Scilab tiene menos difusión y al …nal casi toda la documentación proviene de su página Web o…cial, pero la ayuda del programa es buena.

Facilidad de Manejo: Ninguno de los programas presenta grandes di…-  cultades a la hora de su utilización. MATLAB destaca por su entorno integrado, por las facilidades grá…cas y por la opción de realizar ac- ciones desde sus menús. Pero en menor o mayor medida, todos los paquetes presentan entornos de desarrollo funcional, pero perfectible. [email protected] 84 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Costo: El costo de las diversas versiones de MATLAB supera los dos mil  pesos por licencia estudiantil, en el caso del Software libre, los paquetes se pueden descargar de la red sin más costo que el acceso a Internet.

Así, es posible resumir las características de los paquetes libres como: FreeMat y Octave son programas con una sintaxis muy similar a MAT-  LAB. Su uso no debe suponer problemas para aquellos usuarios habi- tuados a usar MATLAB. En el caso de Octave quizás echará de menos algunas funciones, pero las que posee cubren un gran espectro de apli- caciones, y a partir de ellas se pueden implementar fácilmente las que falten, por otro lado, ambos proyectos son jóvenes y con gran empuje por parte de la comunidad GNU, lo cual, en algunos años permitirá tener productos maduros y de gran calidad, pero por el momento el desarrollo de la interfaz de usuario es algo limitada, al igual que su documentación, pero permiten hacer uso de los cada vez más comunes multiCores en los equipos de cómputo mediante el cómputo en paralelo. Scilab es también parecido a MATLAB, pero dado que no busca tener  una sintaxis similar, los nombres de las funciones pueden cambiar. Hay guías de paso de una herramienta a otra (véase [66]). Además, existe la utilidad de conversión directa de un …chero de MATLAB a uno de Scilab. El comando se llama: m…le2sci, aunque esta herramienta no es perfecta, es sin duda muy interesante contar con esta posibilidad. En cuanto a Scipy o Julia, los cuales más di…eren de MATLAB, al ser  lenguajes ricos en funcionalidades, también permite usar herramientas secuenciales y paralelas — en memoria compartida y distribuida además de usar los Cores Grá…cos CUDA (GPUs) de las tarjetas NVIDIA— . A pesar de que al principio pueden parecer algo más pesado escribir con Scipy o Julia, pronto se comprueba la elegancia del lenguaje de progra- mación y su lógica. Ser estrictos permite, a la larga, evitar errores y organizar mejor las ideas del programador. Además, hay que destacar los numerosos módulos disponibles para tareas distintas a las del cál- culo numérico: transmisión de datos por Internet, e-mail, manejo de bases de datos, creación de interfaces grá…cas, etc.

Por otro lado existe Anaconda, una Suite de código abierto que abarca una serie de aplicaciones, librerías y conceptos diseñados para el desarrollo [email protected] 85 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM de la Ciencia de datos con Python. En líneas generales Anaconda Distribu- tion es una distribucción de Python que funciona como un gestor de en- torno, un gestor de paquetes y que posee una colección de más de 720 pa- quetes de código abierto. Anaconda Distribution se agrupa en 4 sectores o soluciones tecnológicas, Anaconda Navigator, Anaconda Project, Las li- brerías de Ciencia de datos y Conda. Todas estas se instalan de manera automática y en un procedimiento muy sencillo. Para más información ver: https://www.anaconda.com/. También esta SageMath, una Suite de código abierto bajo la licencia GPL de Software matemático como: , SciPy, matplotlib, Sympy, Maxi- ma, GAP, FLINT, R, entre otros. Además combina acceso a una poderosa combinación del lenguaje basada en Python o directamente vía interfaces o Wrappers. La misión del proyecto es crear una alternativa de Software libre a Magma, Maple, Mathematica y Matlab. Para más información ver: http://www.sagemath.org/.

3.8 Desde la Nube Existen diferentes servicios Web20 que permiten editar, compilar y ejecutar código de diversos lenguajes y paquetes desde el navegador, esto en aras de que los estudiantes y profesores que cuenten con algún sistema de acceso a red y un navegador puedan programar en los más diversos lenguajes, IDEs y Terminales sin hacer instalación alguna en su equipo de cómputo, tableta o teléfono celular. Algunos ejemplos de estos servicio son:

Para Octave https://nclab.com/free-portal/  Para Octave https://octave-online.net/  Para SciLab http://cloud.scilab.in/  20 Cuando se trabaja desde la Web es recomendable usar el modo Privado o Incógnito para no guardar el historial de navegación, información introducida en los formularios y borrar al cerrar el navegador los datos de los sitios visitados. Pero recuerda que los sitios Web que visitamos sí guardan información de nuestra visita, nuestro proveedor de internet también guarda constancia de nuestra visita y si descargamos algo, esto no se borra al igual que el historial de descargas, además de las marcas de páginas o favoritos se conservarán al cerrar el navegador. [email protected] 86 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Para SciLab http://hotcalcul.com/on-line-calculator/scilab  Para Julia https://juliabox.com  Para Scipy https://www.jdoodle.com  Para Scipy https://try.jupyter.org/  Para Scipy http://browxy.com 

[email protected] 87 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

4 Paquetes de Cálculo Simbólico

En Matemáticas y Ciencias de la Computación, el cálculo simbólico, tam- bién conocido como cálculo algebraico o álgebra computacional, es un área cientí…ca que se re…ere al estudio y desarrollo de algoritmos y Software para la manipulación de expresiones matemáticas y otros objetos matemáticos. Aunque, hablando con propiedad, el álgebra computacional debe ser un sub- campo de la computación cientí…ca, estos son considerados generalmente como campos distintos, porque la computación cientí…ca se basa general- mente en el análisis numérico con números aproximados en punto ‡otante; mientras que, el álgebra computacional enfatiza el cálculo exacto con expre- siones que contengan variables que no tienen un valor dado y por lo tanto son manipulados como símbolos (de ahí se debe el nombre de cálculo simbólico). Las aplicaciones de Software que realizan cálculos simbólicos son cono- cidas como sistemas de álgebra computacional, con el término sistema, alu- diendo a la complejidad de las principales aplicaciones que incluyen, al menos, un método para representar los datos matemáticos en una computadora, un lenguaje de programación de usuario (por lo general diferente del lenguaje usado para la ejecución), un administrador de memoria, una interfaz de usuario para la entrada/salida de expresiones matemáticas, un gran con- junto de subrutinas para realizar operaciones usuales, como la simpli…cación de expresiones, la regla de la cadena utilizando diferenciación, factorización de polinomios, integración inde…nida, etc. El álgebra computacional es ampliamente utilizada para experimentar en matemática y diseñar las fórmulas que se utilizan en los programas numéricos. También se usa para cálculos cientí…cos completos, cuando los métodos pu- ramente numéricos fallan, como en la criptografía asimétrica o para algunos problemas no lineales.

Los paquetes de cálculo simbólico, son programas matemáticos que ofre- cen un entorno de desarrollo integrado (IDE) con un lenguaje de progra- mación propio con un amplio abanico de herramientas simbólicas y numéri- cas para la lectura, manipulación, análisis y gra…cación de datos. Entre sus prestaciones básicas se hallan:

Bibliotecas de funciones matemáticas elementales y especiales  Matrices y manipulación de datos  [email protected] 88 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Soporte para números complejos, precisión arbitraria, computación de  intervalos aritméticos y simbólicos

Datos en 2D y 3D, función, visualización geográ…ca y herramientas de  animación

Solucionadores para sistemas de ecuaciones, ecuaciones diofánticas, ecua-  ciones diferenciales ordinarias, parciales, diferenciales algebraicas, de retraso, diferenciales estocásticas y relaciones de recurrencia

Herramientas numéricas y simbólicas para cálculo de variable continua  o discreta

Bibliotecas de Estadística multivariable, incluyendo ajuste, pruebas de  hipótesis, y cálculos de probabilidad

Soporte para datos censurados, datos temporales, series temporales y  datos basados en unidades

Cálculos y simulaciones en procesos aleatorios y Queues  Geometría computacional en 2D, 3D y dimensiones mayores  Optimización restringida y no restringida, local y global  Herramientas para problemas combinatorios  Soporta el desarrollo de cálculos matemáticos de manera simbólica y  numérica con precisión arbitraria

Librerías para funciones matemáticas básicas y avanzadas  Manejo de números complejos y sus diversas operaciones  Aritmética, álgebra, operaciones para desarrollo de polinomios multi-  variados

Límites, series y sucesiones  Álgebra diferencial  Herramientas para la manipulación de matrices incluyendo matrices  dispersas [email protected] 89 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Sistemas de solución para ecuaciones diferenciales en sus diferentes va-  riedades (ODE, DAE, PDE, DDE) Herramientas simbólicas y numéricas para cálculo discreto y continuo,  incluye integración de…nida e inde…nida, diferenciación Optimización con restricciones y sin restricciones  Herramientas para la resolución de problemas en el campo de la pro-  babilidad Herramientas para el uso de series de tiempo  Conexión a datos en línea, recopilados para aplicaciones …nancieras y  económicas Herramientas para cálculos …nancieros, incluyendo: bonos, anualidades,  etc. Cálculos y simulaciones para procesos aleatorios  Herramientas para el desarrollo de sistemas lineales y no lineales  Incluye matemáticas discretas  Los programas líderes para el cálculo simbólico son Mathemática y Maple, los costos de sus licencias respectivas son onerosos, pero para la UNAM se tienen licencias académicas disponibles para profesores y estudiantes. Existen otros paquetes como Maxima que tiene licencia GPL (véase apéndice 14.1) y estan disponibles para los usuarios en múltiples plataformas. Estos paquetes, pueden disponer de herramientas adicionales que ex- panden sus prestaciones en modo local como en la Web. En algunos casos existen versiones para cómputo secuencial y paralelo — tanto en memoria compartida como distribuida, también para usar los múltiples Cores grá…cos CUDA (GPUs) de las tarjetas NVIDIA— . Los paquetes de cómputo para el Cálculo Simbólico más usados actual- mente son: Mathematica (véase [75])  Maple (véase [74])  Maxima (véase [76])  [email protected] 90 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

4.1 Mathematica Mathematica (véase [75]) es un programa utilizado en áreas cientí…cas, de in- geniería, matemática y áreas computacionales. Originalmente fue concebido por Stephen Wolfram, quien continúa siendo el líder del grupo de matemáti- cos y programadores que desarrollan el producto en Wolfram Research, com- pañía ubicada en Champaign, Illinois. Comúnmente considerado como un sistema de álgebra computacional, Mathematica es también un poderoso lenguaje de programación de propósito general. Los atributos de Mathematica incluyen:

Bibliotecas de funciones matemáticas elementales y especiales  Matrices y manipulación de datos, así como soporte de matrices tipo  Sparse

Soporte para números complejos, precisión arbitraria, computación de  intervalos aritméticos y simbólicos

Datos en 2D y 3D, función, visualización geográ…ca y herramientas de  animación

Solucionadores para sistemas de ecuaciones, ecuaciones diofánticas, ecua-  ciones diferenciales ordinarias, parciales, diferenciales algebraicas, de retraso, diferenciales estocásticas y relaciones de recurrencia

Herramientas numéricas y simbólicas para cálculo de variable continua  o discreta

Bibliotecas de Estadística multivariable, incluyendo ajuste, pruebas de  hipótesis, cálculos de probabilidad y expectativa en más de 140 dis- tribuciones

Soporte para datos censurados, datos temporales, series temporales y  datos basados en unidades

Cálculos y simulaciones en procesos aleatorios y Queues  Herramientas de aprendizaje de máquina supervisadas y no super-  visadas para datos, imágenes y sonidos

Geometría computacional en 2D, 3D y dimensiones mayores  [email protected] 91 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Análisis de elementos …nitos incluyendo generación de malla adaptiva  en 2D y 3D

Optimización restringida y no restringida, local y global  Lenguaje de programación que da soporte a construcciones de proce-  dimiento, funcionales y orientados a objetos

Juego de herramientas para agregar interfaces de usuario a cálculos y  aplicaciones

Herramientas para procesamiento de imágenes en 2D y 3D, y proce-  samiento morfológico de imágenes incluyendo reconocimiento de imá- genes

Herramientas para visualización y análisis de grafos dirigidos y no di-  rigidos

Herramientas para problemas combinatorios  Herramientas para minería de textos incluyendo expresiones regurales  y análisis semántico

Herramientas de minería de datos tales como análisis de grupos, ali-  neación de secuencias y búsqueda de patrones

Biblioteca de funciones de teoría de números  Herramientas para cálculos …nancieros, incluyendo bonos, anualidades,  derivados, opciones

Teoría de grupo y funciones de tensor simbólicas  Bibliotecas para procesamiento de señales, incluyendo análisis de ondas  en sonidos, imágenes y datos

Bibliotecas de sistemas de control lineales y no lineales  Transformaciones integrales continuas y discretas  Importación y exportación de …ltros para datos, imágenes, video, sonido,  CAD, GIS, formato de documento y biomédicos [email protected] 92 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Colección de base de datos para información matemática, cientí…ca y  socioeconómica y acceso a datos de WolframAlpha y cálculos

Procesamiento de palabras técnicas incluyendo edición de fórmulas y  reportes automatizados

Herramientas para conectarse a sistemas basados en DLL, SQL, Java,  .NET, C++, Fortran, CUDA, OpenCL y HTTP

Herramientas para programación paralela  Usando ambas "entradas lingüística de forma libre" (una interfaz de  usuario de lenguaje natural) y Wolfram Language en el cuaderno cuando esta conectado a internet

Interfaces La interfaz preseleccionada por Mathematica tiene extensas características y capacidades grá…cas, ofreciendo analogías a un cuaderno de trabajo: la entrada de datos por parte del usuario y los resultados envia- dos por el núcleo (incluyendo grá…cas y sonidos), son colocados en forma de celdas jerárquicas (igual que Maple), lo cual permite seguir con facilidad la secuencia de las manipulaciones algebraicas o cálculos que se estan de- sarrollando en una sesión. Comenzando con la versión 3.0 del Software, los cuadernos se representan como expresiones que puedan ser manipuladas, a su vez, por el núcleo. Para permitir a aquellos usuarios que no tienen una licencia, la visua- lización de los cuadernos de trabajo escritos en Mathematica, se creó un paquete de lectura dedicado. Este paquete, llamado MathReader puede ba- jarse de la red gratuitamente. Otras interfaces se encuentran disponibles, como, JMath o Mash, pero la interfaz estandar de Mathematica es la más popular.

Conexiones con otras aplicaciones Las comunicaciones con otras apli- caciones ocurren a través del protocolo llamado MathLink. Este protocolo permite no solo comunicaciones entre el núcleo de Mathematica y las pan- tallas, sino que también provee la interfaz entre el núcleo y aplicaciones arbi- trarias. Wolfram Research distribuye de forma gratuita un kit para enlazar aplicaciones escritas en el lenguaje de programación C hacia el núcleo de Mathematica a través de MathLink. Otros componentes de Mathematica, [email protected] 93 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM que usan el protocolo Mathlink, permite a los desarrolladores establecer co- municaciones entre el núcleo y Java o para programas .NET como J/Link y .NET/Link Usando J/Link, un programa de Java puede decirle a Mathematica que ejecute cálculos; también Mathematica puede cargar cualquier clase de Java, manipular objetos de Java y desempeñar llamadas a métodos, haciendo posi- ble construir interfaces grá…cas desde Mathematica. De forma similar, la plataforma .NET puede enviarle órdenes al núcleo para que ejecute cálcu- los, y devuelva los resultados, también los desarrolladores de Mathematica pueden acceder con facilidad a la funcionalidad de la plataforma .NET. Mathematica 9 es compatible con varias versiones de Linux, OS X de Apple, Windows (XP SP3, Vista, 7 y 8) de Microsoft y Raspberry Pi. Todas estas plataformas son compatibles con implementaciones de 64 bits. Ver- siones anteriores de Mathematica hasta la 6.0.3 son compatibles con otros sistemas operativos, incluyendo Solaris, AIX, Convex, HP-UX, IRIX, MS- DOS, NeXTSTEP, OS/2, Ultrix y Windows Me. Mathematica puede conectarse a una variedad de servicios en la nube para recuperar o enviar datos, incluido ArXiv, Bing, ChemSpider, , Facebook, el Sistema de la Reserva Federal, Fitbit, Flickr, Google (Analyti- cs, Calendar, Contacts, Custom search, Plus, Search, Translate), Instagram, LinkedIn, Mailchimp, Open Library, PubChem, PubMed, Reddit, Survey- Monkey, Twitter y Wikipedia.

Funcionalidades de Mathematica para Internet Wolfram Research cuenta con un programa denominado WebMathematica que añade funciona- lidades para publicación Web capaz de hacer cálculos y desplegar visualiza- ciones de Mathematica en línea. Como demostración de las capacidades de Mathematica y WebMathema- tica, Wolfram Research mantiene un sitio Web en la que es posible realizar integrales inde…nidas simples "The Integrator" en:

http : ==www:wolframalpha:com=calculators=integral calculator= así como el "Demonstrations project" que consiste en pequeños programas encapsulados que muestran un concepto matemático o una función de Mathe- matica de manera simpli…cada, visual y libre ya que el código fuente también puede descargarse. Estos pequeños programas pueden visualizarse incluso sin contar con Mathematica sino directamente en el browser o con el Mathe- [email protected] 94 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM matica Player que es gratuito y puede descargarse en la página de Wolfram Research.

4.2 Maple Maple (véase [74]) es un programa orientado a la resolución de problemas matemáticos, capaz de realizar cálculos simbólicos, algebraicos y de álgebra computacional. Fue desarrollado originalmente en 1981 por el Grupo de Cál- culo Simbólico en la Universidad de Waterloo en Waterloo, Ontario, Canadá. Desde 1988 ha sido mejorado y vendido comercialmente por Waterloo Maple Inc. (también conocida como Maplesoft), compañía canadiense con sede en la misma localidad. La última versión es Maple 2018. Maple se basa en un pequeño núcleo escrito en C, que proporciona el lenguaje Maple. Maple es un lenguaje de programación interpretado. Las expresiones simbólicas son almacenadas en memoria como grafos dirigidos sin ciclos. La mayoría de funcionalidades son proporcionadas por librerías: unas escritas en lenguaje Maple, con acceso a su código fuente; pero también hace uso de otras librerías bien conocidas como las NAG, ATLAS o GMP. Estas son algunas de las características mas relevantes del Software:

Soporta el desarrollo de cálculos matemáticos de manera simbólica y  numérica con precisión arbitraria

Librerías para funciones matemáticas básicas y avanzadas  Manejo de números complejos y sus diversas operaciones  Aritmética, álgebra, operaciones para desarrollo de polinomios multi-  variados

Límites, series y sucesiones  Bases Groebner  Álgebra diferencial  Herramientas para la manipulación de matrices incluyendo matrices  dispersas

Herramientas para grá…cos y animaciones matemáticas  [email protected] 95 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Sistemas de solución para ecuaciones diferenciales en sus diferentes va-  riedades (ODE, DAE, PDE, DDE) Herramientas simbólicas y numéricas para cálculo discreto y continuo,  incluye integración de…nida e inde…nida, diferenciación Optimización con restricciones y sin restricciones  Herramientas estadísticas que incluyen adaptación a diversos modelos,  pruebas de hipótesis y distribuciones probabilísticas Herramientas para la manipulación, visualización y análisis de datos  Herramientas para la resolución de problemas en el campo de la proba-  bilidad Herramientas para el uso de series de tiempo  Conexión a datos en línea, recopilados para aplicaciones …nancieras y  económicas Herramientas para cálculos …nancieros, incluyendo: bonos, anualidades  etc. Cálculos y simulaciones para procesos aleatorios  Herramientas para el procesamiento de señales  Herramientas para el desarrollo de sistemas lineales y no lineales  Incluye matemáticas discretas  Herramientas para visualizar y analizar grá…cos  Importación y exportación de …ltros para datos, imágenes, sonido, CAD  y documentos Procesamiento de texto, incluyendo formulas matemáticas  Herramientas para agregar interfaces de usuario para el desarrollo de  cálculos y aplicaciones Herramientas para conectarse a SQL, Java, .NET, C++, Fortran y  HTTP [email protected] 96 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Herramientas para la generación de códigos en lenguajes C, C++, For-  tran, Java, JavaScript, Julia, Matlab, Perl, Python, R y .

Herramientas para programación paralela.  4.3 Maxima El sistema de álgebra computacional Maxima (véase [76]) es un motor de cálculo simbólico escrito en lenguaje Lisp publicado bajo licencia GNU GPL (véase apéndice 14.1). Cuenta con un amplio conjunto de funciones para hacer manipulación simbólica de polinomios, matrices, funciones racionales, integración, derivación, manejo de grá…cos en 2D y 3D, manejo de números de coma ‡otante muy grandes, expansión en series de potencias y de Fourier, entre otras funcionalidades. Además tiene un depurador a nivel fuente para el código de Maxima. Maxima esta basado en el sistema original de Macsyma desarrollado por MIT en los años 70. Es bastante …able, tiene un buen recolector de basura, por lo que no desperdicia memoria. Viene con cientos de auto pruebas (test- suite). Maxima funciona en modo consola, sin embargo incluye las intefaces grá…cas xMaxima y wxMaxima para facilitar su uso. El editor de texto cientí…co GNU TeXmacs también puede ser usado para facilitar una interfaz grá…ca de usuario para Maxima. Otras opciones son, imaxima, y el modo interactivo de . También puede hacer uso de la in- terfaz grá…ca de SageMath, que facilita su integración con otras herramientas CASE. Como esta escrito en , es fácilmente accesible para la pro- gramación, desde la capa inferior de Lisp puede llamarse a Maxima. Como la mayoría de sistemas algebraicos, Maxima se especializa en ope- raciones simbólicas. También ofrece capacidades numéricas especiales, como son los números enteros y racionales, los cuales pueden crecer en tamaño sólo limitado por la memoria de la máquina; y números reales en coma ‡otante, cuya precisión puede ser arbitrariamente larga (b‡oat). Permite el manejo de expresiones simbólicas y numéricas, y además produce resultados con una alta precisión. Para cálculos intensivos en reales de coma ‡otante, Maxima ofrece la posi- bilidad de generar código en otros lenguajes de programación, como Fortran, que quizá se ejecuten de manera más e…ciente.

[email protected] 97 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Maxima es un sistema de propósito general; como tal los cálculos espe- ciales como la factorización de números grandes, la manipulación de poli- nomios extremadamente grandes, etc. son normalmente realizados de forma más e…ciente y rápida en sistemas especializados.

Números  Listas, arreglos y Matrices  Transformaciones algebraicas  Resolución de ecuaciones  Límites, derivadas e integrales  Conjuntos  Vectores y campos  Grá…cos  Ecuaciones diferenciales  Probabilidades y análisis de datos  Interpolación numérica  Inecuaciones racionales  Ecuaciones diferenciales ordinarias  Sistemas de ecuaciones diferenciales ordinarias  Series de potencias  Transformada de Laplace  Ecuaciones recurrentes  Generacion de expresiones en Tex  Programación en Maxima  [email protected] 98 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

4.4 Ventajas, Desventajas y Carencias Notemos que el tener múltiples herramientas para realizar operaciones ele- mentales y avanzadas de cálculo simbólico, es en sí misma una gran ventaja. Para los centros universitarios y usuarios ocasionales, las herramientas de Software libre son una herramienta invaluable. En el caso de empresas o usuarios avanzados que requieren usar opciones especializadas o generadas por terceros, Maple y Mathematica son grandes herramientas de trabajo. Pero hay que hacer notar que:

Funcionalidades básicas: Todos los paquetes implementan las funciona-  lidades básicas, ya que todos llevan años desarrollándose

Funcionalidades especializadas: Mathematica y Maple tienen imple-  mentadas cientos de funciones especializadas que pueden ser muy útiles para usuarios avanzados, pero rara vez son usados por los usuarios nove- les o cotidianos

Grá…cos e imágenes: Todos los paquetes permiten hacer grá…cos en 2D  y 3D. Pero Mathematica y Maple poseen prestaciones de alto desem- peño para los usuarios …nales

Potencia del lenguaje de programación  Fiabilidad: En los paquetes en desarrollo son comunes las caídas del  programa, pero Maple y Mathematica destacan por ser más …ables

Información: Maple y Mathematica son paquetes con una abundante  bibliografía y la propia ayuda del programa

Facilidad de Manejo: Ninguno de los programas presenta grandes di…-  cultades a la hora de su utilización

Costo: El costo de las diversas versiones de Maple y Mathematica  supera los dos mil pesos por licencia estudiantil, en el caso del Software libre, los paquetes se pueden descargar de la red sin más costo que el acceso a Internet

[email protected] 99 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

4.5 Desde la Nube Existen diferentes servicios Web21 que permiten editar, compilar y ejecutar código de diversos lenguajes y paquetes desde el navegador, esto en aras de que los estudiantes y profesores que cuenten con algún sistema de acceso a red y un navegador puedan programar en los más diversos lenguajes, IDEs y Terminales sin hacer instalación alguna en su equipo de cómputo, tableta o teléfono celular. Algunos ejemplos de estos servicio son:

https://mathics.angusgri¢ th.com/ Clon de Mathematica  http://www.wolframalpha.com/  http://www.quickmath.com/  http://maxima-online.org 

21 Cuando se trabaja desde la Web es recomendable usar el modo Privado o Incógnito para no guardar el historial de navegación, información introducida en los formularios y borrar al cerrar el navegador los datos de los sitios visitados. Pero recuerda que los sitios Web que visitamos sí guardan información de nuestra visita, nuestro proveedor de internet también guarda constancia de nuestra visita y si descargamos algo, esto no se borra al igual que el historial de descargas, además de las marcas de páginas o favoritos se conservarán al cerrar el navegador. [email protected] 100 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

5 Paquetes Estadísticos

Los paquetes estadísticos, son programas matemáticos que ofrecen un en- torno de desarrollo integrado (IDE) con un lenguaje de programación propio con un amplio abanico de herramientas la lectura, manipulación, análisis y gra…cación de datos estadísticos. Entre sus prestaciones básicas destacan:

Análisis de datos mediante operadores para cálculos sobre arreglos,  matrices y/o Tablas

Tablas Cruzadas  Reordenamiento de Datos  Análisis de la Varianza (ANOVA)  Frecuencias  Estadística Descriptiva  Estadística Lineal  Estadística no Lineal  Estadística Biestadística  Pruebas Estadísticas Clásicas  Análisis de Serie de Temporales  Modelos de Regresión  Clasi…cación  Fiabilidad  Categorías  Clustering  Validación de Datos  Tendencias  [email protected] 101 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Grá…cos y Diagramas  Actualmente, los paquetes estadísticos usados en las carreras de Actua- ría, Ciencias de la Computación, Matemáticas, Matemáticas Aplicadas y los cursos de Mátemáticas de las demás carreras de la Facultad (véase [2]) son:

SPSS (véase [43])  R (véase [77])  SAS (véase [42])  PSPP (véase [44])  EViews (véase [67])  Gretel (véase [68])  Stata (véase [66])  Statgraphics (véase [70])  Statistica (véase [71])  Systat (véase [72])  Vensim (véase [73])  Maple (véase [74])  Mathematica (véase [75])  MATLAB (véase [35])  FreeMat (véase [38])  Octave (véase [39])  Maxima (véase [76])  Scipy (véase [40]) 

[email protected] 102 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

En el presente trabajo nos centraremos en los tres primeros paquetes, pero el resto de los paquetes son muy usados ya sea por sus características, facilidad de uso o la accesibilidad del paquete para los estudiantes. Cabe aclarar, que los paquete SPSS y SAS tienen un alto costo monetario, en el caso de SAS existe una versión estudiantil gratuita y SPPS hay una versión de prueba.

5.1 SPSS El paquete SPSS (véase [43]) es un programa estadístico informático muy usado en las ciencias sociales y las empresas de investigación de mercado. Originalmente SPSS fue creado como el acrónimo de «Statistical Package for the Social Sciences» aunque también se ha referido como «Statistical Product and Service Solutions» . Sin embargo, en la actualidad la parte SPSS del nombre completo del paquete es IBM SPSS22 el cual no es acrónimo de nada. Es uno de los programas estadísticos más conocidos teniendo en cuenta su capacidad para trabajar con grandes bases de datos y una sencilla interfaz para la mayoría de los análisis. En las últimas versiones de SPSS se podían realizar análisis con millones de registros y miles de variables. El programa consiste en un módulo base y módulos anexos que se han ido actualizando constantemente con nuevos procedimientos estadísticos. Cada uno de estos módulos se compra por separado. SPSS soporta hacer interfase con lenguajes de programación como Python, R, C, C++, Visual Basic, .NET

Existe una versión incipiente que pretende ser un reemplazo libre para SPSS, se llama PSPP (véase [44]) con una interfaz llamada PSPPire (véase [45]), esta es aplicación de Software libre para el análisis de datos multi- plataforma, se presenta en modo grá…co y esta escrita en el lenguaje de pro- gramación C. Usa la biblioteca cientí…ca GNU para sus rutinas matemáticas, y para la generación de grá…cos. PSPP puede importar formatos de: , OpenDocument, hojas de Excel, bases de datos Postgres, valores separados por coma y archivos ASCII. Puede exportar archivos en formato SPSS y archivos ASCII. Algunas de las bibliotecas usadas por PSPP pueden ser accedidas vía programación.

22 Existe una versión gratuita del paquete IBM SPSS para todo aquel que desee conocer el producto y puede ser descargada de su página Web. [email protected] 103 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

5.2 R El paquete R (véase [77]) es un lenguaje y entorno de programación para análisis estadístico y grá…co. Se trata de un proyecto de Software libre, resultado de la implementación GNU del premiado lenguaje S. SPSS, R y S-Plus — versión comercial de S— son, probablemente, los tres lenguajes más utilizados en investigación por la comunidad estadística, siendo además muy populares en el campo de la investigación biomédica, la bioinformática y las matemáticas …nancieras. A esto contribuye la posibilidad de cargar diferentes bibliotecas o paquetes con …nalidades especí…cas de cálculo o grá…co. Además, R puede integrarse con distintas bases de datos y existen bi- bliotecas que facilitan su utilización desde lenguajes de programación inter- pretados como Perl y Python. R soporta hacer interfase con lenguajes de programación como C, C++ y Fortran. Otra de las características de R es su capacidad grá…ca, que permite generar grá…cos con alta calidad. R posee su propio formato para la do- cumentación basado en LaTeX (véase [34]). R también puede usarse como herramienta de cálculo numérico, campo en el que puede ser tan e…caz como otras herramientas especí…cas tales como FreeMat, GNU Octave y su equi- valente comercial, MATLAB. Se ha desarrollado una interfaz RWeka para interactuar con Weka (véase [78]) que permite leer y escribir …cheros en el formato ¤ y enriquecer R con los algoritmos de minería de datos de dicha plataforma. Los ambientes de desarrollo integrado para R existen como proyectos externos, como pueden ser editores — que sólo soportan la sintaxis— , los IDEs (Integrate Development Environments) y los GUI (Graphical User Interfaces) — permiten editar, ejecutar y depurar código desarrollado para R— . Hay más de 20 proyectos activos, dos de los más conocidos son Tinn-R (véase [79]) y RStudio (véase [80]).

5.3 SAS SAS Institute es uno de los principales fabricantes de Business Intelligence Software (véase [81]). Su nombre es el acrónimo de «Statistical Analysis Sys- tems» (sistemas de análisis estadístico) aunque, posteriormente, al extender su oferta de productos más allá de los meramente dedicados al análisis es- tadístico, pasó a utilizarlo como nombre propio. El primer producto de SAS Institute fue el SAS Software Package (véase [42]), un lenguaje de progra- [email protected] 104 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM mación para el análisis estadístico de datos en mainframes de IBM. Actualmente, este lenguaje de programación, llamado SAS Base, es el motor de una serie de herramientas para la dirección estratégica de empresas, la gestión del riesgo …nanciero, el desarrollo de modelos de minería de datos, etc. El lenguaje SAS opera principalmente sobre tablas de datos: puede leer- las, transformarlas, combinarlas, resumirlas, crear informes a partir de ellas, etc. El núcleo del lenguaje (conocido habitualmente como SAS Base) incluye:

Pasos data que permiten realizar operaciones sobre las …las de un con-  junto de datos.

Procedimientos de manipulación de datos que permiten ordenar tablas,  enlazarlas, etc.

Un intérprete de SQL.  Un super lenguaje de macros.  SAS Institute comercializa paquetes de procedimientos adicionales para el análisis estadístico de los datos, tales como:

SAS/IML, módulo que implementa un lenguaje alternativo similar a  Octave, MATLAB o R.

SAS/STAT, un módulo con procedimientos para realizar determinados  análisis estadísticos (regresiones, etc.)

SAS/ETS para el análisis estadístico de series temporales  SAS/OR para la resolución de problemas de investigación operativa  SAS/GRAPH para generar grá…cos  Además, SAS Institute23 ha desarrollado aplicaciones, denominadas in- terfases, tales como SAS Enterprise Guide, SAS Data Integration Studio, SAS Enterprise Miner y otras que generan código SAS para aplicaciones es- pecí…cas: ETL, minería de datos, etc.

23 Existe una versión de SAS llamada Free SAS Software para uso académico, en la que una vez registrado el usuario, se tiene acceso al programa, documentación y una comunidad en línea con acceso a una gran cantidad de las aplicaciones de SAS. [email protected] 105 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

5.4 Ventajas, Desventajas y Carencias Las organizaciones actuales, manejan una gran cantidad de información, la cual puede o no estar dispersa en sus múltiples sistemas operacionales. Además, en un mercado tan competitivo como el actual, las organizaciones focalizan sus recursos en las estrategias más adecuadas para conducir a la compañía hacia el éxito. Los paquetes estadísticos pueden ayudar a conseguir este objetivo, completando la inversión ya realizada en sistemas operacionales y el hecho de usar paquetes estadísticos que tengan integrado el manejo de las grandes bases de datos ofrece bene…cios adicionales. De los paquetes mencionados, SAS ofrece soluciones en forma de una suite completa para la gestión de datos y Software analítico para encontrar el llamado poder del conocimiento. En general, los paquetes estadísticos proveen un ambiente integrado de análisis de datos, de la gran cantidad de Software existente, la determinación de cual usar en un caso particular, depende de la cantidad de datos y la forma de acceder a ellos. Pese a existir versiones de prueba para SPSS o estudiantiles para SAS, por el tipo de licencia24 del paquete, no se pueden instalar en los equipos de la UNAM, pues violaría la licencia de dichos paquetes. El costo de las versiones completas es prohibitivo para la gran mayoría de las instituciones educativas, en particular para la UNAM. Por ello, el resto de los paquetes estadísticos libres ofrecen una ventaja competitiva, al permitirle al profe- sor y sus estudiantes contar con versiones completas y funcionales en las que pueden ser aplicados los conocimientos adquiridos en los diversos cur- sos de las carreras de Actuaría, Ciencias de la Computación, Matemáticas, Matemáticas Aplicadas y los cursos de Mátemáticas de las demás carreras de la Facultad, dejando el manejo especializado de paquetes como SAS y SPSS a cursos avanzados o para cuando el educando realice sus prácticas profe- sionales. De esta forma se pueden preparar a los estudiantes para aplicar sus conocimientos al egresar en diversas áreas de las carreras de Actuaría, Cien- cias de la Computación, Matemáticas, Matemáticas Aplicadas y los cursos de Mátemáticas de las demás carreras de la Facultad y con pocos conocimien- tos técnicos adicionales puedan laborar en pequeñas, medianas y grandes empresas.

24 Estas versiones de prueba o estudiantiles piden que se instale en el equipo del estudian- te o académico que se registra para el uso del paquete, no esta permitida su instalación en múltiples equipos o en equipos compartidos por varios estudiantes, además caduca en un corto período de tiempo. [email protected] 106 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Por otro lado existe Anaconda, una Suite de código abierto que abarca una serie de aplicaciones, librerías y conceptos diseñados para el desarrollo de la Ciencia de datos con Python. En líneas generales Anaconda Distrib- ution es una distribucción de Python que funciona como un gestor de en- torno, un gestor de paquetes y que posee una colección de más de 720 pa- quetes de código abierto. Anaconda Distribu-tion se agrupa en 4 sectores o soluciones tecnológicas, Anaconda Navigator, Anaconda Project, Las li- brerías de Ciencia de datos y Conda. Todas estas se instalan de manera automática y en un procedimiento muy sencillo. Para más información ver: https://www.anaconda.com/. También esta SageMath, una Suite de código abierto bajo la licencia GPL de Software matemático como: NumPy, SciPy, matplotlib, Sympy, Maxi- ma, GAP, FLINT, R, entre otros. Además combina acceso a una poderosa combinación del lenguaje basada en Python o directamente vía interfaces o Wrappers. La misión del proyecto es crear una alternativa de Software libre a Magma, Maple, Mathematica y Matlab. Para más información ver: http://www.sagemath.org/.

5.5 Desde la Nube Existen diferentes servicios Web25 que permiten editar, compilar y ejecutar código de diversos lenguajes y paquetes desde el navegador, esto en aras de que los estudiantes y profesores que cuenten con algún sistema de acceso a red y un navegador puedan programar en los más diversos lenguajes, IDEs y Terminales sin hacer instalación alguna en su equipo de cómputo, tableta o teléfono celular. Algunos ejemplos de estos servicios son:

Para R https://nclab.com/free-portal/  Para R https://cdn.datacamp.com/dcl-react-prod/example.html 

25 Cuando se trabaja desde la Web es recomendable usar el modo Privado o Incógnito para no guardar el historial de navegación, información introducida en los formularios y borrar al cerrar el navegador los datos de los sitios visitados. Pero recuerda que los sitios Web que visitamos sí guardan información de nuestra visita, nuestro proveedor de internet también guarda constancia de nuestra visita y si descargamos algo, esto no se borra al igual que el historial de descargas, además de las marcas de páginas o favoritos se conservarán al cerrar el navegador. [email protected] 107 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

6 Paquetes O…máticos

En la actualidad, los llamados paquetes o…máticos, no son otra cosa que programas de cómputo integrado, que permiten automatizar multiples ta- reas que ayudan a idear, crear, manipular, transmitir, almacenar información necesaria en una o…cina. Entre sus prestaciones básicas destacan:

Hojas de Cálculo  Bases de Datos  Herramientas de Presentación y Multimedia  Procesamiento de Imágenes  Procesamiento de Textos  Existe una gran cantidad de paquetes o…máticos, que van, desde los ins- talados hasta los asequibles a través de la Web, entre los más comunes ten- emos:

Microsoft O¢ ce (véase [24])  Libre O¢ ce (véase [26])  OpenO¢ ce (véase [25])  (véase [28])  (véase [27])  Lotus Symphony (véase [33])  Only O¢ ce (véase [29])  WPS O¢ ce (véase [30])  O¢ ce Online (véase [31])  Collabora (véase [32]) 

[email protected] 108 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

6.1 Hojas de Cálculo Es un Software a través del cual se pueden usar datos numéricos y realizar cálculos automáticos de números que estan en una tabla. También es posible automatizar cálculos complejos al utilizar una gran cantidad de parámetros y al crear tablas llamadas hojas de trabajo. Las hojas de cálculo permiten a los usuarios elaborar tablas y formatos que incluyan cálculos matemáticos mediante fórmulas, las cuales pueden usar operadores matemáticos como son: + (suma), - (resta), * (multiplicación), / (división) y ^(exponenciación), además de poder utilizar elementos denomi- nados funciones como por ejemplo: Suma(), Promedio(), Buscar(), etc. Así mismo las hojas de cálculo son útiles para gestionar Listas o Bases de Datos; es decir Ordenar y Filtrar la información. Por lo tanto, la hoja de cálculo es una herramienta multiuso que sirve tanto para actividades de o…cina, que implican la organización de grandes cantidades de datos, como para niveles estratégicos y de toma de decisiones al crear representaciones grá…cas de la información sintetizada. Existe una gran variedad de paquetes para el manejo hojas de cálculo — los cuales existen tanto en las plataformas de Windows, Linux, Mac— , entre los que destacan:

Excel: Paquete de Microsoft O¢ ce (véase [24])  Calc: Paquete Libre O¢ ce (véase [26])  OpenCalc: Paquete OpenO¢ ce (véase [25])  Spread Sheet: Google Docs (véase [27])  Sheets: Paquete Calligra (véase [28])  Por otro lado, Microsoft VBA (Visual Basic for Applications) es el lenguaje de macros de Microsoft Visual Basic que se utiliza para programar aplica- ciones Windows y que se incluye en varias aplicaciones Microsoft. VBA per- mite a usuarios y programadores ampliar la funcionalidad de programas de la suite Microsoft O¢ ce. Visual Basic para Aplicaciones es un subconjunto casi completo de Visual Basic 5.0 y 6.0. Microsoft VBA viene integrado en aplicaciones de Microsoft O¢ ce, como Word, Excel, y PowerPoint. Prácticamente cualquier cosa que se pueda programar en Visual Basic 5.0 o 6.0 se puede hacer también dentro [email protected] 109 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM de un documento de O¢ ce, con la sola limitación que el producto …nal no se puede compilar separadamente del documento, hoja o base de datos en que fue creado; es decir, se convierte en una macro (o más bien súper macro). Esta macro puede instalarse o distribuirse con sólo copiar el documento, presentación o base de datos. Su utilidad principal es automatizar tareas cotidianas, así como crear aplicaciones y servicios de bases de datos para el escritorio. Permite acceder a las funcionalidades de un lenguaje orientado a eventos con acceso a la API de Windows. Al provenir de un lenguaje basado en Basic tiene similitudes con lenguajes incluidos en otros productos de o…mática como Libre O¢ ce y Openo¢ ce, pero no hay compatibilidad entre productos. Así también, es común que en los cursos de la carreras de Actuaría, Cien- cias de la Computación, Matemáticas, Matemáticas Aplicadas y los cursos de Mátemáticas de las demás carreras de la Facultad, se requiera hacer análi- sis estadísticos de datos, esto se realiza mediante el uso de complementos de Excel — Herramientas para análisis y Solver— . En donde al usar estas herramientas, se proporcionan los datos y parámetros para cada análisis y la herramienta utilizará las funciones de macros estadísticas o técnicas corres- pondientes para realizar los cálculos y mostrar los resultados en una tabla de resultados. Algunas herramientas generan grá…cos además de tablas de resultados. Entre las herramientas para análisis se incluyen:

Análisis de Fourier  Correlación  Covarianza  Estadística descriptiva  Generación de números aleatorios  Histograma  Jerarquía y percentil  Media móvil  Muestreo  [email protected] 110 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Prueba t  Prueba t para varianzas de dos muestras  Prueba z  Regresión  Suavización exponencial  Varianza  El acceso a tablas de Excel usando Visual Basic for Applications, además del uso de los complementos de Excel — Herramientas para análisis y Solver— para manejo de datos, ha generalizado el uso de los paquetes de Microsoft O¢ ce, esto redunda en el uso de dicha suite en una importante cantidad de cursos dentro de las carreras de la Facultad de Ciencias.

6.2 Bases de Datos Una parte importante de la Modelación Matemática es trabajar con datos de prueba, lo más cercano posible a la realidad. Ello implica que, es nece- sario contar con mecanismos para almacenar, editar y consultar una cantidad grande de datos, esto se logra usando las bases de datos. Existe una gran variedad de paquetes para el manejo de base de datos — los cuales se ejecutan en las plataformas de Windows, Linux, Mac— , entre los que destacan:

Access en Microsoft O¢ ce para Windows (véase [24])  Microsoft SQL Server (véase [94])  PostgreSQL (véase [95])  MySQL (véase [96])  MongoBD (véase [97])  En donde, entendemos a un Sistema de Gestión de Bases de Datos (SGBD) como un conjunto de programas que permiten el almacenamiento, modi…- cación y extracción de la información en una base de datos, además de pro- porcionar herramientas para añadir, borrar modi…car y analizar los datos. [email protected] 111 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Los usuarios pueden acceder a la información usando herramientas especí…- cas de interrogación y de generación de informes, o bien mediante aplicaciones diseñadas para este …n. Los SGBD también proporcionan métodos para mantener la integridad de los datos, para administrar el acceso de usuarios a los datos y recuperar la información si el sistema se corrompe. Permite presentar la información de la base de datos en varios formatos. La mayoría de los SGBD incluyen un generador de informes. También puede incluir un módulo grá…co que permita presentar la información con grá…cos y diagramas. Hay muchos tipos de SGBD distintos según manejen los datos y muchos tamaños distintos según funcionen sobre equipos de cómputo personales y con poca memoria a grandes sistemas que funcionan en mainframes con sistemas de almacenamiento especiales. Generalmente se accede a los datos mediante lenguajes de interrogación26, lenguajes de alto nivel que simpli…can la tarea de construir las aplicaciones. También simpli…can la interrogación y la presentación de la información. Un SGDB permite controlar el acceso a los datos, asegurar su integridad, gestionar el acceso concurrente a ellos, recuperar los datos tras un fallo del sistema y hacer copias de seguridad. El uso generalizado de los paquetes de Microsoft O¢ ce, en particular el acceso a el paquete Access mediante tablas de Excel usando Visual Basic for Applications, además del uso de los complementos de Excel para manejo de datos, hace que sean propicios para que un importante número de cursos dentro de las carreras de la Facultad de Ciencias hagan uso extensivo de dicha suite.

Instalación de Manejadores de Bases de Datos e IDEs en Debian GNU/Linux Existen diversas versiones de paquetes para manejar bases de Datos en Linux, para instalar las más comunes en Debian GNU/Linux es necesario hacer:

# apt install apache2 libapache2-mod-evasive apachetop # apt install libapache2-mod-php php- php-gd ph- pmyadmin

26 Lenguajes tipo SQL (Structured Query Languaje) que es un lenguaje de consulta estructurada que da acceso a un sistema de gestión de bases de datos.

[email protected] 112 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

# apt install mysql-common mysql-client mysql-server mytop mysql-admin ferret mysql-workbench mysql-workbench-data my- cli # apt install postgresql-client postgresql-doc postgresql- contrib pgcli # apt install sqlite3 sqlite3-doc sqlitebrowser # apt install mongodb mongodb-clients mongodb-server

6.3 Herramientas de Presentación y Multimedia El programa líder del mercado es Microsoft PowerPoint (véase [24]), este es un programa de presentación desarrollado por la empresa Microsoft para sistemas operativos Microsoft Windows y Mac OS, ampliamente usado en distintos campos como la enseñanza, negocios, etc. Pero todos los paquetes o…máticos tienen una herramienta pera realizar presentaciones, en algunos casos son altamente compatibles con la desarrollada por Microsoft. Estos programas se han diseñado para hacer presentaciones con texto esquematizado, animaciones de texto e imágenes prediseñadas o importadas desde imágenes de la computadora. Se le pueden aplicar distintos diseños de fuente, plantilla y animación. Este tipo de presentaciones suelen ser más prácticas que las de los paquetes de edición de textos. Las herramientas de Presentación vienen integrados en los paquetes o…má- ticos como un elemento más, que puede aprovechar las ventajas que le ofrecen los demás componentes del paquete para obtener un resultado óptimo. En el caso de PowerPoint, se puede usar como complemento para la edi- ción de texto cientí…co a MathType (véase [82]) para Microsoft O¢ ce, este es un paquete adicional pero es uno de los más usados en cuanto a la tipografía matemática. Por otro lado, esta ganando terreno en la Facultad de Ciencias el uso de Beamer (véase [93]), el cual es una clase de LaTeX (véase [34]) para la creación de presentaciones. Este funciona con pd‡atex, dvips, LyX entre otros. Al estar basado en LaTeX, Beamer es especialmente útil para preparar presentaciones en las que es necesario mostrar gran cantidad de expresiones matemáticas. En los últimos semestres se ha hecho una amplia difusión a los paquetes que usan a LaTeX como base, pues son ampliamente usados por la comunidad cientí…ca mundial.

[email protected] 113 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

6.4 Procesamiento de Imágenes Existe una gran cantidad de usos para los programas de edición de imágenes, pero en las carreras de la Facultad de Ciencias, la edición y manipulación de grá…cos vectoriales27 es común. Es por ello que la gran mayoría de los paque- tes de edición y manipulación de imágenes no proporcionan las herramientas necesarias para procesar adecuadamente imágenes vectoriales. En caso de proveer dichas herramientas, muchas de ellas son de uso tedioso, pues estan diseñadas para uso ocasional. Para subsanar este hecho, existen herramientas y editores hechos a ex- profeso, para permitir la edición y manipulación de grá…cos vectoriales en los cuales su procesamiento es una tarea sencilla de realizar. Existe una gran variedad de paquetes para edición de grá…cos vectoriales — los cuales existen tanto en las plataformas de Windows, Linux, Mac— , entre los que destacan:

Adobe InDesign    Gravit  Vectr  Libre O¢ ce Draw  SK1  Maya  Blender  Autodesk 3Ds Max  Gimp  27 Una imagen vectorial es una imagen digital formada por objetos geométricos depen- dientes, cada uno de ellos de…nido por atributos matemáticos de forma, posición, etc. Y son completamente diferentes a las imágenes de mapa de bits. El interés principal de los grá…cos vectoriales es poder ampliar el tamaño de la imagen a voluntad sin sufrir perdida de calidad que sufren los mapas de bits. Pero todos los ordenadores traducen los grá…cos vectoriales a mapas de bits para poderlos representar en la pantalla, impresora, etc. [email protected] 114 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Corel Photo-Paint   CorelDRAW   Photoshop  6.5 Procesamiento de Textos Existe una gran cantidad de usos para los programas de edición de texto, pero en las carreras de la Facultad de Ciencias, la edición de textos con tipografía cientí…ca es común. Es por ello que la gran mayoría de los procesadores de textos no proporcionan las herramientas necesarias para incluir en el texto fórmulas y/o notación matemática. En caso de proveer dichas herramientas, muchas de ellas son de uso tedioso, pues estan diseñadas para uso ocasional. Para subsanar este hecho, existen herramientas y editores hechos a ex- profeso, para permitir la edición de textos cientí…cos en los cuales numerar ecuaciones, usar tipografía matemática, manipular bibliografía y referencias cruzadas es una tarea sencilla de realizar. Existe una gran variedad de paquetes para la edición de textos cientí…cos — los cuales existen tanto en las plataformas de Windows, Linux, Mac— , entre los que destacan:

Editor de ecuaciones integrado en Word en Microsoft O¢ ce (véase [24])  MathType para Word en Microsoft O¢ ce para Windows (véase [82])  Scienti…c WorkPlace LaTex para Windows (véase [83])  LaTeX (véase [84])  LaTeX (véase [85])  LED LaTeX (véase [86])  LyX LaTeX (véase [87])  LaTeX (véase [88])  [email protected] 115 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

TeXnicCenter LaTeX (véase [89])  TextPad LaTeX (véase [90])  TeXstudio LaTeX (véase [91])  WinEdt LaTeX (véase [92])  Formula de Libre O¢ ce (véase [26])  Math de OpenO¢ ce (véase [25])  Formula de Calligra (véase [28])  Salvo para los productos de Microsoft O¢ ce, el resto de los paquetes tienen una curva de aprendizaje de media a alta, pero en contraste permiten desarrollar textos y grá…cos con tipografía cientí…ca de alta calidad. En la Facultad de Ciencias, desde hace ya varios años, semestre a semestre se imparten cursos a estudiantes, tesistas y profesores de LaTeX y el manejo de uno o mas editores que lo soportan; una cantidad importante de ellos se han impartido en las Aulas y Talleres del Departamento de Matemáticas en el Tlahuizcalpan, además de contar con el repositorio o…cial de LaTeX (véase [99]) dentro de la Facultad.

Instalación de Procesadores de Texto e IDEs en Debian GNU/Linux Existen diversas versiones de paquetes para procesar texto en Linux, para instalar las más comunes en Debian GNU/Linux es necesario hacer: # apt install science- texlive-science pan- doc texmaker inkscape kile gummi texstudio enchant texlive- -base texlive-latex-recommended latexila medit texlive-full latexila libreo¢ ce calligra gnumeric texlive-extra-utils -viewer msttcorefonts djview4 gv zathura di¤pdf pdf-presenter-console evince xpdf okular -utils atril pdftk pdfgrep xpdf-utils pdfcrack qpdf pdfsam pdfshu• er htmldoc pdf2svg pdfmod pdfposter pdfchain pdf2djvu gpdftext catdoc chktex cxref cxref-doc latex2rtf antiword uno- conv a2ps bookletimposer qpdfview rst2pdf xchm chm2pdf arch- mage qpdfview-ps-plugin qpdfview qpdfview-djvu-plugin kchmviewer ispanish wspanish texlive-lang-spanish myspell-es myspell-en-us translate-shell [email protected] 116 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Aprender a Trabajar en LaTeX En la red existen múltiples sitios espe- cializados y una amplia bibliografía para aprender a programar cada uno de los distintos aspectos de LaTeX, nosotros hemos seleccionado diversos textos que ponemos a su disposición en:

Herramientas O…mática/Latex/

6.6 Desde la Nube Existen diferentes servicios Web28 que permiten editar, compilar y generar el archivo PDF o DVI desde el navegador, esto en aras de que los estudiantes y profesores que cuenten con algún sistema de acceso a red y un navegador puedan trabajar en LaTeX sin hacer instalación alguna en su equipo de cóm- puto, tableta o teléfono celular. Algunos ejemplos de estos servicio son:

Para LaTex https://es.sharelatex.com/  Para LaTex https://papeeria.com/  Para LaTex https://www.overleaf.com/  Para LaTex https://www.authorea.com/  Para LaTex https://latexbase.com/  Para LaTex https://www.codecogs.com/latex/eqneditor.php 

28 Cuando se trabaja desde la Web es recomendable usar el modo Privado o Incógnito para no guardar el historial de navegación, información introducida en los formularios y borrar al cerrar el navegador los datos de los sitios visitados. Pero recuerda que los sitios Web que visitamos sí guardan información de nuestra visita, nuestro proveedor de internet también guarda constancia de nuestra visita y si descargamos algo, esto no se borra al igual que el historial de descargas, además de las marcas de páginas o favoritos se conservarán al cerrar al navegador. [email protected] 117 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

7 Lenguajes de Programación

Hay muchas aplicaciones a las herramientas computacionales, pero nos in- teresan aquellas que permitan resolver problemas concomitantes en Ciencia e Ingeniería. Muchas de estas aplicaciones caen en lo que comúnmente se llama cómputo cientí…co. La computación cientí…ca es el campo de estudio relacionado con la construcción de modelos matemáticos, técnicas numéricas para resolver problemas cientí…cos y de ingeniería; y su respectiva imple- mentación computacional. Este campo es distinto a las ciencias de la computación y el procesamiento de información, también es diferente a la teoría y experimentación, que son las formas tradicionales de la ciencia y la ingeniería. El enfoque de la com- putación cientí…ca es para ganar entendimiento, principalmente a través del análisis de modelos matemáticos implementados en computadoras. Los programas de aplicación de la computación cientí…ca a menudo mode- lan cambios en las condiciones del mundo real, tales como el tiempo atmos- férico, el ‡ujo de aire alrededor de un avión, el movimiento de las estre- llas en una galaxia, el comportamiento de un dispositivo explosivo, entre otros. Estos programas deberían crear una ’malla lógica’en la memoria de la computadora, donde cada ítem corresponda a un área en el espacio y con- tenga información acerca del espacio relevante para el modelo. Por ejemplo, en modelos para el tiempo atmosférico, cada ítem podría ser un kilómetro cuadrado, con la altitud del suelo, dirección actual del viento, humedad am- biental, temperatura, presión, etc. El programa debería calcular el siguiente estado probable basado en el estado actual, simulado en medidas de tiempo, resolviendo ecuaciones que describen cómo operan los sistemas mediante el uso de un algoritmo29, y repetir el proceso para calcular el siguiente estado. Este código o programa se escribe en un lenguaje de programación que sigue algún paradigma de programación30, que posteriormente puede ser ejecutado por una unidad central de procesamiento — computadora— .

29 Un algoritmo es un conjunto preescrito de instrucciones o reglas bien de…nidas, orde- nadas y …nitas que permiten llevar a cabo una actividad mediante pasos sucesivos que no generen dudas a quien deba hacer dicha actividad. Dados un estado inicial y una entrada, siguiendo los pasos sucesivos se llega a un estado …nal y se obtiene una solución. 30 Este representa un enfoque particular o …losofía para diseñar soluciones e implemen- tarlas en algún lenguaje de programación. [email protected] 118 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Así, una parte importante de la programación es el hecho de conocer y usar uno o más paradigmas de programación. Entonces iniciemos delineando lo que es un paradigma de programación. Los paradigmas di…eren unos de otros, en los conceptos y la forma de abstraer los elementos involucrados en un problema, así como en los pasos que integran la solución del problema, en otras palabras, el cómputo. Tiene una estrecha relación con la forma- lización de determinados lenguajes al momento de de…nirlos — es el estilo de programación empleado— .

Los Tipos más comunes de paradigmas de programación son31:

Programación imperativa o por procedimientos: es el más usado en  general, se basa en dar instrucciones a la computadora de como hacer las cosas en forma de algoritmos. La programación imperativa es la más usada y la más antigua, el ejemplo principal es el lenguaje de máquina. Ejemplos de lenguajes puros de este paradigma serían C, BASIC o Pascal.

Programación orientada a objetos: esta basado en el imperativo, pero  encapsula elementos denominados objetos que incluyen tanto variables como funciones. Esta representado por C++, C#, Java o Python entre otros, pero el más representativo sería el Smalltalk que esta completa- mente orientado a objetos.

Programación dinámica: esta de…nido como el proceso de romper pro-  blemas en partes pequeñas para analizarlos y resolverlos de forma lo más cercana al óptimo, busca resolver problemas en O(n) sin usar por tanto métodos recursivos. Este paradigma está más basado en el modo de realizar los algoritmos, por lo que se puede usar con cualquier lenguaje imperativo como C, C++, Java o Python.

Programación dirigida por eventos: la programación dirigida por even-  tos es un paradigma de programación en el que tanto la estructura como la ejecución de los programas van determinados por los sucesos que ocurran en el sistema, de…nidos por el usuario o que ellos mismos diseñen, por ejemplo en las interfaces grá…cas de usuarios o en la Web.

31 En general la mayoría son variantes de los dos tipos principales: imperativa y decla- rativa. [email protected] 119 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Programación declarativa: esta basado en describir el problema declaran-  do propiedades y reglas que deben cumplirse, en lugar de instrucciones. Hay lenguajes para la programación funcional, la programación lógica, o la combinación lógico-funcional. Unos de los primeros lenguajes fun- cionales fueron Lisp y Prolog.

Programación funcional: basada en la de…nición los predicados y es de  corte más matemático, está representado por Scheme (una variante de Lisp) o Haskell. Python también representa este paradigma.

Programación lógica: basado en la de…nición de relaciones lógicas, está  representado por Prolog.

Programación con restricciones: similar a la lógica usando ecuaciones.  Casi todos los lenguajes son variantes del Prolog.

Programación multiparadigma: es el uso de dos o más paradigmas  dentro de un programa. El lenguaje Lisp se considera multiparadigma. Al igual que Python, que es orientado a objetos, re‡exivo, imperativo y funcional.

Programación reactiva: este paradigma se basa en la declaración de una  serie de objetos emisores de eventos asíncronos y otra serie de objetos que se «suscriben» a los primeros — es decir, quedan a la escucha de la emisión de eventos de estos— y "reaccionan" a los valores que reciben. Es muy común usar la librería Rx de Microsoft (Acrónimo de Reactive Extensions), disponible para múltiples lenguajes de programación.

El paradigma de programación más utilizado en la actualidad, es el de «orientación a objetos» . El núcleo central de este paradigma es la unión de datos y procesamiento en una entidad llamada «objeto» , relacionable a su vez con otras entidades «objeto» . Tradicionalmente, datos y procesamiento se han separado en diferentes áreas del diseño y la implementación de Software. Esto provocó que grandes desarrollos tuvieran problemas de …abilidad, mantenimiento, adaptación a los cambios y escalabilidad. Con la orientación a objetos y características como el encapsulado, polimor…smo o la herencia, se permitió un avance signi…cativo en el desarrollo de Software a cualquier escala de producción. [email protected] 120 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Otra parte importante de la programación tiene que ver con el algoritmo a implementar y las estructuras de datos necesarias para soportar los datos del problema, así como su e…ciencia. Entonces entenderemos por e…ciencia algorítmica para describir aquellas propiedades de los algoritmos que están relacionadas con la cantidad de recursos utilizados por el algoritmo. Un al- goritmo debe ser analizado para determinar el uso de los recursos que realiza. La e…ciencia algorítmica puede ser vista como análogo a la ingeniería de pro- ductividad de un proceso repetitivo o continuo. Con el objetivo de lograr una e…ciencia máxima se quiere minimizar el uso de recursos. Sin embargo, varias medidas (e.g. complejidad temporal, complejidad espacial) no pueden ser comparadas directamente, luego, cual de los algoritmos es considerado más e…ciente, depende de cual medida de e…ciencia se está considerando como prioridad, e.g. la prioridad podría ser obtener la salida del algoritmo lo más rápido posible, o que minimice el uso de la memoria, o alguna otra medida particular.

Entonces, ¿cómo determinar si un algoritmo es mejor que otro?. Algunas pautas pueden ser:

Facilidad de implementar  Facilidad de entender  Facilidad de modi…car  Usa menos memoria  Menor tiempo de ejecución  Tomando en cuenta todo lo anterior, ¿cómo se hace un pro- grama?

Hay que tener claro el problema a resolver (formalización)  Se debe planear cómo se quiere resolver o abordar el problema (análisis  y diseño)

Se elige uno o más lenguajes de programación y se escriben las instruc-  ciones en ese lenguaje para llevar a cabo esa tarea (codi…cación)

[email protected] 121 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

El texto se compila o interpreta para detectar errores sintácticos y  semánticos (depuración)

El programa revisado se prueba con los distintos datos de entrada (eje-  cución)

Se evalúan los resultados, y de ser necesario se regresa a cualquiera de  los pasos anteriores para completar el proceso de corrección (validación)

Así, para dar solución a algún problema de nuestro interés, debemos elegir el mejor algoritmo a nuestra disposición, seleccionar32 el paradigma de programación que nos ofrezca ventajas según su e…ciencia algorítmica y con ello usar el lenguaje que nos permita implementar dicho programa usando las técnicas de análisis y diseño que garanticen la calidad de un producto de Software33.

Lenguaje de Programación Entenderemos por un lenguaje de pro- gramación, a un lenguaje formal que especi…ca una serie de instrucciones para que una computadora produzca diversas clases de datos. Los lenguajes de programación pueden usarse para crear programas que pongan en práctica algoritmos especí…cos que controlen el comportamiento físico y lógico de una computadora. Esta formado por un conjunto de símbolos y reglas sintácticas y semánticas que de…nen su estructura y el signi…cado de sus elementos y ex- presiones. Al proceso por el cual se escribe, se prueba, se depura, se compila (de ser necesario) y se mantiene el código fuente de un programa informático se le llama programación. Un programa permite especi…car de manera precisa sobre qué datos debe operar una computadora, cómo deben ser almacenados o transmitidos y qué acciones debe tomar bajo una variada gama de circunstancias. Todo esto, a través de un lenguaje que intenta estar relativamente próximo al lenguaje

32 Si bien puede seleccionarse la forma pura de estos paradigmas al momento de progra- mar, en la práctica es habitual que se mezclen, dando lugar a la programación multipara- digma o lenguajes de programación multiparadigma. 33 La ingeniería de Software es la aplicación de un enfoque sistemático, disciplinado y cuanti…cable al desarrollo, operación y mantenimiento de Software y el estudio de estos enfoques, es decir, el estudio de las aplicaciones de la ingeniería al Software. Integra matemáticas, ciencias de la computación y prácticas cuyos orígenes se encuentran en la ingeniería. [email protected] 122 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM humano o natural. Una característica relevante de los lenguajes de progra- mación es precisamente que más de un programador pueda usar un conjunto común de instrucciones que sean comprendidas entre ellos para realizar la construcción de un programa de forma colaborativa.

Variables son títulos asignados a espacios en memoria para almacenar datos especí…cos. Son contenedores de datos y por ello se diferencian según el tipo de dato que son capaces de almacenar. En la mayoría de lenguajes de programación se requiere especi…car un tipo de variable concreto para guardar un dato especí…co. A continuación, un listado con los tipos de varia- bles más comunes:

Tipo de dato Breve descripción Char Contienen un único carácter Int Contienen un número entero F loat Contienen un número decimal String Contienen cadenas de texto Boolean Solo pueden contener34verdadero o falso

Condicionales son estructuras de código que indican que, para que cierta parte del programa se ejecute, deben cumplirse ciertas premisas; por ejemplo: que dos valores sean iguales, que un valor exista, que un valor sea mayor que otro. Estos condicionantes por lo general solo se ejecutan una vez a lo largo del programa. Los condicionantes más conocidos y empleados en programación son:

If: Indica una condición para que se ejecute una parte del programa.  Else if: Siempre va precedido de un "If" e indica una condición para que  se ejecute una parte del programa siempre que no cumpla la condición del if previo y sí se cumpla con la que el "else if" especi…que.

Else: Siempre precedido de "If" y en ocasiones de "Else If". Indica que  debe ejecutarse cuando no se cumplan las condiciones previas.

34 En el caso de variables booleanas, el cero es considerado para muchos lenguajes como el literal falso ("False"), mientras que el uno se considera verdadero ("True").

[email protected] 123 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Bucles son parientes cercanos de los condicionantes, pero ejecutan cons- tantemente un código mientras se cumpla una determinada condición. Los más frecuentes son:

For: Ejecuta un código mientras una variable se encuentre entre 2  determinados parámetros.

While: Ejecuta un código mientras que se cumpla la condición que  solicita.

Hay que decir que a pesar de que existan distintos tipos de bucles, todos son capaces de realizar exactamente las mismas funciones. El empleo de uno u otro depende, por lo general, del gusto del programador.

Funciones estas se crearon para evitar tener que repetir constante- mente fragmentos de código. Una función podría considerarse como una variable que encierra código dentro de sí. Por lo tanto cuando accedemos a dicha variable (la función), en realidad lo que estamos haciendo es ordenar al programa que ejecute un determinado código prede…nido anteriormente. Todos los lenguajes de programación tienen algunos elementos de forma- ción primitivos para la descripción de los datos y de los procesos o transfor- maciones aplicadas a estos datos — tal como la suma de dos números o la selección de un elemento que forma parte de una colección— . Estos elemen- tos primitivos son de…nidos por reglas sintácticas y semánticas que describen su estructura y signi…cado respectivamente.

Implementación de un Lenguaje de Programación Es la que provee una manera de que se ejecute un programa para una determinada combinación de Software y Hardware. Existen básicamente dos maneras de implementar un lenguaje:

Compilación: es el proceso que traduce un programa escrito en un  lenguaje de programación a otro lenguaje de programación, generando un programa equivalente que la máquina será capaz interpretar. Los programas traductores que pueden realizar esta operación se llaman compiladores. Estos, como los programas ensambladores avanzados, pueden generar muchas líneas de código de máquina por cada proposi- ción del programa fuente. [email protected] 124 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Interpretación: es una asignación de signi…cados a las fórmulas bien  formadas de un lenguaje formal. Como los lenguajes formales35 pueden de…nirse en términos puramente sintácticos, sus fórmulas bien formadas pueden no ser más que cadenas de símbolos sin ningún signi…cado. Una interpretación otorga signi…cado a esas fórmulas.

Para ayudar al programador es común el uso de editores de texto o am- bientes integrados de desarrollo que permiten resaltar los elementos de la sintaxis con colores diferentes para facilitar su lectura. A la forma visible de un lenguaje de programación se le conoce como sintaxis. La mayoría de los lenguajes de programación son puramente textuales, es decir, utilizan secuencias de texto que incluyen palabras, números y puntuación, de ma- nera similar a los lenguajes naturales escritos. Por otra parte, hay algunos lenguajes de programación que son más grá…cos en su naturaleza, utilizando relaciones visuales entre símbolos para especi…car un programa. La sintaxis de un lenguaje de programación describe las combinaciones posibles de los símbolos que forman un programa sintácticamente correcto. El signi…cado que se le da a una combinación de símbolos es manejado por su semántica — ya sea formal o como parte del código duro36 de la referencia de implementación— . La sintaxis de los lenguajes de programación es de…nida generalmente utilizando una combinación de expresiones regulares — para la estructura léxica— y la Notación de Backus-Naur37 para la estructura gramática.

35 En matemáticas, lógica y ciencias de la computación, un lenguaje formal es un lenguaje cuyos símbolos primitivos y reglas para unir esos símbolos están formalmente especi…cados. Al conjunto de los símbolos primitivos se le llama alfabeto (o vocabulario) del lenguaje, y al conjunto de las reglas se le llama gramática formal (o sintaxis). A una cadena de símbolos formada de acuerdo a la gramática se le llama fórmula bien formada (o palabra) del lenguaje. Estrictamente hablando, un lenguaje formal es idéntico al conjunto de todas sus fórmulas bien formadas. A diferencia de lo que ocurre con el alfabeto (que debe ser un conjunto …nito) y con cada fórmula bien formada (que debe tener una longitud también …nita), un lenguaje formal puede estar compuesto por un número in…nito de fórmulas bien formadas. 36 Hard-Code, término del mundo de la informática que hace referencia a una mala práctica en el desarrollo de Software que consiste en incrustar datos directamente (a fuego) en el código fuente del programa, en lugar de obtener esos datos de una fuente externa como un …chero de con…guración o parámetros de la línea de comandos, o un archivo de recursos. 37 La notación de Backus-Naur, también conocida por sus denominaciones inglesas Backus-Naur form (BNF), Backus-Naur formalism o Backus normal form, es un meta- [email protected] 125 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Objetivos a Cumplir en el Código Generado Para escribir progra- mas que proporcionen los mejores resultados, cabe tener en cuenta una serie de objetivos, entre los que destacan:

Corrección: Un programa es correcto si hace lo que debe hacer tal y  como se estableció en las fases previas a su desarrollo. Para determi- nar si un programa hace lo que debe, es muy importante especi…car claramente qué debe hacer el programa antes de desarrollarlo y, una vez acabado, compararlo con lo que realmente hace. Claridad: Es muy importante que el programa sea lo más claro y legi-  ble posible, para facilitar así su desarrollo y posterior mantenimiento. Al elaborar un programa se debe intentar que su estructura sea sencilla y coherente, así como cuidar el estilo en la edición; de esta forma se ve facilitado el trabajo del programador, tanto en la fase de creación como en las fases posteriores de corrección de errores, ampliaciones, modi…caciones, etc. Fases que pueden ser realizadas incluso por otro programador, con lo cual la claridad es aún más necesaria para que otros programadores puedan continuar el trabajo fácilmente. E…ciencia: Se trata de que el programa, además de realizar aquello para  lo que fue creado — es decir, que sea correcto— , lo haga gestionando de la mejor forma posible los recursos que utiliza. Normalmente, al hablar de e…ciencia de un programa, se suele hacer referencia al tiempo que tarda en realizar la tarea para la que ha sido creado y a la cantidad de memoria que necesita, pero hay otros recursos que también pueden ser de consideración al obtener la e…ciencia de un programa, depen- diendo de su naturaleza — espacio en disco que utiliza, trá…co de red que genera, etc.— . Portabilidad: Un programa es portable cuando tiene la capacidad de  poder ejecutarse en una plataforma, ya sea Hardware o Software, dife- rente a aquella en la que se elaboró. La portabilidad es una caracterís- tica muy deseable para un programa, ya que permite, por ejemplo, a un programa que se ha desarrollado para sistemas GNU/Linux ejecutarse también en la familia de sistemas operativos Windows. Esto permite que el programa pueda llegar a más usuarios más fácilmente. lenguaje usado para expresar gramáticas libres de contexto: es decir, una manera formal de describir lenguajes formales. [email protected] 126 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Integridad: Un programa tiene integridad si es posible controlar su uso,  el grado con que se puede controlar el acceso al Software o a los datos a personas no autorizadas denotará su integridad.

Facilidad de uso: Un programa tiene facilidad de uso si el esfuerzo  requerido es mínimo o moderado para aprender el manejo de una apli- cación, trabajar con ella, introducir datos y conseguir resultados.

Facilidad de mantenimiento: Un programa tiene facilidad de manteni-  miento si el esfuerzo requerido para localizar y reparar errores es mode- rado o mínimo.

Flexibilidad: Un programa tiene ‡exibilidad si el esfuerzo requerido  para modi…car y/o añadir funcionalidades a una aplicación en fun- cionamiento es moderado o mínimo.

Reusabilidad: Es el grado en que un programa o porción de este es  reusable en otras aplicaciones.

Interoperatibilidad: Un programa debe poder comunicarse con otras  aplicaciones o sistemas informáticos, el esfuerzo necesario para ello medirá su interoperatibilidad.

Existe una gran variedad de lenguajes de programación y su grado de uso depende de diversos factores, entre los que destacan: C, C++, Java y Python.

7.1 Conceptos Transversales En esta sección comentaremos algunos conceptos transversales a los distintos paradigmas de programación y a los lenguajes que los implementan.

Abstracción Entendiendo un sistema como una abstracción de la realidad, los datos son las entidades que representan cada uno de los aspectos de la realidad que son signi…cativos para el funcionamiento del sistema. Para que tenga sentido como abstracción de la realidad, cada dato implica un determinado valor y requiere de una convención que permita representarlo sin ambigüedad y procesarlo de una manera con…able. [email protected] 127 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

En la misma línea, la lógica del procesamiento de los datos es también una abstracción de los procesos que suceden en la realidad que conforma el dominio de la aplicación. El proceso de abstraerse progresivamente de los detalles y así manejar niveles de abstracción, es el que permite construir sistemas complejos. Las unidades de Software que realizan la funcionalidad del sistema re- quieren también de convenciones y criterios de ordenamiento y articulación interna tanto para un funcionamiento con…able y e…ciente del sistema, como para que el proceso de construcción y mantenimiento del Software sea de la forma más simple posible.

Modularización, Encapsulamiento y Delegación Una estrategia cen- tral de la programación es buscar la manera de organizar y distribuir la funcionalidad de un sistema complejo en unidades más pequeñas de Software con que se responsabilizan de tareas especí…cas y que interactúan entre ellas. Estas unidades reciben nombres diferentes según cada lenguaje de progra- mación, como rutinas, funciones, procedimientos, métodos, predicados, sub- programas, bloques, entidades, siendo "módulos" una de las más frecuentes y que dan origen al término. La clave de cada módulo es no conocer el funcionamiento interno de los demás módulos con los que interactúa, sino sólo su interfaz, es decir, la forma en que debe enviarle información adicional en forma de parámetros y cómo va a recibir las respuestas. Esta propiedad recibe diversos nombres, como el de encapsulamiento, ocultación de información o "caja negra". Ante la modi…cación de una funcionalidad en particular del sistema, en la medida que su implementación esté encapsulada en un módulo, el impacto que produce su cambio no afectará a los otros módulos que interactúan con el. En concordancia con la distribución de responsabilidades entre las dife- rentes unidades de Software, la delegación consiste en la invocación que desde un módulo se efectúa a otro módulo, de manera que el que invoca indica de forma explicita qué es lo que pretende y el que es invocado se ocupa de todo lo necesario para realizarlo. Puede realizarse de numerosas maneras, variando el criterio de distribución de responsabilidades, el modo de evaluación, la forma de paso de parámetros, los tipos de datos que utiliza, de acuerdo a las posibilidades y restricciones de cada lenguaje y paradigma.

[email protected] 128 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Declaratividad La declaratividad, en términos generales, se basa en la separación del conocimiento sobre la de…nición del problema con la forma de buscar su solución, una separación entre la lógica y el control. En un programa declarativo se especi…can un conjunto de declaraciones, que pueden ser proposiciones, condiciones, restricciones, a…rmaciones, o ecua- ciones, que caracterizan al problema y describen su solución. A partir de esta información el sistema utiliza mecanismos internos de control, comúnmente llamado "motores", que evalúan y relacionan adecuadamente dichas especi- …caciones, la manera de obtener la solución. De esta forma, en vez de ser una secuencia de órdenes, un programa es un conjunto de de…niciones sobre el dominio del problema. Basándose en la noción de delegación, la declaratividad plantea como criterio para distribuir las responsabilidades, separar las relacionadas con modelar o de…nir el conocimiento del problema de aquellas de manipular ese conocimiento para alcanzar un objetivo concreto. En otras palabras, distinguir el "qué" del "cómo". La declaratividad brinda la posibilidad de usar una misma descripción en múltiples contextos en forma independiente de los motores que se utilicen. Permite focalizar por un lado en las cuestiones algorítmicas del motor, por ejemplo para trabajar en forma uni…cada sobre e…ciencia, y por otro en la de…nición del dominio del problema y la funcionalidad de la aplicación en sí. La noción opuesta, aunque en cierta medida complementaria, de la decla- ratividad, puede denominarse "proceduralidad". Los programas procedurales se construyen indicando explícitamente la secuencia de ejecución en la que se procesan los datos y obtienen los resultados. Para ello se detalla un conjunto de sentencias, ordenadas mediante estructuras de control como decisiones, iteraciones y secuencias, que conforman "algoritmos". En un sistema complejo, no se puede hablar de declaratividad o proce- duralidad como conceptos excluyentes o totalizantes, sino que coexisten y se relacionan en una permanente tensión. Dependiendo de los lenguajes y de las herramientas que se utilicen, y en particular del diseño del sistema, habrá partes del sistema que por su sentido o ubicación dentro del sistema global serán más declarativas o procedurales que otras, logrando con ello aprovechar las ventajas respectivas.

[email protected] 129 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Tipos de Datos Un tipo de dato, o como también es llamado, un tipo abs- tracto de dato, es un conjunto de valores y de operaciones asociadas a ellos. La utilización de diversos tipos de datos permite la agrupación o clasi…cación del gran volumen y variedad de valores que es necesario representar y operar en un sistema, según sus semejanzas y diferencias. Tomando como criterio las similitudes en cuanto al contenido de lo que representan, una primera condición es la existencia de un conjunto de valores o entidades homogéneos en su representación. Otra condición es que los elementos del mencionado conjunto se comporten en forma uniforme respecto a una serie de operaciones. Cada paradigma de programación, y en particular cada lenguaje, tiene su forma de determinar tanto la conformación de cada tipo de dato, con sus va- lores y operaciones, como la forma en que se relacionan entre sí conformando un sistema de tipo de datos. En un lenguaje fuertemente tipado, toda variable y parámetro deben ser de…nidos de un tipo de dato en particular que se mantiene sin cambios durante la ejecución del programa, mientras que en uno débilmente tipado no, sino que pueden asumir valores y tipos de datos diferentes durante la ejecución del programa. El tipo de dato al que pertenece una entidad determina la operatoria que se puede realizar con el. Una tarea que realizan muchos de los lenguajes de programación como forma de su mecanismo interno es el chequeo del tipo de dato de las entidades del programa. Esta acción se realiza de diferentes maneras, con mayor o menor ‡exibilidad, y en diferentes momentos, como la compilación o la ejecución del programa, y en otros no se realiza. De todas maneras, el tipo de datos permite entender qué entidades tienen sentido en un contexto, independientemente de la forma de chequeo o si el tipado es débil o fuerte. Por ejemplo, a un bloque de Software que recibe como argumento una variable, conocer de qué tipo de dato es, le permite saber qué puede hacer con ella.

Estructuras de Datos Los valores atómicos, es decir, aquellos que no pueden ser descompuestos en otros valores, se representan mediante tipos de datos simples. En contrapartida, en un tipo de dato compuesto los valores están com- puestos a su vez por otros valores, de manera que conforma una estructura de datos. Cada uno de los valores que forman la estructura de datos corresponde [email protected] 130 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM a algún tipo de dato que puede ser tanto simple como compuesto. Su utilidad consiste en que se pueden procesar en su conjunto como una unidad o se pueden descomponer en sus partes y tratarlas en forma indepen- diente. En otras palabras, las estructuras de datos son conjuntos de valores.

Polimor…smo y Software Genérico El polimor…smo es un concepto para el que se pueden encontrar numerosas y diferentes de…niciones. En un sentido amplio, más allá de las especi…cidades de cada paradigma y del alcance que se le dé a la de…nición del concepto desde la perspectiva teórica desde la que se le aborde, el objetivo general del polimor…smo es construir piezas de Software genéricas que trabajen indistintamente con diferentes tipos de entidades, para otra entidad que requiere interactuar con ellas; en otras palabras, que dichas entidades puedan ser intercambiables. Mirando con mayor detenimiento los mecanismos que se activan y sus consecuencias para el desarrollo de sistemas, se pueden distinguir dos grandes situaciones. Hay polimor…smo cuando, ante la existencia de dos o más bloques de Software con una misma interfaz, otro bloque de Software cualquiera puede trabajar indistintamente con ellos. Esta noción rescata la existencia de tantas implementaciones como diferentes tipos de entidades con que se interactúe. Una entidad emisora puede interactuar con cualquiera de las otras en- tidades de acuerdo a las características de la interfaz común, y la entidad receptora realizará la tarea solicitada de acuerdo a la propia implementación que tenga de…nida, independientemente de las otras implementaciones que tengan las otras entidades. Consistentemente con la noción de delegación, la entidad emisora se desentiende de la forma en que las otras entidades implementaron sus respuestas, ya sea igual, parecida o totalmente diferente. Analizando el concepto desde el punto de vista de las entidades que res- ponden a la invocación, el proceso de desarrollo debe contemplar la variedad y especi…cidad de cada una para responder adecuadamente a lo que se les solicita. Desde el punto de vista de la entidad que invoca, el proceso es transparente, y es en de…nitiva esta, la que se ve bene…ciada por el uso del concepto. Otra forma de obtener un bloque de Software genérico es ante el caso en que las entidades con las que el bloque quiere comunicarse, en vez de tener diferentes implementaciones, aún siendo de diferente tipo, sean lo su…ciente- mente similares para compartir una misma y única implementación. Desde el punto de vista de la entidad que invoca, el proceso continúa [email protected] 131 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM siendo transparente y sigue aprovechando los bene…cios de haber delegado la tarea y haberse despreocupado de qué tipo de entidad es la receptora. En este caso, el concepto de polimor…smo se relaciona o se basa en la coexistencia de herencia, de variables de tipo de dato o en las formas débiles de declaración y chequeo de tipos de datos, dependiendo de las diferentes herramientas de cada paradigma.

Asignación y Uni…cación La asignación destructiva es una operación que consiste en cambiar la información representada por una variable, de forma tal que si se consulta su valor antes y después de dicha operación, se obtiene un resultado distinto. Estas asignaciones se realizan repetitivamente sobre la misma celda de memoria, remplazando los valores anteriores. La asignación determina el estado de una variable, que consiste en el valor que contiene en un momento en particular. La asignación destructiva es la forma más usual de provocar efecto de lado, pero no la única, ya que, dependiendo de los lenguajes, hay otro tipo de instrucciones que también permiten modi…car el estado de información de un sistema. La uni…cación es un mecanismo por el cual una variable que no tiene valor, asume un valor. Una vez uni…cada, o "ligada", como también se le , una variable no cambia su valor, por lo que no existe la noción de es- tado. La duración de la uni…cación está condicionado por el alcance que tienen las variables en cada lenguaje en particular, pudiendo una variable uni…carse con varios valores alternativos en diferentes momentos de la eje- cución del bloque de Software en el que se encuentran. Se suele denominar como "indeterminada" a una variable sin ligar o no uni…cada.

Modo de Evaluación Los parámetros que se utilizan en la invocación de un bloque de Software cualquiera pueden ser evaluados en diferentes momen- tos de acuerdo al modo de evaluación que utilice el lenguaje de programación. La evaluación ansiosa consiste en que los argumentos son evaluados antes de invocar al bloque de Software y es responsabilidad de la entidad que los invoca. La evaluación diferida plantea que la evaluación de los argumentos es res- ponsabilidad del bloque de Software invocado, quien decide el momento en que lo hará. Provoca que se di…era la evaluación de una expresión, permi- tiendo que en algunos casos, de acuerdo a cómo sea la implementación, no sea necesario evaluarla nunca, con el consiguiente bene…cio en términos de [email protected] 132 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM e…ciencia. La evaluación diferida es utilizada en cierto tipo de situaciones que serían consideradas erróneas o imposibles de resolver con la evaluación ansiosa, como por ejemplo los bucles o las listas in…nitas.

Orden Superior Asumiendo un esquema de un único orden, en un pro- grama existen por un lado datos y por otro los procedimientos — y todo bloque de Software— que trabajan con ellos, de manera tal que los proce- dimientos reciben datos como parámetros y devuelven datos como resulta- dos. La noción de orden superior plantea que los procedimientos son tratados como datos y en consecuencia pueden ser utilizados como parámetros, repre- sentados en variables, devueltas como resultados u operados en cálculos más complejos con otros datos. Se denomina de orden superior a los procedimien- tos que reciben como argumentos a otros procedimientos.

Recursividad La recursividad, entendida como iteración con asignación no destructiva, está relacionada con el principio de inducción. En general, un bloque de Software recursivo se de…ne con al menos un término recursivo, en el que se vuelve a invocar el bloque que se está de…niendo, y algún término no recursivo como caso base para detener la recursividad.

[email protected] 133 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

7.2 Algo de Programación Tipos de datos Dependiendo del lenguaje (véase [7], [8], [9] y [10]), la implementación del mismo y la arquitectura en la que se compile/ejecute el programa, se tienen distintos tipos de datos, pero los básicos son38:

char, 8 bits, rango de -128 a 127  unsigned char, 8 bits, rago de 0 a 255  int, 16 bits, rango de -32,768 a 32,767  unsigned int, 16 bits, rango de 0 a 65,535  long int, 32 bits, rango de -2,147,483,648 a 2,147,483,647  long, 64 bits, rango de -9,223,372,036,854,775,808 a 9,223,372,036,854,775,807  ‡oat, 32 bits, rango de -3.4x1038 a 3.4x1038, con 14 dígitos de precisión  double, 64 bits, rango de -1.7x10308 a 1.7x10308, con 16 dígitos de precisión  4932 4932 long double, 80 bits, 3.4x10 a 3.4x10 , con 18 dígitos de precisión  boolean, 1 bit, rango de True o False  La conversión entre los diferentes tipos de datos esta en función del lenguaje y existe una perdida de datos si se hace de un tipo de dato que no "quepa" en el rango del otro; estos y otros errores de programación han generado graves errores en el sistema automatizado de control que han de- sembocado por ejemplo en, misiones fallidas de cohetes espaciales y su carga en numerosas ocasiones39, la quiebra de la empresa Knight Capital 2012, sobredosis de radioterapia en 1985 a 1987, la desactivación de servidores de Amazon en el 2012, el apagón en el noreste de EE.UU. en el 2003, fallo en el sistema de reserva de vuelos de American Airlines en el 2013, fallo en el sistema de misiles estadounidense Patriot en Dhahran en el 1991, etc.

38 La precedencia de los operadores básicos son: = el de mayor procedencia, siguen y + unario, luego ; =; % y …nalmente los operadores + y . 39 Una de las pérdidas, fue el satélite mexicano Centenario en mayo del 2015.

[email protected] 134 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Condicionales El ‡ujo de programas a menudo tiene que dividirse. Es decir, si una condición se cumple, se hace algo, y si no, se hace otra cosa. Los enunciados condicionales permiten cambiar el comportamiento del programa de acuerdo a una condición dada, la estructura básica de un condicional es: Pseudocódigo: Si entonces Ejemplo en C, C++ y Java40: if (x > 0) x*= 10; if (x > 0) { x *= 10; } Ejemplo en Python: if x > 0: x = x * 10

La estructura completa del condicional es: Pseudocódigo: Si entonces else Ejemplo en C, C++ y Java: if (x % 2 == 0) x = x * x; else x = x * 2; if (x % 2 == 0) { x = x * x; } else { x = x * 2; }

40 En condicionales, tienen mayor precedencia <; >; >=; <=, luego están == y ! =, …nalmente && (AND) y (OR). jj [email protected] 135 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Ejemplo en Python:

if x % 2 == 0: x = x * x else: x = x * 2

La estructura condicional encadenada es: Pseudocódigo:

Si entonces else if else

Ejemplo en C, C++ y Java:

if (x < y) { z = x; } else if (x > y) { z = y; } else { z = 0; }

Ejemplo en Python:

if x < y: z = x elif41 x > y: z = y else: z = 0 41 elif es una contracción de "else if", sirve para enlazar varios "else if", sin tener que aumentar las tabulaciones en cada nueva comparación. [email protected] 136 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Condicionales con operadores lógicos, tenemos dos operadores lógicos el AND (&&) y el OR ( ), ejemplos: Pseudocódigo: jj

Si entonces else

Ejemplo en C, C++ y Java:

if (x % 2 == 0 x > 0) x = x * x; else x = x * 2; jj

if (x % 2 == 0 && x > 0) { x = x * x; } else { x = x * 2; }

Ejemplo en Python:

if x % 2 == 0 and x > 0: x = x * x else: x = x * 2

Bucle for La implementación de bucles mediante el comando for per- mite ejecutar el código que se encuentre entre su cuerpo mientras una variable se encuentre entre 2 determinados parámetros, la estructura básica es: Pseudocódigo:

for entonces

Ejemplo en C, C++ y Java:

for (x = 0; x < 21; x++) { z = z + x; } [email protected] 137 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Ejemplo en Python:

for x in range(0, 21) z = z + x

Bucle while La implementación de bucles mediante el comando while permite ejecutar el código que se encuentre entre su cuerpo mientras una condición se cumple, la estructura básica es: Pseudocódigo:

while entonces

Ejemplo en C, C++ y Java:

while (z < 20) { z = z + x; }

Ejemplo en Python:

while z < 20: z = z + x

Bucle do-while La implementación de bucles mediante el comando do- while permite ejecutar el código que se encuentre entre su cuerpo y después revisa si se cumple la condición para continuar el ciclo, se puede usar do-while en C, C++ y Java, pero no esta presente en Python. La estructura básica es: Pseudocódigo:

do while

Ejemplo en C, C++ y Java:

do { z = z + x; } while (z < 20); [email protected] 138 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Condicional switch Cuando se requiere hacer un condicional sobre una variable y que esta tenga varias alternativas, una opción para evitar una cadena de sentencias if-else, se puede usar switch en C, C++ y Java, pero no esta presente en Python. La estructura básica es: Pseudocódigo:

switch(expresion) { case constante: break; case constante: break; . . . default: }

son opcionales los break y el default.

Ejemplo en C, C++ y Java:

switch(i) { case 1: x=23; case 2: x ++; break; default: x=0; }

[email protected] 139 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Primer ejemplo Como ya se ha hecho costumbre, el primer ejemplo de un programa es: Hola Mundo, así que iniciemos con ello creando el archivo correspondiente hola.ext 42 en cualquier editor de texto o en un IDE, entonces: Ejemplo en C:

#include int main(void) { printf("Hello World n"); return 0; n }

para compilarlo usamos gcc en línea de comandos (véase 15.3) mediante:

$ gcc hola.c -o hola

y lo ejecutamos con:

$ ./hola

Ejemplo en C++:

#include int main() { std::cout << "Hello World! n"; } n

para compilarlo usamos g++ en línea de comandos mediante:

$ g++ hola.cpp -o hola

y lo ejecutamos con:

$ ./hola

42 La extensión depende del lenguaje de programación, para el lenguaje C la extensión es .c, para el lenguaje C++ la extensión es .cpp, para el lenguaje Java la extensión es .java, para el lenguaje Python la extensión es .py. [email protected] 140 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Ejemplo en Java:

class hola { public static void main(String[] args) { System.out.println("Hello world!"); } }

para compilarlo usamos javac en línea de comandos mediante:

$ javac hola.java

y lo ejecutamos con:

$ java hola

Ejemplo en Python 2:

print "Hello World n" n para compilarlo y ejecutarlo usamos python2 en línea de comandos me- diante:

$ python2 hola.py

Ejemplo en Python 3:

print ("Hello World n") n para compilarlo y ejecutarlo usamos python3 en línea de comandos me- diante:

$ python3 hola.py

[email protected] 141 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Un Ejemplo de Cálculo de Primos El algoritmo más simple, para de- terminar si un número es primo o compuesto, es hacer una serie de divisiones sucesivas del número, con todos los números primos menores que él, si alguna división da como residuo 0 o es divisible con el número entonces es compuesto en caso contrario es primo.

Iniciamos con el número 4  Veri…camos si es divisible con los primos almacenados (iniciamos con 2  y 3)

Si es divisible con algún número primo entonces es compuesto, en caso  contrario es primo y este se guarda como un nuevo primo

se incrementa uno al número y se regresa a veri…car si es divisible  entre los números primos almacenados, hasta encontrar por ejemplo los primeros mil primos

Ejemplo en C y C++:

#include // NPB Numero de primos a buscar #de…ne NPB 1000 int main () { int n, i, np; int p[NPB]; // Guarda los primeros 2 primos p[0] = 2; p[1] = 3; np = 2; // Empieza la busqueda de primos a partir del numero 4 n = 4; // Ciclo para buscar los primeros NPB primos while (np < NPB) { for (i = 0; i < np; i++) { if((n % p[i]) == 0) break; [email protected] 142 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

} if(i == np) { p[i] = n; np++; } n++; } // Visualiza los primos encontrados printf(" nVisualiza los primeros %d primos n", NPB); for (i =n 0; i < NPB; i++) n printf("%d n", p[i]); return 0; n }

Ejemplo en Java:

public class CalPrimos { public static void main(String[] args) { // NPB Numero de primos a buscar int NPB = 1000; int n, i, np; int p[] = new int[NPB]; // Guarda los primeros 2 primos p[0] = 2; p[1] = 3; np = 2; // Empieza la busqueda de primos a partir del numero 4 n = 4; // Ciclo para buscar los primeros NPB primos while (np < NPB) { for (i = 0; i < np; i++) { if((n % p[i]) == 0) break; } if (i == np) { p[i] = n; np++; } [email protected] 143 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

n++; } // Visualiza los primos encontrados System.out.println("Visualiza los primeros " + NPB + " primos"); for (i = 0; i < NPB; i++) System.out.println(p[i]); } }

Nótese que el algoritmo para buscar primos de los lenguajes C, C++ y el de Java son muy similares salvo la declaración de la función inicial y el arreglo que contendrá a los primos. Esto deja patente la cercanía entre dichos lenguajes y por que en este trabajo los presentamos en forma conjunta. Ejemplo en Python:

def cribaEratostenes(N): p = [] # inicializa el arreglo de primos encontrados # Guarda los primeros 2 primos p.append(2) p.append(3) np = 2 # Empieza la busqueda de primos a partir del numero 4 n = 4 #Ciclo para buscar los primeros N primos while np < N: xi = 0 for i in p:43 xi = xi + 1 if (n % i) == 0: break if xi == np: p.append(n) np = np + 1 n = n + 1 # Visualiza los primos encontrados

43 En este código, al usar el for sobre los elementos del arreglo de primos, es necesario usar un contador para saber si ya se recorrieron todos los primos existentes y así determinar si es un nuevo primo y agregarlo a la lista. [email protected] 144 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

print("Visualiza los primeros " + str(N) + " primos ") for i in range(np): print(p[i]) return p # Solicita el calculo de los primeros primos P = cribaEratostenes(1000) print(P) Otro ejemplo en Python: def cribaEratostenes(N): p = [] # inicializa el arreglo de primos encontrados # Guarda los primeros 2 primos p.append(2) p.append(3) np = 2 # Empieza la busqueda de primos a partir del numero 4 n = 4 #Ciclo para buscar los primeros N primos while np < N: for i in range(np):44 if (n % p[i]) == 0: break if i == np-1: p.append(n) np = np + 1 n = n + 1 # Visualiza los primos encontrados print("Visualiza los primeros " + str(N) + " primos ") for i in range(np): print(p[i]) return p # Solicita el calculo de los primeros primos P = cribaEratostenes(1000) print(P)

44 Aquí, se hace el recorrido sobre el arreglo de primos usando la indexación sobre sus elementos, usando el número de elementos que se tiene mediante el uso del for con un range. [email protected] 145 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

7.3 Introducción a los Paradigmas de Programación La construcción de programas de cómputo — Software— puede involucrar elementos de gran complejidad, que en muchos casos no son tan evidentes como los que se pueden ver en otras Ciencias e Ingenierías. Un avión, una mina, un edi…cio, una red de ferrocarriles son ejemplos de sistemas complejos de otras Ingenierías, pero el programador construye sistemas cuya compleji- dad puede parecer que permanece oculta. El usuario siempre supone que en informática todo es muy fácil — "apretar un botón y ya esta"— . Cuando se inicia uno en la programación, es común el uso de pequeños ejemplos, generalmente se programa usando una estructura secuencial — una instrucción sigue a la otra— en programas cortos45, cuando los ejemplos cre- cen se empieza a usar programación estructurada46 — que usa funciones— para después proseguir con ejemplos más complejos haciendo uso de la pro- gramación orientada a objetos — uso de clases y objetos— o formulaciones híbridas de las anteriores47. A continuación delinearemos estos paradigmas de programación:

Programación Secuencial es un paradigma de programación en la que una instrucción del código sigue a otra en secuencia también conocido como código espagueti. Las tareas se suceden de tal modo que la salida de una es la entrada de la siguiente y así sucesivamente hasta el …n del programa.

45 Los ejemplos no son complejos, suelen estar construidos y mantenidos por una o pocas personas, son códigos de cientos o miles de líneas y tienen un ciclo de vida corto. Además, se puede construir aplicaciones alternativas en un período razonable de tiempo y no se necesitan grandes esfuerzos en anális y diseño. 46 Al crecer la complejidad del Software a desarrollar, es muy difícil o imposible que un desarrollador o un grupo pequeño de ellos pueda comprender todas las sutilidades de su diseño, para paliar los problemas que conlleva el desarrollo de grandes y complejos sistemas informáticos surge la programación orientada a objetos. 47 El surgimiento de la programación orientada objetos trata de lidiar con una gran canti- dad de requisitos que compiten entre sí, incluso contradiciéndose, tienen desacoplamientos de impedancias entre usuarios del sistema y desarrolladores y es común la modi…cación de los requisitos con el paso del tiempo pues los usuarios y desarrolladores comienzan a compenetrarse mejor. Así, la programación orientada a objetos permite dirigir un equipo grande de desarrolladores, manejar una gran cantidad de código, usar estándares de de- sarrollo — al igual que en otras ingenierías— y veri…car la …abilidad de los estándares existentes en el mercado.

[email protected] 146 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Programación Estructurada también llamada Procedimental, es un pa- radigma de programación orientado a mejorar la claridad, calidad y tiempo de desarrollo de un programa de computadora recurriendo únicamente a sub- rutinas y tres estructuras básicas: secuencia, selección (if y switch) e iteración (bucles for y while); así mismo, se considera innecesario y contraproducente el uso de la instrucción de transferencia incondicional, que podría conducir a código espagueti, mucho más difícil de seguir y de mantener, y fuente de numerosos errores de programación. Entre las ventajas de la programación estructurada sobre el modelo an- terior — hoy llamado despectivamente código espagueti— , cabe citar las si- guientes:

Los programas son más fáciles de entender, pueden ser leídos de forma  secuencial y no hay necesidad de tener que rastrear saltos de líneas dentro de los bloques de código para intentar entender la lógica interna.

La estructura de los programas es clara, puesto que las instrucciones  están más ligadas o relacionadas entre sí.

Se optimiza el esfuerzo en las fases de pruebas y depuración. El segui-  miento de los fallos o errores del programa (debugging), y con él su detección y corrección se facilita enormemente.

Se reducen los costos de mantenimiento. Análogamente a la depu-  ración, durante la fase de mantenimiento, modi…car o extender los pro- gramas resulta más fácil.

Los programas son más sencillos y más rápidos de confeccionar.  Se incrementa el rendimiento de los programadores.  Programación Orientada a Objetos (POO, u OOP según sus siglas en inglés) es un paradigma de programación que viene a innovar la forma de obtener resultados. El surgimiento de la programación orientada obje- tos trata de lidiar con una gran cantidad de requisitos que compiten entre sí, incluso contradiciéndose, tienen desacoplamientos de impedancias entre usuarios del sistema y desarrolladores y es común la modi…cación de los re- quisitos con el paso del tiempo pues los usuarios y desarrolladores comienzan a compenetrarse mejor. Así, la programación orientada a objetos permite [email protected] 147 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM dirigir un equipo grande de desarrolladores, manejar una gran cantidad de código, usar estándares de desarrollo — al igual que en otras ingenierías— y veri…car la …abilidad de los estándares existentes en el mercado. Los objetos manipulan los datos de entrada para la obtención de datos de salida especí…cos, donde cada objeto ofrece una funcionalidad especial. Los objetos son entidades que tienen un determinado «estado» , «compor- tamiento (método)» e «identidad» :

La identidad es una propiedad de un objeto que lo diferencia del resto;  dicho con otras palabras, es su identi…cador — concepto análogo al de identi…cador de una variable o una constante— .

Un objeto contiene toda la información que permite de…nirlo e identi…-  carlo frente a otros objetos pertenecientes a otras clases e incluso frente a objetos de una misma clase, al poder tener valores bien diferencia- dos en sus atributos. A su vez, los objetos disponen de mecanismos de interacción llamados métodos, que favorecen la comunicación entre ellos. Esta comunicación favorece a su vez el cambio de estado en los propios objetos. Esta característica lleva a tratarlos como unidades indivisibles, en las que no se separa el estado y el comportamiento.

Los métodos (comportamiento) y atributos (estado) están estrechamente  relacionados por la propiedad de conjunto. Esta propiedad destaca que una clase requiere de métodos para poder tratar los atributos con los que cuenta. El programador debe pensar indistintamente en ambos conceptos, sin separar ni darle mayor importancia a alguno de ellos. Hacerlo podría producir el hábito erróneo de crear clases contenedo- ras de información por un lado y clases con métodos que manejen a las primeras por el otro. De esta manera se estaría realizando una «programación estructurada camu‡ada» en un lenguaje de POO.

La programación orientada a objetos di…ere de la programación estruc- turada tradicional, en la que los datos y los procedimientos están separados y sin relación, ya que lo único que se busca es el procesamiento de unos datos de entrada para obtener otros de salida. La programación estructurada anima al programador a pensar sobre todo en términos de procedimientos o funciones, y en segundo lugar en las estructuras de datos que esos procedimientos mane- jan. En la programación estructurada solo se escriben funciones que procesan [email protected] 148 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM datos. Los programadores que emplean POO, en cambio, primero de…nen ob- jetos para luego enviarles mensajes solicitándoles que realicen sus métodos por sí mismos.

Conceptos fundamentales La programación orientada a objetos es una forma de programar que trata de encontrar solución a los problemas que genera el desarrollo de proyectos de tamaño mediano o grande y/o complejos. Introduce nuevos conceptos, que superan y amplían conceptos antiguos ya conocidos. Entre ellos destacan los siguientes:

Clase: se puede de…nir de las propiedades y comportamiento de un tipo  de objeto concreto. La instanciación es la lectura de estas de…niciones y la creación de un objeto a partir de ella.

Herencia: Por ejemplo, la herencia de la clase C a la clase D, es la facili-  dad mediante la cual la clase D hereda en ella cada uno de los atributos y operaciones de C, como si esos atributos y operaciones hubiesen sido de…nidos por la misma D. Por lo tanto, puede usar los mismos métodos y variables registrados como «públicos (public)» en C. Los compo- nentes registrados como «privados (private)» también se heredan pero se mantienen escondidos al programador y sólo pueden ser accedidos a través de otros métodos públicos. Para poder acceder a un atributo u operación de una clase en cualquiera de sus subclases pero mantenerla oculta para otras clases es necesario registrar los componentes como «protegidos (protected)» , de esta manera serán visibles en C y en D pero no en otras clases.

Objeto: La instancia de una clase. Entidad provista de un conjunto de  propiedades o atributos (datos) y de comportamiento o funcionalidad (métodos), los mismos que consecuentemente reaccionan a eventos. Se corresponden con los objetos reales del mundo que nos rodea, o con objetos internos del sistema (del programa).

Método: Es un algoritmo asociado a un objeto (o a una clase de obje-  tos), cuya ejecución se desencadena tras la recepción de un «mensaje» . Desde el punto de vista del comportamiento, es lo que el objeto puede hacer. Un método puede producir un cambio en las propiedades del objeto, o la generación de un «evento» con un nuevo mensaje para otro objeto del sistema. [email protected] 149 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Evento: Es un suceso en el sistema — tal como una interacción del  usuario con la máquina, o un mensaje enviado por un objeto— . El sistema maneja el evento enviando el mensaje adecuado al objeto per- tinente. También se puede de…nir como evento la reacción que puede desencadenar un objeto; es decir, la acción que genera.

Atributos: Características que tiene la clase.  Mensaje: Una comunicación dirigida a un objeto, que le ordena que  ejecute uno de sus métodos con ciertos parámetros asociados al evento que lo generó.

Propiedad o atributo: Contenedor de un tipo de datos asociados a un  objeto (o a una clase de objetos), que hace los datos visibles desde fuera del objeto y esto se de…ne como sus características predeterminadas, y cuyo valor puede ser alterado por la ejecución de algún método.

Estado interno: Es una variable que se declara privada, que puede ser  únicamente accedida y alterada por un método del objeto, y que se utiliza para indicar distintas situaciones posibles para el objeto (o clase de objetos). No es visible al programador que maneja una instancia de la clase.

Componentes de un objeto: Atributos, identidad, relaciones y métodos.  Identi…cación de un objeto: Un objeto se representa por medio de  una tabla o entidad que esté compuesta por sus atributos y funciones correspondientes.

Características de la POO Existe un acuerdo acerca de qué carac- terísticas contempla la «orientación a objetos» . Las características siguientes son las más importantes:

Abstracción: Denota las características esenciales de un objeto, donde  se capturan sus comportamientos. Cada objeto en el sistema sirve como modelo de un «agente» abstracto que puede realizar trabajo, in- formar y cambiar su estado, y «comunicarse» con otros objetos en el sistema sin revelar «cómo» se implementan estas características. Los procesos, las funciones o los métodos pueden también ser abstraídos, [email protected] 150 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

y, cuando lo están, una variedad de técnicas son requeridas para am- pliar una abstracción. El proceso de abstracción permite seleccionar las características relevantes dentro de un conjunto e identi…car compor- tamientos comunes para de…nir nuevos tipos de entidades en el mundo real. La abstracción es clave en el proceso de análisis y diseño orientado a objetos, ya que mediante ella podemos llegar a armar un conjunto de clases que permitan modelar la realidad o el problema que se quiere atacar.

Encapsulamiento: Signi…ca reunir todos los elementos que pueden con-  siderarse pertenecientes a una misma entidad, al mismo nivel de abs- tracción. Esto permite aumentar la cohesión (diseño estructurado) de los componentes del sistema.

Polimor…smo: Comportamientos diferentes, asociados a objetos distin-  tos, pueden compartir el mismo nombre; al llamarlos por ese nombre se utilizará el comportamiento correspondiente al objeto que se esté usando. O, dicho de otro modo, las referencias y las colecciones de objetos pueden contener objetos de diferentes tipos, y la invocación de un comportamiento en una referencia producirá el comportamiento co- rrecto para el tipo real del objeto referenciado. Cuando esto ocurre en «tiempo de ejecución» esta última característica se llama asignación tardía o asignación dinámica.

Herencia: Las clases no se encuentran aisladas, sino que se relacio-  nan entre sí, formando una jerarquía de clasi…cación. Los objetos heredan las propiedades y el comportamiento de todas las clases a las que pertenecen. La herencia organiza y facilita el polimor…smo y el en- capsulamiento, permitiendo a los objetos ser de…nidos y creados como tipos especializados de objetos preexistentes. Estos pueden compartir (y extender) su comportamiento sin tener que volver a implementarlo. Esto suele hacerse habitualmente agrupando los objetos en clases y estas en árboles o enrejados que re‡ejan un comportamiento común. Cuando un objeto hereda de más de una clase se dice que hay herencia múltiple; siendo de alta complejidad técnica por lo cual suele recurrirse a la herencia virtual para evitar la duplicación de datos.

Modularidad: Se denomina «modularidad» a la propiedad que permite  subdividir una aplicación en partes más pequeñas (llamadas módulos), [email protected] 151 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

cada una de las cuales debe ser tan independiente como sea posible de la aplicación en sí y de las partes restantes. Estos módulos se pueden compilar por separado, pero tienen conexiones con otros módulos. Al igual que la encapsulación, los lenguajes soportan la modularidad de diversas formas.

Principio de ocultación: Cada objeto está aislado del exterior, es un  módulo natural, y cada tipo de objeto expone una «interfaz» a otros objetos que especí…ca cómo pueden interactuar con los objetos de la clase. El aislamiento protege a las propiedades de un objeto contra su modi…cación por quien no tenga derecho a acceder a ellas; solamente los propios métodos internos del objeto pueden acceder a su estado. Esto asegura que otros objetos no puedan cambiar el estado interno de un objeto de manera inesperada, eliminando efectos secundarios e interacciones inesperadas.

Recolección de basura: La recolección de basura (garbage collection)  es la técnica por la cual el entorno de objetos se encarga de destruir automáticamente, y por tanto desvincular la memoria asociada, los objetos que hayan quedado sin ninguna referencia a ellos. Esto signi…ca que el programador no debe preocuparse por la asignación o liberación de memoria, ya que el entorno la asignará al crear un nuevo objeto y la liberará cuando nadie lo esté usando.

Muchos de los objetos prediseñados de los lenguajes de programación ac- tuales permiten la agrupación en bibliotecas o librerías, sin embargo, muchos de estos lenguajes permiten al usuario la creación de sus propias bibliotecas. Está basada en varias técnicas, incluyendo herencia, cohesión, abstracción, polimor…smo, acoplamiento y encapsulamiento.

Recursión o Recursividad Un concepto que siempre le cuesta bastante a los programadores que están empezando es el de recursión o recursividad (se puede decir de las dos maneras). La recursividad consiste en funciones que se llaman a sí mismas, evitando el uso de bucles y otros iteradores. Uno ejemplo fácil de ver y que se usa a menudo es el cálculo del factorial de un número entero. El factorial de un número se de…ne como ese número multiplicado por el anterior, éste por el anterior, y así sucesivamente hasta [email protected] 152 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM llegar a 1. Así, por ejemplo, el factorial del número 5 sería: 5x4x3x2x1 = 120. Tomando el factorial como base para un ejemplo, ¿cómo podemos crear una función que calcule el factorial de un número? Bueno, existen multitud de formas. La más obvia quizá sería simplemente usar un bucle determinado para hacerlo, algo así en C:

long factorial(int n){ long res = 1; for(int i=n; i>=1; i- -) res = res * i; return res; }

Sin embargo hay otra forma de hacerlo sin necesidad de usar ninguna estructura de bucle que es mediante recursividad. Esta versión de la función hace exactamente lo mismo, pero es más corta, más simple y más elegante:

long factorial(int n) { long fact; if (n <= 1) return 1; return n*factorial(n-1); }

Aquí lo que se hace es que la función se llama a sí misma (eso es recur- sividad), y deja de llamarse cuando se cumple la condición de parada (en este caso que el argumento sea menor o igual que 1 que es lo que hay en el condicional).

Ventajas e inconvenientes ¿Ganamos algo al utilizar recursión en lugar de bucles/iteradores para casos como este? En este caso concreto del cálculo factorial no, y de hecho es una forma más lenta de hacerlo y ocupa más memoria. Esto no es preocupante en la realidad, pero conviene saberlo. Lo del factorial es solo una forma de explicarlo con un ejemplo sencillo y que sea fácil de entender. Pero entonces, si no ganamos nada en este caso ¿para qué sirve realmente la recursividad? Pues para resolver ciertos problemas de manera elegante y e…ciente. El ejemplo típico sería el recorrer un árbol de elementos para hacer algo con [email protected] 153 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM todos ellos. Imagínate un sistema de archivos con carpetas y subcarpetas y archivos dentro de estas carpetas, o el árbol de elementos de una página Web donde unos elementos incluyen a su vez otros y no sabes cuántos hay en cada uno. En este tipo de situaciones la manera más e…ciente de hacer una función que recorra todos los elementos es mediante recursión. Es decir, se crea una función que recorra todos los elementos hijo del nodo que se le pase y que se llame a sí misma para hacer lo mismo con los subnodos que haya. En el caso del sistema de archivos se le pasaría una carpeta y se llamaría a sí misma por cada subcarpeta que hubiese, y así sucesivamente con todas las demás. Con una sola llamada inicial recorrerá automáticamente toda la estructura del sistema de archivos. Con eso, y sin necesidad de complicarse, de repente se tiene una función muy poderosa capaz de enumerar cualquier estructura arbitraria por com- pleja que sea. Ahí es donde se ve el verdadero poder de la recursividad, aunque hay aplicaciones más potentes y más complejas todavía.

Detalles a Tener en Cuenta Otra cosa importante a tener en cuenta es que, cada vez que se hace una llamada a una función desde otra función (aunque sea a sí misma), se crea una nueva entrada en la pila de llamadas del intérprete. Esta tiene un espacio limitado por lo que puede llegar un punto en el que si se hacen demasiadas se sature y se produzca un error. A este error se le denomina "Desbordamiento de pila" o "Stack Over‡ow". Ahora ya sabemos de donde viene el nombre del famoso sitio para dudas de programadores sin el que la programación moderna no sería posible. Además, hay que tener mucho cuidado con la condición de parada. Esta se re…ere a la condición que se debe comprobar para determinar que ya no se harán más llamadas a la función. Es en ese momento en el que empiezan a devolverse los valores hacia "arriba", retornando a la llamada original. Si no tienes la condición de parada controlada pueden pasar varias cosas (todas malas), como por ejemplo:

Que se sature la pila y se produzca un desbordamiento  Que se ocupe cada vez más memoria  Que se produzcan desbordamientos de variables al ir acumulando re-  sultados.

[email protected] 154 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

7.4 Errores de Redondeo y de Aritmética en la Pro- gramación La aritmética que realiza una computadora es distinta de la aritmética de nuestros cursos de álgebra o cálculo. En nuestro mundo matemático tradi- cional consideramos la existencia de números con una cantidad in…nita de cifras, en la computadora cada número representable tienen sólo un número …nito, …jo de cifras (véase 7.2), los cuales en la mayoría de los casos es satis- factoria y se aprueba sin más, aunque a veces esta discrepancia puede generar problemas.

Un ejemplo de este hecho lo tenemos en el cálculo de raíces de:

ax2 + bx + c = 0 cuando a = 0, donde las raíces se calculan comúnmente con el algoritmo: 6 b + pb2 4ac b pb2 4ac x = y x = 1 2a 2 2a o de forma alternativa con el algoritmo que se obtiene mediante la raciona- lización del numerador: 2c 2c x1 = y x2 = b + pb2 4ac b pb2 4ac

Otro algoritmo que implementaremos es el método de Newton-Raphson en su forma iterativa: f(xi) xi+1 = xi f 0(xi)

en el cual se usa x0 como una aproximación a la raíz buscada y xn es la aproximación a la raíz (sí se converge a ella).

Salida del Cálculo de Raíces La implementación computacional se mues- tra en los programas desarrollados en distintos lenguajes (C, C++, Java y Python) usando diferentes paradigmas de programación ( secuencial, proce- dimental y orientada a objetos), todos ellos generan la siguiente salida: [email protected] 155 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Polinomio (1.000000) X^2 + (4.000000 )X + (1.000000) = 0

Chicharronera 1 Raiz (-0.2679491924311228), evaluacion raiz: -4.4408920985006262e-16 Raiz (-3.7320508075688772), evaluacion raiz: 0.0000000000000000e+00

Chicharronera 2 Raiz (-0.2679491924311227), evaluacion raiz: 0.0000000000000000e+00 Raiz (-3.7320508075688759), evaluacion raiz: -5.3290705182007514e-15

Metodo Newton-Raphson Valor inicial aproximado de X1 = -1.2679491924311228 Raiz (-0.2679491924311227), evaluacion raiz: 0.0000000000000000e+00 Valor inicial aproximado de X2 = -4.7320508075688759 Raiz (-3.7320508075688772), evaluacion raiz: 0.0000000000000000e+00

En esta salida se muestra la raíz calculada y su evaluación en la ecuación cuadrática, la cual debería de ser cero al ser una raíz, pero esto no ocurre en general por los errores de redondeo. Además, nótese el impacto de seleccionar el algoritmo numérico adecuado a los objetivos que persigamos en la solución del problema planteado.

En cuanto a la implementación computacional, el paradigma de progra- mación seleccionado depende la complejidad del algoritmo a implementar y si necesitamos reusar el código generado o no. Si lo que necesitamos implementar computacionalmente es una fórmula o conjunto de ellas que generen un código de decenas de líneas, la imple- mentación secuencial es su…ciente, si es menor a una centena de líneas puede ser mejor opción la implementación procedimental y si el proyecto es grande o complejo, seguramente se optará por la programación orientada a objetos o formulaciones híbridas de las anteriores.

En última instancia, lo que se persigue en la programación es generar un código: correcto, claro, e…ciente, de fácil uso y mantenimiento, que sea ‡exible, reusable y en su caso portable.

[email protected] 156 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Ejemplo en C Usando Programación Estructurada: Escribimos el código siguiente en cualquier editor y lo llamamos cuadratica.c:

#include #include

// Funcion cuadratica double f(double x, double a, double b, double c) { return (x * x * a + x * b + c); }

// Derivada de la funcion cuadratica double df(double x, double a, double b) { return (2.0 * x * a + b); }

// Evalua el valor X en la función cuadratica void evalua(double x, double a, double b, double c) { printf(" nRaiz (%1.16f), evaluacion raiz: %1.16e", x, (a * x * x n + b * x + c)); }

// Metodo Newton-Raphson // x = x - f(x)/f’(x) double metodoNewtonRapson(double x, int ni, double a, double b, double c) { int i; for (i = 0; i < ni; i++) { x = x - (f(x, a, b, c) / df(x, a, b)); } return x; }

// Funcion Principal .... int main() { // Coe…cientes del polinomio double A = 1.0, B = 4.0, C = 1.0; // Raices del polinomio [email protected] 157 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

double X1, X2, x; // Calculo del discriminante double d = B * B - 4.0 * A * C; // Raices reales if (d >= 0.0) { printf(" nPolinomio (%f) X^2 + (%f )X + (%f) = 0 n", A, n n B, C); printf(" nChicharronera 1"); n X1 = (-B + sqrt(d)) / (2.0 * A); X2 = (-B - sqrt(d)) / (2.0 * A); evalua(X1, A, B, C); evalua(X2, A, B, C); printf(" n nChicharronera 2"); n n X1 = (-2.0 * C) / (B + sqrt(d)); X2 = (-2.0 * C) / (B - sqrt(d));; evalua(X1, A, B, C); evalua(X2, A, B, C); // Metodo Newton-Raphson printf(" n nMetodo Newton-Raphson"); n n x = X1 - 1.0; printf(" nValor inicial aproximado de X1 = %f", x); n x = metodoNewtonRapson(x, 6, A, B, C); evalua(x, A, B, C); x = X2 - 1.0; printf(" nValor inicial aproximado de X2 = %f", x); n x = metodoNewtonRapson(x, 6, A, B, C); evalua(x, A, B, C); printf(" n"); n } else { // Raices complejas printf("Raices Complejas ..."); } return 0; }

[email protected] 158 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Ejemplo en C++ Usando Programación Orientada a Objetos Es- cribimos el código siguiente en cualquier editor y lo llamamos cuadratica.cpp:

#include #include #include using namespace std; class cuadratica { private: // Coe…cientes del polinomio double A, B, C;

// Funcion cuadratica double f(double x, double a, double b, double c) { return (x * x * a + x * b + c); }

// Derivada de la funcion cuadratica double df(double x, double a, double b) { return (2.0 * x * a + b); }

// Evalua el valor X en la función cuadratica void evalua(double x, double a, double b, double c) { printf(" nRaiz (%1.16f), evaluacion raiz: %1.16e", x, (a * x n * x + b * x + c)); }

// Metodo Newton-Raphson // x = x - f(x)/f’(x) double metodoNewtonRapson(double x, int ni, double a, double b, double c) { int i; for (i = 0; i < ni; i++) { x = x - (f(x, a, b, c) / df(x, a, b)); } return x; } [email protected] 159 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

public: // Constructor de la clase cuadratica(double a, double b, double c) { A = a; B = b; C = c; } // calculo de raices void raices() { // Raices del polinomio double X1, X2, x; // Calculo del discriminante double d = B * B - 4.0 * A * C;

// Raices reales if (d >= 0.0) { printf(" nPolinomio (%f) X^2 + (%f )X + (%f) = 0 n", n n A, B, C); printf(" nChicharronera 1"); n X1 = (-B + sqrt(d)) / (2.0 * A); X2 = (-B - sqrt(d)) / (2.0 * A); evalua(X1, A, B, C); evalua(X2, A, B, C);

printf(" n nChicharronera 2"); n n X1 = (-2.0 * C) / (B + sqrt(d)); X2 = (-2.0 * C) / (B - sqrt(d));; evalua(X1, A, B, C); evalua(X2, A, B, C); // Metodo Newton-Raphson printf(" n nMetodo Newton-Raphson"); n n x = X1 - 1.0; printf(" nValor inicial aproximado de X1 = %f", x); n x = metodoNewtonRapson(x, 6, A, B, C); evalua(x, A, B, C); x = X2 - 1.0; printf(" nValor inicial aproximado de X2 = %f", x); n [email protected] 160 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

x = metodoNewtonRapson(x, 6, A, B, C); evalua(x, A, B, C); printf(" n"); n } else { // Raices complejas printf("Raices Complejas ..."); } } };

int main(void) { cuadratica cu1 = cuadratica(1.0, 4.0, 1.0); cu1.raices(); return 0; }

Ejemplo en Java Usando Programación Orientada a Objetos Es- cribimos el código siguiente en cualquier editor y lo llamamos cuadratica.java:

import java.lang.Math; public class cuadratica { // Coe…cientes del polinomio double A, B, C, d;

// Constructor de la clase public cuadratica(double a, double b, double c) { A = a; B = b; C = c; }

// Funcion cuadratica public double f(double x) { return (x * x * A + x * B + C); }

[email protected] 161 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

// Evalua el valor X en la función cuadratica public void evalua(double x) { System.out.println("Raiz (" + x + ") , evaluacion raiz:" + (A * x * x + B * x + C)); }

// Derivada de la funcion cuadratica public double df(double x) { return (2.0 * x * A + B); }

// Metodo Newton-Raphson // x = x - f(x)/f’(x) public double metodoNewtonRapson(double x, int ni) { for (int i = 0; i < ni; i++) { x = x - (f(x) / df(x)); } return x; }

public void raices() { // Raices del polinomio double X1, X2, x; // Calculo del discriminante d = B * B - 4.0 * A * C; // Raices reales if (d >= 0.0) { System.out.println(""); System.out.println("Raices Reales (" + A + ")X^2 + (" + B + ")X + (" + C + ") = 0"); System.out.println("Chicharronera 1"); X1 = (-B + Math.sqrt(d)) / (2.0 * A); X2 = (-B - Math.sqrt(d)) / (2.0 * A); evalua(X1); evalua(X2); System.out.println(""); System.out.println("Chicharronera 2"); X1 = (-2.0 * C) / (B + Math.sqrt(d)); [email protected] 162 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

X2 = (-2.0 * C) / (B - Math.sqrt(d));; evalua(X1); evalua(X2); System.out.println(""); // Metodo Newton-Raphson System.out.println("Newton-Rapson"); X1 = Math.round(X1); System.out.print("Valor inicial aproximado de X1 = " + X1); x = metodoNewtonRapson(X1, 8); evalua(x); X2 = Math.round(X2); System.out.print("Valor inicial aproximado de X2 = " + X2); x = metodoNewtonRapson(X2, 8); evalua(x); } else { // Raices complejas System.out.println("Raices Complejas ..."); } }

// Funcion Principal .... public static void main(String[] args) { cuadratica cu1 = new cuadratica(1.0, 4.0, 1.0); cu1.raices(); } }

[email protected] 163 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Ejemplo en Python Usando Programación Orientada a Objetos Escribimos el código siguiente en cualquier editor y lo llamamos cuadra- tica.py:

#!/usr/bin/python3 # -*- coding: utf-8 -*- import math class Ejemplo: # Constuctor def __init__(self, a, b ,c): self.A = a; self.B = b; self.C = c; # Funcion cuadratica def f(self, x, a, b, c): return (x * x * a + x * b + c); # Derivada de la funcion cuadratica def df(self, x, a, b): return (2.0 * x * a + b); # Evalua el valor X en la funcion cuadratica def evalua(self, x, a, b, c): print(’Raiz (%1.16f), evaluacion raiz: %1.16e’% (x, (a * x * x + b * x + c))) # Metodo Newton-Raphson # x = x - f(x)/f’(x) def metodoNewtonRapson(self, x, ni, a, b, c):

for i in range(ni): x = x - (self.f(x, a, b, c) / self.df(x, a, b)) return x # Calculo de raices def raices(self): # Calculo del discriminante d = self.B * self.B - 4.0 * self.A * self.C

# Raices reales if d >= 0.0: [email protected] 164 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

print(’ nPolinomio (%f) X^2 + (%f )X + (%f) = 0 n’% n n (self.A, self.B, self.C)) print(’ nChicharronera 1’) n X1 = (-self.B + math.sqrt(d)) / (2.0 * self.A) X2 = (-self.B - math.sqrt(d)) / (2.0 * self.A) self.evalua(X1, self.A, self.B, self.C) self.evalua(X2, self.A, self.B, self.C) print(’ nChicharronera 2’) n X1 = (-2.0 * self.C) / (self.B + math.sqrt(d)) X2 = (-2.0 * self.C) / (self.B - math.sqrt(d)) self.evalua(X1, self.A, self.B, self.C) self.evalua(X2, self.A, self.B, self.C) # Metodo Newton-Raphson print(" n nMetodo Newton-Raphson") n n x = X1 - 1.0; print(" nValor inicial aproximado de X1 = %1.16f" % x) n x = self.metodoNewtonRapson(x, 6, self.A, self.B, self.C) self.evalua(x, self.A, self.B, self.C); x = X2 - 1.0; print(" nValor inicial aproximado de X2 = %1.16f" % x); n x = self.metodoNewtonRapson(x, 6, self.A, self.B, self.C) self.evalua(x, self.A, self.B, self.C) print(" n") n else: # Raices complejas print("Raices Complejas ...")

if __name__ == ’__main__’: ej = Ejemplo(1.0, 4.0, 1.0) ej.raices()

[email protected] 165 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

7.5 Trabajando con Punto Flotante Hay varias trampas en las que incluso los programadores muy experimentados caen cuando escriben código que depende de la aritmética de punto ‡otante. En esta sección explicamos algunas cosas a tener en cuenta al trabajar con números de punto ‡otante, es decir, tipos de datos ‡otantes y dobles.

No pruebes por la igualdad Cuando se usa Punto Flotante no es re- comendable escribir código como el siguiente48:

double x; double y; ... if (x == y) {...}

La mayoría de las operaciones de punto ‡otante implican al menos una pequeña pérdida de precisión y, por lo tanto, incluso si dos números son iguales para todos los …nes prácticos, es posible que no sean exactamente iguales hasta el último bit, por lo que es probable que la prueba de igualdad falle. Por ejemplo, el siguiente fragmento de código imprime:

1:778636e 015 Aunque en teoría, la cuadratura debería deshacer una raíz cuadrada, la ope- ración de ida y vuelta es ligeramente inexacta.

double x = 10; double y = sqrt(x); y *= y; if (x == y) cout << "La reaiz cuadrada es exacta n"; else n cout << x-y << " n"; n En la mayoría de los casos, la prueba de igualdad anterior debe escribirse de la siguiente manera:

48 Sin perdida de generalidad usamos C++ pero esto pasa en todos los lenguajes que usen operaciones de Punto Flotante. [email protected] 166 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

double tolerancia = ... if (fabs(x - y) < tolerancia) {...} Aquí la tolerancia es un umbral que de…ne lo que está "lo su…cientemente cerca" para la igualdad. Esto plantea la pregunta de qué tan cerca está lo su…cientemente cerca. Esto no puede responderse en abstracto; tienes que saber algo sobre tu problema particular para saber qué tan cerca está lo su…cientemente cerca en tu contexto.

Preocúpate más por la suma y la resta que por la multiplicación y la división Los errores relativos en la multiplicación y división son siempre pequeños. La suma y la resta, por otro lado, pueden resultar en una pérdida completa de precisión. Realmente el problema es la resta; la suma solo puede ser un problema cuando los dos números que se agregan tienen signos opuestos, por lo que puedes pensar en eso como una resta. Aún así, el código podría escribirse con un "+" que sea realmente una resta. La resta es un problema cuando los dos números que se restan son casi iguales. Cuanto más casi iguales sean los números, mayor será el potencial de pérdida de precisión. Especí…camente, si dos números están de acuerdo con n bits, se pueden perder n bits de precisión en la resta. Esto puede ser más fácil de ver en el extremo: si dos números no son iguales en teoría pero son iguales en su representación de máquina, su diferencia se calculará como cero, 100% de pérdida de precisión. Aquí hay un ejemplo donde tal pérdida de precisión surge a menudo. La derivada de una función f en un punto x se de…ne como el límite de (f(x + h) f(x))=h cuando h llega a cero. Entonces, un enfoque natural para calcular la derivada de una función sería evaluar (f(x + h) f(x))=h para alguna h pequeña. En teoría, cuanto menor es h, mejor se aproxima esta fracción a la derivada. En la práctica, la precisión mejora por un tiempo, pero más allá de cierto punto, valores más pequeños de h resultan en peores aproximaciones a la derivada. A medida que h disminuye, el error de aprox- imación se reduce pero el error numérico aumenta. Esto se debe a que la resta f(x + h) f(x) [email protected] 167 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM se vuelve problemática. Si toma h lo su…cientemente pequeño (después de todo, en teoría, más pequeño es mejor), entonces f(x+h) será igual a f(x) a la precisión de la máquina. Esto signi…ca que todas las derivadas se calcularán como cero, sin importar la función, si solo toma h lo su…cientemente pequeño. Aquí hay un ejemplo que calcula la derivada de sin(x) en x = 1.

cout << std::setprecision(15); for (int i = 1; i < 20; ++i) { double h = pow(10.0, -i); cout << (sin(1.0+h) - sin(1.0))/h << " n"; } n cout << "El verdadero resultado es: " << cos(1.0) << " n"; n Aquí está la salida del código anterior. Para que la salida sea más fácil de entender, los dígitos después del primer dígito incorrecto se han reemplazado por puntos.

0.4...... 0.53...... 0.53...... 0.5402...... 0.5402...... 0.540301...... 0.5403022..... 0.540302302... 0.54030235.... 0.5403022..... 0.540301...... 0.54034...... 0.53...... 0.544...... 0.55...... 0 0 0 0 El verdadero resultado es: 0.54030230586814 [email protected] 168 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

La precisión49 mejora a medida que h se hace más pequeña hasta que 8 h = 10 . Pasado ese punto, la precisión decae debido a la pérdida de 16 precisión en la resta. Cuando h = 10 o menor, la salida es exactamente cero porque sin(1:0 + h) es igual a sin(1:0) a la precisión de la máquina. (De hecho, 1 + h equivale a 1 a la precisión de la máquina. Más sobre eso a continuación). ¿Qué haces cuando tu problema requiere resta y va a causar una pérdida de precisión? A veces la pérdida de precisión no es un problema; los dobles comienzan con mucha precisión de sobra. Cuando la precisión es importante, a menudo es posible usar algún truco para cambiar el problema de modo que no requiera resta o no requiera la misma resta con la que comenzaste.

Los números de punto ‡otante tienen rangos …nitos Todos saben que los números de punto ‡otante tienen rangos …nitos, pero esta limitación puede aparecer de manera inesperada. Por ejemplo, puede encontrar sorprendente la salida de las siguientes líneas de código ‡oat f = 16777216; cout << f << "" << f+1 << " n"; n Este código imprime el valor 16777216 dos veces. ¿Que pasó? De acuerdo con la especi…cación IEEE para aritmética de punto ‡otante, un tipo ‡otante tiene 32 bits de ancho. Veinticuatro de estos bits están dedicados al signi…- cado (lo que solía llamarse la mantisa) y el resto al exponente. El número 16777216 es 224 y, por lo tanto, a la variable ‡otante f no le queda precisión para representar f + 1. Ocurriría un fenómeno similar para 253 si f fuera del tipo double porque un doble de 64 bits dedica 53 bits al signi…cado. El siguiente código imprime 0 en lugar de 1. x = 9007199254740992; // 2^53 cout << ((x+1) - x) << " n"; n También podemos quedarnos sin precisión al agregar números pequeños a números de tamaño moderado. Por ejemplo, el siguiente código imprime "¡Lo siento!" porque DBL_EPSILON (de…nido en ‡oat.h) es el número positivo más pequeño e tal que 1 + e! = 1 cuando se usan tipos dobles. 49 Los resultados anteriores se calcularon con Visual C ++ 2008. Cuando se compiló con gcc 4.2.3 en Linux, los resultados fueron los mismos, excepto los últimos cuatro números. Donde VC ++ produjo ceros, gcc produjo números negativos: -0.017 ..., - 0.17 ..., -1.7 ... y 17 .... [email protected] 169 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

x = 1.0; y = x + 0.5*DBL_EPSILON; if (x == y) cout << "¡Lo siento! n"; n De manera similar, la constante FLT_EPSILON es el número positivo más pequeño e tal que 1 + e no es 1 cuando se usan tipos ‡otantes.

Use logaritmos para evitar desbordamientos y subdesbordamientos Las limitaciones de los números de punto ‡otante descritos en la sección anterior provienen de tener un número limitado de bits en el signi…cado. El desbordamiento y el subdesbordamientos resultan de tener también un número …nito de bits en el exponente. Algunos números son demasiado grandes o demasiado pequeños para almacenarlos en un número de punto ‡otante. Muchos problemas parecen requerir calcular un número de tamaño mod- erado como la razón de dos números enormes. El resultado …nal puede ser representable como un número de punto ‡otante aunque los resultados inter- medios no lo sean. En este caso, los logaritmos proporcionan una salida. Si desea calcular M=N para grandes números M y N, calcule log(M) log(N) y aplique exp() al resultado. Por ejemplo, las probabilidades a menudo im- plican proporciones de factoriales, y los factoriales se vuelven astronómica- mente grandes rápidamente. Para N > 170, N! es mayor que DBL_MAX, el número más grande que puede representarse por un doble (sin precisión extendida). Pero es posible evaluar expresiones como 200!=(190!10!) Sin des- bordamiento de la siguiente manera:

x = exp( logFactorial(200) - logFactorial(190) - logFactor- ial(10) );

Una función logFactorial simple pero ine…ciente podría escribirse de la siguiente manera:

double logFactorial(int n) { double sum = 0.0; for (int i = 2; i <= n; ++i) sum += log((double)i); return sum; } [email protected] 170 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Un mejor enfoque sería utilizar una función de registro gamma si hay una disponible. Consulte Cómo calcular las probabilidades binomiales para obtener más información.

Las operaciones numéricas no siempre devuelven números Debido a que los números de punto ‡otante tienen sus limitaciones, a veces las op- eraciones de punto ‡otante devuelven "in…nito" como una forma de decir "el resultado es más grande de lo que puedo manejar". Por ejemplo, el siguiente código imprime 1. # INF en Windows e inf en Linux.

x = DBL_MAX; cout << 2*x << " n"; n A veces, la barrera para devolver un resultado signi…cativo tiene que ver con la lógica en lugar de la precisión …nita. Los tipos de datos de punto ‡otante representan números reales (a diferencia de los números complejos) y no hay un número real cuyo cuadrado sea 1. Eso signi…ca que no hay un número signi…cativo que devolver si el código solicita sqrt( 2), incluso con una precisión in…nita. En este caso, las operaciones de punto ‡otante devuelven NaN. Estos son valores de punto ‡otante que representan códigos de error en lugar de números. Los valores NaN se muestran como 1. # IND en Windows y NAN en Linux. Una vez que una cadena de operaciones encuentra un NaN, todo es un NaN de ahí en adelante. Por ejemplo, suponga que tiene un código que equivale a algo como lo siguiente:

if (x - x == 0) // hacer algo

¿Qué podría impedir que se ejecute el código que sigue a la instrucción if? Si x es un NaN, entonces también lo es x x y los NaN no equivalen a nada. De hecho, los NaN ni siquiera se igualan. Eso signi…ca que la expresión x == x se puede usar para probar si x es un número (posiblemente in…nito). Para obtener más información sobre in…nitos y NaN, consulte las excepciones de punto ‡otante IEEE en C ++.

[email protected] 171 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Relaciones de Factoriales Los cálculos de probabilidad a menudo impli- can tomar la razón de números muy grandes para producir un número de tamaño moderado. El resultado …nal puede caber dentro de un doble con es- pacio de sobra, pero los resultados intermedios se desbordarían. Por ejemplo, suponga que necesita calcular el número de formas de seleccionar 10 objetos de un conjunto de 200. ¡Esto es 200!=(190!10!), Aproximadamente 2:2e16: Pero 200! y 190! desbordaría el rango de un doble. Hay dos formas de solucionar este problema. Ambos usan la siguiente regla: Use trucos algebraicos para evitar el desbordamiento. El primer truco es reconocer que

200! = 200 199 198 ::: 191 190!      y así 200!=(190!10!) = 200 199 198 ::: 191=10!     esto ciertamente funciona, pero está limitado a factoriales. Una técnica más general es usar logaritmos para evitar el desbordamiento: tome el logaritmo de la expresión que desea evaluar y luego exponga el re- sultado. En este ejemplo

log(200!=(190!10!)) = Log(200!) log(190!) log(10!) si tiene un código que calcula el logaritmo de los factoriales directamente sin calcular primero los factoriales, puede usarlo para encontrar el logaritmo del resultado que desea y luego aplicar la función exp. log (1 + x) Ahora veamos el ejemplo del calculo de log(x + 1) . Considere el siguiente código:

double x = 1e-16; double y = log(1 + x)/x;

En este código y = 0, aunque el valor correcto sea igual a 1 para la precisión de la máquina.

[email protected] 172 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

¿Qué salió mal? los números de doble precisión tienen una precisión de aproximadamente 15 decimales, por lo que 1 + x equivale a 1 para la precisión de la máquina. El registro de 1 es cero, por lo que y se establece en cero. Pero para valores pequeños de x, log(1 + x) es aproximadamente x, por lo que log(1 + x)=x es aproximadamente 1. Eso signi…ca que el código anterior para calcular log(1 + x)=x devuelve un resultado con 100% de error relativo. Si x no es tan pequeño que 1 + x es igual a 1 en la máquina, aún podemos tener problemas. Si x es moderadamente pequeño, los bits en x no se pierden totalmente al calcular 1 + x, pero algunos sí. Cuanto más se acerca x a 0, más bits se pierden. Podemos usar la siguiente regla: Utilice aproximaciones analíticas para evitar la pérdida de precisión. La forma favorita de aproximación de los analistas numéricos es la serie de potencia. ¡La serie de potencia para

log(1 + x) = x + x2=2! + x3=3! + :::

Para valores pequeños de x, simplemente devolver x para log(1 + x) es una mejora. Esto funcionaría bien para los valores más pequeños de x, pero para algunos valores no tan pequeños, esto no será lo su…cientemente preciso, pero tampoco lo hará directamente el cálculo del log(1 + x).

Logit inverso A continuación, veamos el cálculo f(x) = ex=(1 + ex). (Los estadísticos llaman a esto la función "logit inverso" porque es el inverso de la función que ellos llaman la función "logit".) El enfoque más directo sería calcular exp(x)=(1 + exp(x)). Veamos dónde se puede romper eso.

double x = 1000; double t = exp(x); double y = t/(1.0 + t);

Imprimir y da -1. # IND. Esto se debe a que el cálculo de t se desbordó, produciendo un número mayor que el que cabía en un doble. Pero podemos calcular el valor de y fácilmente. Si t es tan grande que no podemos alma- cenarlo, entonces 1 + t es esencialmente lo mismo que t y la relación es muy cercana a 1. Esto sugiere que descubramos qué valores de x son tan grandes que f(x) será igual 1 a la precisión de la máquina, luego solo devuelva 1 para esos valores de x para evitar la posibilidad de desbordamiento. Esta es nuestra siguiente regla: No calcules un resultado que puedas predecir con precisión. [email protected] 173 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

El archivo de encabezado ‡oat.h tiene un DBL_EP SILON constante, que es la precisión doble más pequeña que podemos agregar a 1 sin recuperar 1. Un poco de álgebra muestra que si x es más grande que log(DBL_EP SILON), entonces f(x) será igual a 1 a la precisión de la máquina. Así que aquí hay un fragmento de código para calcular f(x) para valores grandes de x:

const double x_max = -log(DBL_EPSILON); if (x > x_max) return 1.0;

El código provisto en esta sección calcula siete funciones que aparecen en las estadísticas. Cada uno evita problemas de desbordamiento, subdesbor- damiento o pérdida de precisión que podrían ocurrir para grandes argumentos negativos, grandes argumentos positivos o argumentos cercanos a cero:

LogOnePlusX calcúlese como log(1 + x) como en ejemplo antes visto  ExpMinusOne calcúlese como ex 1  Logit calcúlese como log(x=(1 x))  LogitInverse calcúlese como ex=(1 + ex) como se discutió en el ejemplo  último

LogLogitInverse calcúlese como log(ex=(1 + ex))  LogitInverseDi¤erence calcúlese como LogitInverse(x) LogitInverse(y)  LogOnePlusExpX calcúlese como log(1 + exp(x))  ComplementaryLogLog calcúlese como log( log(1 x))  ComplementaryLogLogInverse calcúlese como 1:0 exp( exp(x))  Las soluciones presentadas aquí parecen innecesarias o incluso incorrectas al principio. Si este tipo de código no está bien comentado, alguien lo verá y lo "simpli…cará" incorrectamente. Estarán orgullosos de todo el desorden innecesario que eliminaron. Y si no prueban valores extremos, su nuevo código parecerá funcionar correctamente. Las respuestas incorrectas y los NaN solo aparecerán más tarde.

[email protected] 174 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

7.6 Documentación del Código Fuente La documentación dentro del código fuente (véase 8.5.1) tiene como objetivo que los que lo , mantengan y reparen el código, lo entiendan. La documentación básica en C, C++ y Java se realiza usando:

// para comentar dentro de una línea de código:  for (int i = 0; i < 10; i ++) // Este ciclo se realiza 10 veces

/* y */ para comentar una o más líneas:  /* Este ciclo se realiza 10 veces */ for (int i = 0; i < 10; i ++) xp += 10 + i;

La documentación básica en Python se realiza usando:

# para comentar dentro de una línea de código:  for i in Array: # Este ciclo se realiza tantas veces como ele- mentos en Array

""" y """ para comentar una o más líneas:  """ Este ciclo se realiza tantas veces como elementos en Array """ for i in Array: xp = xp + i

Además, si se realiza la documentación con cierta estructura, esta se puede utilizar para generar un manual de referencia del código en formatos: HTML, PDF, PS, o XML a partir de los fuentes con unos cuantos comandos de texto en menos de un minuto, pues qué mejor. Existen varias herramientas para ello, una de ellas es DOXYGEN para códigos de Java, Fortran, C y C++, en Python se puede usar Docstring o una cadena de documentación como se verá a continuación. [email protected] 175 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

7.6.1 Documentar en C, C++ y Java Para instalar DOXYGEN usar:

# apt install doxygen

una vez instalada, hay que generar el archivo de con…guración de DOXY- GEN, para ello usar:

$ doxygen -g

de aquí podemos editar el archivo Doxy…le generado según las necesidades de la documentación, un ejemplo de dicha con…guración para generar la salida en HTML, LaTeX y XML esta en: Jerarquia de Clases DOXYGEN Para generar la documentación de los fuentes en la carpeta donde este el archivo de con…guración y los archivos fuentes, usar:

$ doxygen

La documentación generada con DOXYGEN se mostrará en carpetas se- paradas para cada una de las salidas seleccionadas por ejemplo: HTML, LaTeX, XML, etc. Para ver la documentación generada, usar en la consola:

$ cd html $ xpdf .html

Para generar la documentación en formato PDF a partir de la salida de LaTeX usar:

$ cd latex $ make pdf $ xpdf refman.pdf

en este caso se supone que se tiene instalado LaTeX en la máquina, en caso contrario podemos instalar lo básico usando:

# apt install science-typesetting texlive-science [email protected] 176 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

y adicionalmente, si se requieren otras opciones instalamos:

# apt install texmaker texmacs texmacs-extra-fonts texlive- latex-base texlive-latex-recommended myspell-en-us myspell-es

Hay varios estilos de documentación (véase 8.5.1), aquí ponemos una que es fácil de usar para códigos en C++, pero es lógicamente extensible a lenguajes como Java.

#ifndef __test__ #de…ne __test__ /// Descripcion breve de la clase. /** * Descripcion detallada de la clase ... * * @author Antonio Carrillo * @date Winter 2010 * @version 0.0.1 * @bug No errors detected * @warning No warnings detected * @todo Exception handling */ class test { private:

/// Descripcion breve. const char *nmClass; /** * Descripcion corta. * * Descripcion larga ... * * 0 = Dirichlet, 1 = Neumann (or Robin) */ int bdType;

[email protected] 177 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

public: /** * Descipcion breve. * * Descripcion detallada ... * * Algo de LaTeX ... * * f[ n * I_2 = left int_{0}^T psi(t) j j n j n n * left { n n * u(a,t)- * int_{ gamma(t)}^a n n * frac{d theta}{k( theta,t)} n n n * int_{a}^ theta c( xi)u_t( xi,t) ,d xi n n n n n n * right } dt n n * right n j * f] n * * * @param[out] clas Descripcion del parametro de salida * @param[in] fun Descripcion del parametro de entrada */ test(const char *clas, const char *fun) { nameClassFunct(clas, fun); }

/** * Descripcion breve. * * Descripcion detallada * * @param nVert Descripcion del parametro * @param[in] g Descripcion del parametro * @param[in] me Descripcion del parametro [email protected] 178 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

* @param[out] values Descripcion del parametro * @param z Descripcion del parametro * @return Descripcion de lo que regresa */ int eval(int nVert, double **g, StdElem *me, double ***values, double *z); }; /** * Descripcion breve de la clase. * * Descripcion detallada de la clase * * Otro parrafo de la descripcion ... * * Algo de formulas con LaTeX * * f{eqnarray*}{ n * g &=& frac{Gm_2}{r^2} n nn * &=& frac{(6.673 times 10^{-11} , mbox{m}^3 , mbox{kg}^{- n n n n n n 1} , n * mbox{s}^{-2})(5.9736 times 10^{24} , mbox{kg})}{(6371.01 , mbox{km})^2} n n n n n n nn * &=& 9.82066032 , mbox{m/s}^2 n n * f} n * * * Documentacion sobre la cual se basa la clase o archivo(s) que hagan una descripcion de la * misma: Archivo.doc * * Descripcion breve del ejemplo de uso de esta clase (este archivo se supone que estara en * una carpeta de nombre ./Examples en la posicion actual del código) * * Algo de LaTeX * [email protected] 179 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

* La distancia entre f$(x_1,y_1) f$ and f$(x_2,y_2) f$ is n n n n f$ sqrt{(x_2-x_1)^2+(y_2-y_1)^2} f$. n n n * * @example ExampleText.cpp */ #endif

Adicionalmente es deseable que algunos comportamientos o clases tengan información adicional como son: propósito, entradas, salidas, estructuras de datos usadas en entradas y salidas, dependencia de datos o ejecución, restricciones, etc., usando una estructura como la siguiente:

/** * Proposito y Metodo: * Entradas: * Salidas: * Entradas TDS: * Salidas TDS: * Dependencias: * Restricciones y advertencias" */

Para controlar las versiones se podría usar algo como lo siguiente:

/** * @…le release.notes * @brief Package TkrRecon * @verbatim * Coordinator: Leon Rochester * * v4r4p8 09-Mar-2002 LSR Remove GFxxxxx and SiRecObjs, no longer used * v4r4p7 07-Mar-2002 TU Mainly, add a combo vertexing to the TkrRecon sequence * @endverbatim */

Un ejemplo completo puede ser el siguiente: [email protected] 180 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

#ifndef __ErrorControl__ #de…ne __ErrorControl__ #include using namespace std; #include #include "Printf.hpp" #ifdef USE_HYPRE #include #endif /// Error Control, this class handles errors for the system RESSIM /** * @author Antonio Carrillo and Gerardo Cisneros * @date Winter 2010 * @version 0.0.2 * @verbatim Coordinator: Robert Yates v0.0.1 Junuary 2011 Antonio Carrillo generates the …rst ver- sion of the class v0.0.2 March 2011 Gerardo Cisneros add HYPRE errors con- trol Inputs: Name of class and function Outputs: Exit of program TDS Inputs: none TDS Outputs: none Dependencies: #ifdef USE_HYPRE, MPI Restrictions and Caveats: Non exception handling still @endverbatim * @bug No errors detected * @warning No warnings detected * @todo Exception handling */ class ErrorControl { private: /// Name of class const char *nmClass; /// Name of function generating the error const char *nmFunction; [email protected] 181 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

public: /** * Class Constructor */ ErrorControl(void) { nameClassFunct(" ", " "); } /** * Class Constructor * @param clas Class name */ ErrorControl(const char *clas) { nameClassFunct(clas, " "); } /** * Class Constructor * @param clas Class name * @param fun Name of function generating the error */ ErrorControl(const char *clas, const char *fun) { nameClassFunct(clas, fun); } /** * Name of class and function * @param clas Class name * @param func Name of function generating the error */ void nameClassFunct(const char * clas, const char *func) { nameClass(clas); nameFunct(func); } /** * No memory for this request * @param var Var name */ void memoryError(const char * var) { Afprintf(stderr, " n nNo memory for %s request in %s of class %s n n", var, nmFunction,n n nmClass); n n [email protected] 182 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

fatalError(1); } /** * No memory for this request * @param var Var name * @param i Index number */ void memoryError(const char * var, int i) { Afprintf(stderr, " n nNo memory for %s request %d in %s of class %s n n", var, i,n nmFunction,n nmClass); fatalError(1);n n } /** * No memory for this request * @param var Var name * @param func Name of function generating the error */ void memoryError(const char * var, const char *func) { Afprintf(stderr, " n nNo memory for %s request in %s of class %s n n", var, func, nmClass);n n nfatalError(1);n } /** * Fatal error. * @param cod Error code */ void fatalError(int cod) { Afprintf(stderr, " nFatal Error nEnd program n"); #ifdef USE_HYPREn n n MPI_Abort(MPI_COMM_WORLD, cod); #else exit(cod); #endif } /** * Fatal error. * @param cod Error code */ [email protected] 183 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

void fatalError(int cod, const char *txt) { Afprintf(stderr, txt); Afprintf(stderr, " nFatal Error nEnd program n"); #ifdef USE_HYPREn n n MPI_Abort(MPI_COMM_WORLD, cod); #else exit(cod); #endif } /** * Set name of class * @param clas Class name */ void nameClass(const char *clas) { nmClass = clas; } /** * Set name of function * @param func Function name */ void nameFunct(const char *func) { nmFunction = func; } }; /** * Error Control, this class handles errors for the system RESSIM * * Use of the class ErrorControl for error handling within the system RESSIM, * for example in the error control of memory request * * @example ExampleErrorControl.cpp */ #endif

Más detalles sobre los parámetros en la documentación del código fuente para ser usada por DOXYGEN se pueden ver en: http://www.stack.nl/~dimitri/doxygen/commands.html#cmdparam [email protected] 184 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

7.6.2 Documentar en Python En Python el uso de acentos y caracteres extendidos esta soportado por la codi…cación UTF-8 (véase 8.5.1), para ello en las primeras líneas de código es necesario usar:

#!/usr/bin/env python # -*- coding: utf-8 -*-

siempre y cuando se use un editor o IDE que soporte dicha codi…cación, en caso contrario los caracteres se perderán. Para documentar en Python se usa un Docstring o cadena de docu- mentación, esta es una cadena de caracteres que se coloca como primer enun- ciado de un módulo, clase, método o función, y cuyo propósito es explicar su intención. Un ejemplo sencillo (en Python 3), es:

def promedio(a, b): """Calcula el promedio de dos numeros.""" return (a + b) / 2

Un ejemplo más completo:

def formula_cuadratica(a, b, c): """Resuelve una ecuación cuadratica. Devuelve en una tupla las dos raices que resuelven la ecuacion cuadratica:

ax^2 + bx + c = 0. Utiliza la formula general (tambien conocida coloquialmente como el "chicharronero"). Parametros: a –coe…ciente cuadratico (debe ser distinto de 0) b –coe…ciente lineal c –termino independiente Excepciones: ValueError –Si (a == 0) """ if a == 0: [email protected] 185 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

raise ValueError( ’Coe…ciente cuadratico no debe ser 0.’) from cmath import sqrt discriminante = b ** 2 - 4 * a * c x1 = (-b + sqrt(discriminante)) / (2 * a) x2 = (-b - sqrt(discriminante)) / (2 * a) return (x1, x2)

La cadena de documentación en el segundo ejemplo es una cadena multi- líneas, la cual comienza y termina con triples comillas ("""). Aquí se puede observar el uso de las convenciones establecidas en el PEP 257 (Python En- hancement Proposals):

La primera línea de la cadena de documentación debe ser una línea de  resumen terminada con un punto. Debe ser una breve descripción de la función que indica los efectos de esta como comando. La línea de re- sumen puede ser utilizada por herramientas automáticas de indexación; es importante que quepa en una sola línea y que este separada del resto del docstring por una línea en blanco.

El resto de la cadena de documentación debe describir el compor-  tamiento de la función, los valores que devuelve, las excepciones que arroja y cualquier otro detalle que consideremos relevante.

Se recomienda dejar una línea en blanco antes de las triples comillas  que cierran la cadena de documentación.

Todos los objetos documentables (módulos, clases, métodos y funciones) cuentan con un atributo __doc__ el cual contiene su respectivo comentario de documentación. A partir de los ejemplos anteriores podemos inspeccionar la documentación de las funciones promedio y formula_cuadratica desde el shell de Python:

>>> promedio.__doc__ ’Calcula el promedio de dos numeros.’ >>> formula_cuadratica.__doc__ ’Resuelve una ecuación cuadratica. n n Devuelve en una tupla las dos raices que resuelven lan nn ecuacion cuadratica: n n ax^2 + bx + c = 0.n n n n n n n [email protected] 186 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Utiliza la formula general (tambien conocida n coloquialmente como el "chicharronero"). n nn Parametros: n a –coe…ciente cuadratico (deben n ser distinto de 0)n n b –coe…ciente lineal n c –termino independienten n n Excepciones:n n ValueError –Si (a == 0) nn nn ’ n n n Sin embargo, si se esta usando el shell de Python es mejor usar la función (), dado que la salida producida queda formateada de manera más clara y conveniente:

>>> help(promedio) Help on function promedio in module __main__: promedio(a, b) Calcula el promedio de dos numeros. >>> help(formula_cuadratica) Help on function formula_cuadratica in module __main__: formula_cuadratica(a, b, c) Resuelve una ecuacion cuadratica. Devuelve en una tupla las dos raices que resuelven la ecuacion cuadratica: ax^2 + bx + c = 0. Utiliza la formula general (tambien conocida coloquialmente como el "chicharronero"). Parametros: a –coe…ciente cuadratico (debe ser distinto de 0) b –coe…ciente lineal c –termino independiente Excepciones: ValueError –Si (a == 0)

Ciertas herramientas, por ejemplo shells o editores de código, pueden ayudar a visualizar de manera automática la información contenida en los comentarios de documentación. De esta manera un usuario puede tener a su alcance de manera sencilla toda la información que necesita para poder usar nuestras funciones.

[email protected] 187 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Generando documentación en páginas de HTML Los Docstrings se pueden usar también para producir documentación en páginas de HTML que pueden ser consultadas usando un navegador de Web. Para ello se usa el comando pydoc desde una terminal. Por ejemplo, si las dos funciones ante- riores (promedio y formula_cuadratica) se encuentran en un archivo fuente llamado ejemplos.py, podemos ejecutar el siguiente comando en una terminal dentro del mismo directorio donde esta el archivo fuente:

pydoc -w ejemplos

La salida queda en el archivo ejemplos.html, y así se visualiza desde un navegador. La documentación de pydoc explica otros artilugios que puede hacer esta utilería de Python.

Docstrings vs. Comentarios Un comentario en Python inicia con el símbolo de número (#) y se extiende hasta el …nal de la línea. En principio los Docstrings pudieran parecer similares a los comentarios, pero hay una diferencia pragmática importante: los comentarios son ignorados por el am- biente de ejecución de Python y por herramientas como pydoc; esto no es así en el caso de los Docstrings. A un nivel más fundamental hay otra diferencia aún más grande entre los Docstrings y los comentarios, y esta tiene que ver con la intención:

Los Docstrings son documentación, y sirven para entender qué hace el  código.

Los comentarios sirven para explicar cómo lo hace.  La documentación es para la gente que usa tu código. Los comentarios son para la gente que necesita entender cómo funciona tu código, posiblemente para extenderlo o darle mantenimiento.

El uso de Docstrings en Python facilita la escritura de la documentación técnica de un programa. Escribir una buena documentación requiere de dis- ciplina y tiempo, pero sus bene…cios se cosechan cuando alguien — quizás mi futuro yo dentro de seis meses— necesita entender qué hacen nuestros programas. Los Docstrings no sustituyen otras buenas prácticas de progra- mación, como son el uso apropiado de comentarios o el empleo de nombres descriptivos para variables y funciones. [email protected] 188 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

8 Entornos de Desarrollo y Herramientas de Programación

Para programar, es necesario como mínimo contar con un editor de texto -como o nano- y acceso al compilador o intérprete del lenguaje que nos interese. En Linux se tiene una gran variedad de lenguajes y herramientas de desarrollo -Linux fue hecho por programadores para programadores- que se pueden instalar. Pero, también están los entornos de desarrollo integrado o entorno de desarrollo interactivo -en inglés Integrated Development Environ- ment (IDE)-, estas son aplicaciones informáticas que proporcionan servicios integrales para facilitarle al programador el desarrollo de Software. Normalmente, un IDE consiste de un editor de código fuente, herramien- tas de construcción automáticas y un depurador. La mayoría de los IDE tienen auto-completado inteligente de código (IntelliSense). Algunos IDE contienen un compilador, un intérprete, o ambos, tales como NetBeans y Eclipse. El límite entre un IDE y otras partes del entorno de desarrollo de Software más amplio no está bien de…nido. Muchas veces, a los efectos de simpli…car la construcción de la interfaz grá…ca de usuario (GUI, por sus siglas en inglés) se integran un sistema controlador de versión y varias he- rramientas. Muchos IDE modernos también cuentan con un navegador de clases, un buscador de objetos y un diagrama de jerarquía de clases, para su uso con el desarrollo de Software orientado a objetos. Los IDE están diseñados para maximizar la productividad del progra- mador proporcionando componentes muy unidos con interfaces de usuario similares. Los IDE presentan un único programa en el que se lleva a cabo todo el desarrollo. Generalmente, este programa suele ofrecer muchas ca- racterísticas para la creación, modi…cación, compilación, implementación y depuración de Software. Esto contrasta con el desarrollo de Software uti- lizando herramientas no relacionadas, como vi, GNU Collection (gcc) o make. Uno de los propósitos de los IDE es reducir la con…guración necesaria para reconstruir múltiples utilidades de desarrollo, en vez de proveer el mismo conjunto de servicios como una unidad cohesiva. Reduciendo ese tiempo de ajustes, se puede incrementar la productividad de desarrollo, en casos donde aprender a usar un IDE es más rápido que integrar manualmente todas las herramientas por separado. Una mejor integración de todos los procesos de desarrollo hace posi- [email protected] 189 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM ble mejorar la productividad en general, que únicamente ayudando con los ajustes de con…guración. Por ejemplo, el código puede ser continuamente armado, mientras es editado, previendo retroalimentación instantánea, como cuando hay errores de sintaxis. Esto puede ayudar a aprender un nuevo lenguaje de programación de una manera más rápida, así como sus librerías asociadas. Algunos IDE están dedicados especí…camente a un lenguaje de progra- mación, permitiendo que las características sean lo más cercanas al para- digma de programación de dicho lenguaje. Por otro lado, existen muchos IDE de múltiples lenguajes tales como Eclipse, ActiveState Komodo, IntelliJ IDEA, MyEclipse, Oracle JDeveloper, NetBeans, Codenvy y Microsoft Visual Studio. Por otro lado , y están dedicados a un lenguaje cerrado o a un tipo de lenguajes de programación. Los IDE ofrecen un marco de trabajo amigable para la mayoría de los lenguajes de programación tales como C++, Python, Java, C#, Delphi, Vi- sual Basic, etc. En algunos lenguajes, un IDE puede funcionar como un sistema en tiempo de ejecución, en donde se permite utilizar el lenguaje de programación en forma interactiva, sin necesidad de trabajo orientado a archivos de texto. Es deseable que un IDE cuente con las siguientes carac- terísticas:

Multiplataforma  Soporte para diversos lenguajes de programación  Integración con Sistemas de Control de Versiones  Reconocimiento de Sintaxis  Extensiones y Componentes para el IDE  Integración con Framework populares  Depurador  Importar y Exportar proyectos  Múltiples idiomas  Manual de Usuarios y Ayuda  [email protected] 190 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Componentes  Editor de texto  Compilador.  Intérprete  Herramientas de automatización  Depurador  Posibilidad de ofrecer un sistema de control de versiones  Factibilidad para ayudar en la construcción de interfaces grá…cas de  usuarios

Algunos de los más usados son: Eclipse, , NetBeans, Sublime Text, , Visual Studio, , Monodevelop, Komodo, , CodeLite, Code::Blocks, PyDev, Eric, PyCharm, PTK, , Blue…sh, Glade, Kde- velop, Emacs, QtCreator, Android SDK, WxFormBuilder, etc.

8.1 Java Java (véase [7]) es un lenguaje de programación de propósito general, con- currente, orientado a objetos, que fue diseñado especí…camente para tener tan pocas dependencias de implementación como fuera posible. Su inten- ción es permitir que los desarrolladores de aplicaciones «escriban el pro- grama una vez y lo ejecuten en cualquier dispositivo (Write Once, Run Any- where» o WORA)» , lo que quiere decir que el código que es ejecutado en una plataforma no tiene que ser recompilado para ejecutarse en otra. El lenguaje de programación Java fue originalmente desarrollado por , de Sun Microsystems (constituida en 1982 y posteriormente adquirida el 27 de enero de 2010 por la compañía Oracle), y publicado en 1995 como un componente fundamental de la plataforma Java de Sun Microsys- tems. Su sintaxis deriva en gran medida de C y C++, pero tiene menos utilidades de bajo nivel que cualquiera de ellos. Las aplicaciones de Java son compiladas a (clase Java), que puede ejecutarse en cualquier máquina virtual Java (JVM) sin importar la arquitectura de la computadora subyacente. [email protected] 191 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

La compañía Sun desarrolló la implementación de referencia original para los compiladores de Java, máquinas virtuales y librerías de clases en 1991, y las publicó por primera vez en 1995. A partir de mayo de 2007, en cumpli- miento de las especi…caciones del Proceso de la Comunidad Java, Sun volvió a licenciar la mayoría de sus tecnologías de Java bajo la Licencia Pública General de GNU (véase [15]). Otros también han desarrollado implementa- ciones alternas a estas tecnologías de Sun, tales como el Compilador de Java de GNU y el GNU Classpath.

Orientado a Objetos La primera característica, orientado a objetos (OO), se re…ere a un método de programación y al diseño del lenguaje. Aunque hay muchas interpretaciones para OO, una primera idea es diseñar el Soft- ware de forma que los distintos tipos de datos que usen, esten unidos a sus operaciones. Así, los datos y el código (funciones o métodos) se combinan en entidades llamadas objetos. Un objeto puede verse como un paquete que contiene el "comportamiento" (el código) y el "estado" (datos). El princi- pio es separar aquello que cambia de las cosas que permanecen inalterables. Frecuentemente, cambiar una estructura de datos implica un cambio en el código que opera sobre los mismos, o viceversa. Esta separación en objetos coherentes e independientes ofrece una base más estable para el diseño de un sistema Software. El objetivo es hacer que grandes proyectos sean fáciles de gestionar y manejar, mejorando como consecuencia su calidad y reduciendo el número de proyectos fallidos. Otra de las grandes promesas de la programación orientada a objetos es la creación de entidades más genéricas (objetos) que permitan la reuti- lización del Software entre proyectos, una de las premisas fundamentales de la Ingeniería del Software. La reutilización del Software ha experimentado resultados dispares, en- contrando dos di…cultades principales: el diseño de objetos realmente genéri- cos es pobremente comprendido y falta una metodología para la amplia comu- nicación de oportunidades de reutilización. Algunas comunidades de código abierto quieren ayudar en este problema dando medios a los desarrolladores para diseminar la información sobre el uso y versatilidad de objetos reutili- zables y bibliotecas de objetos.

Independencia de la plataforma La segunda característica, la indepen- dencia de la plataforma, signi…ca que programas escritos en el lenguaje Java [email protected] 192 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM pueden ejecutarse igualmente en cualquier tipo de Hardware. Este es el sig- ni…cado de ser capaz de escribir un programa una vez y que pueda ejecutarse en cualquier dispositivo, tal como reza el axioma de Java, "write once, run anywhere". Para ello, se compila el código fuente escrito en lenguaje Java, para generar un código conocido como "bytecode" (especí…camente Java byte- code), instrucciones máquina simpli…cadas especí…cas de la plataforma Java. Esta pieza esta "a medio camino" entre el código fuente y el código máquina que entiende el dispositivo destino. El bytecode es ejecutado entonces en la máquina virtual (JVM), un programa escrito en código nativo de la plataforma destino (que es el que entiende su Hardware), que interpreta y ejecuta el código. Además, se suministran bibliotecas adicionales para acceder a las características de cada dispositivo (como los grá…cos, ejecución mediante he- bras o threads, la interfaz de red) de forma uni…cada. Se debe tener presente que, aunque hay una etapa explícita de compilación, el bytecode generado es interpretado o convertido a instrucciones máquina del código nativo por «compilación al vuelo JIT (Just In Time)» . Hay implementaciones del compilador de Java que convierten el código fuente directamente en código objeto nativo, como GCJ. Esto elimina la etapa intermedia donde se genera el bytecode, pero la salida de este tipo de compiladores sólo puede ejecutarse en un tipo de arquitectura. La licencia sobre Java de Sun insiste en que todas las implementaciones sean "compatibles". Esto dio lugar a una disputa legal entre Microsoft y Sun, cuando este último alegó que la implementación de Microsoft no daba soporte a las interfaces RMI y JNI además de haber añadido características ”dependientes” de su plataforma. Sun demandó a Microsoft y ganó por daños y perjuicios (unos 20 millones de dólares), así como una orden judicial forzando el acatamiento de la licencia de Sun. Como respuesta, Microsoft no ofrece Java con su versión de sistema operativo, y en recientes versiones de Windows, su navegador Internet Explorer no admite la ejecución de applets sin un «conector (Plugin)» aparte. Sin embargo, Sun y otras fuentes ofrecen versiones gratuitas para distintas versiones de Windows. Las primeras implementaciones del lenguaje usaban una máquina virtual interpretada para conseguir la portabilidad. Sin embargo, el resultado eran programas que se ejecutaban comparativamente más lentos que aquellos es- critos en C o C++. Esto hizo que Java se ganase una reputación de lento en rendimiento. Las implementaciones recientes de la JVM dan lugar a progra- mas que se ejecutan considerablemente más rápido que las versiones antiguas, [email protected] 193 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM empleando diversas técnicas, aunque sigue siendo mucho más lentos que otros lenguajes. La primera de estas técnicas es simplemente compilar directamente en código nativo como hacen los compiladores tradicionales, eliminando la etapa del bytecode. Esto da lugar a un gran rendimiento en la ejecución, pero tapa el camino a la portabilidad. Otra técnica, conocida como «compilación al vuelo JIT (Just In Time)» , convierte el bytecode a código nativo cuando se ejecuta la aplicación. Otras máquinas virtuales más so…sticadas usan una "recompilación dinámica" en la que la VM es capaz de analizar el compor- tamiento del programa en ejecución y recompila y optimiza las partes críticas. La recompilación dinámica puede lograr mayor grado de optimización que la compilación tradicional (o estatica), ya que puede basar su trabajo en el conocimiento que de primera mano tiene sobre el entorno de ejecución y el conjunto de clases cargadas en memoria. La compilación JIT y la recompi- lación dinámica permiten a los programas Java aprovechar la velocidad de ejecución del código nativo sin por ello perder la ventaja de la portabilidad en ambos. La portabilidad es técnicamente difícil de lograr, y el éxito de Java en ese campo ha sido dispar. Aunque es de hecho posible escribir programas para la plataforma Java que actúen de forma correcta en múltiples plataformas de distinta arquitectura, el gran número de estas con pequeños errores o inconsistencias llevan a que a veces se parodie el eslogan de Sun, "Write once, run anywhere" como "Write once, debug everywhere" (o "Escríbelo una vez, ejecútalo en cualquier parte" por "Escríbelo una vez, depúralo en todas partes"). El concepto de independencia de la plataforma de Java cuenta, sin em- bargo, con un gran éxito en las aplicaciones en el entorno del servidor, como los Servicios Web, los Servlets, los Java Beans, así como en sistemas empo- trados basados en OSGi, usando entornos Java empotrados.

El recolector de basura En Java el problema fugas de memoria se evita en gran medida gracias a la «recolección automática de basura (o automatic garbage collector)» . El programador determina cuándo se crean los objetos y el entorno en «tiempo de ejecución de Java (Java runtime)» es el responsable de gestionar el ciclo de vida de los objetos. El programa, u otros objetos, pueden tener localizado un objeto mediante una referencia a este. Cuando no quedan referencias a un objeto, el recolector de basura de Java borra [email protected] 194 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM el objeto, liberando así la memoria que ocupaba previniendo posibles fugas (ejemplo: un objeto creado y únicamente usado dentro de un método sólo tiene entidad dentro de este; al salir del método el objeto es eliminado). Aun así, es posible que se produzcan fugas de memoria si el código almacena referencias a objetos que ya no son necesarios; es decir, pueden aún ocurrir, pero en un nivel conceptual superior. En de…nitiva, el recolector de basura de Java permite una fácil creación y eliminación de objetos y mayor seguridad.

Instalación de Java e IDEs Existen diversas versiones de Java para Linux, la más usada es JDK de Oracle pero también esta una versión abierta llamada OpenJDK, para instalar por ejemplo OpenJDK 14 en Debian GNU/Linux es necesario hacer:

# apt install default-jdk

o

# apt install -14-jre openjdk-14-jdk openjdk-14-doc

si se desea instalar solo el Run-Time JRE, para ello usamos:

# apt install default-jre

o

# apt install openjdk-14-jre

y si hay más de una versión instalada, podemos actualizar la versión por omisión de Java:

# update-java-alternatives -s java-1.14.0-openjdk-amd64

para conocer la versión instalada usamos:

$ java –version

Además, se pueden instalar diversas herramientas e IDEs para facilitar la programación en Java, para ello usar: [email protected] 195 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

# apt install jedit gedit nedit emacs medit kscope geany geany-plugins editra qtcreator anjuta n anjuta-extras codelite-plugins tea vim- n mousepad eric neovim neovim- medit katepartn # apt install eclipse eclipse-cdt eclipse- blue…sh blue…sh-plugins codeblocks codeblocks-contrib n # apt install fte fte-console fte-terminal nano joe vim vim-python-jedi vim-tlib vim-latexsuite vim-nox micron neovim micro kakoune vim-athena jed n # apt install kdi¤3 di¤use dirdi¤ numdi¤ colordi¤ dwdi¤ wdi¤ xxdi¤ tkdi¤ ndi¤ ccdi¤ xxdi¤ n # apt install alleyoop astyle c2html java2html code2html c2html autodia txt2html html2text n # apt install git git-all gitk gitg git-cola git-gui qgit tig vim-fugitive git-extras n # apt install mercurial # apt install subversion rapidsvn # apt install cvs tkcvs

Además, es posible instalar varios editores especializados de las páginas o…ciales de sus proyectos:

https://netbeans.apache.org/download/index.html https://www.eclipse.org/downloads/ http://brackets.io/ https://www.jetbrains.com/idea/download/#section=Linux https://www.oracle.com/tools/downloads/Jdeveloper-12c-downloads.html http://www.drjava.org/ https://www.jgrasp.org/ https://www.bluej.org/ http://www.jcreator.com/index.htm https://codenvy.com/ https://atom.io/ https://www.sublimetext.com/

[email protected] 196 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Crear y Ejecutar Archivos . Un archivo .jar (Java ARchive) es un formato de archivo independiente de la plataforma que se utiliza para agregar muchos archivos de clase Java, metadatos y recursos asociados, como texto, imágenes, etc., en un solo archivo para su distribución. Permite que los tiempos de ejecución de Java implementen de manera e…ciente una aplicación completa en un archivo de almacenamiento y brinda muchos bene…cios, como seguridad, sus elementos pueden comprimirse, acor- los tiempos de descarga, permite el sellado y control de versiones de pa- quetes, admite la portabilidad. También es compatible con el empaquetado para extensiones. Para crear y ejecutar archivos .jar necesitamos hacer lo siguiente:

1. Primero comencemos escribiendo una clase Java simple con un método principal para una aplicación llamada MiApp, con …nes de demostración.

$ nano MiApp.java

Copie y pegue el siguiente código en el archivo MiApp.java.

public class MiApp { public static void main(String[] args){ System.out.println("Solo ejecuta MiApp"); } }

Grabe el archivo y cierre este.

2 A continuación, necesitamos compilar y empaquetar la clase en un archivo JAR usando las utilidades javac y jar como se muestra:

$ javac -d . MiApp.java $ ls $ jar cvf MiApp.jar MiApp.class $ ls

3 Una vez creado MiApp.jar, ahora podemos ejecutar el archivo usando el comando java como se muestra:

$ java -jar MiApp.jar no main manifest attribute, in MiApp.jar [email protected] 197 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

De la salida del comando anterior, encontramos un error. La JVM (Java ) no pudo encontrar nuestro atributo de mani…esto principal, por lo que no pudo ubicar la clase principal que contiene el método principal (public static void main (String [] args)). El archivo JAR debe tener un mani…esto que contenga una línea con el formato Main-Class: classname que de…na la clase con el método principal que sirve como punto de partida de nuestra aplicación.

4 Para corregir el error anterior, necesitaremos actualizar el archivo JAR para incluir un atributo de mani…esto junto con nuestro código. Creemos un archivo MANIFEST.MF:

$ nano MANIFEST.MF

Copie y pegue la siguiente línea en el archivo MANIFEST.MF:

Main-Class: MiApp

Guarde el archivo y agreguemos el archivo MANIFEST.MF a nuestro MiApp.jar usando el siguiente comando:

$ jar cvmf MANIFEST.MF MiApp.jar MiApp.class

5 Finalmente, cuando ejecutamos el archivo JAR nuevamente, debería producir el resultado esperado como se muestra en la salida:

$ java -jar MiApp.jar Solo ejecuta MiApp

Para obtener más información, debemos consultar las páginas de manual de los comandos java, javac y jar.

$ man java $ man javac $ man jar

[email protected] 198 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Aprender a Programar en Java En la red existen múltiples sitios espe- cializados y una amplia bibliografía para aprender a programar cada uno de los distintos aspectos de Java, nosotros hemos seleccionado diversos textos que ponemos a su disposición en:

Lenguaje Java

8.2 C y C++ C (véase [9]) es un lenguaje de programación originalmente desarrollado por Dennis Ritchie entre 1969 y 1972 en los Laboratorios Bell, como evolución del lenguaje anterior B, a su vez basado en BCPL. Es un lenguaje orientado a la implementación de Sistemas operativos, concretamente Unix, Linux y el Kernel de Linux. C es apreciado por la e…ciencia del código que produce y es el lenguaje de programación más popular para crear Software de sistemas, aunque también se utiliza para crear aplicaciones. Se trata de un lenguaje de tipos de datos estaticos, débilmente tipi…cado, de medio nivel, ya que dispone de las estructuras típicas de los lenguajes de alto nivel pero, a su vez, dispone de construcciones del lenguaje que permiten un control a muy bajo nivel. Los compiladores suelen ofrecer extensiones al lenguaje que posibilitan mezclar código en ensamblador con código C o acceder directamente a memoria o dispositivos periféricos.

Filosofía Uno de los objetivos de diseño del lenguaje C es que sólo sean necesarias unas pocas instrucciones en lenguaje máquina para traducir cada elemento del lenguaje, sin que haga falta un soporte intenso en tiempo de ejecución. Es muy posible escribir C a bajo nivel de abstracción; de hecho, C se usó como intermediario entre diferentes lenguajes. En parte, a causa de ser relativamente de bajo nivel y tener un modesto conjunto de características, se pueden desarrollar compiladores de C fácil- mente. En consecuencia, el lenguaje C esta disponible en un amplio abanico de plataformas (más que cualquier otro lenguaje). Además, a pesar de su naturaleza de bajo nivel, el lenguaje se desarrolló para incentivar la progra- mación independiente de la máquina. Un programa escrito cumpliendo los estandares e intentando que sea portátil puede compilarse en muchos com- putadores. C se desarrolló originalmente (conjuntamente con el sistema operativo Unix, con el que ha estado asociado mucho tiempo) por programadores para [email protected] 199 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM programadores. Sin embargo, ha alcanzado una popularidad enorme, y se ha usado en contextos muy alejados de la programación de Software de sistemas, para la que se diseñó originalmente.

Propiedades Núcleo del lenguaje simple, con funcionalidades añadidas importantes, como funciones matemáticas y de manejo de archivos, propor- cionadas por bibliotecas. Es un lenguaje muy ‡exible que permite programar con múltiples estilos. Uno de los más empleados es el estructurado "no lle- vado al extremo", entre sus principales propiedades destacan:

Un sistema de tipos que impide operaciones sin sentido  Usa un lenguaje de preprocesado, el preprocesador de C, para tareas  como de…nir macros e incluir múltiples archivos de código fuente

Acceso a memoria de bajo nivel mediante el uso de punteros  Interrupciones al procesador con uniones  Un conjunto reducido de palabras clave  Por defecto, el paso de parámetros a una función se realiza por valor. El  paso por referencia se consigue pasando explícitamente a las funciones las direcciones de memoria de dichos parámetros

Punteros a funciones y variables estaticas, que permiten una forma  rudimentaria de encapsulado y polimor…smo

Tipos de datos agregados (struct) que permiten que datos relacionados  (como un empleado, que tiene un id, un nombre y un salario) se combi- nen y se manipulen como un todo (en una única variable "empleado")

Carencias Aunque la lista de las características útiles de las que carece C es larga, éstos factores han sido importantes para su aceptación, porque escribir rápidamente nuevos compiladores para nuevas plataformas, mantiene lo que realmente hace el programa bajo el control directo del programador, y permite implementar la solución más natural para cada plataforma. esta es la causa de que a menudo C sea más e…ciente que otros lenguajes. Típicamente, sólo la programación cuidadosa en lenguaje ensamblador produce un código más rápido, pues da control total sobre la máquina, aunque los avances en [email protected] 200 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM los compiladores de C y la complejidad creciente de los microprocesadores modernos han reducido gradualmente esta diferencia, Algunas carencias son:

Recolección de basura nativa, sin embargo se encuentran a tal efecto  bibliotecas como la "libgc" desarrollada por Sun Microsystems, o el Recolector de basura de Boehm

Soporte para programación orientada a objetos, aunque la implementa-  ción original de C++ fue un preprocesador que traducía código fuente de C++ a C. Véase también la librería GObject

Funciones anidadas, aunque GCC tiene esta característica como exten-  sión

Soporte nativo para programación multihilo. Disponible usando libre-  rías como libpthread

Ventajas estas se pueden resumie en:

Lenguaje muy e…ciente puesto que es posible utilizar sus características  de bajo nivel para realizar implementaciones óptimas

A pesar de su bajo nivel es el lenguaje más portado en existencia, ha-  biendo compiladores para casi todos los sistemas de cómputo conocidos

Proporciona facilidades para realizar programas modulares y/o utilizar  código o bibliotecas existentes

Inconvenientes El mayor problema que presenta el lenguaje C frente a los lenguajes de tipo de dato dinámico es la gran diferencia en velocidad de desarrollo: es más lento programar en C, sobre todo para el principiante. La razón estriba en que el compilador de C se limita a traducir código sin apenas añadir nada. La gestión de la memoria es un ejemplo clásico: en C el programador ha de reservar y liberar la memoria explícitamente. En otros lenguajes (como BASIC, MATLAB o C#) la memoria es gestionada de forma transparente para el programador. Esto alivia la carga de trabajo humano y en muchas ocasiones evita errores, aunque también supone mayor carga de trabajo para el procesador.

[email protected] 201 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

El mantenimiento en algunos casos puede ser más difícil y costoso que con ciertos lenguajes de más alto nivel. El código en C se presta a sentencias cortas y enrevesadas de difícil interpretación. Cabe destacar el contexto y época en la que fue desarrollado C. En aque- llos tiempos existían muy pocos programadores, los cuales, a su vez, eran prácticamente todos expertos en el área. De esta manera, se asumía que los programadores eran conscientes de sus trabajos y capaces de manejar perfectamente el lenguaje. Por esta razón es muy importante que los re- cién iniciados adopten buenas prácticas a la hora de escribir en C y manejar la memoria, como por ejemplo un uso intensivo de indentación y conocer a fondo todo lo que implica el manejo de punteros y direcciones de memoria.

Aplicabilidad Hecho principalmente para la ‡uidez de programación en sistemas UNIX. Se usa también para el desarrollo de otros sistemas ope- rativos como Windows o GNU/Linux. Igualmente para aplicaciones de es- critorio como GIMP, cuyo principal lenguaje de programación es C. De la misma forma, es muy usado en aplicaciones cientí…cas (para exper- imentos informáticos, físicos, químicos, matemáticos, entre otros, conocidos como modelos y simuladores), industriales (industria robótica, cibernética, sistemas de información y base de datos para la industria petrolera y petro- química). Predominan también todo lo que se re…ere a simulación de máquinas de manufactura, simulaciones de vuelo (es la más delicada, ya que se tienen que usar demasiados recursos tanto de Hardware como de Software para de- sarrollar aplicaciones que permitan simular el vuelo real de una aeronave). Se aplica por tanto, en diversas áreas desconocidas por gran parte de los usuarios noveles. Los equipo de cómputo de …nales de los 90 son varios órdenes de mag- nitud más potentes que las máquinas en que C se desarrolló originalmente. Programas escritos en lenguajes de tipo dinámico y fácil codi…cación (Ruby, Python, Perl, etc.) que antaño hubieran resultado demasiado lentos, son lo bastante rápidos como para desplazar en uso a C. Aun así, se puede seguir encontrando código C en grandes desarrollos de animaciones, modelados y escenas en 3D en películas y otras aplicaciones multimedia. Actualmente, los grandes proyectos de Software se dividen en partes, den- tro de un equipo de desarrollo. Aquellas partes que son más "burocráticas" o "de gestión" con los recursos del sistema, se suelen realizar en lenguajes de tipo dinámico o de guion (script), mientras que aquellas partes "críti- [email protected] 202 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM cas", por su necesidad de rapidez de ejecución, se realizan en un lenguaje de tipo compilado, como C o C++. Si después de hacer la división, las partes críticas no superan un cierto porcentaje del total (aproximadamente el 10%) entonces todo el desarrollo se realiza con lenguajes dinámicos. Si la parte crítica no llega a cumplir las expectativas del proyecto, se comparan las al- ternativas de una inversión en nuevo Hardware frente a invertir en el coste de un programador para que reescriba dicha parte crítica. Ya que muchos programas han sido escritos en el lenguaje C existe una gran variedad de bibliotecas disponibles. Muchas bibliotecas son escritas en C debido a que C genera código objeto rápido; los programadores luego generan interfaces a la biblioteca para que las rutinas puedan ser utilizadas desde lenguajes de mayor nivel, tales como Java, Perl y Python.

C++ (véase [10]) es un lenguaje de programación diseñado a mediados de 1979 por Bjarne Stroustrup. La intención de su creación fue el extender al lenguaje de programación C mecanismos que permiten la manipulación de objetos. En ese sentido, desde el punto de vista de los lenguajes orientados a objetos, C++ es un lenguaje híbrido. Posteriormente se añadieron facilidades de programación genérica, que se sumaron a los paradigmas de programación estructurada y programación orientada a objetos. Por esto se suele decir que el C++ es un lenguaje de programación multiparadigma. Actualmente existe un estandar, denominado ISO C++, al que se han ad- herido la mayoría de los fabricantes de compiladores más modernos. Existen también algunos intérpretes, tales como ROOT. Una particularidad de C++ es la posibilidad de rede…nir los operadores, y de poder crear nuevos tipos que se comporten como tipos fundamentales. El nombre "C++" fue propuesto por Rick Mascitti en el año 1983, cuando el lenguaje fue utilizado por primera vez fuera de un laboratorio cientí…co. Antes se había usado el nombre "C con clases". En C++, la expresión "C++" signi…ca "incremento de C " y se re…ere a que C++ es una extensión de C.

El concepto de clase Los objetos en C++ son abstraídos mediante una clase. Según el paradigma de la programación orientada a objetos un objeto consta de: [email protected] 203 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Identidad, que lo diferencia de otros objetos (Nombre que llevará la  clase a la que pertenece dicho objeto).

Métodos o funciones miembro  Atributos o variables miembro  Diferencias de tipos respecto a C En C++, cualquier tipo de datos que sea declarado completo (fully quali…ed, en inglés) se convierte en un tipo de datos único. Las condiciones para que un tipo de datos T sea declarado completo son a grandes rasgos las siguientes:

Es posible al momento de compilación conocer el espacio asociado al  tipo de datos (es decir, el compilador debe conocer el resultado de sizeof(T))

T Tiene al menos un constructor, y un destructor, bien declarados  Si T es un tipo compuesto, o es una clase derivada, o es la especi…cación  de una plantilla, o cualquier combinación de las anteriores, entonces las dos condiciones establecidas previamente deben aplicar para cada tipo de dato constituyente

En general, esto signi…ca que cualquier tipo de datos de…nido haciendo  uso de las cabeceras completas, es un tipo de datos completo

En particular, y a diferencia de lo que ocurría en C, los tipos de…nidos  por medio de struct o enum son tipos completos. Como tales, ahora son sujetos a sobrecarga, conversiones implícitas, etcétera

Los tipos enumerados, entonces, ya no son simplemente alias para tipos enteros, sino que son tipos de datos únicos en C++. El tipo de datos bool, igualmente, también pasa a ser un tipo de datos único, mientras que en C funcionaba en algunos casos como un alias para alguna clase de dato de tipo entero.

[email protected] 204 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Compiladores Uno de los compiladores libres de C++ es el de GNU, el compilador G++ (parte del proyecto GCC, que engloba varios compiladores para distintos lenguajes). Otros compiladores comunes son Intel C++ Com- piler, el compilador de Xcode, el compilador de Borland C++, el compilador de CodeWarrior C++, el compilador g++ de , el compilador g++ de MinGW, el compilador de Visual C++, Carbide.c++, entre otros.

Instalación de C y C++ e IDEs Existen diversas versiones de C y C++ para Linux, para instalarlos en Debian GNU/Linux es necesario hacer:

# apt install build-essential manpages-dev glibc-doc glibc-doc-reference gcc-doc-base gcc-doc splint n c++-annotations-pdf c++-compiler c-compilern g++ cppcheck cccc make cmake scons n jam ohcount n

Además, se pueden instalar diversas herramientas e IDEs para facilitar la programación en C y C++, para ello usar:

# apt install scite jedit kate gedit nedit emacs medit kscope geany geany-plugins editra qtcreator anjuta n anjuta-extras codelite codelite-plugins tea vim-gtk n mousepad eric neovim neovim-qt medit kwrite katepartn # apt install eclipse eclipse-cdt eclipse-pydev netbeans blue…sh blue…sh-plugins codeblocks codeblocks-contrib n # apt install fte fte-console fte-terminal nano joe vim vim-python-jedi vim-tlib vim-latexsuite vim-nox micron neovim micro kakoune vim-athena jed n # apt install kdi¤3 meld di¤use dirdi¤ kompare numdi¤ colordi¤ dwdi¤ wdi¤ xxdi¤ tkdi¤ ndi¤ ccdi¤ xxdi¤ n # apt install alleyoop astyle c2html java2html code2html c2html autodia txt2html html2text n # apt install git git-all gitk gitg git-cola git-gui qgit tig vim-fugitive git-extras n # apt install mercurial # apt install subversion rapidsvn # apt install cvs tkcvs [email protected] 205 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Aprender a Programar en C y C++ En la red existen múltiples sitios especializados y una amplia bibliografía para aprender a programar cada uno de los distintos aspectos de C y C++, nosotros hemos seleccionado diversos textos que ponemos a su disposición en:

Lenguajes C y C++

8.3 Fortran Fortran (véase [?]) contracción del inglés The IBM Mathematical Formula Translating System, es un lenguaje de programación de alto nivel de propósito general, procedimental e imperativo, que está especialmente adaptado al cál- culo numérico y a la computación cientí…ca. Desarrollado originalmente por IBM en 1957 para el equipo IBM 704, y usado para aplicaciones cientí…cas y de ingeniería, el Fortran a dominar esta área de la programación desde el principio y ha estado en uso continuo por más de medio siglo en áreas de cómputo intensivo tales como la predicción numérica del tiempo, análisis de elementos …nitos, dinámica de ‡uidos computacional, física computacional y química computacional. Es uno de los lenguajes más populares en el área de la computación de alto rendimiento y es el lenguaje usado para programas que evalúan el desempeño (benchmark) y el ranking de los supercomputa- dores más rápidos del mundo. El Fortran abarca un linaje de versiones, cada una de las cuales evolu- cionó para añadir extensiones al lenguaje mientras que usualmente retenía compatibilidad con las versiones previas. Versiones sucesivas han añadido soporte para procesamiento de datos basados en caracteres (Fortran 77), programación de arreglos, programación modular y programación orientada a objetos (Fortran 90/95), y programación genérica (Fortran 2003).

Ventajas e inconvenientes de su sintaxis como fue una primera tentativa de creación de un lenguaje de programación de alto nivel, tiene una sintaxis considerada arcaica por muchos programadores que aprenden lenguajes más modernos. Es difícil escribir un bucle "for", y errores en la escritura de un solo carácter pueden llevar a errores durante el tiempo de ejecución en vez de errores de compilación, en el caso de que no se usen las construcciones más frecuentes. Algunas de las primeras versiones no poseían facilidades que son consideradas muy útiles, tal como la asignación dinámica de memoria. [email protected] 206 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Se debe tener en cuenta que la sintaxis de Fortran fue orientada para el uso en trabajos numéricos y cientí…cos. Muchas de sus de…ciencias han sido abordadas en revisiones recientes del lenguaje. Por ejemplo, Fortran 95 posee comandos mucho más breves para efectuar operaciones matemáticas con matrices y dispone de tipos. Esto no solo mejora mucho la lectura del programa sino que además aporta información útil al compilador. Por estas razones Fortran prácticamente no se usa fuera de los campos cientí…cos y del análisis numérico, pero permanece como el lenguaje preferido para desarrollar aplicaciones de computación numérica de alto rendimiento.

Características

Tipos de datos soportados: Numéricos (enteros, reales, complejos y doble precisión).  Boleanos (logical).  Arreglos.  Cadenas de caracteres.  Archivos.  FORTRAN 90 ya es estructurado, y no requiere sentencias GOTO. Sólo admite dos ámbitos para las variables: local y global.

Variables y constantes Fortran no es sensible a mayúsculas y minúsculas. Los nombre de  variables tienen de 6 a 31 caracteres máximo y deben comenzar por una letra. Los blancos son signi…cativos. Declaración explicita de variables.  Enteras (I-N), el resto reales. (se modi…ca con IMPLICIT).  Punteros: en los primeros FORTRAN no hay punteros y todas las vari-  ables se almacenan en memoria estática. En FORTRAN 90 se declaran INTEGER, POINTER::P. Para memoria dinámica ALLOCATE y DEALLOCATE  [email protected] 207 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Tipos de datos Arrays, pueden tener hasta 7 dimensiones y se guardan por colummnas.  REAL M(20),N(-5:5)  DIMENSION I(20,20) (tipo por nomenclatura implícita)  Cadenas de caracteres, el primer carácter es el 1, el operador // permite  concatenar cadenas. CHARACTER S*10, T*25  Almacenamiento de datos. Se usa COMMON para datos compartidos  y EQUIVALENCE cuando almacenamos una variable con dos posibles tipos en la misma posición de memoria (como union en C). Se usa DATA para inicializar datos estáticos. DATA X/1.0/,Y/3.1416/,K/20/  Tipos de…nidos por el usuario, con TYPE ... END TYPE 

Control de secuencia el conjunto de estructuras de control es limi- tado:

Expresiones, prioridad de operadores  Enunciados  Asignación, cuando se hace entre cadenas hay ajuste de tamaño con blancos o truncamiento. Condicional. Permite IF ELSE IF... Para selección múltiple SELECT CASE CASE.....CASE DEFAULT.... END SELECT Iteración. DO....END DO  Nulo, se usa solo para la etiqueta. CONTINUE.  Control de subprogramas. CALL invoca al subprograma y RETURN  devuelve un valor al programa llamante. Construcciones propensas a error: GOTO.  [email protected] 208 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Entrada y salida

Tipos de archivos:  Secuenciales  De acceso directo  Comandos: READ, WRITE, PRINT, OPEN , CLASE, INQUIRE (pro-  piedades o estado del archivo) REWIND y ENDFILE (para ubicar el puntero del …chero).

Para el tratamiento de excepciones en las sentencias READ/WRITE se  puede introducir la posición de la rutina de dicho tratamiento (ERR=90).

Subprogramas

Hay tres tipos de subprogramas:  Function, devuelven un solo valor de tipo numérico, lógico o cadena de caracteres. , devuelve valores a través de variables no locales COMMON.  Función de enunciado, permite calcular una sola expresión aritmética o lógica. FN(X,Y)=SIN(X)**2-COS(Y)**2  Gestión de almacenamiento.  Las variables son locales o globales (COMMON)  Recursividad: RECURSIVE FUNCTION FACTORIAL(X)  Parámetros de subprograma. Paso por referencia.  Abstracción y encapsulación. Evaluación del lenguaje

La abstracción es posible mediante los subprogramas y el uso de varia-  bles COMMON, aunque su uso es propenso a errores.

FORTRAN sigue siendo utilizado en el ámbito cientí…co y es muy e…-  ciente realizando cálculos. [email protected] 209 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

La estructura del programa suele ser di…cil de entender.  En FORTRAN 90 se incluye la recursividad y la memoria dinámica. Las etiquetas de las sentencias ya no son necesarias, ni el GOTO, pues se ha transformado en un lenguaje estructurado. El aspecto de los programas sigue siendo de procesamiento por lotes

Instalación de Fortran e IDEs Existen diversas versiones de Fortean para Linux, para instalarlos en Debian GNU/Linux es necesario hacer:

# apt install gfortran gfortran-doc fortran77-compiler fortran95-compiler fortran-compiler cfortran n

Además, se pueden instalar diversas herramientas e IDEs para facilitar la programación en Fortran, para ello usar:

# apt install scite jedit kate gedit nedit emacs medit kscope geany geany-plugins editra qtcreator anjuta n anjuta-extras codelite codelite-plugins tea vim-gtk n mousepad eric neovim neovim-qt medit kwrite katepartn # apt install fte fte-console fte-terminal nano joe vim vim-python-jedi vim-tlib vim-latexsuite vim-nox micron neovim micro kakoune vim-athena jed n # apt install kdi¤3 meld di¤use dirdi¤ kompare numdi¤ colordi¤ dwdi¤ wdi¤ xxdi¤ tkdi¤ ndi¤ ccdi¤ xxdi¤ n # apt install alleyoop astyle c2html java2html code2html c2html autodia txt2html html2text n # apt install git git-all gitk gitg git-cola git-gui qgit tig vim-fugitive git-extras n # apt install mercurial # apt install subversion rapidsvn # apt install cvs tkcvs

[email protected] 210 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

8.4 Python Python (véase [8]) es un lenguaje de programación interpretado cuya …losofía hace hincapié en una sintaxis que favorezca un código legible. Se trata de un lenguaje de programación multiparadigma, ya que soporta orientación a ob- jetos, programación imperativa y, en menor medida, programación funcional. Es un lenguaje interpretado, usa tipado dinámico y es multiplataforma. Es administrado por la Python Software Foundation. Posee una licencia de código abierto, denominada Python Software Foundation License, que es compatible con la Licencia pública general de GNU a partir de la versión 2.1.1, e incompatible en ciertas versiones anteriores (véase apéndice 14.1). Python fue creado a …nales de los ochenta por Guido van Rossum en el Centro para las Matemáticas y la Informática (CWI, Centrum Wiskunde & Informatica), en los Países Bajos, como un sucesor del lenguaje de pro- gramación ABC, capaz de manejar excepciones e interactuar con el sistema operativo Amoeba. Van Rossum es el principal autor de Python, y su con- tinuo rol central en decidir la dirección de Python es reconocido, re…riéndose a él como Benevolente Dictador Vitalicio (en inglés: Benevolent Dictator for Life, BDFL).

Características y paradigmas Python es un lenguaje de programación multiparadigma. Esto signi…ca que más que forzar a los programadores a adoptar un estilo particular de programación, permite varios estilos: progra- mación orientada a objetos, programación imperativa y programación fun- cional. Otros paradigmas estan soportados mediante el uso de extensiones. Python usa tipado dinámico y conteo de referencias para la administración de memoria. Una característica importante de Python es la resolución dinámica de nombres; es decir, lo que enlaza un método y un nombre de variable durante la ejecución del programa (también llamado enlace dinámico de métodos). Otro objetivo del diseño del lenguaje es la facilidad de extensión. Se pueden escribir nuevos módulos fácilmente en C o C++. Python puede incluirse en aplicaciones que necesitan una interfaz programable. Aunque la programación en Python podría considerarse en algunas situa- ciones hostil a la programación funcional tradicional del Lisp, existen bas- tantes analogías entre Python y los lenguajes minimalistas de la familia Lisp como puede ser Scheme. El intérprete de Python estandar incluye un modo interactivo en el cual [email protected] 211 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM se escriben las instrucciones en una especie de intérprete de comandos: las expresiones pueden ser introducidas una a una, pudiendo verse el resultado de su evaluación inmediatamente, lo que da la posibilidad de probar porciones de código en el modo interactivo antes de integrarlo como parte de un programa. Esto resulta útil tanto para las personas que se estan familiarizando con el lenguaje como para los programadores más avanzados. Existen otros programas, tales como IDLE, bpython o IPython, que añaden funcionalidades extra al modo interactivo, como el autocompletado de código y el coloreado de la sintaxis del lenguaje.

Elementos del lenguaje Python fue diseñado para ser leído con facilidad. Una de sus características es el uso de palabras donde otros lenguajes uti- lizarían símbolos. Por ejemplo, los operadores lógicos: !, y &&, en Python se escriben; not, or y and, respectivamente. Curiosamentejj el lenguaje Pascal es junto con COBOL uno de los lenguajes con muy clara sintaxis y ambos son de la década de los 70. La idea del código claro y legible no es algo nuevo. El contenido de los bloques de código (bucles, funciones, clases, etc.) es delimitado mediante espacios o tabuladores, conocidos como indentación, antes de cada línea de órdenes pertenecientes al bloque. Python se diferen- cia así de otros lenguajes de programación que mantienen como costumbre declarar los bloques mediante un conjunto de caracteres, normalmente entre llaves {}. Se pueden utilizar tanto espacios como tabuladores para indentar el código, pero se recomienda no mezclarlos. Debido al signi…cado sintáctico de la indentación, cada instrucción debe estar contenida en una sola línea. No obstante, si por legibilidad se quiere dividir la instrucción en varias líneas, añadiendo una barra invertida: al …nal de una línea, se indica que la instrucción continúa en la siguiente. n

Variables Las variables se de…nen de forma dinámica, lo que signi…ca que no se tiene que especi…car cuál es su tipo de antemano y puede tomar distintos valores en otro momento, incluso de un tipo diferente al que tenía previamente. Se usa el símbolo = para asignar valores.

Módulos Existen muchas propiedades que se pueden agregar al lenguaje importando módulos, que son "minicódigos" (la mayoría escritos también en Python) que proveen de ciertas funciones y clases para realizar determinadas tareas. Un ejemplo es el módulo: Tkinter, que permite crear interfaces grá- [email protected] 212 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

…cas basadas en la biblioteca Tk. Otro ejemplo es el módulo: os, que provee acceso a muchas funciones del sistema operativo. Los módulos se agregan a los códigos escribiendo la palabra reservada import seguida del nombre del módulo que queramos usar. Python tiene una gran biblioteca estandar, usada para una diversidad de tareas. Esto viene de la …losofía "pilas incluidas" ("batteries included") en referencia a los módulos de Python50. Los módulos de la biblioteca estandar pueden mejorarse por módulos personalizados escritos tanto en C como en Python. Debido a la gran variedad de herramientas incluidas en la biblioteca estandar, combinada con la habilidad de usar lenguajes de bajo nivel como C y C++, los cuales son capaces de interactuar con otras bibliotecas, Python es un lenguaje que combina su clara sintaxis con el inmenso poder de lenguajes menos elegantes.

Algunos Módulos para Python

TensorFlow Models sirve para el aprendizaje automático y apren- dizaje profundo. TensorFlow Models es el repositorio de fuente abierta para encontrar muchas bibliotecas y modelos relacionados con el aprendizaje pro- fundo.

Keras es una API de redes neuronales de alto nivel, escrita en Python y es capaz de ejecutarse sobre TensorFlow, CNTK o Theano. Fue desarrollado con un enfoque para permitir la experimentación rápida.

Frasco es un framework ligero de aplicaciones Web WSGI. esta dise- ñado para que el inicio sea rápido y fácil, con la capacidad de escalar hasta aplicaciones complejas. Comenzó como un simple envoltorio alrededor de Werkzeug y Jinja y se ha convertido en uno de los frameworks de aplicación Web Python más populares.

Scikit-learn es un módulo de Python para el aprendizaje automático construido sobre SciPy y distribuido bajo la licencia BSD.

50 Una lista de módulos disponibles en Python esta en su página o…cial. Para la versión 2 en: https://docs.python.org/2/py-modindex.html Para la versión 3 en: https://docs.python.org/3/py-modindex.html [email protected] 213 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Zulip es una poderosa aplicación de chat grupal de código abierto que combina la inmediatez del chat en tiempo real con los bene…cios de produc- tividad de las conversaciones enhebradas. Zulip es utilizado por proyectos de código abierto, compañías de Fortune 500, cuerpos de grandes estandares y otros que necesitan un sistema de chat en tiempo real que les permita a los usuarios procesar fácilmente cientos o miles de mensajes al día. Con más de 300 colaboradores que fusionan más de 500 commits por mes, Zulip es también el proyecto de chat grupal de código abierto más grande y de más rápido crecimiento.

Django es un framework Web Python de alto nivel que fomenta un de- sarrollo rápido y un diseño limpio y pragmático de desarrollo Web de código abierto, escrito en Python, que respeta el patron de diseño conocido como modelo-vista-template. Fue desarrollado en origen para gertionar varias pági- nas orientadas a noticias de la World Company de Lawrence, Kanzas y fúe liberada al público bajo unalicencia BSD en julio del 2005.

Rebound es una herramienta de línea de comandos que obtiene instan- táneamente los resultados de desbordamiento de pila cuando se produce un error de compilación.

Google Images Download Este es un programa de línea de comando de Python para buscar palabras clave / frases clave en Google Imágenes y op- cionalmente descargar imágenes a su computadora. También puede invocar este script desde otro archivo Python.

YouTube-dl es usado para descargar videos de: .com u otras plataformas de video.

System Design Primer este repositorio es una colección organizada de recursos para ayudar a aprender a construir sistemas a escala.

Mask R-CNN es para detección y segmentación de objetos. Esta es una implementación de Mask R-CNN en Python 3, Keras y TensorFlow. El modelo genera cuadros de delimitación y máscaras de segmentación para cada instancia de un objeto en la imagen. Se basa en Feature Pyramid Network (FPN) y ResNet101 backbone. [email protected] 214 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Face Recognition es usado para reconocer y manipular caras desde Python o desde la línea de comandos con la biblioteca de reconocimiento facial más simple del mundo. Esto también proporciona una herramienta de línea de comandos: face_recognition simple que permite hacer reconocimiento de rostros en una carpeta de imágenes desde la línea de comandos.

Snallygaster Herramienta para buscar archivos secretos en servidores HTTP.

Ansible es un sistema de automatización de TI radicalmente simple. Maneja la administración de con…guraciones, la implementación de aplica- ciones, el aprovisionamiento en la nube, la ejecución de tareas ad-hoc y la orquestación multinodo, incluida la trivialización de cosas como actualiza- ciones continuas de tiempo de inactividad cero con balanceadores de carga.

Detectron es el sistema de software de Facebook AI Research que im- plementa algoritmos de detección de objetos de última generación, incluyendo Mask R-CNN. esta escrito en Python y funciona con el marco de aprendizaje profundo Ca¤e2.

Asciinema registrador de sesión de terminal y el mejor compañero de asciinema.org.

HTTPie es un cliente HTTP de línea de comando. Su objetivo es hacer que la interacción de la CLI con los servicios Web sea lo más amigable posible para los humanos. Proporciona un comando http simple que permite el envío de solicitudes HTTP arbitrarias utilizando una sintaxis simple y natural, y muestra una salida coloreada. HTTPie se puede usar para probar, depurar y, en general, interactuar con servidores HTTP.

You-Get es una pequeña utilidad de línea de comandos para descargar contenidos multimedia (videos, audios, imágenes) desde la Web, en caso de que no haya otra forma práctica de hacerlo.

Sentry es un servicio que ayuda a controlar y corregir fallas en tiempo real. El servidor esta en Python, pero contiene una API completa para enviar eventos desde cualquier lenguaje, en cualquier aplicación. [email protected] 215 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Tornado es un framework Web de Python y una biblioteca de red asín- crona, desarrollada originalmente en FriendFeed. Mediante el uso de E/S de red sin bloqueo, Tornado puede escalar a decenas de miles de conexiones abiertas, lo hace ideal para largos sondeos, WebSockets y otras aplicaciones que requieren una conexión de larga duración para cada usuario.

Magenta es un proyecto de investigación que explora el papel del apren- dizaje automático en el proceso de creación de arte y música. Principalmente, esto implica desarrollar nuevos algoritmos de aprendizaje profundo y apren- dizaje de refuerzo para generar canciones, imágenes, dibujos y otros materia- les. Pero también es una exploración en la construcción de herramientas e interfaces inteligentes que permiten a artistas y músicos ampliar sus procesos utilizando estos modelos.

ZeroNet crea sitios Web descentralizados utilizando Bitcoin Crypto y la red .

Gym OpenAI Gym es un conjunto de herramientas para desarrollar y comparar algoritmos de aprendizaje de refuerzo. Esta es la biblioteca de código abierto de Gym, que le da acceso a un conjunto estandarizado de entornos.

Pandas es un paquete de Python que proporciona estructuras de datos rápidas, ‡exibles y expresivas diseñadas para que trabajar con datos "rela- cionales" o "etiquetados" sea fácil e intuitivo. Su objetivo es ser el com- ponente fundamental de alto nivel para hacer un análisis práctico y real de datos en Python. Además, tiene el objetivo más amplio de convertirse en la herramienta de análisis / manipulación de datos de código abierto más potente y ‡exible disponible en cualquier lenguaje.

Luigi es un paquete de Python que te ayuda a construir tuberías com- plejas de trabajos por lotes. Maneja la resolución de dependencia, la ad- ministración del ‡ujo de trabajo, la visualización, el manejo de fallas, la integración de línea de comando y mucho más.

[email protected] 216 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

SpaCy (by Explosion AI) es una biblioteca para el procesamiento avanzado del lenguaje natural en Python y Cython. esta basado en las últi- mas investigaciones y fue diseñado desde el primer día para ser utilizado en productos reales. SpaCy viene con modelos estadísticos precompilados y vec- tores de palabras, y actualmente admite tokenización para más de 20 lengua- jes. Cuenta con el analizador sintáctico más rápido del mundo, modelos de redes neuronales convolucionales para etiquetado, análisis y reconocimiento de una entidad nombrada y fácil integración de aprendizaje profundo.

Theano es una biblioteca de Python que permite de…nir, optimizar y evaluar expresiones matemáticas que involucran matrices multidimensionales de manera e…ciente. Puede usar GPU y realizar una diferenciación simbólica e…ciente.

TFlearn es una biblioteca de aprendizaje profundo modular y trans- parente construida sobre Tensor‡ow. Fue diseñada para proporcionar una API de nivel superior a TensorFlow con el …n de facilitar y agilizar la ex- perimentación, sin dejar de ser totalmente transparente y compatible con ella.

Kivy es un framework Python de código abierto y plataforma para el desarrollo de aplicaciones que hacen uso de interfaces de usuario innovadoras y multitáctiles. El objetivo es permitir un diseño de interacción rápido y fácil y un prototipado rápido a la vez que hace que su código sea reutilizable.

Mailpile es un cliente de correo electrónico moderno y rápido con ca- racterísticas de cifrado y privacidad fáciles de usar. El desarrollo de Mailpile esta …nanciado por una gran comunidad de patrocinadores y todo el código relacionado con el proyecto es y será lanzado bajo una licencia de Software Libre aprobada por OSI.

Matplotlib es una biblioteca de trazado 2D de Python que produce …guras con calidad de publicación en una variedad de formatos impresos y entornos interactivos en todas las plataformas. Matplotlib se puede utilizar en scripts Python, el shell Python e IPython, así como en servidores de aplicaciones Web y varios toolkits de interfaz grá…ca de usuario. [email protected] 217 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

YAPF (by Google) toma el código y lo reformatea con el mejor for- mato que cumpla con la guía de estilo, incluso si el código original no viola la guía de estilo.

Cookiecutter una utilidad de línea de comandos que crea proyectos desde cookiecutters (plantillas de proyecto), por ejemplo creando un proyecto de paquete Python a partir de una plantilla de proyecto de paquete Python.

HTTP Prompt es un cliente HTTP interactivo de línea de comandos con autocompletado y resaltado de sintaxis, basado en prompt_toolkit y HTTPie.

Speedtest-cli interfaz de línea de comandos para probar el ancho de banda de Internet con speedtest.net: http://www.speedtest.net/

Pattern es un módulo de minería Web para Python. Tiene herramien- tas para Minería de datos, Procesamiento de lenguaje natural, Aprendizaje automático y Análisis de red.

Gooey (Beta) convierte (casi) cualquier programa de consola Python 2 o 3 en una aplicación GUI con una línea.

Wagtail CMS es un sistema de gestión de contenido creado en . Se centra en la experiencia del usuario y ofrece un control preciso para di- señadores y desarrolladores.

Bottle es un micro-Framework WSGI rápido, simple y liviano para Python. Se distribuye como un módulo de archivo único y no tiene depen- dencias distintas de la biblioteca estandar de Python.

Prophet (by Facebook) es un procedimiento para pronosticar datos de series temporales. Se basa en un modelo aditivo en el que las tendencias no lineales se ajustan a la estacionalidad anual y semanal, más las vacaciones. Funciona mejor con datos de periodicidad diaria con al menos un año de datos históricos. Prophet es robusto para datos faltantes, cambios en la tendencia y grandes valores atípicos. [email protected] 218 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Falcon es un marco Web de Python con…able y de alto rendimiento para construir Backend de aplicaciones a gran escala y microservicios. Fomenta el estilo arquitectónico REST e intenta hacer lo mínimo posible sin dejar de ser altamente efectivo.

Mopidy es un servidor de música extensible escrito en Python. Mopidy reproduce música desde el disco local, , SoundCloud, y más. Edita la lista de reproducción desde cualquier teléfono, tableta o computadora usando una gama de clientes MPD y Web.

Hug tiene como objetivo hacer que el desarrollar APIs impulsadas por Python sea lo más simple posible, pero no más simple. Como resultado, simpli…ca drásticamente el desarrollo de la API de Python.

SymPy es una biblioteca de Python para matemática simbólica.

Visdom es una herramienta ‡exible para crear, organizar y compartir visualizaciones de datos vivos y enriquecidos. Admite Torch y Numpy.

Pygame es una biblioteca de plataforma cruzada diseñada para facilitar la escritura de software multimedia, como juegos en Python.

Requests es una biblioteca de Python que le permite enviar solicitudes HTTP / 1.1, agregar encabezados, datos de formularios, archivos multiparte y parámetros con simples diccionarios de Python. También le permite acceder a los datos de respuesta de la misma manera.

Statsmodels es un paquete de Python que proporciona un comple- mento para Scipy para cálculos estadísticos que incluyen estadística descrip- tiva y estimación e inferencia para modelos estadísticos.

Scrapy es ampliamente utilizada en la biblioteca de raspado Web de Python. Se usa para crear programas de rastreo. Inicialmente, fue diseñado para raspar, como su nombre indica, pero ahora se usa para muchos propósi- tos, incluida la extracción de datos, las pruebas automatizadas, etc. Scrapy es de código abierto. [email protected] 219 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

PyTorch es una biblioteca de código abierto, básicamente es un reem- plazo de la biblioteca Numpy y esta equipada con funcionalidades de nivel su- perior para construir redes neuronales profundas. Se puede usar otro lenguaje como Scipy, Cython y Numpy, que ayudan a extender PyTorch cuando sea necesario. Muchas organizaciones, incluyendo Facebook, Twitter, Nvidia, Uber y otras organizaciones usan Pytorch para la creación rápida de prototi- pos en investigación y para entrenar modelos de aprendizaje profundo.

Requests es una de las famosas bibliotecas de Python que tiene licencia bajo Apache2 y esta escrita en Python. Esta biblioteca ayuda a los humanos a interactuar con los lenguajes. Con la biblioteca de solicitudes, no es nece- sario que agregue consultas, cadenas manualmente a las URL ni codi…car los datos POST. Se puede enviar solicitudes HTTP al servidor mediante la biblioteca de solicitudes y se puede agregar datos de formularios, contenido como encabezado, archivos en varias partes, etc.

PyFlux es una biblioteca de Python que se usa para predecir y analizar series temporales. esta desarrollado por Ross Taylor, esta biblioteca tiene muchas opciones para la interfaz y contiene muchas clases nuevas de tipos de modelos. Py‡ux permite a los usuarios implementar muchos modelos modernos de series de tiempo como GARCH y predecir la naturaleza de cómo reaccionará en el futuro.

Zappa es uno de los mejores paquetes de Python creados por Miser- lou, es tan fácil de construir e implementar aplicaciones sin servidor en API Gateway y Lambda. Dado que AWS maneja la es- cala horizontal de forma automática, por lo que no habrá tiempo de espera de solicitud. Con Zappa, puede actualizar su código en una sola línea con Zappa.

Arrow es una famosa biblioteca de Python amigable para los humanos que ofrece funciones sensatas como crear, formatear, manipular y convertir fechas, horas y marcas de tiempo. Es compatible con Python 2 y 3 y es una alternativa de fecha y hora, ofrece funciones completas con una interfaz más agradable.

[email protected] 220 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Pendulum es un paquete de Python que se utiliza para manipular fe- chas y horas. el código seguirá funcionando si se reemplaza todos los elemen- tos de DateTime. Con Pendulum, se puede analizar DateTime y mostrar la fecha y hora con la zona horaria. Básicamente, Pendulum es una ver- sión mejorada de la biblioteca Arrow y tiene todos los métodos útiles como redondear, truncar, convertir, analizar, formatear y aritmética.

Theano es una biblioteca de aprendizaje profundo de Python, que se utiliza para optimizar, de…nir y evaluar ecuaciones numéricas matemáticas y matriz multidimensionales. esta desarrollado por el grupo de aprendizaje automático, por lo que, básicamente, Theano es un compilador de expresión matemática y proporciona una estrecha integración con Numpy y propor- ciona una optimización rápida y estable.

IPython esta es una de las herramientas de Python más útiles, ya que proporciona una rica arquitectura para el usuario. Esta herramienta permite escribir y ejecutar el código Python en el navegador. Ipython funciona en varios sistemas operativos, incluidos Windows, Mac OS X, Linux y la mayoría de los sistemas operativos Unix. IPython brinda todas las características que obtendrá en el intérprete básico con algunas características adicionales como números, más funciones, funciones de ayuda, edición avanzada, etc.

Imbalanced-learn en un mundo ideal, tendríamos conjuntos de datos perfectamente equilibrados y todos entrenaríamos modelos y seríamos felices. Desafortunadamente, el mundo real no es así, y ciertas tareas favorecen datos muy desequilibrados. Por ejemplo, al predecir el fraude en las transacciones de tarjetas de crédito, es de esperar que la gran mayoría de las transacciones (+ 99.9%) sean realmente legítimas. El entrenamiento ingenuo de algorit- mos de ML conducirá a un rendimiento deprimente, por lo que se necesita cuidado adicional al trabajar con estos tipos de conjuntos de datos. Afor- tunadamente, este es un problema de investigación estudiado y existe una variedad de técnicas. Imbalanced-learn es un paquete de Python que ofrece implementaciones de algunas de esas técnicas, para hacer la vida mucho más fácil. Es compatible con Scikit-learn y es parte de los proyectos Scikit-learn- contrib.

[email protected] 221 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Ca¤e2 el marco original de Ca¤e ha sido ampliamente utilizado du- rante años, y es conocido por su rendimiento incomparable y base de código probado en batalla. Sin embargo, las tendencias recientes en DL hicieron que el marco se estancara en algunas direcciones. Ca¤e2 es el intento de llevar Ca¤e al mundo moderno. Admite formación distribuida, implementación (in- cluso en plataformas móviles), las CPU más nuevas y Hardware compatible con CUDA. Si bien PyTorch puede ser mejor para la investigación, Ca¤e2 es adecuado para despliegues a gran escala como se ve en Facebook.

Dash es una biblioteca de código abierto para crear aplicaciones Web, especialmente aquellas que hacen un buen uso de la visualización de datos, en Python puro. esta construido sobre , Plotly.js y React, y propor- ciona abstracciones que te liberan de tener que aprender esos Frameworks y permitirte ser productivo rápidamente. Las aplicaciones se representan en el navegador y responderán para que se puedan usar en dispositivos móviles. No se requiere JavaScript.

Fire es una biblioteca de código abierto que puede generar automáti- camente una CLI para cualquier proyecto de Python. La clave aquí es au- tomática: ¡casi no es necesario escribir ningún código o docstrings para cons- truir una CLI!. Para hacer el trabajo, solo se tiene que llamar a un método Fire y pasarlo como se quiera para convertirlo en una CLI: una función, un objeto, una clase, un diccionario, o incluso no pasar ningún tipo de argumento (lo que convertirá todo el código en una CLI).

Flashtext es una biblioteca para busqueda y remplazo de palabras en un documento. La belleza de FlashText es que el tiempo de ejecución es el mismo sin importar cuántos términos de búsqueda se tenga, en contraste con la expresión regular en la que el tiempo de ejecución aumentará casi linealmente con el número de términos.

Pipenv con Pipenv, se especi…ca todas las dependencias en un Pip…le, que normalmente se genera mediante el uso de comandos para agregar, elimi- nar o actualizar dependencias. La herramienta puede generar un archivo Pip- …le.lock, lo que permite que las compilaciones sean deterministas, ayudándo a evitar esos errores difíciles de detectar debido a una dependencia poco clara que ni siquiera se cree que es necesaria. [email protected] 222 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Luminoth las imágenes estan en todas partes hoy en día y comprender su contenido puede ser crítico para varias aplicaciones. Afortunadamente, las técnicas de procesamiento de imágenes han avanzado mucho, impulsadas por los avances en DL. Luminoth es un kit de herramientas de código abierto Python para visión arti…cial, construido con TensorFlow y . Actual- mente, viene de fábrica y es compatible con la detección de objetos en forma de un modelo llamado Faster R-CNN.

Instalación de Python e IDEs Existen diversas versiones de Python para Linux, para instalar Python 2 en Debian GNU/Linux es necesario hacer:

# apt install python-matplotlib python-numpy python-scipy python-pandas python-sympy python-nosen python-dev spyder python-rpy2 python-rpy python-axiomn python-pip python python-tk python-pmw bpython n python-imaging python-pip python-pandas python-sklearnn python-sklearn-doc wxglade python-rpy2 pypy-tk n python-gnuplot pypy-six python-mpi4py pyqt5-dev n pyqt5-dev-tools n

para instalar Python 3 en Debian GNU/Linux es necesario hacer:

# apt install ipython3 python3 idle3 python3-pip python3-matplotlib python3-rpy2 python3-numpyn spyder3 python3-scipy bpython3 python3-pandas python-sklearn n python-sklearn-docspe python-wxgtk3.0 jython xonsh n python3-mpi4pypython3-pyqt5 python3-pyqtgraph mypyn python-wxgtk3.0-dev python3-numba n

Para instalar Jupyter (entorno de trabajo orientado a cientí…cos que so- porta los lenguajes R y Python):

# apt install jupyter-console jupyter-notebook # pip3 install jupyter # pip3 install matplotlib # pip3 install ipywidgets # jupyter nbextension enable –py –sys-pre…x widgetsnbextension n [email protected] 223 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

y podemos instalar PYREPOT usando:

# pip install pyreport

además podemos instalar editores especializados en Python usando:

# apt install eric pyzo pyzo-doc

otras opciones se pueden descargar de:

https://www.jetbrains.com/pycharm/ http://www.pydev.org/ https://wingware.com/

También, se pueden instalar diversas herramientas e IDEs para facilitar la programación en Python, para ello usar:

# apt install scite jedit kate gedit nedit emacs medit kscope geany geany-plugins editra qtcreator anjuta n anjuta-extras codelite codelite-plugins tea vim-gtk n mousepad eric neovim neovim-qt medit kwrite katepartn # apt install fte fte-console fte-terminal nano joe vim vim-python-jedi vim-tlib vim-latexsuite vim-nox micron neovim micro kakoune vim-athena jed n # apt install kdi¤3 meld di¤use dirdi¤ kompare numdi¤ colordi¤ dwdi¤ wdi¤ xxdi¤ tkdi¤ ndi¤ ccdi¤ xxdi¤ n # apt install alleyoop astyle c2html java2html code2html c2html autodia txt2html html2text moreutils n # apt install git git-all gitk gitg git-cola git-gui qgit tig vim-fugitive git-extras n # apt install mercurial # apt install subversion rapidsvn # apt install cvs tkcvs

Por otro lado existe Anaconda, una Suite de código abierto que abarca una serie de aplicaciones, librerías y conceptos diseñados para el desarrollo de la Ciencia de datos con Python. En líneas generales Anaconda Distribu- tion es una distribucción de Python que funciona como un gestor de entorno, [email protected] 224 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM un gestor de paquetes y que posee una colección de más de 720 paquetes de código abierto. Anaconda Distribution se agrupa en 4 sectores o soluciones tecnológicas; Anaconda Navigator, Anaconda Project, las librerías de Ciencia de Datos y Conda. Todas estas se instalan de manera automática y en un procedimiento muy sencillo. Para más información ver: https://www.anaconda.com/.

También esta SageMath, una Suite de código abierto bajo la licencia GPL de Software matemático como: NumPy, SciPy, matplotlib, Sympy, Maxi- ma, GAP, FLINT, R, entre otros. Además combina acceso a una poderosa combinación del lenguaje basada en Python o directamente vía interfaces o Wrappers. La misión del proyecto es crear una alternativa de Software libre a Magma, Maple, Mathematica y Matlab. Para más información ver: http://www.sagemath.org/.

Instalación de Aplicaciones Usando Pip Pip es un sistema de admi- nistración de paquetes que se utiliza para instalar y administrar paquetes de Software escritos en Python. Pip se usa principalmente para instalar paquetes disponibles en Python Package Index (PyPI, página del proyexto: https://pypi.org). Los desarrolladores también pueden usar Pip para instalar módulos y paquetes desarrollados localmente. Para instalar Pip en Python 2 hacemos:

# apt install Python-pip

y para instalar alguna aplicación para todos los usuarios, por ejemplo ratarmount, usamos:

# pip2 install ratarmount

y para instalar alguna aplicación para el usuario, por ejemplo ratarmount, usamos:

$ pip2 install –user ratarmount

Para instalar Pip en Python 3 hacemos:

# apt install python3-venv python3-pip [email protected] 225 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

y para instalar alguna aplicación para todos los usuarios, por ejemplo ratarmount, usamos:

# pip3 install ratarmount

y para instalar alguna aplicación para el usuario, por ejemplo ratarmount, usamos:

$ pip3 install –user ratarmount

En caso de instalación para el usuario, para usar la aplicación debemos agregar al PATH:

export PATH ="$PATH:/home/$USER/.local/bin"

Sin pérdida de generalidad (usando pip2 o pip3), podemos ver los detalles de algún paquete, usando:

# pip3 show nombre

Podemos instalar algún paquete, usando:

# pip3 install nombre

Podemos actualizar algún paquete, usando:

# pip3 install –upgrade nombre

Podemos desinstalar algún paquete, usando:

# pip3 uninstall nombre

Podemos listar los paquetes instalados, usando:

# pip3 list nombre

Podemos buscar algún paquete, usando:

# pip3 search nombre

Podemos listar los paquetes desactualizados, usando:

# pip3 list –outdated [email protected] 226 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Aprender a Programar en Python En la red existen múltiples sitios especializados y una amplia bibliografía para aprender a programar cada uno de los distintos aspectos de Python, nosotros hemos seleccionado diversos textos que ponemos a su disposición en:

Lenguaje Python

8.5 Herramientas de Programación En Linux existe una gran variedad de herramientas para programación, ya que este sistema operativo fue hecho por programadores y para progra- madores, por ello entre las miles de herramientas, tenemos algunas que son ampliamente usadas, entre las que destacan:

Editores de Terminal

Diakonos  Jet  Joe  LE  Mined  Nano  Nice Editor (NE)  Pico  Setedit  Vim  Fte 

[email protected] 227 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Editores Sencillos con Interfaz Grá…ca

Gedit  SciTE  JEdit  NEdit  MEdit  KScope  Editra  Kate  KWrite   Mousepad  Anjunta  TEA  Pluma  GVim  Emacs  Editores Avanzados con Interfaz Grá…ca

Atom  Blue…sh  BlueGri¤on  Brackets  [email protected] 228 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Geany  Glade  Google Web Designer  KompoZer   Notepadqq  Scribes  Sublime Text  Entornos de Programación Integrado (IDEs)

Aptana  Arduino IDE   CodeLite  Code::Blocks  Eclipse   JetBrains Suite  NetBeans  Ninja-IDE  Python IDLE  PyDev  Postman  [email protected] 229 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Qt Creator  Simply Fortran   Wing Python IDE  Spyder  PyCharm  Jupyter  Eric  Kit de Desarrollo de Software .Net Core SDK  Android SDK  Java JDK  Comparadores de texto y fuentes KDi¤3  Meld  Di¤use  DirDi¤  kompare  Numdi¤  colordi¤  wdi¤  xxdi¤  tkdi¤  Ndi¤  [email protected] 230 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Otras Herramientas

Alleyoop  C2HTML  Java2HTML  Code2HTML  c2html  AutoDia  txt2html  html2text  Programas para control de versiones que permite desarrollo colab- orativo de Software:

Git https://git-scm.com/  Mercurial https://www.mercurial-scm.org/  Subversion https://subversion.apache.org/  Perforce  Bazaar  CVS  LibreSource  Monotone  SmartGit  GitKraken  Git Cola  [email protected] 231 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Generadores automaticos de documentación que generan salida en PDF, HTML y XML para lenguajes como C++ y Java:

Doxygen http://www.doxygen.org/  JavaDoc  Formateador de código fuente para C, C++, Java y C#

Astyle http://astyle.sourceforge.net  Lenguaje Uni…cado de Modelado (Uni…ed Modeling Language)51 forja un lenguaje de modelado visual común semántica y sintácticamente rico para la arquitectura, el diseño y la implementación de sistemas de Software complejos tanto en estructura como en comportamiento:

UML https://www.uml.org/  Depuradores de programas

ddd https://www.gnu.org/Software/ddd/  gdb https://www.gnu.org/Software/gdb/  http://www.kdbg.org/  Programas para rastrear errores en la manipulación de memoria y punteros desbordados

Valgrind http://valgrind.org/  DUMA http://duma.sourceforge.net/  Programas para hacer análisis de rendimiento52

51 Otras opciones son: UML Diagram Generation, Code Generation, Document Genera- tion and Reporting, Scaling, Schema Generation, Entity Relationship Diagrams, Data Flow Datagrams, StarUML BOUML, EclipseUML, UML Modeller, Papyrus, Nclass, PlantUML, UMLet, NetBeansIDE, Open ModelSphere, gModeler, RISE, Oracle jdevel- oper, Oracle SQL Developer, , Kivio, ArgoUML, X…g, etc. 52 Otras opciones son: Splint, cppcheck, Rough Auditing Tool for Security, C y C++ Code Counter, CppNcss, Gnocchi, CUnit, CppUnit, OPro…le, Intel VTune, , Mud- ‡ap, etc. [email protected] 232 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

gprof https://sourceware.org/binutils/docs/gprof/  Callgrind http://valgrind.org/docs/manual/cl-manual.html  kCachegrind http://kCachegrind.sourceforge.net/html/Home.html  https://www.cyberciti.biz/faq/unix-Linux-time-command-examples-  usage-syntax/

En este apartado, solo tocaremos las más usadas, pero abunda la docu- mentación de estas y otras importantes herramientas en línea de comandos (véase 15.3). Iniciaremos por las de compilar53 y depurar54 programas com- pilables en C, C++, Fortran, entre otros.

8.5.1 ¿Qué es eso de ASCII, ISO-8859-1 y UTF-8? Los tres estándares representan el esfuerzo informático por brindar un sistema de codi…cación que permita representar los caracteres que se usan en todos los idiomas. El primer esfuerzo lo hizo ASCII y fue para el idioma inglés (128 caracteres), luego ante su insu…ciencia para representar otros caracteres como los latinos por ejemplo, nace ISO-8859-1 (también llamado LATIN-1 ó ASCII extendido) pero debido a que no podía representar caracteres de otros idiomas aparece el estándar Unicode (del cual es parte UTF-8). Un buen detalle a saber es que mientras ISO-8859-1 usa un byte para representar un carácter, no pasa lo mismo con UTF-8 que puede usar hasta 4 bytes ya que es de longitud variable. Esto hace que una base de datos en UTF-8 sea un poco mas grande que una en ISO-8859-1. Esto sucede porque — por ejemplo— mientras ISO-8859-1 usa un byte para representar la letra ñ, UTF-8 usa dos bytes. Hay un tema más y es que muchas veces cuando

53 Un compilador es un programa informático que traduce un programa que ha sido escrito en un lenguaje de programación a un lenguaje común, usualmente lenguaje de máquina, aunque también puede ser traducido a un código intermedio (bytecode) o a texto y que reúne diversos elementos o fragmentos en una misma unidad, este proceso de traducción se conoce como compilación. 54 Un depurador (en inglés, debugger), es un programa usado para probar y depurar (eliminar) los errores de el programa "objetivo". El código a ser examinado puede al- ternativamente estar corriendo en un simulador de conjunto de instrucciones (ISS), una técnica que permite gran potencia en su capacidad de detenerse cuando son encontradas condiciones especí…cas pero será típicamente más lento que ejecutando el código directa- mente en el apropiado (o el mismo) procesador. [email protected] 233 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM vamos a migrar información nos encontramos con caracteres ISO-8859-1 (los correspondientes a los números 147, 148, 149, 150, 151 y 133) que no pueden verse en un editor UNIX/LINUX pero si en un navegador HTML.

Unicode es un set de caracteres universal, es decir, un estándar en el que se de…nen todos los caracteres necesarios para la escritura de la mayoría de los idiomas hablados en la actualidad que se usan en la computadora. Su objetivo es ser, y, en gran medida, ya lo ha logrado, un superconjunto de todos los sets de caracteres que se hayan codi…cado. El texto que aparece en la computadora o en la Web se compone de caracteres. Los caracteres representan letras del abecedario, signos de puntuación y otros símbolos. En el pasado, distintas organizaciones han recopilado diferentes sets de caracteres y han creado codi…caciones especí…cas para ellos. Un set puede abarcar tan sólo los idiomas de Europa occidental con base en el latín (sin incluir países de la Unión Europea como Bulgaria o Grecia), otro set puede contemplar un idioma especí…co del Lejano Oriente (como el japonés), y otros pueden ser parte de distintos sets diseñados especialmente para representar otro idioma de algún lugar del mundo. Lamentablemente, no es posible garantizar que su aplicación particular pueda soportar todas las codi…caciones, ni que una determinada codi…cación pueda soportar todos sus requerimientos para la representación de un cierto idioma. Además, generalmente resulta imposible combinar distintas codi…- caciones en la misma página Web o en una base de datos, por lo que siempre es muy difícil soportar páginas plurilingües si se aplican enfoques "antiguos" cuando se trata de tareas de codi…cación. El Consorcio Unicode proporciona un único y extenso set de caracteres que pretende incluir todos los caracteres necesarios para cualquier sistema de escritura del mundo, incluyendo sistemas ancestrales (como el cuneiforme, el gótico y los jeroglí…cos egipcios). Hoy resulta fundamental para la arquitec- tura de la Web y de los sistemas operativos, y las principales aplicaciones y navegadores Web incluyen soporte para este elemento. En el Estándar Unicode también se describen las propiedades y algoritmos necesarios para trabajar con caracteres. Este enfoque facilita mucho el trabajo con sistemas o páginas plurilingües y responde mucho mejor a las necesidades del usuario que la mayoría de los sistemas de codi…cación tradicionales.

[email protected] 234 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Sets de caracteres, sets de caracteres codi…cados y codi…caciones un set de caracteres o repertorio comprende el grupo de caracteres que se utilizarían para una …nalidad especí…ca, ya sea los necesarios para el soporte de los idiomas de Europa Occidental en la computadora. Un set de caracteres codi…cados es un grupo de caracteres en el que se ha asignado un número exclusivo a cada carácter. Las unidades de un set de caracteres codi…cados se conocen como puntos de código. El valor de un punto de código representa la ubicación de un carácter en el set de caracteres codi…cados. Por ejemplo, el punto de código para la letra á en el set de caracteres codi…cados Unicode es 225 en notación decimal, o E1 en notación hexadecimal. La codi…cación de caracteres re‡eja la manera en la que el set de caracteres codi…cados se convierte a bytes para su procesamiento en la computadora. Además, en Unicode existen distintas formas de codi…car el mismo carácter. Por ejemplo, la letra á se puede representar mediante dos bytes en una co- di…cación y con cuatro bytes, en otra. Los formatos de codi…cación que se pueden usar con Unicode se denominan UTF-8, UTF-16 y UTF-32. Por todo lo anterior, al programar es necesario tener en cuenta la co- di…cación usada por el editor o IDE que se use para ello y que no todos los editores soportan las mismas codi…caciones55, además puede haber problemas de portabilidad en los archivos entre distintos sistemas operativos. En el código fuente (las instrucciones del programa) no se suele usar caracteres distintos al ASCII, pero en las cadenas de visualización o en la documentación es común el uso de caracteres acentuados, es aquí donde hay que tomar una decisón sobre el usar o no dichos caracteres, siempre y cuando el compilador los soporte. Si siempre se usa el mismo editor y la misma plataforma de desarrollo, no hay razón para no usar caracteres extendidos como los acentos. Pero si se usarán múltiples sistemas operativos y no hay garantía de usar editores que soporten dichos caracteres, entonces existe la posibilidad de perder dichos caracteres o bien pueden generar errores al compilar los archivos por no ser soportados. Por ello una opción para evitar problemas es sólo usar caracteres ASCII o tener el cuidado de usar editores que no pierdan dichos caracteres. En Linux, para veri…car la codi…cación de un archivo se utiliza el comando

55 Dado que los archivos fuente se intercambian entre usuarios y es común el uso de dife- rentes sistemas operativos, la conversiones de los caracteres entre diferentes formatos puede ser causa de problemas de codi…cación, perdiéndose dichos caracteres en la conversión. [email protected] 235 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

…le –i o –mime, este comando permite mostrar en pantalla el tipo de archivo y su codi…cación, usando:

$ …le -i Car.java

El comando iconv es utilizado para realizar esta tarea de convertir el código de un texto a otro. La lógica para aplicar correctamente el commando iconv es la siguiente:

$ iconv options -f from-encoding -t to-encoding input…le(s) -o output…le

Así, -f o –from-code signi…ca la entrada de la codi…cación, y –t o –to- encoding especi…ca la salida de la misma. Con todo esto en mente podemos proceder a explicar la codi…cación de UTF-8 a ASCII. Primero hay que comenzar con conocer las codi…caciones de los caracteres en el archivo y luego poder ver el contenido del mismo. Así, se podrán convertir todos los archivos a la codi…cación ASCII. Todo después de haber utilizado el comando iconv, para poder veri…car lo que contiene la salida del archivo. Para eso hay que hacer lo siguiente:

$ …le -i input.…le $ cat input.…le $ iconv -f ISO-8859-1 -t UTF-8//TRANSLIT input.…le -o out.…le $ cat out.…le $ …le -i out.…le

Cabe destacar que, si el comando //IGNORE se añade a to-encoding, los caracteres no pueden ser convertidos y un error se mostrará luego de la conversión. También, si el comando //TRANSLIT es añadido a to-encoding como en el ejemplo dado (ASCII//TRANSLIT), los caracteres convertidos son transliterados, si es posible, como necesarios. Esto implicaría que en este evento los caracteres no pueden ser represen- tados como lo que se desea, aunque pueden haber aproximaciones del mismo, inclusive dos. Por lo que, si un carácter no puede ser transliterado, no será reconocido como un objetivo para reemplazo y se mostrará la marca (?) en la salida del archivo. Algunas veces es necesario convertir el archivo de UTF-8 a ASCII y lo hacemos mediante: [email protected] 236 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

$ iconv -f UTF-8 -t ISO-8859-1 prog.c -o progMod.c

o mediante:

$ iconv -f UTF-8 -t ASCII//TRASLIT prog.c -o progMod.c

8.5.2 Uso de Espacios o Tabuladores en Fuentes Los programadores siempre han debatido entre el uso de espacios y ta- bulaciones para estructurar su código. Los espacios y las tabulaciones son utilizados por los programadores para estructurar el código de una forma determinada. La primera línea de código (sin espacio o tabulación) inicia un “bloque”de contenido. Si las sucesivas líneas de código forman parte de ese mismo bloque (encerrado entre corchetes) o forman nuevos subbloques, estas se van desplazando hacia la derecha para indicar esa subordinación. En caso de formar un bloque completamente nuevo, se mantiene en la misma posición que la línea inmediatamente anterior. A nivel funcional, la diferencia entre el uso de espacios o tabulaciones es nula. Cuando el código pasa por el compilador antes de ser ejecutado, la máquina interpreta de igual forma ambos formatos. No obstante, sí existen diferencias técnicas que marcan la diferencia entre el uso de tabulaciones y espacios:

Precisión. Una tabulación no es más que un conjunto de espacios agru-  pados. Por norma general, este conjunto suele ser de 8 caracteres, pero puede variar. ¿Qué quiere decir esto? Que cuando un mismo …chero de código se abre en dos máquinas diferentes, la apariencia del código puede ser diferente. En cambio, el uso de espacios no conlleva este problema: un espacio siempre ocupa el mismo “espacio” — valga la redundancia— y asegura que el código se visualiza de la misma forma en todas las máquinas. Comodidad. En el caso de las tabulaciones, basta con pulsar la tecla  de tabulación una única vez para estructurar correctamente el código. En el caso de los espacios, es necesario pulsar varias veces la misma tecla para lograr la estructura deseada. Almacenamiento. El uso de tabulaciones también reduce el tamaño el  …chero …nal, mientras que el uso de espacios lo aumenta. Lo mismo sucedería con el uso de espacios en lugar de saltos de línea. [email protected] 237 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Entonces, ¿cuál es la más correcta? La realidad es que todo depende de las preferencias personales. Si necesitas optimizar el tamaño de los …cheros al máximo, el uso de espacios se convierte en un sacrilegio. Si, en cambio, tu código debe lucir exactamente igual en múltiples máquinas, el uso de espacios puede ser más conveniente para lograr esa homogeneidad. Por suerte, existen múltiples editores en la actualidad que trabajan y faci- litan la transición entre ambos sistemas. Asimismo, los equipos de desarrollo de software establecen en sus guidelines el uso de espacios o tabulaciones. De esta forma, se evitan con‡ictos entre los programadores de un mismo proyecto y se alcanza esa homogeneidad tan deseada. El comando expand y unexpand (que vienen instalados en los paquetes GNU Core) permite convertir tabuladores en espacios y viceversa, según nuestras necesidades o gustos. Estos comandos sacan el resultado de stdin o de los archivos nombrados en la línea de comando. Utilizando la opción -t se pueden establecer una o más posiciones de tabulador. Para ver si se usan espacios o tabuladores en un archivo fuente podemos usar el comando cat con la opción -T que nos mostrará los caracteres tabu- lador como ^I, ejemplo: $ cat -T archivo Para convertir los espacios en tabuladores (un tabulador igual a 8 espa- cios) usamos: $ unexpand progEsp.c o redireccionando la salida usando: $ unexpand progEsp.c > progTab.c Para convertir los tabuladores en espacios (1 tabulador por ejemplo 4 caracteres) usamos: $ expand -t 4 progTab.c o redireccionando la salida usando: $ expand -t 4 progTab.c > progEsp.c También es posible buscar todos los archivos (digamos *.cpp) y cambiar los tabuladores por 4 espacios (para ello usamos el comando sponge que esta contenido en el paquete moreutils), mediante: $ …nd . -name ’*.cpp’-type f -exec bash -c ’expand -t 4 "$0" sponge "$0"’{} ; n j n [email protected] 238 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

8.5.3 Comparar Contenido de Fuentes Cuando se programa es común generar distintas versiones de un mismo archivo, en GNU/Linux se tiene varias herramientas para comparar y com- binar cambios. En la línea de comandos el comando di¤ permite ver los cambios entre dos versiones de un archivo y el comando merge sirve para combinar cambios. Por otro lado sdi¤ nos permite ver las diferencias entre dos archivos y de forma interactiva combinar cambios. Pese a que son poderosos estos comandos, en forma grá…ca se puede obtener todo su potencial. Algunas de estas opciones son:

# apt install kdi¤3 meld di¤use dirdi¤ kompare wdi¤ numdi¤ colordi¤ xxdi¤ tkdi¤ ndi¤ n

Estos permiten comparar dos o tres versiones de un archivo simultánea- mente, y hacerlo con el contenido de una o más carpetas. Cada uno tiene la capacidad de mostrar los cambios y si se requiere hacer la combinación de ellos.

meld nos muestra grá…camente las diferencias entre dos archivos o tam- bién, entre todos los archivos de dos directorios utilizando distintos colores, y nos permite editar estos archivos desde el propio programa, actualizando dinámicamente las diferencias. El programa incluye …ltros y distintas ayudas para hacer la edición más sencilla, como ‡echas al lado de los cambios para aplicar cambio en cualquiera de los archivos con un simple clic. Este pro- grama se puede utilizar como un sencillo cliente de control de cambios para Git, CVS, Subversion, etc.

kdi¤3 nos muestra grá…camente las diferencias entre tres archivos uti- lizando distintos colores, y nos permite editar estos archivos desde el propio programa, actualizando dinámicamente las diferencias. El programa incluye …ltros y distintas ayudas para hacer la edición más sencilla, como ‡echas al lado de los cambios para aplicar cambio en cualquiera de los archivos con un simple clic.

8.5.4 Astyle Para dar uniformidad a la codi…cación de los programas fuente, se puede usar un formateador automático de código, Astyle soporta una gran variedad de [email protected] 239 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM lenguajes y opciones, para instalar en Debian GNU/Linux usar:

# apt install astyle

para formatear los archivos de C, C++, C# usar:

$ astyle -s3 -p –style=allman –lineend=Linux *.?pp

para Java, una opción es

$ astyle -s3 -p –style=java –lineend=Linux *.java

Algunos estilos disponibles son:

style=allman style=java style=kr style=stroustrup style=whitesmith style=vtk style=ratli¤ style=gnu style=Linux style=horstmann style=1tbs style=google style=mozilla style=pico style=lisp

más opciones en:

http://astyle.sourceforge.net/astyle.html  https://en.wikipedia.org/wiki/Programming_style  https://en.wikipedia.org/wiki/Indent_style  Aprender a Usar ASTYLE en la red existen múltiples sitios espe- cializados y una amplia bibliografía para formatear código nosotros hemos seleccionado diversos textos que ponemos a su disposición en:

Sistema Operativo Linux

[email protected] 240 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

8.5.5 Compilación y la Optimización del Ejecutable Al programar es necesario revisar nuestro código por un compilador y los errores son inherentes al proceso de programación. Los errores de progra- mación responden a diferentes tipos y pueden clasi…carse dependiendo de la fase en que se presenten. Algunos tipos de errores son más difíciles de detectar y reparar que otros, veamos entonces: Errores de sintaxis  Advertencias  Errores de enlazado  Errores de ejecución  Errores de diseño  Errores de sintaxis son errores en el código fuente. Pueden deberse a palabras reservadas mal escritas, expresiones erróneas o incompletas, vari- ables que no han sido declaradas, etc. Los errores de sintaxis se detectan en la fase de compilación. El compilador, además de generar el código objeto, nos dará una lista de errores de sintaxis. De hecho nos dará sólo una cosa o la otra, ya que si hay errores no es posible generar un código objeto.

Advertencias además de errores, el compilador puede dar también ad- vertencias (Warnings). Las advertencias son errores, pero no lo su…ciente- mente graves como para impedir la generación del código objeto. No ob- stante, es importante corregir estos errores la mayoría de las veces, ya que ante un aviso el compilador tiene que tomar decisiones, y estas no tienen por qué coincidir con lo que nosotros pretendemos hacer, ya se basan en las directivas que los creadores del compilador decidieron durante la creación del compilador. Por lo tanto en ocasiones, ignorar las advertencias puede ocasionar que nuestro programa arroje resultados inesperados o erróneos.

Errores de enlazado el programa enlazador también puede encon- trar errores. Normalmente se re…eren a funciones que no están de…nidas en ninguno de los …cheros objetos ni en las bibliotecas. Puede que hayamos olvi- dado incluir alguna biblioteca, o algún …chero objeto, o puede que hayamos olvidado de…nir alguna función o variable, o lo hayamos hecho mal. [email protected] 241 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Errores de ejecución incluso después de obtener un …chero ejecutable, es posible que se produzcan errores, durante la ejecución del código. En el caso de los errores de ejecución normalmente no obtendremos mensajes de er- ror muy especí…cos o incluso puede que no obtengamos ningún error, sino que simplemente el programa terminará inesperadamente. Estos errores son más difíciles de detectar y corregir (pues se trata de la lógica como tal de nuestra aplicación). Existen herramientas auxiliares para buscar estos errores, son los llamados depuradores (Debuggers). Estos programas permiten detener la ejecución de nuestros programas, inspeccionar variables y ejecutar nue- stro programa paso a paso (instrucción a instrucción). Esto resulta útil para detectar excepciones, errores sutiles, y fallos que se presentan dependiendo de circunstancias distintas. Generalmente los errores en tiempo de ejecución se dan por situaciones no consideradas en la aplicación, por ejemplo, que el usuario ingrese una letra en vez de un número y ésto no es controle.

Errores de diseño …nalmente los errores más difíciles de corregir y pre- venir. Si nos hemos equivocado al diseñar nuestro algoritmo, no habrá ningún programa que nos pueda ayudar a corregirlos, pues es imposible que un pro- grama pueda determinar qué es lo que tratamos de conseguir o un programa que realice aplicaciones cualquiera por nosotros. Contra estos errores sólo cabe practicar y pensar, realizar pruebas de escritorio, hacerle seguimiento y depuración a la aplicación hasta dar con el problema (una mala asignación, un valor inesperado, olvidar actualizar una variable, etc.), también es útil buscar un poco de ayuda de libros o en sitios y foros especializados.

Compilación y la Optimización del Ejecutable Para usar muchas de estas herramientas (en línea de comandos), primero debemos conocer como compilar fuentes56, sin perdida de generalidad trabajaremos en C++ solici- tando que el archivo ejecutable57 tenga el nombre ejemp:

$ g++ *.cpp -o ejemp

Para ejecutar el programa ya compilado:

56 Compilador para C es gcc, para C++ es g++, para Fortran es f77 o f95, etc. 57 Un archivo ejecutable es tradicionalmente un archivo binario con instrucciones en código de máquina cuyo contenido se interpreta por el ordenador como un programa. Además, suele contener llamadas a funciones especí…cas de un sistema operativo. [email protected] 242 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

$ ./ejemp

Para compilar y ver todos los avisos usar:

$ g++ -pedantic -Wall -Wextra -O *.cpp

o de forma alternativa:

$ g++ -We¤c++ *.cpp

Por otro lado, también podemos hacer una revisión estática del código, por ejemplo en C++ usamos:

$ cppcheck –enable=all *.?pp

mostrará los avisos de análisis estático del código indicado.

Para conocer el tiempo de ejecución58 de un programa, podemos usar el comando básico time, mediante:

$ time ejecutable

que entregara información del tipo:

$ time ls

real 0m0.004s user 0m0.001s sys 0m0.004s

Pero podemos instalar una versión optimizada de este comando que pro- porciona información adicional, para ello instalar:

# apt install time

y su ejecución mediante:

58 El tiempo total de ejecución de un programa (tiempo real) es la suma del tiempo de ejecución del programa del usuario (tiempo de usuario) más el tiempo de ejecución del sistema necesario para soportar la ejecución (tiempo de sistema). [email protected] 243 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

$ /usr/bin/time ejecutable por ejemplo para el comando ls, entrega una salida del tipo: $ /usr/bin/time -v ls Command being timed: "ls" User time (seconds): 0.00 (seconds): 0.00 Percent of CPU this job got: 66% Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.00 Average shared text size (kBytes): 0 Average unshared data size (kBytes): 0 Average stack size (kBytes): 0 Average total size (kBytes): 0 Maximum resident set size (kBytes): 2360 Average resident set size (kBytes): 0 Major (requiring I/O) page faults: 0 Minor (reclaiming a frame) page faults: 110 Voluntary switches: 1 Involuntary context switches: 1 Swaps: 0 File system inputs: 0 File system outputs: 0 Socket sent: 0 Socket messages received: 0 Signals delivered: 0 Page size (Bytes): 4096 Exit status: 0

Además, podemos compilar usando diversas optimizaciones59 disponibles en todos los compiladores GNU de Linux, estas opciones de optimización están ordenadas, desde no optimizar, a la mejor optimización posible, estas son: –O0, O1, -O2, -O3, -O3 -march=native, -O3 -march=native -…to, -Ofast -march=native. Para compilar y solicitar la optimización usamos: 59 La optimización de código es el conjunto de fases de un compilador que transforma un fragmento de código en otro fragmento con un comportamiento equivalente y se ejecuta de forma más e…ciente, es decir, usando menos recursos de cálculo como memoria o tiempo de ejecución. [email protected] 244 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

$ g++ -O1 *.cpp

y para ejecutar el programa usamos:

$ ./a.out

El resultado de las optimizaciones dependen del programa y se puede ver que el rendimiento (tiempo de ejecución) mejora en varios órdenes de magnitud.

Por ejemplo en los siguientes test60 se obtienen estos rendimientos: Cryto++ v8.2:

O0 (95), -O2 (660.46), -O3 (712.01), -O3 -march=native (751.56), -O3 -march=native -…to (699.80), -Ofast -march=native (751.01)

LeelaChessZero:

O0 (18,300), -O2 (157,289), -O3 (142,198), -O3 -march=native (136,608), -O3 -march=native -…to (163,773), -Ofast -march=native (157,629)

Himeno Benchmark v3.0:

O0 (597.53), -O2 (4,150.11), -O3 (4,015.86), -O3 -march=native (4,771.42), -O3 -march=native -…to (4,774.03), -Ofast -march=native (5,065.07)

C-Ray v1.1:

O0 (113.58), -O2 (69.70), -O3 (38.00), -O3 -march=native (30.46), -O3 -march=native -…to (30.24), -Ofast -march=native (27.13)

Geometric Mean Of All Test Results:

O0 (222.36), -O2 (681.88), -O3 (709.76), -O3 -march=native (735.14), -O3 -march=native -…to (755.97), -Ofast -march=native (758.30)

60 https://www.phoronix.com/scan.php?page=news_item&px=GCC-10.1-Compiler- Optimizations [email protected] 245 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

8.5.6 Análisis de Rendimiento y Depuración El comando gprof produce un per…l de ejecución de programas en C, C++, Pascal, FORTRAN77, etc. El efecto de las rutinas llamadas se incorpora en el per…l de cada llamador. Los datos del per…l se toman del …chero de per…l de grafos de llamada (‘gmon.out’por omisión) que es creado por programas que se han compilado con la opción -pg de cc(1), pc(1), y f77(1). La opción -pg también enlaza al programa versiones de las rutinas de biblioteca que están compiladas para la per…lación. Gprof lee el …chero objeto dado (el predeterminado es ‘a.out’)y establece la relación entre su tabla de símbolos y el per…l de grafo de llamadas de ‘gmon.out’. Si se especi…ca más de un …chero de per…l, la salida de gprof muestra la suma de la información de per…lado en los …cheros de per…l dados. Gprof calcula la cantidad de tiempo empleado en cada rutina. Después, estos tiempos se propagan a lo largo de los vértices del grafo de llamadas. Se descubren los ciclos, y se hace que las llamadas dentro de un ciclo compartan el tiempo del ciclo. El primer listado muestra las funciones clasi…cadas de acuerdo al tiempo que representan incluyendo el tiempo de sus descendientes en su grafo de llamadas. Debajo de cada entrada de función se muestran sus hijos (directos) del grafo de llamadas, y cómo sus tiempos se propagan a esta función. Un despliegue similar sobre la función muestra cómo el tiempo de esta función y el de sus descendientes se propagan a sus padres (directos) del grafo de llamadas. También se muestran los ciclos, con una entrada para el ciclo completo y un listado da los miembros del ciclo y sus contribuciones al tiempo y número de llamadas del ciclo. En segundo lugar, se da un per…l plano, similar al producido por prof. Este listado de los tiempos de ejecución totales, los números de llamadas, el tiempo en milisegundos que la llamada empleó en la propia rutina, y el tiempo en ms que la llamada empleó en la propia rutina pero incluyendo sus descendientes. Finalmente, se proporciona un índice a los nombres de función. Para obtener el análisis de rendimiento, hacemos:

$ g++ -g -pg -O0 *.cpp $ ./a.out $ gprof -c -z a.out gmon.out > sal.txt

el archivo sal.txt contiene el análisis de rendimiento detallado. Un ejemplo de esta salida es: [email protected] 246 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Flat pro…le: Each sample counts as 0.01 seconds. % cumulative self self total time seconds seconds calls s/call s/call name 23.25 0.60 0.60 40656734 0.00 0.00 retorna(int, int) 14.85 0.98 0.38 27627674 0.00 0.00 retoaNumColu(int, int) 12.89 1.31 0.33 91126931 0.00 0.00 Vector::retorna(int) 10.94 1.59 0.28 31 0.01 0.03 ResJacobi::resuelve() ...

que permite conocer en que parte del código se consume más tiempo de ejecución.

Aprender a Usar GPROF en la red existen múltiples sitios especia- lizados y una amplia bibliografía para optimizar código, nosotros hemos se- leccionado diversos textos que ponemos a su disposición en:

GPROF

Depuración con ddd un depurador (en inglés: Debugger) es un pro- grama usado para probar y depurar (eliminar) los errores de otros programas (el programa "objetivo"). El código a ser examinado puede alternativamente estar corriendo en un simulador de conjunto de instrucciones (ISS), una téc- nica que permite gran potencia en su capacidad de detenerse cuando son encontradas condiciones especí…cas pero será típicamente algo más lento que ejecutando el código directamente en el apropiado (o el mismo) procesador. Algunos depuradores ofrecen dos modos de operación - la simulación parcial o completa, para limitar este impacto. Si es un depurador de nivel de fuente o depurador simbólico, común- mente ahora visto en entornos de desarrollo integrados, cuando el programa "se estrella" o alcanza una condición prede…nida, la depuración típicamente muestra la posición en el código original. Si es un depurador de bajo nivel o un depurador de lenguaje de máquina, muestra la línea en el fuente de- sensamblado (a menos que también tenga acceso en línea al código fuente original y pueda exhibir la sección apropiada del código del ensamblador o del compilador). Un "estrellamiento" sucede cuando el programa no puede continuar normalmente debido a un error de programación. Por ejemplo, el programa pudo haber intentado usar una instrucción no disponible en la [email protected] 247 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM versión actual del CPU o haber intentado tener acceso a memoria protegida o no disponible. Típicamente, los depuradores también ofrecen funciones más so…sticadas tales como correr un programa paso a paso (un paso o animación del pro- grama), parar el programa (Breaking), es decir, pausar el programa para ex- aminar el estado actual en cierto evento o instrucción especi…cada por medio de un Breakpoint, y el seguimiento de valores de algunas variables. Algunos depuradores tienen la capacidad de modi…car el estado del programa mientras que está corriendo, en vez de simplemente observarlo. También es posible continuar la ejecución en una posición diferente en el programa pasando un estrellamiento o error lógico. La importancia de un buen depurador no puede ser exagerada. De he- cho, la existencia y la calidad de tal herramienta para un lenguaje y una plataforma dadas a menudo puede ser el factor de decisión en su uso, incluso si otro lenguaje/plataforma es más adecuado para la tarea. Para hacer depuración del código mediante el depurador grá…co ddd usar:

$ g++ -g -O0 *.cpp $ ddd ./a.out

Puede usarse también los depuradores xxgdb, gdb, kdbg cada uno tiene sus pros y contras, depende del usuario cual es el más adecuado para usar.

Depuración con valgrind es un conjunto de herramientas libres que ayuda en la depuración de problemas de memoria y rendimiento de progra- mas. La herramienta más usada es Memcheck. Memcheck introduce código de instrumentación en el programa a depurar, lo que le permite realizar un seguimiento del uso de la memoria y detectar los siguientes problemas:

Uso de memoria no inicializada.  Lectura/escritura de memoria que ha sido previamente liberada.  Lectura/escritura fuera de los límites de bloques de memoria dinámica.  Fugas de memoria.  Otros.  [email protected] 248 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

El precio a pagar es una notable pérdida de rendimiento; los programas se ejecutan entre cinco y veinte veces más lento al usar Valgrind, y su consumo de memoria es mucho mayor. Por ello normalmente no siempre se ejecuta un programa en desarrollo usando Valgrind, sino que se usa en situaciones concretas cuando se está buscando un error determinado se trata de veri…car que no haya errores ocultos como los que Memcheck puede detectar. Valgrind incluye además otras herramientas:

Addrcheck, versión ligera de Memcheck que se ejecuta más rápido y  requiere menos memoria pero que detecta menos tipos de errores.

Massif, mide el rendimiento del montículo (heap).  Helgrind, herramienta de detección de condiciones de carrera (race con-  ditions) en código multihilo.

Cachegrind, mide el rendimiento de la caché durante la ejecución, de  acuerdo a sus características (capacidad, tamaño del bloque de datos, grado de asociatividad, etc.).

Para el rastreo de problemas con la manipulación de memoria y punteros desbordados usamos:

$ g++ -g -O0 *.cpp $ valgrind –tool=memcheck –leak-check=yes –show-reachable=yes ./a.out

o analizar la salida usando kCachegrind:

$ valgrind –tool=callgrind ./a.out $ kCachegrind pro…le.callgrind

Aprender a Usar VALGRIND en la red existen múltiples sitios es- pecializados y una amplia bibliografía para depurar código, nosotros hemos seleccionado diversos textos que ponemos a su disposición en:

VALGRIND

[email protected] 249 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Existen varios paquetes de modo grá…co para valgrind, uno de ellos es alleyoop y se usa:

$ alleyoop ./a.out -v –arg1=foo

otro es kCachegrind, podemos ver más opciones en:

http://valgrind.org/  http://alleyoop.sourceforge.net/usage.html  http://kCachegrind.sourceforge.net/html/Home.html  8.5.7 Mejora del Rendimiento en Python Python es un lenguaje interpretado, pero es posible compilar el código para generar Byte Code para el interprete (no aumenta la velocidad de ejecución). Si se necesita crear un archivo .pyc para un módulo que no se importa, se puede usar los módulos py_compile y compile_all desde el interprete de Python. El módulo py_compile puede compilar manualmente cualquier módulo. Una forma de usar la función py_compile.compile en ese modulo de forma interactiva es:

>>> import py_compile >>> py_compile.compile(’modulo.py’)

esto escribirá el archivo modulo.pyc.

En la linea de comando de Linux es posible compilar todos los archivos en un directorio utilizando el módulo compileall, para ello usar:

$ python -m compileall *.py

y ejecutar mediante:

$ python modulo.pyc

También es posible hacer ligera optimización del código generado medi- ante: [email protected] 250 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

$ python –O-m compileall *.py

esto generará código Bytecode con extensión .pyo, y ejecutar mediante:

$ python modulo.pyo

Python es un lenguaje razonablemente rápido, pero no es tan rápido como los programas compilados de C o Fortran. Eso es porque se interpreta CPython, la implementación estándar. Para ser más precisos, su código de Python se compila en un código de Bytes que luego se interpreta. Eso es bueno para aprender, ya que puede ejecutar el código en el REPL de Python y ver los resultados de inmediato en lugar de tener que compilar y ejecutar. Pero como los programas de Python no son tan rápidos, los desarrolladores han creado varios compiladores de Python61 a lo largo de los años, incluidos62 Numba, Nuitka, PyPy, Cython, cx_FreezeIron, Pythran, Jython entre otros.

Comparando Compiladores de Python Alguien ya ha hecho el trabajo de crear un punto de referencia de Python. Opté por PyStone, una traduc- ción de un programa en C de Guido van Rossum, el creador de Python (el programa en C era en sí mismo una traducción de un programa Ada). Encon- tré una versión convertida por el desarrollador Christopher Arndt en Github que era capaz de probar Python 3. Para dar un sentido de perspectiva, aquí está el rendimiento de CPython (es decir, Python estándar) con Pystone:

Python 2.7.15Rc1 2: 272.647 pystones / second. Python 3.6.5: 175,817

Como puede ver, hay una gran diferencia entre Python 2 y 3 (cuanto más Pystones por segundo, mejor). En los siguientes desgloses, todos los compiladores de Python se compararon con Python 3.

61 El rendimiento rápido no es la única razón para compilar; Posiblemente la mayor desventaja de los lenguajes de Scripting como Python es que se proporciona de manera implícita su código fuente a los usuarios …nales. 62 Si está interesado en los compiladores de Python en general, tenga en cuenta que hay mucho debate y controversia sobre los "mejores" compiladores y la rapidez general del lenguaje.

[email protected] 251 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Nuitka Aunque puede seguir las instrucciones en la página de descarga, lo siguiente en Debian funcionó bien para mí:

$ apt install nuitka

adicionalmente Nuitka también puede usar otro compilador de C (además del gcc), así que descargué clang. Puedes instalarlo con esto:

$ apt install clang

De forma predeterminada, Nuitka usa gcc, pero un parámetro te permite usar el clang, así que lo probé con ambos. El compilador clang es parte de la familia llvm, y está pensado como un reemplazo moderno para gcc. Compilar pystone.py con gcc fue tan simple como esto (primera línea), o con clang (segunda línea), y con la optimización del tiempo de enlace para gcc (tercera línea):

$ nuitka pystone.py $ nuitka pystone.py –clang $ nuitka pystone.py –lto

Después de compilar, lo que tomó aproximadamente 10 segundos, ejecuté el pystone.exe desde la terminal con:

$ ./pystone.exe 500000

Hice 500,000 pases:

Tamaño Ejecución pystones / seg. 1. 223.176 Kb 597,000 2. 195,424 Kb 610,000 3. 194.2 kb 600,000

Estos fueron los promedios de más de 5 corridas. Había cerrado tantos procesos como pude, pero tomo los tiempos con un poco de variación porque había un +/- 5% en los valores de tiempo.

[email protected] 252 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

PyPy Guido van Rossum dijo una vez: "Si quieres que tu código se ejecute más rápido, probablemente debas usar PyPy". Para instalarlo en Debian usar:

$ apt install pypy

Entonces lo corrí así:

$ pypy pystone.py

El resultado fue una asombrosa cantidad de 1,776,001 pystones por se- gundo, casi tres veces más rápido que Nuitka. PyPy usa un compilador justo a tiempo y hace algunas cosas muy in- teligentes para alcanzar su velocidad. De acuerdo con los puntos de referen- cia reportados, es 7.6 veces más rápido que el CPython en promedio. Puedo creer eso fácilmente. La única (leve) desventaja es que siempre está un poco por detrás de las versiones de Python (es decir, hasta 2.7.13 (no 2.7.15) y 3.5.3 (no 3.6.5)). Producir un exe requiere un poco de trabajo. Tienes que escribir tu Python en un subconjunto llamado RPython.

Cython no es solo un compilador para Python; es para un supercon- junto de Python que admite la interoperabilidad con C / C ++. CPython está escrito en C, por lo que es un lenguaje que generalmente se combina bien con Python. Con…gurar las cosas con Cython es un poco complicado. No es como Nuitka, que acaba de salir de la caja. Primero, debes comenzar con un archivo de Python con una extensión .pyx; ejecuta Cython para crear un archivo pystone.c a partir de eso:

$ cython pystone.pyx –embed

No omita el parámetro -embed. Se agrega en main y eso es necesario. A continuación, compila pystone.c con esta hermosa línea:

$ gcc $ (python3-con…g –includes) pystone.c -lpython3.6m -o pystone.exe

Si recibe algún error, como "no se puede encontrar la versión -lpython", podría ser el resultado de su versión de Python. Para ver qué versión está instalada, ejecute este comando: [email protected] 253 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

$ pkg-con…g –c‡ags python3

Después de todo eso, Cython solo dio 228,527 pystones / sec. Sin embargo, Cython necesita que hagas un poco de trabajo especi…cando los tipos de variables. Python es un lenguaje dinámico, por lo que no se especi…can los tipos; Cython utiliza la compilación estática y el uso de variables de tipo C le permite producir un código mucho mejor optimizado. (La documentación es bastante extensa y requiere lectura).

Tamaño Ejecución pystones / seg. 1. 219.552 Kb 228.527

cx_freeze es un conjunto de Scripts y módulos para "congelar" Scripts de Python en ejecutables, y se pueden encontrar en Github. Lo instalé y creé una carpeta congelada para administrar cosas en:

$ pip3 install cx_Freeze –upgrade

Un problema que encontré con el Script de instalación fue un error que falta "lz". Necesitas tener instalado zlib; ejecuta esto para instalarlo:

$ apt install zlib1g-dev

Después de eso, el comando cx_Freeze tomó el Script pystone.py y creó una carpeta dist que contenía una carpeta lib, un archivo lib de 5MB y el archivo de aplicación pystone:

$ cxfreeze pystone.py –target- dist

Tamaño Ejecución pystones / seg. 1. 10,216 174,822

No es el rendimiento más rápido, porque es la misma velocidad que CPython. (La congelación de Python implica enviar su aplicación en un solo archivo (o carpeta) con los elementos Python necesarios, en lugar de compilar; signi…ca que el destino no requiere Python).

[email protected] 254 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Numba Este es un compilador "justo a tiempo" para Python que opti- miza el código que se usa en algoritmos numéricos como son en las matrices, bucles y funciones de NumPy (también da soporte a Threading, vectorización SIMD y aceleración por GPUs: Nvidia CUDA, AMD ROC ). La forma más común de usar Numba es a través de su colección de decoradores que se pueden aplicar a sus funciones para indicar a Numba que las compile usando el estándar LLVM. Cuando se realiza una llamada a una función decorada de Numba, de compila en el código de máquina "justo a tiempo" para su ejecución y todo o parte de su código puede ejecutarse posteriormente a la velocidad de código de máquina nativo. Numba también trabaja bien con Jupiter notebook para computación interactiva y con ejecución distribuida como Dask y Spark. Se puede instalar en Debian GNU/Linux mediante:

$ apt install python3-numba

y se puede descargar mediante CONDA paquete de Anaconda, usando:

$ conda install numba

o mediante PIP usando:

$ pip install numba

Dando mejores resultados en la ejecución de múltiples pruebas que PyPy, pero no en todos los casos. Por ello, la recomendación es evaluar el rendimiento mediante pruebas en cada caso particular.

Conclusión Una buena opción es PyPy por el rendimiento obtenido en código general (y dependiendo del código en cuestión Numba puede ser mejor que PyPy en aplicaciones de cómputo cientí…co), la compilación fue muy rápida y produjo los resultados en menos de un segundo después de presionar la tecla RETURN. Si requieres un ejecutable, sin embargo, te recomiendo Nuitka; fue una compilación sin complicaciones y se ejecuta más rápido que CPython. Experimenta con estos compiladores de Python y vea cuál funciona mejor para tus necesidades particulares.

[email protected] 255 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

8.5.8 Git Git es un programa de control de versiones que sirve para la gestión de los diversos cambios que se realizan sobre los elementos de algún proyecto de Software y sus respectivos programas fuente o con…guración del mismo. Fue diseñado por Linus Torvalds y es usado para controlar los cambios de diversos proyectos como los fuentes del Kernel de Linux (véase ??) que tiene decenas de millones de líneas de código (en la versión 4.12 cuenta con 24,170,860 líneas de código repartidos en 59,806 archivos) y es trabajado por miles de programadores alrededor del mundo.

¿Qué es control de versiones? se de…ne como control de versiones a la gestión de los diversos cambios que se realizan sobre los elementos de algún producto o una con…guración del mismo es decir a la gestión de los diversos cambios que se realizan sobre los elementos de algún producto o una con…guración, y para los que aún no les queda claro del todo, control de versiones es lo que se hace al momento de estar desarrollando un Software o una página Web. Exactamente es eso que haces cuando subes y actualizas tu código en la nube, o le añades alguna parte o simplemente editas cosas que no funcionan como deberían o al menos no como tú esperarías.

¿A que le llamamos sistema de control de versiones? son todas las herramientas que nos permiten hacer todas esas modi…caciones antes mencionadas en nuestro código y hacen que sea más fácil la administración de las distintas versiones de cada producto desarrollado; es decir Git.

Git fue creado pensando en la e…ciencia y la con…abilidad del mante- nimiento de versiones de aplicaciones cuando estas tienen un gran número de archivos de código fuente, es decir Git nos proporciona las herramientas para desarrollar un trabajo en equipo de manera inteligente y rápida y por trabajo nos referimos a algún Software o página que implique código el cual necesitemos hacerlo con un grupo de personas. Algunas de las características más importantes de Git son:

Rapidez en la gestión de ramas, debido a que Git nos dice que un  cambio será fusionado mucho más frecuentemente de lo que se escribe originalmente

[email protected] 256 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Gestión distribuida: Los cambios se importan como ramas adicionales  y pueden ser fusionados de la misma manera como se hace en la rama local

Gestión e…ciente de proyectos grandes  Realmacenamiento periódico en paquetes 

Para instalar Git completo en el servidor o en la máquina de trabajo:

# apt install git-all

Para instalar lo básico de Git, si no esta instalado:

# apt install git

Otras opciones para trabajar con Git son:

# apt install git git-all gitk gitg git-cola git-gui qgit tig lighttpd vim-fugitive # apt install mercurial # apt install subversion rapidsvn # apt install cvs

Con…guración: Si se quiere especi…car la identidad del que controla el repositorio local en el equipo, debemos usar (por omisión toma la información de la cuenta del usuario y máquina):

$ git con…g –global user.name "John Doe" $ git con…g –global user.email [email protected]

Si se desea con…gurar el editor de texto a usar por Git, usamos (por omisión es vim):

$ git con…g –global Core.editor scite

Si se desea con…gurar la herramienta de control de diferencias, usamos (por omisión vimdi¤ ): [email protected] 257 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

$ git con…g –global merge.tool meld

Si lo que requiero es un control personal sin necesidad de compartir los archivos con ningún otro usuario, puedo usar Git de forma local en cualquier directorio mediante:

$ git

Si se desea agregar la identidad del que controla el repositorio en este directorio, se debe usar:

$ git con…g user.name "John Doe" $ git con…g user.email [email protected]

Ahora para agregar los archivos (todos los de este directorio), usar:

$ git add .

Así podemos hacer la con…rmación de los cambios, mediante:

$ git commit -m "Primer lanzamiento"

Ahora cada que lo requiera al hacer modi…caciones, puedo checar los cambios:

$ git status

o en forma grá…ca con gitk, mediante:

$ gitk

Para actualizar los cambios, usar:

$ git commit -a -m ’Actualizacion’

La otra alternativa es preparar un directorio para el repositorio ya sea en el servidor o de forma local, mediante:

$ example.git $ cd example.git [email protected] 258 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Para inicializar el repositorio:

$ git –bare init

Es buena opción limitar el acceso a la cuenta via ssh, por ello es mejor cambiar en /etc/passwd, la línea del usuario predeterminada:

tlahuiz:x:1005:1005:Tlahuizcalpan„,:/home/tlahuiz:/bin/bash

a esta otra:

tlahuiz:x:1005:1005:Tlahuizcalpan„,:/home/tlahuiz:/usr/bin/git- Shell

En la máquina de trabajo o en el servidor en cualquier carpeta se genera la estructura del repositorio en un directorio temporal de trabajo para el repositorio:

$ mkdir tmp $ cd tmp $ git init

Para generar la estructura de trabajo para el repositorio y los archivos necesarios:

$ mkdir branches release trunk $ mkdir ...

Para adicionar todos y cada uno de los archivos y carpetas:

$ git add .

Para subir los cambios:

$ git commit -m "Texto"

Después debemos mandarlo al servidor:

$ git remote add ssh://usr@máquina/~/trayectoria [email protected] 259 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

o mandarlo a un directorio local:

$ git remote add origin ~/trayectoria $ git push origin +master:refs/heads/master

Para usar el repositorio en cualquier otra máquina hay que bajar el repo- sitorio por primera vez del servidor:

$ git clone ssh://usr@máquina/~/trayectoria

o de una carpeta local:

$ git clone ~/trayectoria

Ahora, podemos con…gurar algunos datos usados en el control de cambios:

$ git con…g –global usr.name "Nombre" $ git con…g –global usr.email usr@direccion

cuando se requiera actualizar del repositorio los cambios:

$ git pull

para subir los cambios al repositorio:

$ git commit -a -m "mensaje" $ git push

Comando usados para el trabajo cotidiano en Git Para ver el estado de los archivos locales:

$ git status

Para generar una nueva rama y trabajar en ella:

$ git branch MiIdea $ git checkout MiIdea

o en un solo paso: [email protected] 260 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

$ git checkout -b MiIdea

Para uni…car las ramas generadas en el punto anterior:

$ git checkout master $ git merge MiIdea

Para borrar una rama:

$ git branch -d MiIdea

Para listar ramas:

$ git branch

Para listar ramas fusionadas:

$ git branch –merged

Para listar ramas sin fusionar:

$ branch –no-merged

Para ver los cambios en el repositorio:

$ git log

o verlos en forma acortada:

$ git log –pretty=oneline

Para recuperar un archivo de una actualización anterior:

$ git show a30ab2ca64d81876c939e16e9dac57c8db6fb103:ruta/al/archivo > ruta/al/archivo.bak

Para volver a una versión anterior:

$ git reset –hard 56f8fb550282f8dfaa75cd204d22413fa6081a11: [email protected] 261 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

para regresar a la versión presente (cuidado con subir cambios en ramas anteriores):

$ git pull

Si en algún momento borramos algo o realizamos cambios en nuestra máquina y necesitamos regresar los archivos como estaban en nuestra última actualización, podemos usar:

$ git reset –hard HEAD

este trabaja con la información de nuestra copia local y no necesita cone- xión de red para la restitución. Eventualmente es necesario optimizar la copia local de los archivos en Git, para ello podemos usar:

$ git gc

Visualizador grá…co para Git:

# apt install gitk

Git es un proyecto pujante, amplio y bien documentado, ejemplos y do- cumentación puede ser consultada en:

https://git-scm.com/book/es/v1  http://git-scm.com/documentation  https://coderwall.com/p/kucyaw/protect-secret-data-in-git-repo  Git en Google Drive:

http://www.iexplain.org/using-git-with-google-drive-a-tutorial/  https://techstreams.github.io/2016/09/07/google-drive-as-simple-git-Host/  Aprender a Usar Git En la red existen múltiples sitios especializados y una amplia bibliografía para aprender a usar Git, nosotros hemos sele- ccionado diversos textos que ponemos a su disposición en:

Git [email protected] 262 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Un Resumen de los Comando de Git más Usados CONFIGURACION Con…gurar Nombre que salen en los commits

git con…g –global user.name "antonio"

Con…gurar Email

git con…g –global user.email [email protected]

Marco de colores para los comando

git con…g –global color.ui true

INICIOANDO REPOSITORIO

Iniciamos GIT en la carpeta donde esta el proyecto

git init

Clonamos el repositorio de github o bitbucket

git clone

Añadimos todos los archivos para el commit

git add .

Hacemos el primer commit

git commit -m "Texto que identi…que por que se hizo el com- mit"

Subimos al repositorio

git push origin master

GIT CLONE

Clonamos el repositorio de github, gitlab o bitbucket [email protected] 263 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

git clone

Clonamos el repositorio de github, gitlab o bitbucket

git clone git-demo

GIT ADD

Añadimos todos los archivos para el commit

git add .

Añadimos el archivo para el commit

git add

Añadimos todos los archivos para el commit omitiendo los nuevos

git add –all

Añadimos todos los archivos con la extensión especi…cada

git add *.txt

Añadimos todos los archivos dentro de un directorio y de una extensión especi…ca

git add docs/*.txt

Añadimos todos los archivos dentro de un directorios

git add docs/

GIT COMMIT

Cargar en el HEAD los cambios realizados

git commit -m "Texto que identi…que por que se hizo el com- mit"

Agregar y Cargar en el HEAD los cambios realizados [email protected] 264 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

git commit -a -m "Texto que identi…que por que se hizo el commit"

De haber con‡ictos los muestra

git commit -a

Agregar al ultimo commit, este no se muestra como un nuevo commit en los logs. Se puede especi…car un nuevo mensaje

git commit –amend -m "Texto que identi…que por que se hizo el commit"

GIT PUSH

Subimos al repositorio

git push

Subimos un tag

git push –tags

GIT LOG

Muestra los logs de los commits

git log

Muestras los cambios en los commits

git log –oneline –stat

Muestra gra…cos de los commits

git log –oneline –graph

GIT

Muestra los cambios realizados a un archivo [email protected] 265 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

git di¤ git di¤ –staged

GIT HEAD

Saca un archivo del commit

git reset HEAD

Devuelve el ultimo commit que se hizo y pone los cambios en staging

git reset –soft HEAD^

Devuelve el ultimo commit y todos los cambios

git reset –hard HEAD^

Devuelve los 2 ultimo commit y todos los cambios

git reset –hard HEAD^^

Rollback merge/commit

git log git reset –hard

GIT REMOTE

Agregar repositorio remoto

git remote add origin

Cambiar de remote

git remote set-url origin

Remover repositorio

git remote rm

Muestra lista repositorios [email protected] 266 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

git remote -v

Muestra los branches remotos

git remote show origin

Limpiar todos los branches eliminados

git remote prune origin

GIT BRANCH

Crea un branch

git branch

Lista los branches

git branch

Comando -d elimina el branch y lo une al master

git branch -d

Elimina sin preguntar

git branch -D

GIT TAG

Muestra una lista de todos los tags

git tag

Crea un nuevo tags

git tag -a - m "esta es la versión x"

GIT REBASE [email protected] 267 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Los rebase se usan cuando trabajamos con branches esto hace que los branches se pongan al día con el master sin afectar al mismo Une el branch actual con el mastar, esto no se puede ver como un merge

git rebase

Cuando se produce un con‡icto no das las siguientes opciones: cuando resolvemos los con‡ictos –continue continua la secuencia del re- base donde se pauso

git rebase –continue

Omite el con‡icto y sigue su camino

git rebase –skip

Devuelve todo al principio del rebase

git reabse –abort

Para hacer un rebase a un branch en especi…co

git rebase

OTROS COMANDOS

Lista un estado actual del repositorio con lista de archivos modi…cados o agregados

git status

Quita del HEAD un archivo y le pone el estado de no trabajado

git checkout –<…le>

Crea un branch en base a uno Online

git checkout -b newlocalbranchname origin/branch-name

Busca los cambios nuevos y actualiza el repositorio [email protected] 268 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

git pull origin

Cambiar de branch

git checkout

Une el branch actual con el especi…cado

git merge

Veri…ca cambios en el repositorio Online con el local

git fetch

Borrar un archivo del repositorio

git rm

Fork

Descargar remote de un fork

git remote add upstream

Merge con master de un fork

git fetch upstream git merge upstream/master

Git-crypt El paquete git-crypt es una solución que usa GPG por debajo de Git que permite encriptación y desencriptación transparente de archivos en un repositorio git. Los archivos que se requieran proteger serán encriptados al hacer commit y desencriptados al hacer checkout y permite compartir libremente un repo- sitorio que contenga contenido tanto público como privado. De esta forma, permite trabajar de manera transparente con el contenido desencriptado, de forma que desarrolladores que no tengan la clave secreta podrán clonar y hacer commit en un repositorio con archivos encriptados. Esto te permite almacenar tu material secreto (como pueden ser claves) en el mismo repositorio que tu código sin tener que bloquearlo. Solo un usuario autorizado puede dar permisos a otros usuarios. Para instalar el paquete git-crypt usamos: [email protected] 269 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

# apt install git-crypt

Ya instalado debemos prepara el repositorio git, para crear la llave, en- tonces usar:

$ git-crypt keygen ~/crypt-key

Ahora podemos crear el repositorio:

$ cd repo $ git-crypt init

Especi…ca que carpetas/archivos deben ser encriptados, como git-…lters:

$ cat .gitattributes

keys …lter=git-crypt di¤=git-crypt

crear la lista de los archivos a encriptar

$ vi .gitattributes

Indicamos que se cifren, por ejemplo, los archivos .html, .org, directo- rio:secretdir/**secreto y archivo, con cualquier extensión o palabra que le preceda.

*.html …lter=git-crypt di¤=git-crypt‘ *.org …lter=git-crypt di¤=git-crypt directorio_secreto/** …lter=git-crypt di¤=git-crypt *archivo* …lter=git-crypt di¤=git-crypt

ahora cada vez que hagamos un commit, los archivos .html y .org, subirán cifrados.

Ya podemos usar la llave para encriptar los archivos indicados por .gitat- tributes mediante:

$ git-crypt unlock ~/crypt-key [email protected] 270 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

y agregar los archivos que deseamos encriptar, usando git add, revisando el estado de los archivos encriptados mediante:

$ git-crypt status -f

y podemos hacer los commits necesarios.

Al clonar el repositoro, los archivos encriptados se mostraran como tal, hasta hacer en el repositorio:

$ git-crypt unlock ~/crypt-key

mostrando los archivos desencriptados a partir de ese momento

Si se desea respaldar el repositorio en un solo archivo se puede usar:

$ git bundle create /tmp/Respaldo –all

y para restaurar usar algo como:

$ git clone /tmp/Respaldo newFolder

También podemos añadir usuarios autorizados (identi…cados por su clave GPG), mediante:

$ git-crypt add-gpg-user USER_ID

Flujos de trabajo comunes

En la máquina del desarrollador: Crea el vault, añádete como usuario  …able. Pide las claves públicas a los miembros de tu equipo y añádelas al vault.

En el entorno de Integración Continua (CI): Añade una clave GPG  común para los ejecutores /CI. Autorízala en el repositorio.

Seguridad

[email protected] 271 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Git-crypt usa GPG internamente, así que el nivel de seguridad debería  ser el dado por GPG, a excepción de posibles errores en el propio pro- grama git-crypt.

Git-crypt es más seguro que otros sistemas git de encriptación transpar-  ente, git-crypt encripta archivos usando AES-256 en modo CTR con un synthetic IV derivado del SHA-1 HMAC del archivo. Este modo de operar proporciona seguridad semántica ante CPAs (chosen-plain attacks) determinísticos. Esto signi…ca que pese a que la encriptación es determinística (lo cual es requerido para que git pueda distinguir cuando un archivo ha cambiado y cuando no), no …ltra información más allá de mostrar si dos archivos son idénticos o no.

Limitaciones y Trucos

Cualquier usuario no autorizado puede ver que estamos usando git-crypt  basándose en la evidencia dejada en el archivo .gitattributes.

Git-crypt no encripta nombres de archivo, mensajes de commit, symlink  targets, gitlinks, u otros metadatos.

Git-crypt se apoya en git …lters, los cuales no fueron diseñados con la  encriptación en mente. Así pues, git-crypt no es la mejor herramienta para encriptar la mayoría o totalidad de los archivos de un repositorio. Donde git-crypt destaca es en aquellos casos en que la mayoría del repositorio es público pero unos pocos archivos deben ser encriptados (por ejemplo, claves privadas o archivos con credenciales API). Para encriptar un repositorio entero, mejor considerar usar un sistema como git-remote-gcrypt.

Git-crypt no esconde cuando un archivo cambia o no, cuanto ocupa o  el hecho de dos archivos sean idénticos.

Los archivos encriptados con git-crypt no se pueden comprimir. Incluso  el más pequeño de los cambios en un archivo encriptado requiere que git archive el archivo modi…cado en su totalidad y no solo un delta.

A pesar de que git-crypt protege el contenido de los archivos individ-  uales con SHA-1 HMAC, git-crypt no puede ser usado de forma segura a menos que el repositorio entero esté protegido contra la alteración [email protected] 272 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

de datos (un atacante que pueda mutar tu repositorio podrá alterar tu archivo .gitattributes para deshabilitar la encriptación). Si fuera necesario, usa características de git cómo signed tags en vez de contar únicamente con git-crypt para la integridad.

El di¤ del commit varía cuando el vault está abierto vs cuando está cer-  rado. Cuando está abierto, los contenidos del archivo están en formato plano, es decir, desencriptados. En consecuencia puedes ver el di¤. Cuando el vault está cerrado, no se puede apreciar un di¤ efectivo ya que el texto cifrado cambia, pero el ojo humano no puede distinguir los contenidos.

Además de Git usado de forma local, existen diversos servicios en la nube63 que permiten dar soporte a proyectos mediante Git, en los cuales es necesario crear una cuenta y subir los datos usando Git, algunos de estos servicios son:

GitLab (https://about.gitlab.com/) Para con…gurar:

git con…g –global user.name "Antonio Carrillo Ledesma" git con…g –global user.email "[email protected]"

Para crear nuevo repositorio:

git clone https://gitlab.com/antoniocarrillo69/MDF.git cd MDF touch README.md git add README.md git commit -m "add README" git push -u origin master

Para usar una carpeta existente:

63 Algunos de estos proyectos gratuitos son: Gitlab, Github, Bitbucket, Beanstalk, Launchpad, SourceForge, Phabricator, GitBucket, Gogs, Gitea, Apache Allura, entre otros.

[email protected] 273 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

cd existing_folder git init git remote add origin https://gitlab.com/antoniocarrillo69/MDF.git git add . git commit -m "Initial commit" git push -u origin master

Para usar un repositorio existente:

cd existing_repo git remote rename origin old-origin git remote add origin https://gitlab.com/antoniocarrillo69/MDF.git git push -u origin –all git push -u origin –tags

Github (https://github.com/) Para con…gurar:

git con…g –global user.name "Antonio Carrillo Ledesma" git con…g –global user.email "[email protected]"

Para con…gurar un nuevo repositorio:

$ touch README.md $ git init $ git add . $ git commit -m "mi primer commit" $ git remote add origin https://github.com/antoniocarrillo69/ejemploPruebas.git $ git push -u origin master

8.5.9 Otras opciones Herramientas para convertir código fuentes en HTML, usando:

$ code2html Fuente Salida.html

o

$ c2html Fuente [email protected] 274 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Para java, usamos:

$ java2html Fuentes

También podemos convertir código fuente en PDF, usando:

$ nl test.cpp a2ps -1 -l100 -otest.ps ; ps2pdf test.ps j el primer comando numera las líneas del fuente, el segundo comando genera del fuente numerado un .PS y el último comando convierte .PS a .PDF

Si se tiene que ejecutar múltiples programas que son independientes uno de otro se puede usar el programa parallel para correr N (número de cores del equipo) de ellos al mismo tiempo, por ejemplo si tenemos un archivo Bash con el nombre mi-Bash y cuyo contenido es:

./a.out 4 5 4 > a1.txt ./a.out 4 5 3 > a2.txt ./a.out 4 5 6 > a3.txt ./a.out 4 5 4 > a4.txt ./a.out 3 5 4 > a5.txt ./a.out 4 6 4 > a6.txt

entonces podemos ejecutarlo usando parallel, el programa usara el número máximo de cores disponibles:

$ parallel -v < mi-Bash

si solo se desea usar una determinada cantidad de cores (por ejemplo 3) entonces usamos:

$ parallel -v -j 3 < mi-Bash

[email protected] 275 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

8.6 Programando Desde la Nube Existen diferentes servicios Web64 que permiten editar, compilar y ejecutar código de diversos lenguajes y paquetes desde el navegador, esto en aras de que los estudiantes y profesores que cuenten con algún sistema de acceso a red y un navegador puedan programar en los más diversos lenguajes, IDEs y terminales sin hacer instalación alguna en su equipo de cómputo, tableta o teléfono celular. Algunos ejemplos de estos servicios son:

https://www.jdoodle.com/  https://repl.it/  http://browxy.com  https://jupyter.org/try  https://tio.run/  https://www.compilejava.net/  http://codepad.org/  https://code.hackerearth.com/  https://www.remoteinterview.io/online-c-compiler  https://ideone.com/  https://hackide.herokuapp.com/  https://www.codechef.com/ide  http://cpp.sh/  64 Cuando se trabaja desde la Web es recomendable usar el modo Privado o Incógnito para no guardar el historial de navegación, información introducida en los formularios y borrar al cerrar el navegador los datos de los sitios visitados. Pero recuerda que los sitios Web que visitamos sí guardan información de nuestra visita, nuestro proveedor de Internet también guarda constancia de nuestra visita y si descargamos algo, esto no se borra al igual que el historial de descargas, además de las marcas de páginas o favoritos se conservarán al cerrar al navegador. [email protected] 276 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

https://codebunk.com/  https://rextester.com/  https://www.tutorialspoint.com/codingground.htm  https://www.compileonline.com  http://python…ddle.com/  https://trinket.io/python  https://www.pythonanywhere.com/try-ipython/  https://www.rollapp.com/  https://godbolt.org/  https://www.codiva.io/  https://paiza.io/en  https://wandbox.org/  http://coliru.stacked-crooked.com/  http://quick-bench.com/  https://cppinsights.io/  https://ideone.com/  http://cpp.sh/  https://ide.geeksforgeeks.org/  https://www.codechef.com/ide  https://visualstudio.microsoft.com/services/visual-studio-online/ 

Usando Editores Colaborativos

[email protected] 277 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

La escritura colaborativa es una escritura de códigos de programación en la Web hecha por más de una persona simultáneamente. Algunos ejemplos de estos servicios son:

http://collabedit.com (edita código, tiene chat, no compila)  https://gitduck.com/  https://codeshare.io/  https://www.tutorialspoint.com/codingground.htm  http://ideone.com  https://codebunk.com  https://visualstudio.microsoft.com/services/visual-studio-online/  https://ace.c9.io/build/kitchen-sink.html  https://coderpad.io/  https://peerpad.net/  https://aws.amazon.com/cloud9/  https://codeanywhere.com/  https://stekpad.com/home/ 

Algunas de las terminales soportados son:

CentOS, IPython, Lua, MemCached, Mongo DB, MySQL, Node.js, Numpy, Oracle, Octave, PowerShell, PHP, R Progra- mming, Redis, Ruby, SciPy, SymPy, etc.

Algunos de los IDEs soportados son:

[email protected] 278 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Ada (GNAT), Algol68, Angular JS, Assembly, AsciiDoc, AWK, Bash Shell, Befunge, Bootstrap, Brainf**k, C, CSS3, Chipmunk BASIC, Clojure, Cobol, Co¤eeScript, ColdFusion, C99 Strict, C++, C++ 0x, C++ 11, C#, Dart, D , Embedded C, Erlang, Elixir, Factor, Fantom, Falcon, Fortran- 95, Forth,F#, Free Basic, Groovy, GO, Haxe, Haskell, HTML, , Intercal, Icon, Java, Java 8, Java MySQL, JavaScript, JSP, JQuery, Julia, Korn Shell (ksh), Latex, Lisp, LOLCODE, Lua, Matlab/Octave, Malbolge, Markdown, MathML, Mozart- Oz, Nimrod, Node.JS, Objective-C, OCaml, Pascal, PARI/GP, Pawn, Perl, Perl MySQL, PHP, PHP MySQL, WebView, Pike, Processing.js, p5.js, Prolog, Python-2, Python-3, Python MySQL, Jupyter Notebook, Rexx, reStructure, Ruby, Rust, , R Pro- gramming, Scheme, Smalltalk,SML/NJ, Simula, SQLite SQL, Tcl, TeX, Unlambda, VB.NET, Verilog, Whitespace, Ya Basic, etc.

Google Colaboratory Integrante de la G Suite for Education de Google permite a los usuarios que pertenezcan a esta Suite (como gran parte de los estudiantes de la UNAM) tener acceso desde el navegador para escribir y eje- cutar código de Python (Jupyter), es posible elegir correr nuestro Notebook en una CPU, GPU o en una TPU de forma gratuita. Tiene algunas restric- ciones, como por ejemplo que una sesión dura 12 hrs, pasado ese tiempo se limpia nuestro ambiente y perdemos las variables y archivos que tengamos almacenados allí. Es conveniente para principiantes que requieran experimentar con Machne Learning y Deep Learning pero sin recurrir en costos de procesamiento . Además el ambiente de trabajo ya viene con muchas librerías instaladas y listas para utilizar (como por ejemplo Tensor‡ow, Sclkit-learn, Pytorch, Keras y OpenCV ), ahorrándonos el trabajo de con…gurar nuestro ambiente de trabajo. Podemos importar nuestros archivos y datos desde Google Drive, GitHub, etc. Más información sobre Google Colaboratory en:

https://colab.research.google.com/notebooks/intro.ipynb

[email protected] 279 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

9 Bases de Datos

¿Qué son las bases de datos? una base de datos es un conjunto de datos pertenecientes a un mismo contexto y almacenados sistemáticamente para su uso posterior (véase [102] y [103]). En este sentido; una biblioteca puede considerarse una base de datos compuesta en su mayoría por documen- tos y textos impresos en papel e indexados para su consulta. Actualmente la mayoría de las bases de datos están en formato digital, se han desarrollado y se ofrece un amplio rango de soluciones al problema del almacenamiento de datos.

9.1 Clasi…cación Las bases de datos se pueden clasi…car de diferentes formas: acuerdo a la ubicación, de acuerdo a la forma de establecer relaciones entre los datos, según la orientación, entre otros. De acuerdo a la ubicación

Base de datos centralizada: Se ubica, almacena y mantiene en una sola  ubicación. Eso no signi…ca que el usuario tenga que estar en el mismo lugar para acceder.

Base de datos distribuida: Se trata en realidad de diferentes bases de  datos en distintas locaciones físicas unidas por un gestor que las hace funcionar como si fueran una sola.

De acuerdo a la forma de establecer relaciones entre los datos

Relacionales: En este tipo de base de datos estos se organizan en forma  de …las y columnas.

Orientadas a objetos: Aquí los datos se almacenan en forma de objetos.  Estos objetos se guardan en la base de datos asignándoles atributos y métodos que son los que de…nen qué hacer con los datos.

Orientadas a grafos: Utiliza la teoría de grafos para almacenar, mapear  y consultar las relaciones entre datos.

NoSQL: Permite almacenar datos no estructurados o semiestructura-  dos. [email protected] 280 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Orientada a documentos: Es un subtipo de la anterior. En lugar de  almacenar los datos en …las y columnas utiliza documentos para al- macenar y recuperar los datos. Estos documentos organizan los datos utilizando estándares como JSON o XML. Según la orientación OLTP: Son bases de datos orientadas al procesamiento de transacciones  e incluye funciones de introducción, modi…cación y borrado de datos. OLAP: Estas bases de datos están orientadas al análisis de los datos  para permitir extraer conclusiones. Otros tipos Autónomas: Están basadas en la nube y utilizan el aprendizaje au-  tomático para automatizar el trabajo la base de datos, la seguridad, las copias de seguridad, las actualizaciones y otras tareas de gestión rutinarias que en las bases de datos tradicionales realiza un admin- istrador. Almacén de datos: Es una base de datos enfocada en el sector cor-  porativo que integra y depura información de varias fuentes distintas para procesarla y analizarla desde diferentes puntos de vista a gran velocidad.

Hay programas denominados sistemas gestores de bases de datos SGBD (Database Management System o DBMS), que permiten almacenar y poste- riormente acceder a los datos de forma rápida y estructurada. Actualmente se tienen dos importantes tipos de bases de datos: Structured Query Language SQL (lenguaje de consulta estructurada)  es un lenguaje de dominio especí…co, diseñado para administrar, y recu- perar información de sistemas de gestión de bases de datos relacionales. NoSQL "no solo SQL" es una amplia clase de sistemas de gestión de  bases de datos que di…eren del modelo clásico de SGBDR (Sistema de Gestión de Bases de Datos Relacionales) en aspectos importantes, siendo el más destacado que no usan SQL como lenguaje principal de consultas. Los datos almacenados no requieren estructuras …jas como tablas. [email protected] 281 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

9.2 ¿Qué son las bases de datos SQL? el lenguaje de consulta estructurada SQL (Structured Query Language), es un lenguaje de dominio especí…co, diseñado para administrar, y recuperar información de sistemas de gestión de bases de datos relacionales. Una de sus principales características es el manejo del álgebra y el cálculo relacional para efectuar consultas con el …n de recuperar, de forma sencilla, información de bases de datos, así como realizar cambios en ellas. Originalmente basado en el álgebra relacional y en el cálculo relacional, SQL consiste en un lenguaje de de…nición de datos, un lenguaje de manipu- lación de datos y un lenguaje de control de datos. El alcance de SQL incluye la inserción de datos, consultas, actualizaciones y borrado, la creación y modi- …cación de esquemas y el control de acceso a los datos. También en SQL a veces se describe como un lenguaje declarativo, también incluye elementos procesales.

Características generales de SQL SQL es un lenguaje de acceso a bases de datos que explota la ‡exibilidad y potencia de los sistemas relacionales y permite así gran variedad de operaciones. Es un lenguaje declarativo de "alto nivel" o "de no procedimiento" que, gracias a su fuerte base teórica y su orientación al manejo de conjuntos de registros –y no a registros individuales–permite una alta productividad en codi…cación y la orientación a objetos. De esta forma, una sola sentencia puede equivaler a uno o más programas que se utilizarían en un lenguaje de bajo nivel orientado a registros. SQL también tiene las siguientes caracterís- ticas:

Lenguaje de de…nición de datos: El LDD de SQL proporciona coman-  dos para la de…nición de esquemas de relación, borrado de relaciones y modi…caciones de los esquemas de relación.

Lenguaje interactivo de manipulación de datos: El LMD de SQL in-  cluye lenguajes de consultas basado tanto en álgebra relacional como en cálculo relacional de tuplas.

Integridad: El LDD de SQL incluye comandos para especi…car las res-  tricciones de integridad que deben cumplir los datos almacenados en la base de datos. [email protected] 282 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

De…nición de vistas: El LDD incluye comandos para de…nir las vistas.  Control de transacciones: SQL tiene comandos para especi…car el comien-  zo y el …nal de una transacción.

SQL incorporado y dinámico: Esto quiere decir que se pueden incorpo-  rar instrucciones de SQL en lenguajes de programación como: C++, C, Java, Python, PHP, COBOL, Pascal y Fortran.

Autorización: El LDD incluye comandos para especi…car los derechos  de acceso a las relaciones y a las vistas.

Tipos de datos Algunos de los tipos de datos básicos de SQL’sson:

Varchar: Recibe cadena de palabras compuestas de letras, números y  caracteres especiales.

Int: es el principal tipo de datos de valores enteros de SQL Server. Con  números enteros con o sin signo

Date: una fecha de calendario que contiene el año (de cuatro cifras), el  mes y el día.

Time: La hora del día en horas, minutos y segundos (el valor predeter-  minado es 0).

Optimización Como ya se dijo antes, y suele ser común en los lenguajes de acceso a bases de datos de alto nivel, SQL es un lenguaje declarativo. O sea, que especi…ca qué es lo que se quiere y no cómo conseguirlo, por lo que una sentencia no establece explícitamente un orden de ejecución. El orden de ejecución interno de una sentencia puede afectar seriamente a la e…ciencia del SGBD, por lo que se hace necesario que este lleve a cabo una optimización antes de su ejecución. Muchas veces, el uso de índices acelera una instrucción de consulta, pero ralentiza la actualización de los datos. Dependiendo del uso de la aplicación, se priorizará el acceso indexado o una rápida actualización de la información. La optimización di…ere sensiblemente en cada motor de base de datos y depende de muchos factores. Los sistemas de bases de datos modernos poseen un componente llamado optimizador de consultas. Este realiza un análisis detallado de los posibles [email protected] 283 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM planes de ejecución de una consulta SQL y elige aquel que sea más e…ciente para llevar adelante la misma. Existe una ampliación de SQL conocida como FSQL (Fuzzy SQL, SQL difuso) que permite el acceso a bases de datos difusas, usando la lógica difusa.

9.2.1 Lenguaje de de…nición de datos (DDL) El lenguaje de de…nición de datos (en inglés Data De…nition Language, o DDL), es el que se encarga de la modi…cación de la estructura de los objetos de la base de datos. Incluye órdenes para modi…car, borrar o de…nir las tablas en las que se almacenan los datos de la base de datos. Existen cuatro operaciones básicas: CREATE, ALTER, DROP y TRUNCATE.

CREATE (Crear) este comando permite crear objetos de datos, como nuevas bases de datos, tablas, vistas y procedimientos almacenados. Ejemplo (crear una tabla):

CREATE TABLE clientes;

ALTER (Alterar) este comando permite modi…car la estructura de una tabla u objeto. Se pueden agregar/quitar campos a una tabla, modi…car el tipo de un campo, agregar/quitar índices a una tabla, modi…car un trigger, etc. Ejemplo (agregar columna a una tabla):

ALTER TABLE alumnos ADD edad INT UNSIGNED;

DROP (Eliminar) este comando elimina un objeto de la base de datos. Puede ser una tabla, vista, índice, trigger, función, procedimiento o cualquier objeto que el motor de la base de datos soporte. Se puede com- binar con la sentencia ALTER. Ejemplo (elimina la tabla alumnos):

DROP TABLE alumnos;

[email protected] 284 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

TRUNCATE (Truncar) este comando solo aplica a tablas y su fun- ción es borrar el contenido completo de la tabla especi…cada. La ventaja sobre el comando DELETE, es que si se quiere borrar todo el contenido de la tabla, es mucho más rápido, especialmente si la tabla es muy grande. La desventaja es que TRUNCATE solo sirve cuando se quiere eliminar absolu- tamente todos los registros, ya que no se permite la cláusula WHERE. Si bien, en un principio, esta sentencia parecería ser DML (Lenguaje de Mani- pulación de Datos), es en realidad una DDL, ya que internamente, el co- mando TRUNCATE borra la tabla y la vuelve a crear y no ejecuta ninguna transacción. Ejemplo (borra el contenido de la tabla alumnos):

TRUNCATE TABLE alumnos;

9.2.2 Lenguaje de manipulación de datos DML Un lenguaje de manipulación de datos (Data Manipulation Language, o DML en inglés) es un lenguaje proporcionado por el sistema de gestión de base de datos que permite a los usuarios llevar a cabo las tareas de consulta o manipulación de los datos, organizados por el modelo de datos adecuado. El lenguaje de manipulación de datos más popular hoy en día es SQL, es usado para recuperar y manipular datos en una base de datos relacional.

SELECT (Seleccionar) La sentencia SELECT nos permite consultar los datos almacenados en una tabla de la base de datos. Forma básica:

SELECT [{ALL DISTINCT}] [, ...] FROM { }[, { }...] [WHERE [{AND OR} ...]] [GROUP BY [, ...]] [HAVING [{AND OR} ...]] [ORDER BY { } [{ASC DESC}][,{ } [{ASCjDESC}]]]; j j [email protected] 285 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

SELECT palabra clave que indica que la sentencia de SQL que que- remos ejecutar es de selección.

ALL indica que queremos seleccionar todos los valores. Es el valor por defecto y no suele especi…carse casi nunca.

DISTINCT indica que queremos seleccionar solo los valores distintos.

FROM indica la tabla (o tablas) desde la que queremos recuperar los datos. En el caso de que exista más de una tabla se denomina a la consulta "consulta combinada" o "join". En las consultas combinadas es necesario aplicar una condición de combinación a través de una cláusula WHERE.

WHERE especi…ca una condición que debe cumplirse para que los datos sean devueltos por la consulta. Admite los operadores lógicos AND y OR.

GROUP BY especi…ca la agrupación que se da a los datos. Se usa siempre en combinación con funciones agregadas.

HAVING especi…ca una condición que debe cumplirse para que los datos sean devueltos por la consulta. Su funcionamiento es similar al de WHERE pero aplicado al conjunto de resultados devueltos por la consulta. Debe aplicarse siempre junto a GROUP BY y la condición debe estar referida a los campos contenidos en ella.

ORDER BY presenta el resultado ordenado por las columnas indi- cadas. El orden puede expresarse con ASC (orden ascendente) y DESC (orden descendente). El valor predeterminado es ASC. Ejemplo: Para formular una consulta a la tabla coches, usamos la palabra clave FROM y con SELECT le indicamos que desamos recuperar los campos ma- trícula, marca, modelo, color, número_kilómetros, num_plazas, para ello debemos ejecutar la siguiente consulta:

SELECT matricula, marca, modelo, color, numero_kilometros, num_plazas [email protected] 286 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

FROM coches ORDER BY marca, modelo;

los datos serán devueltos ordenados por marca y por modelo en orden ascendente, de menor a mayor. Ejemplo de consulta simpli…cada a través de un comodín de campos (*): El uso del asterisco indica que queremos que la consulta devuelva todos los campos que existen en la tabla y los datos serán devueltos ordenados por marca y por modelo.

SELECT * FROM coches ORDER BY marca, modelo;

Cláusula WHERE (Donde) la cláusula WHERE es la instrucción que nos permite …ltrar el resultado de una sentencia SELECT. Habitualmente no deseamos obtener toda la información existente en la tabla, sino que queremos obtener solo la información que nos resulte útil en ese momento. La cláusula WHERE …ltra los datos antes de ser devueltos por la consulta. Cuando en la cláusula WHERE queremos incluir un tipo texto, debemos incluir el valor entre comillas simples. Ejemplos: En nuestro ejemplo, se desea consultar un coche en concreto, para esto se agregó una cláusula WHERE. Esta cláusula especi…ca una o varias condi- ciones que deben cumplirse para que la sentencia SELECT devuelva los datos. En este caso la consulta devolverá solo los datos del coche con matrícula para que la consulta devuelva solo los datos del coche con matrícula MF-234-ZD o bien la matrícula FK-938-ZL . Se puede utilizar la cláusula WHERE sola- mente, ó en combinación con tantas condiciones como queramos.

SELECT matricula, marca, modelo, color, numero_kilometros, num_plazas FROM coches [email protected] 287 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

WHERE matricula = ’MF-234-ZD’OR matricula = ’FK-938-ZL’;

Una condición WHERE puede ser negada a través del Operador Lógico NOT. La Siguiente consulta devolverá todos los datos de la tabla coches, menos el que tenga la matrícula MF-234-ZD.

SELECT matricula, marca, modelo, color, numero_kilometros, num_plazas FROM coches WHERE NOT matricula = ’MF-234-ZD’;

La siguiente consulta utiliza la condicional DISTINCT, la cual nos de- volverá todos los valores distintos formados por los campos marca y modelo de la tabla coches.

SELECT DISTINCT marca, modelo FROM coches;

Cláusula ORDER BY (Ordernar Por) la cláusula ORDER BY es la instrucción que nos permite especi…car el orden en el que serán devueltos los datos. Podemos especi…car el orden de forma ascendente o descendente a través de las palabras clave ASC y DESC. El orden depende del tipo de datos que estén de…nidos en la columna, de forma que un campo numérico será ordenado como tal, y un alfanumérico se ordenará de la A a la Z, aunque su contenido sea numérico. El valor predeterminado es ASC si no se especi…ca al hacer la consulta. Ejemplos:

SELECT matricula, marca, modelo, color, numero_kilometros, num_plazas FROM coches ORDER BY marca ASC, modelo DESC;

[email protected] 288 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Este ejemplo, selecciona todos los campos matricula, marca, modelo, color, numero_kilometros y num_plazas de la tabla coches, ordenándolos por los campos marca y modelo, marca en forma ascendente y modelo en forma descendente. SELECT matricula, marca, modelo, color, numero_kilometros, num_plazas FROM coches ORDER BY 2; Este ejemplo, selecciona todos los campos matrícula, marca, modelo, color, numero_kilometros y num_plazas de la tabla coches, ordenándolos por el campo marca, ya que aparece en segundo lugar dentro de la lista de campos que componen la cláusula SELECT.

Subconsultas una subconsulta es una sentencia SELECT que está em- bebida en una cláusula de otra sentencia SQL. También pueden utilizarse subconsultas en los comandos INSERT, UPDATE, DELETE y en la cláusula FROM. Las subconsultas pueden resultar útiles si necesitas seleccionar …las de una tabla con una condición que depende de los datos de la propia tabla o de otra tabla. La subconsulta (consulta interna), se ejecuta antes de la consulta prin- cipal; el resultado de la subconsulta es utilizado por la consulta principal (consulta externa). SELECT c.matricula, c.modelo FROM coches AS c WHERE c.matricula IN ( SELECT m.matricula FROM multas AS m WHERE m.importe > 100 ); En este ejemplo, se seleccionan las matrículas y los modelos de los coches cuyas multas superan los USD 100. [email protected] 289 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

INSERT (Insertar) una sentencia INSERT de SQL agrega uno o más registros a una (y solo una) tabla en una base de datos relacional. Forma básica:

INSERT INTO tablatura(columnaA, [columnaB, ...]) VALUES (’valor1’,[’valor2’,...]);

o también se puede utilizar como:

INSERT INTO tablatura VALUES (’valor1’,’valor2’);

Las cantidades de columnas y valores deben ser iguales. Si una columna no se especi…ca, le será asignado el valor por omisión. Los valores especi- …cados (o implícitos) por la sentencia INSERT deberán satisfacer todas las restricciones aplicables. Si ocurre un error de sintaxis o si alguna de las restricciones es violada, no se agrega la …la y se devuelve un error. Ejemplo:

INSERT INTO agenda_telefonica (nombre, numero) VALUES (’Roberto Jeldrez’,4886850);

Cuando se especi…can todos los valores de una tabla, se puede utilizar la sentencia acortada:

INSERT INTO nombre_tabla VALUES (’valor1’, [’valor2’, ...]);

Ejemplo (asumiendo que ’nombre’y ’número’son las únicas columnas de la tabla ’agenda_telefonica’):

INSERT INTO agenda_telefonica VALUES (’Jhonny Aguilar’,080473968);

[email protected] 290 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Formas avanzadas una característica de SQL (desde SQL-92) es el uso de constructores de …las para insertar múltiples …las a la vez, con una sola sentencia SQL:

INSERT INTO tabla(columna1[, columna2, ...]) VALUES (’valor1A’,[’valor1B’,...]), (’value2A’,[’value2B’,...]), ...;

Esta característica es soportada por DB2, PostgreSQL (desde la versión 8.2), MySQL, y H2. Ejemplo (asumiendo que nombre y número son las únicas columnas en la tabla agenda_telefonica):

INSERT INTO agenda_telefonica VALUES (’Roberto Fernández’,’4886850’), (’Alejandro Sosa’,’4556550’);

Que podía haber sido realizado por las sentencias:

INSERT INTO agenda_telefonica VALUES (’Roberto Fer- nández’,’4886850’); INSERT INTO agenda_telefonica VALUES (’Alejandro Sosa’, ’4556550’);

Notar que las sentencias separadas pueden tener semántica diferente (es- pecialmente con respecto a los triggers), y puede tener diferente rendimiento que la sentencia de inserción múltiple. Para insertar varias …las en MS SQL puede utilizar esta construcción:

INSERT INTO phone_book SELECT ’John Doe’,’555-1212’ UNION ALL SELECT ’Peter Doe’,’555-2323’;

[email protected] 291 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Tenga en cuenta que no se trata de una sentencia SQL válida de acuerdo con el estándar SQL (SQL: 2003), debido a la cláusula subselect incompleta. Para hacer lo mismo en Oracle se usa la Tabla DUAL, siempre que se trate de solo una …la simple:

INSERT INTO phone_book SELECT ’John Doe’,’555-1212’FROM DUAL UNION ALL SELECT ’Peter Doe’,’555-2323’FROM DUAL

Una implementación conforme al estándar de esta lógica se muestra en el siguiente ejemplo, o como se muestra arriba (no aplica en Oracle):

INSERT INTO phone_book SELECT ’John Doe’, ’555-1212’ FROM LATERAL ( VAL- UES (1) ) AS t(c) UNION ALL SELECT ’Peter Doe’,’555-2323’ FROM LATERAL ( VAL- UES (1) ) AS t(c)

Copia de …las de otras tablas un INSERT también puede utilizarse para recuperar datos de otros, modi…carla si es necesario e insertarla direc- tamente en la tabla. Todo esto se hace en una sola sentencia SQL que no implica ningún procesamiento intermedio en la aplicación cliente. Un SUB- SELECT se utiliza en lugar de la cláusula VALUES. El SUBSELECT puede contener la sentencia JOIN, llamadas a funciones, y puede incluso consultar en la misma TABLA los datos que se inserta. Lógicamente, el SELECT se evalúa antes que la operación INSERT esté iniciada. Un ejemplo se da a continuación:

INSERT INTO phone_book2 SELECT * FROM phone_book WHERE name IN (’John Doe’,’Peter Doe’);

Una variación es necesaria cuando algunos de los datos de la tabla fuente se está insertando en la nueva tabla, pero no todo el registro. (O cuando los esquemas de las tablas no son iguales.) [email protected] 292 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

INSERT INTO phone_book2 ([name], [phoneNumber]) SELECT [name], [phoneNumber] FROM phone_book WHERE name IN (’John Doe’,’Peter Doe’);

El SELECT produce una tabla (temporal), y el esquema de la tabla tem- poral debe coincidir con el esquema de la tabla donde los datos son insertados.

UPDATE (Actualizar) una sentencia UPDATE de SQL es utilizada para modi…car los valores de un conjunto de registros existentes en una tabla. Ejemplo:

UPDATE My_table SET …eld1 = ’updated value’WHERE …eld2 = ’N’;

DELETE (Borrar) una sentencia DELETE de SQL borra uno o más registros existentes en una tabla. Forma básica: DELETE FROM tabla WHERE columna1 = ’valor1’; Ejemplo:

DELETE FROM mi_tabla WHERE columna2 = ’N’;

Recuperación de clave los diseñadores de base de datos que usan una clave suplente como la clave principal para cada tabla, se ejecutará en el escenario ocasional en el que es necesario recuperar automáticamente la base de datos, generando una clave primaria de una sentencia SQL INSERT para su uso en otras sentencias SQL. La mayoría de los sistemas no permiten sentencias SQL INSERT para retornar …la de datos. Por lo tanto, se hace necesario aplicar una solución en tales escenarios. Implementaciones comunes incluyen:

Utilizando un procedimiento almacenado especí…co de base de datos  que genera la clave suplente, realice la operación INSERT y …nalmente devuelve la clave generada. Utilizando una sentencia SELECT especi…ca de base de datos, sobre  una tabla temporal que contiene la última …la insertada. DB2 imple- menta esta característica de la siguiente manera: [email protected] 293 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

SELECT * FROM NEW TABLE ( INSERT INTO phone_book VALUES (’Cristobal Jeldrez’,’0426.817.10.30’) ) AS t

Utilizando una sentencia SELECT después de la sentencia INSERT  con función especí…ca de base de datos, que devuelve la clave primaria generada por el registro insertado más recientemente.

Utilizando una combinación única de elementos del original SQL IN-  SERT en una sentencia posterior SELECT.

Utilizando un GUID en la sentencia SQL INSERT y la recupera en una  sentencia SELECT.

Utilizando la función de PHP mysql_insert_id() de MySQL después  de la sentencia INSERT.

Utilizando un INSERT con la cláusula RETURNING para Oracle, que  solo se puede utilizar dentro de un bloque PL/SQL, en el caso de Post- greSQL se puede usar tanto con SQL como con PL/SQL.

INSERT INTO phone_book VALUES (’Cristobal Jeldrez’, ’0426.817.10.30’) RETURNING phone_book_id INTO v_pb_id

En el caso de MS SQL se puede utilizar la siguiente instrucción:  Set NoCount On; INSERT INTO phone_book VALUES (’Cristobal Jeldrez’, ’0426.817.10.30’); Select @@Identity as id

9.3 ¿Qué son las bases de datos NoSQL? A veces llamado "no solo SQL" es una amplia clase de sistemas de gestión de bases de datos que di…eren del modelo clásico de SGBDR (Sistema de Gestión de Bases de Datos Relacionales) en aspectos importantes, siendo el más destacado que no usan SQL como lenguaje principal de consultas. Los [email protected] 294 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM datos almacenados no requieren estructuras …jas como tablas, normalmente no soportan operaciones JOIN, ni garantizan completamente ACID (atomi- cidad, consistencia, aislamiento y durabilidad) y habitualmente escalan bien horizontalmente. Los sistemas NoSQL se denominan a veces "no solo SQL" para subrayar el hecho de que también pueden soportar lenguajes de consulta de tipo SQL. Por lo general, los investigadores académicos se re…eren a este tipo de bases de datos como almacenamiento estructurado, término que abarca tam- bién las bases de datos relacionales clásicas. A menudo, las bases de datos NoSQL se clasi…can según su forma de almacenar los datos, y compren- den categorías como clave-valor, las implementaciones de BigTable, bases de datos documentales, y bases de datos orientadas a grafos. Las bases de datos NoSQL son ampliamente reconocidas porque son fá- ciles de desarrollar, por su funcionalidad y el rendimiento a escala. Bas- tantes sistemas NoSQL emplean una arquitectura distribuida, manteniendo los datos de forma redundante en varios servidores, usando frecuentemente una tabla Hash distribuida. De esta forma, el sistema puede realmente es- calar añadiendo más servidores, y el fallo en un servidor puede ser tolerado.

¿Cómo funciona una base de datos NoSQL (no relacionales)? Las bases de datos NoSQL utilizan una variedad de modelos de datos para ac- ceder y administrar datos. Estos tipos de bases de datos están optimizados especí…camente para aplicaciones que requieren grandes volúmenes de datos, baja latencia y modelos de datos ‡exibles, lo que se logra mediante la ‡exibi- lización de algunas de las restricciones de coherencia de datos en otras bases de datos. Considere el ejemplo de modelado del esquema para una base de datos simple de libros:

En una base de datos relacional, un registro de libros a menudo se  enmascara (o "normaliza") y se almacena en tablas separadas, y las relaciones se de…nen mediante restricciones de claves primarias y exter- nas. En este ejemplo, la tabla Libros tiene las columnas ISBN, Título del libro y Número de edición, la tabla Autores tiene las columnas IDAutor y Nombre de autor y, …nalmente, la tabla Autor-ISBN tiene las columnas IDAutor e ISBN. El modelo relacional está diseñado para permitir que la base de datos aplique la integridad referencial entre [email protected] 295 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

tablas en la base de datos, normalizada para reducir la redundancia y, generalmente, está optimizada para el almacenamiento.

En una base de datos NoSQL, el registro de un libro generalmente  se almacena como un documento JSON. Para cada libro, el elemento ISBN, Título del libro, Número de edición, Nombre autor y IDAutor se almacenan como atributos en un solo documento. En este modelo, los datos están optimizados para un desarrollo intuitivo y escalabilidad horizontal.

¿Por qué debería usar una base de datos NoSQL? Las bases de datos NoSQL se adaptan perfectamente a muchas aplicaciones modernas, como dispositivos móviles, Web y juegos, que requieren bases de datos ‡exibles, escalables, de alto rendimiento y altamente funcionales para proporcionar excelentes experiencias de usuario.

Flexibilidad: las bases de datos NoSQL generalmente ofrecen esquemas  ‡exibles que permiten un desarrollo más rápido y más iterativo. El modelo de datos ‡exible hace que las bases de datos NoSQL sean ideales para datos semiestructurados y no estructurados.

Escalabilidad: las bases de datos NoSQL generalmente están diseñadas  para escalar usando clústeres distribuidos de Hardware en lugar de escalar añadiendo servidores caros y sólidos. Algunos proveedores de la nube manejan estas operaciones en segundo plano, como un servicio completamente administrado.

Alto rendimiento: la base de datos NoSQL está optimizada para mo-  delos de datos especí…cos y patrones de acceso que permiten un mayor rendimiento que el intento de lograr una funcionalidad similar con bases de datos relacionales.

Altamente funcional: las bases de datos NoSQL proporcionan APIs  altamente funcionales y tipos de datos que están diseñados especí…ca- mente para cada uno de sus respectivos modelos de datos.

Tipos de bases de datos NoSQL

[email protected] 296 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Clave-valor: las bases de datos clave-valor son altamente divisibles y  permiten escalado horizontal a escalas que otros tipos de bases de datos no pueden alcanzar. Los casos de uso como juegos, tecnología publi- citaria e IoT se prestan particularmente bien con el modelo de datos clave-valor. Amazon DynamoDB está diseñado para proporcionar una latencia de milisegundos constate de un solo dígito para cualquier es- cala de cargas de trabajo. Este rendimiento sistemático es uno de los principales elementos que explican por qué la característica de historias de Snapchat, que incluye la carga de trabajo de escritura de almace- namiento más grande de Snapchat, se trasladó a DynamoDB.

Documentos: en el código de aplicación, los datos se representan a  menudo como un objeto o un documento de tipo JSON porque es un modelo de datos e…ciente e intuitivo para los desarrolladores. Las bases de datos de documentos facilitan a los desarrolladores el almace- namiento y la consulta de datos en una base de datos mediante el uso del mismo formato de modelo de documento que emplean en el código de aplicación. La naturaleza ‡exible, semiestructurada y jerárquica de los documentos y las bases de datos de documentos permiten que evolucionen según las necesidades de las aplicaciones. El modelo de documentos funciona bien con catálogos, per…les de usuario y sistemas de administración de contenido en los que cada documento es único y evoluciona con el tiempo. Amazon DocumentDB (con compatibilidad para MongoDB) y MongoDB son bases de datos de documentos cono- cidas que proporcionan APIs poderosas e intuitivas para un desarrollo ‡exible e iterativo.

Grá…cos: el propósito de una base de datos de grá…cos es facilitar la  creación y la ejecución de aplicaciones que funcionan con conjuntos de datos altamente conectados. Los casos de uso típicos para una base de datos de grá…cos incluyen redes sociales, motores de recomendaciones, detección de fraude y grá…cos de conocimiento. es un servicio de base de datos de grá…cos completamente administrado. Neptune admite tanto el modelo de Property Graph como el Resource Description Framework (RDF), que ofrece la opción de dos API de grá…cos: TinkerPop y RDF/SPARQL. Las bases de datos de grá…cos populares incluyen Neo4j y Giraph.

En memoria: las aplicaciones de juegos y tecnología publicitaria tienen  [email protected] 297 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

casos de uso como tablas de clasi…cación, tiendas de sesión y análisis en tiempo real que requieren tiempos de respuesta de microsegundos y pueden tener grandes picos de trá…co en cualquier momento. Amazon ElastiCache ofrece Memcached y Redis, para servir cargas de trabajo de baja latencia y alto rendimiento, como McDonald’s, en las que no se pueden servirse con almacenes de datos basados en disco. Amazon DynamoDB Accelerator (DAX) es otro ejemplo de un almacén de datos especialmente diseñado. DAX hace que DynamoDB lea una orden de magnitud más rápida.

Buscar: muchas aplicaciones generan registros para ayudar a los de-  sarrolladores a solucionar problemas. Amazon Elasticsearch Service (Amazon ES) está diseñado para proporcionar visualizaciones en tiempo real y análisis de datos generados por máquinas al indexar, agregar y buscar registros y métricas semiestructuradas. Amazon ES también es un poderoso motor de búsqueda de alto rendimiento para casos de uso de búsqueda de texto completo. Expedia está utilizando más de 150 dominios de Amazon ES, 30 TB de datos y 30 mil millones de docu- mentos para una variedad de casos de uso críticos, que van desde el monitoreo operativo y la resolución de problemas, hasta el seguimiento de la pila de aplicaciones distribuidas y la optimización de precios.

9.3.1 SQL en comparación con NoSQL Durante décadas, el modelo de datos predominante utilizado para el desa- rrollo de aplicaciones era el modelo de datos relacional empleado por bases de datos relacionales como Oracle, DB2, SQL Server, MySQL y PostgreSQL. No fue sino hasta mediados y …nales de la década del 2000 que otros modelos de datos comenzaron a adoptarse y aumentó su uso signi…cativamente. Para diferenciar y categorizar estas nuevas clases de bases de datos y modelos de datos, se acuñó el término "NoSQL". Con frecuencia, los términos "NoSQL" y "no relacional" se usan indistintamente.

Cargas de trabajo óptimas las bases de datos relacionales están di- señadas para aplicaciones de procesamiento de transacciones online (OLTP) altamente coherentes y transaccionales, y son buenas para el procesamiento analítico online (OLAP), en cambio las bases de datos NoSQL están dise- ñadas para varios patrones de acceso a datos que incluyen aplicaciones de [email protected] 298 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM baja latencia. Las bases de datos de búsqueda NoSQL están diseñadas para hacer análisis sobre datos semiestructurados.

Modelo de datos el modelo relacional normaliza los datos en tablas conformadas por …las y columnas. Un esquema de…ne estrictamente las tablas, las …las, las columnas, los índices, las relaciones entre las tablas y otros elementos de las bases de datos. La base de datos impone la integri- dad referencial en las relaciones entre tablas, en cambio las bases de datos NoSQL proporcionan una variedad de modelos de datos, como clave-valor, documentos y grá…cos, que están optimizados para el rendimiento y la escala.

Propiedades ACID las bases de datos relacionales ofrecen propiedades de atomicidad, coherencia, aislamiento y durabilidad (ACID): La atomicidad requiere que una transacción se ejecute por completo o  no se ejecute en absoluto. La coherencia requiere que una vez con…rmada una transacción, los  datos deban acoplarse al esquema de la base de datos. El aislamiento requiere que las transacciones simultáneas se ejecuten  por separado. La durabilidad requiere la capacidad de recuperarse de un error ines-  perado del sistema o de un corte de energía y volver al último estado conocido. Las bases de datos NoSQL a menudo hacen concesiones al ‡exibilizar algunas de las propiedades ACID de las bases de datos relacionales para un modelo de datos más ‡exible que puede escalar horizontalmente. Esto hace que las bases de datos NoSQL sean una excelente opción para casos de uso de baja latencia y alto rendimiento que necesitan escalar horizontalmente más allá de las limitaciones de una sola instancia.

Rendimiento en las bases de datos relacionales normalmente, el rendi- miento depende del subsistema de disco. Se necesita la optimización de consultas, índices y estructura de tabla para lograr el máximo rendimiento, en cambio en las bases de datos NoSQL el rendimiento depende del tamaño del clúster de Hardware subyacente, la latencia de red y la aplicación que efectúa la llamada. [email protected] 299 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Escalado las bases de datos relacionales generalmente escalan en forma ascendente las capacidades de computación del Hardware o la ampliación mediante la adición de réplicas para cargas de trabajo de solo lectura, en cambio en las bases de datos NoSQL normalmente se pueden particionar porque los patrones de acceso son escalables mediante el uso de arquitectura distribuida para aumentar el rendimiento que proporciona un rendimiento constante a una escala casi ilimitada.

API en las bases de datos relacionales se solicita almacenar y recuperar datos que están comunicados mediante consultas que se ajustan a un lenguaje de consulta estructurado (SQL). Estas consultas son analizadas y ejecutadas por la base de datos relacional, en cambio en las bases de datos NoSQL las APIs basadas en objetos permiten a los desarrolladores almacenar y recu- perar fácilmente estructuras de datos. Las claves de partición permiten que las aplicaciones busquen pares de clave-valor, conjuntos de columnas o do- cumentos semiestructurados que contengan atributos y objetos de aplicación serializados.

9.3.2 SQL en comparación con Terminología NoSQL La siguiente tabla compara la terminología utilizada por las bases de datos NoSQL seleccionadas con la terminología utilizada por las bases de datos SQL. SQL MongoDB DynamoDB Cassandra Couchbase

Tabla Conjunto Tabla Tabla Bucketdedatos

Fila Documento Elemento Fila Documento

Columna Campo Atributo Columna Campo

Claveprincipal ObjectId Clave principal Clave principal ID del documento

Índice Índice Índicesecundario Índice Índice

Ver Ver Índicesecundarioglobal Vistamaterializada Ver

Tabla u objeto D o cum ento Mapa Mapa Mapa anidado incrustado

Matriz Matriz Lista Lista Lista Un conjunto de Campos formarán un Documento, que en caso de asociarse con otros formará una Colección. Las Bases se Datos estará formada por Colecciones, y a su vez, cada Servidor puede tener tantas bases de datos como el equipo lo permita.

[email protected] 300 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Los tipos de datos soportados son: Numericos:

Double: punto ‡otante de 64 bist.  Decimal: punto ‡otante de 128 bits.  Int: enteros de hasta 32 bits.  Long: enteros de hasta 64 bits.  Texto:

String: Cadenas UTF-8.  Regex: Almacena expresiones regulares.  Fecha:

Date: entero de 64 bits representa en número de milisegundos desde el  primero de enero de 1970.

Timestamp: entero de 64 bits, en el que los primeros 32 bits representan  los segundos pasados desde el primero de enero de 1970 y los otros 32 bits son ordinales incrementales.

Especiales:

Array: almacena un conjunto de elementos de cualquier tipo.  Objectld: tipo de dato único, principalmente utilizados para da valor  al campo _id de los documentos.

Javascript: código de Javascript  Null: valor nulo  Boolean: valor booleano. 

[email protected] 301 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Consulta y modi…cación de datos Los datos pueden ser accedidos me- diante operaciones CRUD (Create, Read, Update, Delete), la ejecucuón de cualquiera de estas instrucciones sigue el siguiente esquema:

db..()

Operaciones:

Find: lectura (Read) de datos  Insert: escritura (Create) de datos  Update: actualización de valores de datos  Remove: borrado (Delete) de datos  A modo de ejemplo utilizaremos un JSON como el que se usa en mongoDB. Supongamos que vamos a registrar diferentes personas en una colección perteneciente a una BBDD NoSQL con algunos campos especiales. Estos no necesariamente tienen que seguir un patrón especí…co como veremos a continuación:

item1 = { Nombre: "Luís", Apellidos: "Martinez", Edad: 18, A…ciones: ["fútbol","senderismo","tenis"], Amigos: [ { Nombre:"Monica", Edad:20 }, { Nombre:"Andrés", Edad:24 } ] } db.hi.insert(item1) db.amigos.…nd().pretty() [email protected] 302 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Ahora bien, si queremos añadir otros datos con algunas características diferentes la podemos hacer sin mayor problema introduciendo lo siguiente:

item2 = { Nombre: "Luís", Apellidos: "Martinez", Edad: 18, } db.hi.insert(item2) db.amigos.…nd().pretty()

En un modelo relacional o SQL clásico esto sería imposible de hacer. Esta es una de las tantas ventajas que hemos comentado

Operación Find ejemplo del comando Find, para encontrar a alguien de nombre Luis:

db.amigos.…nd({Nombre:"Luís"}])

ejemplo del comando Find, para encontrar a alguien de nombre Luis y apellidos Martinez:

db.amigos.…nd({$and:[{Nombre:"Luís"},{Apellidos:"Martinez"}]}])

ejemplo del comando Find, para encontrar a alguien de nombre Luis y apellidos Martinez o edad mayor a 18:

db.amigos.…nd({ $or:[ {$and:[{Nombre:"Luís"},{Apellidos:"Martinez"}]}, {Edad:{gte:18}} ] })

ejemplo en el que el campo Amigos exista:

db.amigos.…nd({Amigos:{$exists:true}}])

[email protected] 303 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Lista de comando ejecutables contra la base de datos:

db.adminCommand(nameOrDocument) - switches to ’admin’ db, and runs command [ just calls db.runCommand(...) ] db.auth(username, password) db.cloneDatabase(fromhost) db.commandHelp(name) returns the help for the command db.copyDatabase(fromdb, todb, fromhost) db.createCollection(name, { size : ..., capped : ..., : ... } ) db.createUser(userDocument) db.currentOp() displays currently executing operations in the db db.dropDatabase() db.fsyncLock() ‡ush data to disk and lock server for backups db.fsyncUnlock() unlocks server following a db.fsyncLock() db.getCollection(cname) same as db[’cname’]or db.cname db.getCollectionInfos([…lter]) - returns a list that contains the names and options of the db’scollections db.getCollectionNames() db.getLastError() - just returns the err msg string db.getLastErrorObj() - return full status object db.getLogComponents() db.getMongo() get the server connection object db.getMongo().setSlaveOk() allow queries on a replication slave server db.getName() db.getPrevError() db.getPro…lingStatus() - returns if pro…ling is on and slow threshold db.getReplicationInfo() db.getSiblingDB(name) get the db at the same server as this one db.getWriteConcern() - returns the write concern used for any operations on this db, inherited from server object if set db.hostInfo() get details about the server’shost db.isMaster() check replica primary status db.killOp(opid) kills the current operation in the db [email protected] 304 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

db.listCommands() lists all the db commands db.loadServerScripts() loads all the scripts in db.system.js db.logout() db.printCollectionStats() db.printReplicationInfo() db.printShardingStatus() db.printSlaveReplicationInfo() db.dropUser(username) db.repairDatabase() db.resetError() db.runCommand(cmdObj) run a database command. if cm- dObj is a string, turns it into { cmdObj : 1 } db.serverStatus() db.setLogLevel(level,) db.setPro…lingLevel(level,) 0=o¤ 1=slow 2=all db.setWriteConcern( ) - sets the write concern for writes to the db db.unsetWriteConcern( ) - unsets the write concern for writes to the db db.setVerboseShell(‡ag) display extra information in shell out- put db.shutdownServer() db.stats() db.version() current version of the server

9.4 Programando en Diferentes Manejadores de Bases de Datos Existen diferentes paquetes para que permiten trabajar con bases de datos, en esta sección mostraremos como trabajar con algunos de ellos:

MySQL/MariaDB  PostgreSQL  Sqlite  MongoDB  [email protected] 305 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

A continuación, mostraremos el mismo ejemplo en cada uno de estos manejadores:

9.4.1 MySQL y MariaDB MySQL/MariaDB es un sistema de administración de bases de datos (Data- base Management System, DBMS) para bases de datos relacionales. Así, estos manejadores de bases de datos, no son más que una aplicación que permite gestionar archivos llamados de bases de datos. Existen muchos tipos de bases de datos, desde un simple archivo hasta sistemas relacionales orientados a objetos. MySQL/mariaDB, como base de datos relacional, utiliza multiples tablas para almacenar y organizar la información. MySQL/MariaDB fue escrito en C y C++ y destaca por su gran adaptación a diferentes entornos de desarrollo, permitiendo su interactuación con los lenguajes de programación más utilizados como PHP, Perl y Java y su integración en distintos sistemas operativos. También es muy destacable, la condición de open source de MySQL/MariaDB, que hace que su utilización sea gratuita e incluso se pueda modi…car con total libertad, pudiendo descargar su código fuente. Esto ha favorecido muy posi- tivamente en su desarrollo y continuas actualizaciones, para hacer de MySQL una de las herramientas más utilizadas por los programadores orientados a Internet.

MariaDB este sistema de gestión de base de datos es una bifurcación de MySQL, aunque parecidos, estos dos sistemas de gestión de bases de datos siguen siendo bastante diferentes:

MariaDB tiene licencia GPL mientras que MySQL tiene un enfoque  de doble licencia

Cada mango se acumula de una manera diferente  MariaDB soporta muchos motores de almacenamiento diferente  En muchos escenarios, MariaDB ofrece un mejor rendimiento  Instalación en Debian GNU/Linux En este caso tenemos dos opciones, instalar MariaDB que ya es parte integral de multiples aplicaciones dentro de GNU/Linux o usar MySQL, en cada caso el uso es prácticamente el mismo. [email protected] 306 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Para instalar el paquete MariaDB usamos:

# apt install mariadb-server

y para con…gurarlo, usamos:

# mysql > use mysql > update user set plugin=”where user=’root’; > alter user root@localhost identi…ed by ’XXXXXXX’; > ‡ush privilegies; > exit

y para usarlo

$ mysql -u root -p

Para instalar el paquete MySQL usamos:

# apt install mysql-common mysql-client mysql-server mytop mysql-admin

y para con…gurarlo, usamos:

# mysql_secure_installation

o

# mysql

en caso de no crear contraseña, podemos ingresar así:

$ mysql -u root -p

una vez en la consola del cliente de MySQL creamos un nuevo usuario

> create user nombre identi…ed by ’XXXXX’;

y a continuación le damos privilegios totales [email protected] 307 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

> gran all privileges on *.* to nombre with grant option; > ‡ush privileges; > exit;

si requerimos las pruebas de e…ciencia, podemos instalar:

# apt install ferret mysql-workbench mysql-workbench-data mycli

además podemos instalar la interface para PHP, mediante:

# apt install php libapache2-mod-php php-mysql php-gd ph- pmyadmin

Ejemplo de uso Una vez que hemos ingresado al sistema de base de datos con nuestro usuario, entonces podemos pedirle al sistema que nos muestre las bases de datos existentes:

show

si necesitamos crear una, por ejemplo prueba, usamos:

create databases prueba

ahora, le indicamos que usaremos dicha base de datos, mediante:

use prueba

y ahors podremos, por ejemplo ver las tablas creadas usando:

show tables

y estamos en posibilidad de crear nuestras tablas, por ejemplo:

create table Productos( id_prod int, descripcion text, precio ‡oat(9,2), precioVenta ‡oat(9,2) ); [email protected] 308 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

e ingresamos valores:

insert into Productos values (1, ’Cigarros’,25.5, 30.0), (2, ’Refresco’,4.5, 6.0);

y los visualizamos:

select * from Productos;

ahora procedemos hacer lo pertinente para nuestra otra tabla, usando:

create table Ventas( id_prod int, cantidad int, fecha timestamp ); insert into Ventas values (1, 2, ’2020/12/01 8:01:00’), (2, 5, ’2020/12/01 10:15:00’), (2, 4, ’2020/12/01 13:34:00’), (1, 3, ’2020/12/01 21:56:00’); select * from Ventas;

de esta forma, ahora podemos usar SELECT para hacer un JOIN de nuestras tablas y mostrar el resultado de la solicitud, mediante:

Select Ventas.fecha, Ventas.cantidad, Productos.descripcion, Productos.precioVenta, (Ventas.cantidad * Productos.precioVenta) From Ventas INNER JOIN Productos ON Ventas.id_prod=Productos.id_prod;

9.4.2 PostgreSQL Las bases de datos relacionales son uno de los tipos más populares que existen, y su uso nos permite crear sitios web de toda clase. Entre los sistemas de bases de datos relacionales más utilizados se encuentra uno que es conocido como PostgreSQL, que dicho sea de paso está entre los más usados a nivel mundial. PostgreSQL, o simplemente Postgres para darle un nombre más pin- toresco, es un sistema de código abierto de administración de bases de datos del tipo relacional, aunque también es posible ejecutar consultas que sean [email protected] 309 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM no relaciones. En este sistema, las consultas relacionales se basan en SQL, mientras que las no relacionales hacen uso de JSON. Como decíamos, se trata de un sistema de código abierto y además gra- tuito, y su desarrollo es llevado adelante por una gran comunidad de colabo- radores de todo el mundo que día a día ponen su granito de arena para hacer de este sistema una de las opciones más sólidas a nivel de bases de datos. Dos detalles a destacar de PostgreSQL es que posee data types (tipos de datos) avanzados y permite ejecutar optimizaciones de rendimiento avan- zadas, que son características que por lo general solo se ven en sistemas de bases de datos comerciales, como por ejemplo SQL Server de Microsoft u Oracle de la compañía homónima.

Instalación en Debian GNU/Linux Para instalar el paquete usamos:

# apt install postgresql postgresql-client postgresql-doc postgresql- contrib

y ya podemos conectarnos al servidor mediante:

# postgres psql

Ejemplo de uso Una vez que hemos ingresado al sistema de base de datos con nuestro usuario, entonces podemos pedirle al sistema que nos muestre las bases de datos existentes:

l n si necesitamos crear una, por ejemplo prueba, usamos:

create databases prueba

ahora, le indicamos que usaremos dicha base de datos, mediante:

c prueba n y ahors podremos, por ejemplo ver las tablas creadas usando:

d n [email protected] 310 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

y estamos en posibilidad de crear nuestras tablas, por ejemplo:

create table Productos( id_prod int, descripcion text not null, precio money, precioVenta money, primary key (id_prod) );

e ingresamos valores:

insert into Productos values (1, ’Cigarros’,25.5, 30.0), (2, ’Refresco’,4.5, 6.0);

y los visualizamos:

select * from Productos;

ahora procedemos hacer lo pertinente para nuestra otra tabla, usando:

create table Ventas( id_prod int, cantidad int, fecha timestamp ); insert into Ventas values (1, 2, ’12/01/2020 8:01:00.00’), (2, 5, ’12/01/2020 10:15:00.00’), (2, 4, ’12/01/2020 13:34:00.00’), (1, 3, ’12/01/2020 21:56:00.00’); select * from Ventas;

de esta forma, ahora podemos usar SELECT para hacer un JOIN de nuestras tablas y mostrar el resultado de la solicitud, mediante:

select Ventas.fecha, Ventas.cantidad, Productos.descripcion, Productos.precioVenta, (Ventas.cantidad * Productos.precioVenta) from Ventas INNER JOIN Productos ON Ventas.id_prod=Productos.id_prod; [email protected] 311 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

9.4.3 SQLite es una herramienta de software libre, que permite almacenar información en dispositivos empotrados de una forma sencilla, e…caz, potente, rápida y en equipos con pocas capacidades de hardware, como puede ser una PDA o un teléfono celular. SQLite implementa el estándar SQL92 y también agrega extensiones que facilitan su uso en cualquier ambiente de desarrollo. Esto permite que SQLite soporte desde las consultas más básicas hasta las más complejas del lenguaje SQL, y lo más importante es que se puede usar tanto en dispositivos móviles como en sistemas de escritorio, sin necesidad de re- alizar procesos complejos de importación y exportación de datos, ya que existe compatibilidad al 100% entre las diversas plataformas disponibles, ha- ciendo que la portabilidad entre dispositivos y plataformas sea transparente.

Lenguajes de Programación de SQLite gracias a que SQLite es software libre, es posible encontrar una gran cantidad de componentes, li- brerías y drivers para interactuar con SQLite desde una gran diversidad de lenguajes y plataformas de programación. Ya sea que estemos utilizando lenguajes modernos como Java, Perl, Python, PHP, Ruby, C#, lenguajes más antiguos como Pascal, SmallTalk, Clipper, o lenguajes poco conocidos como Suneido, REXX, S-Lang, para todos podemos encontrar librerías y ejemplos de código para SQLite. http://www.sqlite.org/cvstrac/wiki?p=SqliteWrappers ofrece más infor- mación sobre "wrappers" para SQLite sobre diferentes plataformas y lengua- jes.

Instalación en Debian GNU/Linux Para instalar el paquete usamos:

# apt install pgcli sqlite3 sqlite3-doc sqlitebrowser

y ya podemos iniciar a trabajar, usando

# sqlite3

Ejemplo de uso Una vez que hemos ingresado al sistema de base de datos con nuestro usuario, entonces podemos pedirle al sistema que cree o abra una base de datos:

sqlite3 prueba.db [email protected] 312 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

y estamos en posibilidad de crear nuestras tablas, por ejemplo:

create table Productos( id_prod int, descripcion text, precio ‡oat(9,2), precioVenta ‡oat(9,2) );

e ingresamos valores:

insert into Productos values (1, ’Cigarros’,25.5, 30.0), (2, ’Refresco’,4.5, 6.0);

y los visualizamos:

select * from Productos;

ahora procedemos hacer lo pertinente para nuestra otra tabla, usando:

create table Ventas( id_prod int, cantidad int, fecha timestamp ); insert into Ventas values (1, 2, ’2020/12/01 8:01:00’), (2, 5, ’2020/12/01 10:15:00’), (2, 4, ’2020/12/01 13:34:00’), (1, 3, ’2020/12/01 21:56:00’); select * from Ventas;

de esta forma, ahora podemos usar SELECT para hacer un JOIN de nuestras tablas y mostrar el resultado de la solicitud, mediante:

select Ventas.fecha, Ventas.cantidad, Productos.descripcion, Productos.precioVenta, (Ventas.cantidad * Productos.precioVenta) from Ventas INNER JOIN Productos ON Ventas.id_prod=Productos.id_prod;

[email protected] 313 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

9.4.4 MongoDB MongoDB (del inglés humongous, "enorme") es un sistema de base de datos NoSQL orientado a documentos de código abierto y escrito en C++, que en lugar de guardar los datos en tablas lo hace en estructuras de datos BSON (similar a JSON) con un esquema dinámico. Al ser un proyecto de código abierto, sus binarios están disponibles para los sistemas operativos Windows, GNU/Linux, OS X y Solaris y es usado en múltiples proyectos o implementa- ciones en empresas como MTV Network, Craigslist, BCI o Foursquare. La razón de esto es que MongoDB, al estar escrito en C++, cuenta con una más que notoria capacidad para aprovechar los recursos de la máquina y, al estar licenciado bajo una licencia GNU AGPL 3.0, es posible adaptarlo a nuestras necesidades. Si no conocemos a MongoDB, al principio puede que nos sientamos un poco perdidos. Al no tener tablas ni nada que se parezca a SQL como referencia, tendremos que estudiar un poco su …losofía y características para entender cómo manejar los datos. Aun así, MongoDB es una seria candidata para almacenar los datos de nuestras aplicaciones.

Características de MongoDB si tuviéramos que resumir a una la principal característica a destacar de MongoDB, sin duda esta sería la ve- locidad, que alcanza un balance perfecto entre rendimiento y funcionalidad gracias a su sistema de consulta de contenidos. Pero sus características prin- cipales no se limitan solo a esto, MongoDB cuenta, además, con otras que lo posicionan como el preferido de muchos desarrolladores. Características principales:

Consultas ad hoc. Con MongoDb podemos realizar todo tipo de con-  sultas. Podemos hacer búsqueda por campos, consultas de rangos y expresiones regulares. Además, estas consultas pueden devolver un campo especí…co del documento, pero también puede ser una función JavaScript de…nida por el usuario.

Indexación. El concepto de índices en MongoDB es similar al empleado  en bases de datos relacionales, con la diferencia de que cualquier campo documentado puede ser indexado y añadir múltiples índices secundar- ios.

[email protected] 314 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Replicación. Del mismo modo, la replicación es un proceso básico en  la gestión de bases de datos. MongoDB soporta el tipo de replicación primario-secundario. De este modo, mientras podemos realizar consul- tas con el primario, el secundario actúa como réplica de datos en solo lectura a modo copia de seguridad con la particularidad de que los no- dos secundarios tienen la habilidad de poder elegir un nuevo primario en caso de que el primario actual deje de responder.

Balanceo de carga. Resulta muy interesante cómo MongoDB puede  escalar la carga de trabajo. MongoDB tiene la capacidad de ejecutarse de manera simultánea en múltiples servidores, ofreciendo un balanceo de carga o servicio de replicación de datos, de modo que podemos mantener el sistema funcionando en caso de un fallo del hardware.

Almacenamiento de archivos. Aprovechando la capacidad de MongoDB  para el balanceo de carga y la replicación de datos, Mongo puede ser utilizado también como un sistema de archivos. Esta funcionalidad, llamada GridFS e incluida en la distribución o…cial, permite manipular archivos y contenido.

Ejecución de JavaScript del lado del servidor. MongoDB tiene la ca-  pacidad de realizar consultas utilizando JavaScript, haciendo que estas sean enviadas directamente a la base de datos para ser ejecutadas.

Instalación en Debian GNU/Linux Para instalar el paquete usamos:

# apt install mongodb mongodb-clients mongodb-server

y ya podemos iniciar su uso mediante:

$ mongo

Ejemplo de uso Una vez que hemos ingresado al sistema de base de datos con nuestro usuario, entonces podemos pedirle al sistema nos muestre las colecciones existentes (bases de datos), mediante:

db

podemos crear una usando: [email protected] 315 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

db.createCollection(prueba)

podemos ver las existentes mediante:

show collections

y le pedimos usar alguna, mediante:

use prueba

y estamos en posibilidad de crear nuestras documentos, por ejemplo:

var miProductos = [ {"_id" : 1, "descripcion" : "Cigarros", "precio" : 25.5, "precioVenta" : 30.0}, {"_id" : 2, "descripcion" : "Refresco", "precio" : 4.5, "precioVenta" : 6.0}, ]; db.Productos.insert(miProductos);

y los visualizamos:

db.Productos.…nd()

ahora procedemos hacer lo pertinente para nuestra otro documento, us- ando:

var miVentas = [ {"_id" : 1, "id_prod" : 1, "Cantidad" : 2, "Fecha" : "2020/12/01 8:01:00"}, {"_id" : 2, "id_prod" : 2, "Cantidad" : 5, "Fecha" : "2020/12/01 10:15:00"}, {"_id" : 3, "id_prod" : 2, "Cantidad" : 4, "Fecha" : "2020/12/01 13:34:00"}, {"_id" : 4, "id_prod" : 1, "Cantidad" : 3, "Fecha" : "2020/12/01 21:56:00"}, ]; db.Ventas.insert(miVentas); db.Ventas.…nd() [email protected] 316 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

de esta forma, ahora podemos usar Find para hacer el equivalente a un JOIN como en los ejemplos anteriores y mostrar el resultado de la solicitud, mediante:

db.Ventas.…nd().forEach( function (object) { var commonInBoth=db.Productos.…ndOne({ "_id": object.id_prod} ); if (commonInBoth != null) { print(object.Fecha, object.Cantidad, common- InBoth.descripcion, commonInBoth.precioVenta, (commonInBoth.precioVenta * object.Cantidad)); } } );

9.5 Programando desde la Web Existen diferentes servicios WEB que permiten editar, compilar y ejecutar código de diversos lenguajes y paquetes desde el navegador, esto en aras de que los estudiantes y profesores que cuenten con algún sistema de acceso a red y un navegador puedan programar en los más diversos lenguajes, IDEs y Terminales sin hacer instalación alguna en su equipo de cómputo, tableta o teléfono celular. Algunos ejemplos de estos servicios son:

9.5.1 MySQL y MariaDB Se puede trabajar este manejador de bases de datos desde la red, ingresando a la dirección: https://www.jdoodle.com/ Por ser un servicio en red, no es necesario conocer que bases de datos hay, ni seleccionar alguna de las existentes para inicar el trabajo en la base de datos. Por lo tanto, sólo creamos las tablas necesarias, agregamos valores y hacemos las operaciones requeridas con la base de datos creada, por ejemplo: Creamos la tabla de Productos e insertamos los valores mediante:

create table Productos( id_prod int, [email protected] 317 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

descripcion text, precio ‡oat(9,2), precioVenta ‡oat(9,2) ); insert into Productos values (1, ’Cigarros’,25.5, 30.0), (2, ’Refresco’,4.5, 6.0); select * from Productos;

ahora, creamos la tabla de ventas e insertamos los valores mediante:

create table Ventas( id_prod int, cantidad int, fecha timestamp ); insert into Ventas values (1, 2, ’2020/12/01 8:01:00’), (2, 5, ’2020/12/01 10:15:00’), (2, 4, ’2020/12/01 13:34:00’), (1, 3, ’2020/12/01 21:56:00’); select * from Ventas;

de esta forma, ahora podemos usar SELECT para hacer un JOIN de nuestras tablas y mostrar el resultado de la solicitud, mediante:

select Ventas.fecha, Ventas.cantidad, Productos.descripcion, Productos.precioVenta, (Ventas.cantidad * Productos.precioVenta) from Ventas INNER JOIN Productos ON Ventas.id_prod=Productos.id_prod;

9.5.2 PostgreSQL Se puede trabajar este manejador de bases de datos desde la red, ingresando a la dirección: https://rextester.com/l/postgresql_online_compiler Por ser un servicio en red, no es necesario conocer que bases de datos hay, ni seleccionar alguna de las existentes para inicar el trabajo en la base de datos. Por lo tanto, sólo creamos las tablas necesarias, agregamos valores y hacemos las operaciones requeridas con la base de datos creada, por ejemplo: Creamos la tabla de Productos e insertamos los valores mediante:

[email protected] 318 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

create table Productos( id_prod int, descripcion text not null, precio money, precioVenta money, primary key (id_prod) ); insert into Productos values (1, ’Cigarros’,25.5, 30.0), (2, ’Refresco’,4.5, 6.0); select * from Productos; ahora, creamos la tabla de ventas e insertamos los valores mediante: create table Ventas( id_prod int, cantidad int, fecha timestamp ); insert into Ventas values (1, 2, ’12/01/2020 8:01:00.00’), (2, 5, ’12/01/2020 10:15:00.00’), (2, 4, ’12/01/2020 13:34:00.00’), (1, 3, ’12/01/2020 21:56:00.00’); select * from Ventas; de esta forma, ahora podemos usar SELECT para hacer un JOIN de nuestras tablas y mostrar el resultado de la solicitud, mediante: select Ventas.fecha, Ventas.cantidad, Productos.descripcion, Productos.precioVenta, (Ventas.cantidad * Productos.precioVenta) from Ventas INNER JOIN Productos ON Ventas.id_prod=Productos.id_prod;

9.5.3 SQLite Se puede trabajar este manejador de bases de datos desde la red, ingresando a la dirección: https://www.codechef.com/ide Por ser un servicio en red, no es necesario conocer que bases de datos hay, ni seleccionar alguna de las existentes para inicar el trabajo en la base de datos. Por lo tanto, sólo creamos las tablas necesarias, agregamos valores y hacemos las operaciones requeridas con la base de datos creada, por ejemplo: Creamos la tabla de Productos e insertamos los valores mediante: [email protected] 319 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

create table Productos( id_prod int, descripcion text, precio ‡oat(9,2), precioVenta ‡oat(9,2) ); insert into Productos values (1, ’Cigarros’,25.5, 30.0), (2, ’Refresco’,4.5, 6.0); select * from Productos; ahora, creamos la tabla de ventas e insertamos los valores mediante: create table Ventas( id_prod int, cantidad int, fecha timestamp ); insert into Ventas values (1, 2, ’2020/12/01 8:01:00’), (2, 5, ’2020/12/01 10:15:00’), (2, 4, ’2020/12/01 13:34:00’), (1, 3, ’2020/12/01 21:56:00’); select * from Ventas; de esta forma, ahora podemos usar SELECT para hacer un JOIN de nuestras tablas y mostrar el resultado de la solicitud, mediante: select Ventas.fecha, Ventas.cantidad, Productos.descripcion, Productos.precioVenta, (Ventas.cantidad * Productos.precioVenta) from Ventas INNER JOIN Productos ON Ventas.id_prod=Productos.id_prod;

9.5.4 MongoDB Se puede trabajar este manejador de bases de datos desde la red, ingresando a la dirección: https://www.jdoodle.com/online-mongodb-terminal/ Por ser un servicio en red, no es necesario conocer que bases de datos hay, ni seleccionar alguna de las existentes para inicar el trabajo en la base de datos. Por lo tanto, sólo creamos las colecciones necesarias, agregamos valores y hacemos las operaciones requeridas con la base de datos creada, por ejemplo: Creamos el document de Productos e insertamos los valores mediante: [email protected] 320 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

var miProductos = [ {"_id" : 1, "descripcion" : "Cigarros", "precio" : 25.5, "precioVenta" : 30.0}, {"_id" : 2, "descripcion" : "Refresco", "precio" : 4.5, "precioVenta" : 6.0}, ]; db.Productos.insert(miProductos); db.Productos.…nd()

ahora, creamos documento de ventas e insertamos los valores mediante:

var miVentas = [ {"_id" : 1, "id_prod" : 1, "Cantidad" : 2, "Fecha" : "2020/12/01 8:01:00"}, {"_id" : 2, "id_prod" : 2, "Cantidad" : 5, "Fecha" : "2020/12/01 10:15:00"}, {"_id" : 3, "id_prod" : 2, "Cantidad" : 4, "Fecha" : "2020/12/01 13:34:00"}, {"_id" : 4, "id_prod" : 1, "Cantidad" : 3, "Fecha" : "2020/12/01 21:56:00"}, ]; db.Ventas.insert(miVentas); db.Ventas.…nd()

de esta forma, ahora podemos usar Find para hacer el equivalente a un JOIN como en los ejemplos anteriores y mostrar el resultado de la solicitud, mediante:

db.Ventas.…nd().forEach( function (object) { var commonInBoth=db.Productos.…ndOne({ "_id": object.id_prod} ); if (commonInBoth != null) { print(object.Fecha, object.Cantidad, common- InBoth.descripcion, commonInBoth.precioVenta, (commonInBoth.precioVenta * object.Cantidad)); [email protected] 321 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

} } );

[email protected] 322 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

10 Otros Programas de Cómputo

Existe una gran variedad de programas de cómputo que son usados en los cursos de la Facultad de Ciencias, algunos de ellos los podemos agrupar en:

Otros Programas Matemáticos  Programas de Visualización y Gra…cación  Programas de Navegación en la Web  Compresores y Descompresores de Archivos  Virtualización  10.1 Otros Programas Matemáticos Existe una gran variedad de programas matemáticos disponibles para usua- rios ocasionales y avanzados. Entre los que se destacan:

Xabacus  Euler  Geogebra  Gretl  Lybniz  Mathomatic  Pari/GP  qliss3d  RKWard  XaoS   BLISS  [email protected] 323 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Mumpstest test  nauty  Netgen  Eukleides  Genius  PSPP  Pdl  Yorick  Gnuplot  FreeMat  mathomatic-primes  OpenAxiom  Julia  SageMath  10.2 Programas de Visualización y Gra…cación Existe una gran variedad de programas de visualización y gra…cación disponi- bles para usuarios ocasionales y avanzados. Entre los que se destacan tene- mos:

Cabri-Geometer  GeoGebra  Sketchpad  Cindirella  RyC  [email protected] 324 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Geup  GlassFish  NetLogo  Gpaint  GIMP  Inkscape  Umbrello  ImageMagick  Dia  X…g  Scribus  Blender    Kazam  Pinta   Pencil2D  Graphviz  TextDraw  Calligra  feh  [email protected] 325 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

10.3 Navegadores Web Existe una gran variedad de programas para navegar en la Web65, entre los que se destacan tenemos:

Chromium  Firefox  Chimera   Dillo  Edbrowse  Epiphany-browser  Iceweasel    Netrik  NetSurf  netsurf-fb  netsurf-gtk  Surf   65 Cuando se trabaja desde la Web es recomendable usar el modo Privado o Incógnito para no guardar el historial de navegación, información introducida en los formularios y borrar al cerrar el navegador los datos de los sitios visitados. Pero recuerda que los sitios Web que visitamos sí guardan información de nuestra visita, nuestro proveedor de internet también guarda constancia de nuestra visita y si descargamos algo, esto no se borra al igual que el historial de descargas, además de las marcas de páginas o favoritos se conservarán al cerrar el navegador. [email protected] 326 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Firefox-ESR  QupZilla  Arora  Hv3  Tor66  10.4 Compresores y Descompresores de Archivos Existe una gran variedad de programas para comprimir y descomprimir archivos, entre los que se destacan:

 unzip  zip  pbzip2   lbzip2    unrar  lhasa  ncompress  66 Tor es la sigla de The Onion Router (enrutador de cebolla), el cual es un proyecto cuyo objetivo es el desarrollo de una red de comunicaciones distribuida de baja latencia y sobrepuesta a Internet, en la que el encaminamiento de los mensajes intercambiados entre los usuarios no revele su identidad y que además, mantiene la integridad y el secreto de la información que vieja en ella. Se puede descargar el proyecto Tor listo para usar sin requerir instalar nada en el equipo y este se puede descargar de: https://www.torproject.org [email protected] 327 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

p7zip  p7zip-full  p7zip-rar  unace  unace-nonfree  zutils    unp  lzma  xz-utils pxz  pixz kgb  rar  rarcrack  zpaq  bsdtar  dtrx   tar 

[email protected] 328 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

10.5 Virtualización Hoy en día tenemos a nuestra disposición varios manejadores de máquinas virtuales (MV) que nos permiten crear, usar y optimizar máquinas virtuales (véase apéndice 17). Algunos manejadores son los siguientes:

Virtualbox: Software desarrollado por Oracle. Se trata de un Software  multiplataforma capaz de virtualizar prácticamente la totalidad de sis- temas operativos con arquitectura x86/amd64. Es la máquina virtual multiplataforma, la base de este Software dispone de una la licencia GPL2 (véase apéndice 14.1.1), mientras que el de extensiones que añaden funcionalidades estan bajo licencia privativa. Virtualbox es gratuito para un uso no comercial.

Vmware Workstation Player: Software privativo multiplataforma de-  sarrollado por EMC corporation, es utilizado ampliamente en el entorno profesional en las áreas del entre muchas otras. Al igual que Virtualbox, esta máquina virtual nos permite virtualizar una gran diversidad de sistemas operativos. Vmware dispone de muchas soluciones de virtualización y prácticamente todas son de pago, no obs- tante Vmware Workstation Player es totalmente gratuita para un uso no comercial.

Parallels: Aunque se trata de una máquina virtual multiplataforma,  es usada frecuentemente por los usuarios del sistema operativo OS X de Apple que desean virtualizar el sistema operativo Windows. Esta máquina virtual es de pago y únicamente puede virtualizar los sistemas operativos Windows y Mac OS.

Windows Virtual PC: Software gratuito y privativo propiedad de Mi-  crosoft que se puede usar tanto en Windows como en Mac OS. Virtual PC esta destinado únicamente a Virtualizar sistemas operativos Win- dows.

QEMU/KVM: Software libre multiplataforma que dispone de licen-  cia GPL (véase apéndice 14.1.1). QEMU permite virtualizar un gran número de sistemas operativos y además soporta varios tipos de arqui- tectura como por ejemplo X86, x86-64, MIPS, Arm, PowerPC, etc. El rendimiento que ofrece QEMU es igual o superior a las opciones que hemos mencionado con anterioridad. Una gran ventaja de QEMU que [email protected] 329 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

permite usar una máquina virtual sin necesidad de tener privilegios root.

10.6 Desde la Nube Existen diferentes servicios Web67 que permiten editar, compilar y ejecutar código de diversos lenguajes y paquetes desde el navegador, esto en aras de que los estudiantes y profesores que cuenten con algún sistema de acceso a red y un navegador puedan programar en diversos lenguajes, IDEs y Terminales sin hacer instalación alguna en su equipo de cómputo, tableta o teléfono celular. Algunos ejemplos de estos servicios son:

https://www.rollapp.com/apps/data%20analysis  https://www.rollapp.com/apps/development  https://www.rollapp.com/apps/graphics  https://www.rollapp.com/apps/o¢ ce  https://www.rollapp.com/apps/utilities  https://www.rollapp.com/apps/education 

67 Cuando se trabaja desde la Web es recomendable usar el modo Privado o Incógnito para no guardar el historial de navegación, información introducida en los formularios y borrar al cerrar el navegador los datos de los sitios visitados. Pero recuerda que los sitios Web que visitamos sí guardan información de nuestra visita, nuestro proveedor de Internet también guarda constancia de nuestra visita y si descargamos algo, esto no se borra al igual que el historial de descargas, además de las marcas de páginas o favoritos se conservarán al cerrar el navegador. [email protected] 330 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

11 Seguridad, Privacidad y Vigilancia

Ante el constante aumento -explosivo- en el uso de dispositivos conectados a internet como computadoras personales, Laptops, tabletas y teléfonos celu- lares, expertos en ciberseguridad advierten un entorno propicio para que prosperen los cibercriminales y que, tanto individuos como empresas, se en- cuentren expuestos a múltiples amenazas de ciberseguridad. En la actualidad, aproximadamente la mitad de la población mundial accede de algún modo a internet. Con tantos accesos concurrentes a la red de redes, la posible amenaza de seguridad a los sistemas informáticos crece y se complejiza, a pesar de las diversas y especializadas maneras de contra- rrestarlas. Por su propia naturaleza, una conexión a internet hace que tu equipo de cómputo quede expuesto a ataques y pueda ser accesible por otro equipo, llegando a tener acceso a tu información.

¿Por qué?

En muchas ocasiones, los usuarios no cuentan con la su…ciente sensibi-  lización sobre su exposición al riesgo, o bien, no están familiarizados con las herramientas y/o capacitación de sus organizaciones para prevenir y enfrentar amenazas de ciberseguridad.

Los usuarios de internet a menudo utilizan redes Wi-Fi no seguras y  usan dispositivos que no están con…gurados con los controles de políti- cas de seguridad básicos, lo cual los vuelve excepcionalmente vulnera- bles a ataques cibernéticos.

Es común que los usuarios compartan dispositivos (computadoras, table-  tas, teléfonos) para educación, trabajo y esparcimiento aumentando con ello su exposición a amenazas de ciberseguridad.

Los piratas informáticos eligen como blanco la dependencia, cada vez  mayor, de las personas con respecto a las herramientas digitales, además de que más tiempo en línea incrementa la potencial exposición de los usuarios a amenazas de ciberseguridad.

Los piratas informáticos son extremadamente creativos al idear for-  mas de aprovecharse de los usuarios y de la tecnología para acceder a contraseñas, redes y datos, a menudo sirviéndose de herramientas de [email protected] 331 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

ingeniería social y de temas y tendencias populares para tentar a los usuarios a tener comportamientos inseguros en línea. Todo lo anterior, ha creado una enorme super…cie de exposición a ataques cibernéticos dirigidos a los usuarios, la red, la computadora portátil, el telé- fono inteligente, la tableta, etc. con la intención de cometer delitos informáti- cos. Por ello estos lineamientos generales de ciberseguridad son sugeridos para el uso seguro de redes y dispositivos de telecomunicaciones en apoyo al usuario, contiene recomendaciones sencillas y prácticas para fomentar una buena salud cibernética de los dispositivos utilizados para el trabajo a distan- cia, educación y diversión; y promover la ciberseguridad entre las personas y sus organizaciones. La seguridad de la información en la red es más que un problema de protección de datos, y debe estar básicamente orientada en asegurar la in- formación importante de las personas, de las organizaciones y la propiedad intelectual. Los riesgos de la información están presentes cuando con‡uyen fundamentalmente dos elementos: las amenazas de ataques, y las vulnera- bilidades de la tecnología; conceptos íntimamente relacionados donde no es posible ninguna consecuencia sin la presencia conjunta de estos.

¿Qué es la privacidad y por qué es importante? Consideramos que la privacidad debería ser un derecho básico y una protección necesaria en la era digital para evitar la victimización y la manipulación. Una sociedad no puede tener libertad sin privacidad. Puede parecer un lujo, pero es im- portante para el bienestar de una sociedad libre y justa. Muchos gobiernos y empleadores hacen vigilancia68 activa a sus ciudadanos o empleados para monitorear ideas, discusiones o disensiones no deseadas. Los infractores son

68 ¿Qué es vigilancia? Vigilancia es el seguimiento de las comunicaciones, acciones o movimientos de una persona por un gobierno, empresa, grupo o persona. ¿Cuándo es legal la vigilancia? En general, cuando es selectiva, se basa en indicios su…cientes de conducta delictiva y está autorizada por una autoridad estrictamente inde- pendiente, como un juez. ¿Qué es la vigilancia masiva? La vigilancia masiva indiscriminada es el control de las comunicaciones por internet y telefónicas de un gran número de personas -a veces de países enteros- sin que existan indicios su…cientes de conducta delictiva. Este tipo de vigilancia no es legal. ¿Qué datos recogen? Algunos gobiernos almacenan y analizan historiales de navegación, búsquedas en internet, mensajes de correo electrónico, mensajes instantáneos, conversa- ciones por Webcam y llamadas telefónicas. También reúnen metadatos -datos sobre datos-, como destinatarios de correo electrónico, horas de llamadas y registros de ubicación. [email protected] 332 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM luego procesados o reeducados para alinearse con lo que las autoridades con- sideran apropiado. Sin el bene…cio del anonimato, el deseo de los ciudadanos de expresar sus pensamientos se reprime efectivamente. En la era digital, la privacidad va más allá del anonimato, al protege a las personas de la victimización y la manipulación. La sociedad ha adop- tado la tecnología para educarse, comunicarse, realizar negocios y formar relaciones. Nuestros puntos de vista y opiniones están fuertemente in‡uen- ciados por lo que aprendemos de las fuentes de noticias locales, nacionales e internacionales. Contribuimos en gran medida al panorama digital a través de nuestras acciones y decisiones. Nuestras huellas digitales están en todas partes. Cuen- tan una historia de a dónde vamos, qué hacemos, quién nos gusta o no, y qué pensamos. Se crean con cada Clic que hacemos y con cada archivo, aplicación y dispositivo que usamos. Cuando esos datos se agregan, pueden proporcionar información tremendamente poderosa sobre una persona o co- munidad, lo su…ciente como para construir personas complejas y precisas. Esta información se usa comúnmente para manipular las creencias y com- portamientos de las personas. Las compras en línea son un ejemplo perfecto: el Marketing dirigido y la publicidad basada en datos es un gran negocio porque logra que la gente gaste dinero. Todo se reduce a saber lo que las personas hacen, piensan, dicen, consumen y miran69. Tener acceso a grandes cantidades de datos privados les brinda a los anunciantes la capacidad de crear mensajes oportunos y signi…cativos que atraigan a las personas a los comportamientos deseados. Pero si los minoristas pueden hacer que las personas compren cosas que no necesitan, ¿para qué más se pueden usar los datos privados? ¿Qué tal cambiar lo que piensa la gente, a quiénes apoyan, sus opiniones políticas, qué

¿Qué hacen con mis datos? Se guardan en grandes centros de datos donde unos al- goritmos informáticos pueden hacer búsquedas en ellos y analizarlos. También están a disposición de las autoridades de las agencias de seguridad a través de potentes bases de datos como XKeyscore. 69 Has notado que si buscas algo en un buscador comercial -como Google, Yahoo, Bing, Ask, Baidu, etc.-, minutos después en tus distintas redes sociales aparecerán mensajes rela- cionados a tu búsqueda. Esto ocurre porque los buscadores comerciales en cada búsqueda que haces, vídeo o anuncios que ves o en los que haces Clic comparten tu ubicación, los sitios que visitas, los dispositivos, navegadores y aplicaciones que usas para acceder a los servicios del buscador con …nes comerciales. Una opción para nuestra privacidad es usar buscadores que no dejan rastro de nuestras búsquedas como puede ser: DuckDuckGo. [email protected] 333 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM debería convertirse en ley y en qué creer? El uso de información privada se ha aprovechado durante mucho tiempo para promover, vilipendiar o perseguir a diversas religiones, partidos políticos y líderes. En las últimas décadas, ha cambiado la forma en que los ciudadanos del mundo reciben sus noticias. Los segmentos de noticias y entretenimiento han comenzado a mezclarse, a menudo informando hechos con adornos e historias obstinadas para in‡uir en las opiniones públicas. Cuanta más información privada se conozca, más fácil será in‡uir, convencer, engatusar o amenazar a las personas. Según informes de Oxford Internet Institute, a pesar de los esfuerzos para combatir la propaganda computacional, el problema ha crecido a gran escala. El mayor crecimiento proviene de propaganda política que es difundida junto con desinformación y noticias basura alrededor de los períodos electorales. Se incrementa el número de campañas políticas a nivel mundial que usan Bots, noticias basura y desinformación para polarizar y manipular a los votantes. Un velo de privacidad puede proteger tanto los bene…cios como los abusos. La tendencia actual es establecer y ampliar los derechos de privacidad en bene…cio de los ciudadanos. Esto reduce la victimización, manipulación y explotación digitales al proteger los datos con…denciales y permite actividades que promueven la libertad y la libertad de expresión. Sin leyes, los gobiernos y las empresas han desarrollado prácticas que aprovechan el poder de recopilar información con…dencial y utilizarla en su propio bene…cio. Las nuevas leyes de privacidad están cambiando el panorama y muchas empresas éticas reducen sus esfuerzos de cobranza para ser más conservadoras y respetuosas. También muestran ‡exibilidad en la forma en que tratan, protegen y comparten dichos datos. Algunos gobiernos y agencias también están reduciendo la recolección, limitando la retención o terminando los programas domésticos que los ciu- dadanos consideran invasivos. Al mismo tiempo, los organismos encargados de hacer cumplir la ley quieren conservar la capacidad para detectar e inves- tigar delitos, para proteger la seguridad de los ciudadanos. También se hace un mal uso de la privacidad. Es la herramienta preferida por quienes cometen delitos y permite que los actos atroces contra otros no se detecten. Puede ocultar actos terribles y permitir una coordinación generalizada entre el fraude, abuso y terror. Se argumenta que las puertas traseras digitales, las claves maestras y los algoritmos de cifrado que obtienen acceso a los sistemas y la información privada ayudarían en la detección legal de actividades delictivas y en las [email protected] 334 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM investigaciones para identi…car a los terroristas. Aunque suena como una gran herramienta contra los delincuentes, es una caja de Pandora. Las puertas traseras y las llaves maestras no limitan el acceso para una investigación especí…ca donde existe una causa probable, sino que permiten una vigilancia generalizada70 y la recolección de datos de toda una población, incluidos los ciudadanos respetuosos de la ley. Esto viola el derecho de las personas a la privacidad y abre la puerta a la manipulación y el enjuiciamiento político. La capacidad de leer cada texto, correo electrónico, mensaje y conversación en línea para "monitorear" a la población crea un camino claro hacia el abuso. El riesgo de control y explotación es real. Incluso para aquellos que no tienen ninguna objeción a que su gobierno tenga acceso, debemos considerar el hecho de que tales puertas traseras y claves maestras serían buscadas por ciberdelincuentes y otros actores del estado-nación. Ningún sistema es infalible. Con el tiempo, los delincuentes encontrarían y utilizarían estas herramientas en detrimento de la comunidad digital mundial. Algunas puertas traseras podrían valer decenas de miles de millones de dólares para el comprador adecuado, ya que podrían desbloquear un poder inimaginable para apoderarse de la riqueza, afectar a la gente, dañar naciones, socavar la independencia y reprimir el pensamiento libre. Proteger la privacidad no se trata de ocultar información. Se trata de la capacidad de liberarse de in‡uencias no deseadas, de la tiranía y de comu-

70 El 5 de junio de 2013, el exanalista de la CIA y de la NSA Edward Snowden decidió revelar la existencia de programas de vigilancia sobre las comunicaciones de millones de ciudadanos de todo el mundo. A través de The Guardian y The Washington Post, supi- mos que, en nombre de la seguridad y sin ningún control judicial, la NSA y el gobierno británico habían rastreado e-mails, llamadas telefónicas y mensajes encriptados. Empresas como Facebook, Google y Microsoft habían sido obligadas a entregar información de sus clientes por órdenes secretas de la NSA. Esta misma agencia grabó, almacenó y analizó los ’metadatos’de las llamadas y de los mensajes de texto enviados en México, Kenia y Filipinas. Incluso llegaron a espiar el móvil de la canciller alemana Angela Merkel. Snowden hizo las …ltraciones a la prensa desde Hong Kong y actualmente vive en Rusia, donde se le concedió asilo. No puede volver a su país porque está acusado de revelar información clasi…cada a personas no autorizadas y de robo de propiedad del gobierno federal. Para unos es un héroe y para otros un traidor, gracias a las revelaciones de Snow- den la opinión pública es más consciente de su derecho a la privacidad y ha reaccionado oponiéndose al espionaje masivo. Aunque queda un largo camino para asegurar que los Gobiernos no invadan la vida privada de las personas, los tribunales han declarado ilegales algunos aspectos de estos programas y las empresas tecnológicas han tenido que posicionarse ante un escándalo capaz de dañar seriamente su reputación. [email protected] 335 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM nicarse con los demás de formas que desafíen el statu quo. La privacidad protege a las personas, pero también los cimientos de una sociedad libre. La privacidad no es un tema fácil y no existe una solución perfecta. Es una situación dinámica y seguirá cambiando con el sentimiento público. Todos quieren cierto nivel de discreción, con…dencialidad y espacio. Nadie quiere que se expongan sus contraseñas, …nanzas familiares, detalles de rela- ciones personales, historial médico, ubicación, compras y discusiones pri- vadas. Las personas tampoco disfrutan de verse inundadas de Spam, Phi- shing y llamadas de ventas incesantes. La privacidad no se trata necesaria- mente de ocultar algo, sino de limitar la información a quienes tienen derecho a saber. Muy poca privacidad puede socavar la libertad de expresión, la libertad y la denuncia de victimizaciones. También empodera a entidades poderosas para manipular el mundo digital de las personas para coaccionarlas, mani- pularlas y victimizarlas. Demasiada privacidad puede permitir que los actores criminales prosperen y se escondan de las autoridades. Debe lograrse un equilibrio71. Algunos gobiernos y empresas tecnológicas quieren que aceptemos que no tenemos derechos cuando estamos en internet. Que cuando usamos el teléfono o entramos en nuestra cuenta de correo electrónico, todo lo que hacemos o decimos les pertenece. No permitiríamos este grado de intrusión en nuestra vida fuera de internet, así que no debemos permitirlo dentro. Cuando los gobiernos no protegen los derechos humanos, sólo la acción de la gente común y corriente puede hacer que las cosas cambien y que los responsables de los abusos rindan cuentas. Muchas organizaciones trabajan para que los gobiernos prohíban la vigilancia masiva y el intercambio ilegal de

71 Los gobiernos nos enfrentan a un dilema falso: seguridad o libertad. En un estado de derecho, donde las leyes equilibran ambos conceptos, las personas son inocentes hasta que se demuestra lo contrario y tienen derecho a que se respete su vida privada. Por tanto, antes de violar estos derechos, los gobiernos deben de tener indicios de que se está cometiendo un delito. No pueden buscar pruebas aleatoriamente en nuestras comunicaciones privadas antes de que se cometa ese delito. Varios países dan "carta blanca" a la vigilancia indiscriminada en sus leyes. En Francia se permite interceptar masivamente comunicaciones, retener información durante largos períodos de tiempo y se ha eliminado la autorización judicial previa. También Reino Unido ha introducido en su legislación mayores poderes de espionaje. Polonia ha otorgado poderes de vigilancia incompatibles con respecto a la privacidad a la policía y a otras agencias. Otros países como o Rusia también vigilan internet con total desprecio a la intimidad de las personas. [email protected] 336 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM información con…dencial. Esta será una larga lucha no exenta de di…cultades, pero cuyo impulso va creciendo con el tiempo. Las amenazas, en un entorno dinámico de interconectividad, pueden venir de cualquier parte, sea interna o externa, e íntimamente relacionada con el entorno de las organizaciones. Las vulnerabilidades son una debilidad en la tecnología o en los procesos asociados con la información, y como tal, se consideran características propias de los sistemas o de la infraestructura que los soporta. Las personas o usuarios de internet que emplean las tecnologías para vulnerar los sistemas en la red, robar información y/o infectarlos con com- portamientos dudosos, son comúnmente conocidos como Hackers. Su forma de actuar, por lo general, determina su clasi…cación en:

Hacker de Sombrero Blanco (White Hat): éticos, expertos en seguridad  informática, especializados en realizar test de intrusión y evaluaciones de seguridad.

Hacker de Sombrero Negro (Black Hat): también conocidos como Crac-  kers, vulneran los sistemas de información con …nes maliciosos.

Hacker de Sombrero Gris (Grey Hat): en ocasiones vulneran la ley, y  de forma general no atacan malintencionadamente o con intereses per- sonales, sino que sus motivaciones se relacionan a protestas o desafíos personales.

Hacker de Sombrero Verde (Green Hat): son novatos que pueden evolu-  cionar y buscan convertirse en expertos.

Hacker de Sombrero Azul (Blue Hat): son personas expertas que se les  paga para probar Software en busca de errores antes de que éste salga al mercado.

Para una entidad, la fuga de información provocada por el actuar de algunos de estos usuarios de la red, puede ocurrir deliberadamente como resultado de una acción intencional de algún empleado descontento, como consecuencia de un ciberataque, o inadvertidamente, por un colaborador des- prevenido víctima de un Software malicioso. Una de las principales amenazas para los dispositivos tecnológicos utiliza- dos para el trabajo y estudio a distancia es el Malware, también conocido [email protected] 337 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM como Software o código malicioso. Éste se de…ne como cualquier programa informático que se coloca de forma oculta en un dispositivo, con la intención de comprometer la con…dencialidad, integridad o disponibilidad de los datos, las aplicaciones o el sistema operativo. Los tipos más comunes de amenazas de Malware incluyen virus, gusanos, troyanos, Rootkits y Spyware. Las amenazas de Malware pueden infectar cualquier dispositivo por medio del correo electrónico, los sitios Web, las descargas y el uso compartido de archivos, el Software punto a punto y la mensajería instantánea. Además, existen amenazas relacionadas con la ingeniería social como el Phishing, Smishing y Vishing, por medio de los cuales los atacantes intentan engañar a las personas para que revelen información con…dencial o realicen ciertas acciones, como descargar y ejecutar archivos que parecen ser benignos, pero que en realidad son maliciosos.

Seguridad TIC La seguridad TIC (Information Technology Security o IT Security) está de actualidad, ya que cualquier profesional o empresa que use las Tecnologías de la Información y de la Comunicación, debe situarse en la vanguardia de la tecnología. Pero, ¿qué signi…ca seguridad TIC?, ¿qué es? La seguridad TIC es la responsable de implantar las medidas de seguridad necesarias para procurar la protección de la información a través de diferentes tipos de tecnología. Así, es capaz de proteger los datos personales y de las empresas, tanto de formatos electrónicos o digitales, como en papel. Seguramente, más de una vez han oído hablar de la palabra ciberseguri- dad como si fuera equivalente de seguridad TIC. Pero nada más de la realidad: la ciberseguridad es un subtipo de la seguridad TIC. De este modo, la ciberseguridad, es la encargada de la protección de los datos de la organización respecto a los posibles ataques que tengan como origen internet. Pero, de todas formas, la información y todos los datos personales y de las empresas, no sólo se enfrentan a problemas de seguridad en internet, sino que también fuera de él. El modelo de defensa debe abarcar:

Políticas, procedimientos y concientización  Seguridad física  Seguridad de perímetro  [email protected] 338 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Seguridad de la red  Seguridad del equipo  Seguridad de las aplicaciones  Seguridad de los datos  Amenazas Físicas y sus Repercusiones para la Seguridad TIC Es- tas, pueden darse por diversos motivos. Así, es posible encontrar las gene- radas por las radiaciones electromagnéticas debidas a un teclado inalámbrico o el mismo acceso libre a la red Wi-Fi. Dentro de estas redes Wi-Fi están los Sni¤ers, que no son más que sistemas que, por decirlo de alguna manera, recopilan cualquier dato que encuentren de los usuarios. Por lo tanto, son ideales para realizar auditorías en las propias redes, para corroborar y veri…car el trá…co de una organización y además, monitorizar el comportamiento que tiene dentro de la propia red y sus movimientos. No obstante, si un Hacker encuentra un acceso, con los Sni¤er, podría apoderarse de todos los datos del usuario y contraseñas, por lo que el sistema no es demasiado adecuado ni …able. Es por ello, que no es recomendable utilizar este sistema en las empresas, ya que puede suponer un grave problema para la seguridad de la información que se esté gestionando de esta manera. Es usual encontrarse Sni¤ers, por ejemplo, en las universidades, con ob- jeto de evitar que se conecten a la red Wi-Fi personas que no sean del propio centro y dañen el sistema. Otra de las amenazas físicas que podemos encontrar y que en realidad, no puede evitarse, es la debida a los accidentes naturales. Como es evidente, se trata de que tenga lugar un accidente natural en el lugar donde se encuentre el Hardware, de manera que se dañe a consecuencia de un incendio, humedad, apagones, etc.

Amenazas Lógicas Este tipo de amenazas, son programas que han sido diseñados explícitamente para dañar el sistema. Básicamente, se aprovechan de cualquier vulnerabilidad, fallo o debilidad que exista en un sistema, para poder atacarlo y, …nalmente, acceder a él. Así, se pueden encontrar dos tipos:

[email protected] 339 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Intencionados: se trata de programas que tienen como objetivo hacer  daño, como por ejemplo los Malware o Software malicioso, los Spyware, Jokes, Virus, Backdoors, Dialers, etc. entre otros.

No intencionados: este tipo, tiene lugar cuando un programador comete  alguna clase de error o fallo en la programación, dando lugar, por ejem- plo a Bugs o Exploits.

Amenazas del Propio Usuario Este punto es el más sensible. Normal- mente, en cualquier empresa, los empleados, o usuarios en sí son los eslabones más débiles en lo que respecta a la seguridad TIC. Esto es, cualquier usuario de una empresa trabaja con datos, indepen- dientemente del permiso que tenga para gestionarlos, editarlos o veri…carlos, pues se trata de una cadena. Así, encontramos usuarios que, por diversos motivos, son la fuente de los principales fallos de seguridad TIC que tienen lugar en una empresa, y son a los que se les suele denominar eslabones débiles. Entonces, es fundamental que sepan la forma en la que hay que proceder, con objeto de poder evitar cualquier tratamiento erróneo de los datos. Este tipo de usuarios suele actuar de dos formas:

Activa: aquí, el usuario causa daño de manera consciente, bien sea  por dañar o por sustraer información o datos especí…cos de la empresa. Como ejemplos, tenemos a los Hackers, antiguos empleados o piratas informáticos.

Pasiva: cuando daña al sistema sin intención de hacerlo, por falta de  formación, conocimiento o por querer acceder a una información a la que no tiene acceso. Por ello, es preciso establecer niveles de permiso para los accesos a los sistemas de gestión documental.

Las Vulnerabilidades y Exposiciones Comunes De manera global, la última década ha sido testigo del cambio de paradigma en que los ata- cantes buscan explotar vulnerabilidades dentro de las organizaciones y las infraestructuras de redes. Con el …n de contrarrestar estos ataques, las políticas de seguridad persiguen constantemente aprender de ellos para estar preparados lo mejor posible, y en este sentido, intentar garantizar con…anza y tranquilidad a los usuarios de la red, sobre el empleo de sus datos, …nanzas y propiedades intelectuales. [email protected] 340 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Los ataques de seguridad vienen en muchas formas y usan varios puntos de entrada. Cada tipo de ataque viene en varios tipos, ya que generalmente hay más de una forma en que se pueden con…gurar o camu‡ar en función de la experiencia, los recursos y la determinación del pirata informático. Las Vulnerabilidades y Exposiciones Comunes (Common Vulnerabilities and Exposures, CVE72) que tienen los distintos sistemas operativos (pro- ductos), es una lista de información registrada sobre vulnerabilidades de seguridad conocidas, en la que cada referencia tiene un número de identi- …cación llamada CVE-ID, descripción de la vulnerabilidad, que versiones del Software están afectadas, posible solución al fallo (si existe) o como con…- gurar para mitigar la vulnerabilidad y referencias a publicaciones o entradas de foros o Blogs donde se ha hecho pública la vulnerabilidad o se demues- tra su explotación. Además suele también mostrarse un enlace directo a la información de la base de datos de vulnerabilidades (https://nvd.nist.gov, https://openssf.org y https://docs.aws.amazon.com/security), en la que pue- den conseguirse más detalles de la vulnerabilidad y su valoración. El mundo está cada vez más interconectado y, como resultado de esto, la exposición a las vulnerabilidades de seguridad también ha aumentado dramáticamente. Las complejidades de mantener las plataformas de cóm- puto actuales hacen que sea muy difícil para los desarrolladores cubrir cada punto de entrada potencial. En 2019 hubo un promedio de más de 45 vul- nerabilidades y exposiciones comunes registradas por día y estas siguen en aumento año con año. El CVE-ID ofrece una nomenclatura estándar para identi…cación de la vulnerabilidad de forma inequívoca que es usada en la mayoría de repositorios de vulnerabilidades. Es de…nido y es mantenido por The MITRE Corporation (por eso a ve- ces a la lista se la conoce por el nombre MITRE CVE List) con fondos de la National Cyber Security Division del gobierno de los Estados Unidos de América. Forma parte del llamado Security Content Automation Protocol.

72 https://www.cvedetails.com/ https://www.cvedetails.com/top-50-products.php https://thebestvpn.com/vulnerability-alerts/ Hay que notar que en la base de datos se diferencian distintos productos de Windows (como Windows 7.0 u 8.1) pero no se hace lo mismo con los demás productos (por ejemplo para Debian GNU/Linux están los errores desde 1999 a la fecha) con lo que es engañosa la comparación del número vulnerabilidades para un sistema operativo con tantas versiones generadas en dicho tiempo con otro con un tiempo de vida corto. [email protected] 341 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Por otro lado, como parte de las amplias revelaciones sobre vigilancia ma- siva …ltradas en 2013, 2014 y años posteriores, se descubrió que las agencias de inteligencia estadounidenses y británicas, la Agencia de Seguridad Nacional (NSA, por sus siglas en inglés) y el Cuartel General de Comunicaciones del Gobierno (GCHQ, por sus siglas en inglés), respectivamente, tienen acceso a los datos de los usuarios de dispositivos Android. Estas agencias son capaces de leer casi toda la información del teléfono como los SMS, geolocalización, correos, notas o mensajes. Documentos …ltrados en enero de 2014, revelaron que las agencias inter- ceptan información personal a través de internet, redes sociales y aplicaciones populares, como Angry Birds, que recopilan información para temas comer- ciales y de publicidad. Además, según The Guardian, el GCHQ tiene una wiki con guías de las diferentes aplicaciones y redes de publicidad para saber los diferentes datos que pueden ser interceptados. Una semana después de salir esta información a la luz, el desarrollador …nlandés Rovio, anunció que estaba reconsiderando sus relaciones con las distintas plataformas publici- tarias y exhortó a la industria en general a hacer lo mismo. Las informaciones revelaron que las agencias realizan un esfuerzo adi- cional para interceptar búsquedas en desde Android y otros teléfonos inteligentes para recopilar ubicaciones de forma masiva. La NSA y el GCHQ insistieron en que estas actividades cumplen con las leyes na- cionales e internacionales, aunque The Guardian a…rmó que «las últimas revelaciones podrían sumarse a la creciente preocupación pública acerca de cómo se acumula y utiliza la información, especialmente para aquellos fuera de Estados Unidos de Norte América, que gozan de menos protección en temas de privacidad que los estadounidenses» .

Formación en Seguridad de la Información Finalmente, los cursos de formación respecto a la seguridad de la información se tornan fundamentales para poder manejarse y recordar cualquier norma que sea imprescindible. Por ejemplo, la gestión segura de las contraseñas, del correo electrónico, la gestión de la documentación, etc. Pero, de todas formas, la información y todos los datos personales y de las empresas, no sólo se enfrentan a problemas de seguridad en internet, sino que también fuera de él. Algunas de estas amenazas, son las que van a desarrollarse en este capítulo, pero si quiere conocer la norma ISO por excelencia para procurar la seguridad de la información en las empresas, le [email protected] 342 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM recomendamos que visite por ejemplo la página sobre la norma ISO 27001 o Cybersecurity Framework.

Alfabetismo Digital Según la organización Common Sense Media, el al- fabetismo digital es la capacidad de encontrar, identi…car, evaluar y usar la información encontrada en medios digitales de manera efectiva. Básica- mente, es la misma de…nición tradicional de alfabetismo, pero adaptada a la era digital y a fuentes no tradicionales de información. El anuario del 2016 de la UNESCO en "Alfabetización mediática e in- formacional para los objetivos de desarrollo sostenible" hace referencia a las "Cinco leyes de la alfabetización mediática e informacional":

1. La información, la comunicación, las bibliotecas, los medios de comu- nicación, la tecnología, el internet y otras fuentes de información se encuentran en la misma categoría. Ninguna es más relevante que la otra ni debe ser tratada como tal. 2. Cada ciudadano es un creador de información o conocimiento y tiene un mensaje. Todas las personas deben estar facultadas para acceder a nueva información y expresarse. 3. La información, el conocimiento y los mensajes no siempre están exen- tos de valores o prejuicios. Cualquier conceptualización, uso y apli- cación de alfabetismo digital debe presentar este hecho de manera transparente y comprensible para todos los ciudadanos. 4. Todo ciudadano desea conocer y comprender información, conocimien- tos y mensajes nuevos, así como comunicarse; y sus derechos nunca deben ser comprometidos. 5. El alfabetismo digital es un proceso dinámico de experiencias vividas. Se considera completa cuando incluye conocimientos, habilidades y ac- titudes, cuando abarca el acceso, la evaluación, el uso, la producción y la comunicación de información, de contenido mediático y tecnológico.

De igual manera, en el anuario de la UNESCO se exponen 10 habilidades que deben desarrollarse para lograr la alfabetización digital, o como lo de…ne el anuario, alfabetización mediática e informacional. Estas habilidades son:

Interactuar con información referente a los medios y la tecnología.  [email protected] 343 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Ser capaz de aplicar habilidades técnicas de comunicación de informa-  ción para procesar la información y producir contenido mediático.

Utilizar, de manera ética y responsable la información y comunicar su  comprensión o conocimiento adquirido a una audiencia o lectores en una forma y medio apropiados.

Extraer y organizar información y contenidos.  Evaluar de forma crítica la información y el contenido presentado en  los medios y otras fuentes de información, incluyendo medios en línea, en términos de autoridad, credibilidad, propósito y posibles riesgos.

Localizar y acceder a información de contenido relevante.  Sintetizar las ideas extraídas del contenido.  Comprender las condiciones bajo las cuales se pueden cumplir esas ideas  o funciones.

Comprender el papel y las funciones de los medios, incluyendo medios  en línea, en la sociedad y su desarrollo.

Reconocer y articular la necesidad de información y de los medios.  Internet ha sido una herramienta que ha transformado y de…nido la co- municación en el siglo XXI. A través de sus múltiples interfaces, internet ha tenido éxito, para que tanto individuos como organizaciones se conecten, se comuniquen e intercambien información. Las plataformas tecnológicas y las redes sociales han acelerado la velocidad a través de la cual los usuarios pueden acceder y recuperar información, simpli…cando el proceso en el que las noticias se difunden, actualizan e incluso se comunican. Hoy en día, es prácticamente instantáneo darse cuenta de un evento de noticias sin que sea necesariamente comunicado por medios tradicionales como los periódicos o la radio. La facilidad a través de la cual las personas ahora pueden comunicarse ha traído una sensación de democratización a la libertad de expresión. Trans- formar la libertad de expresión ha posibilitado nuevas capacidades para crear y editar contenido, generando nuevas oportunidades para el periodismo al- ternativo; nuevas capacidades de organización y movilización (que apoyan en [email protected] 344 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM gran medida otros derechos, como la libertad de asociación); y nuevas posi- bilidades para innovar y generar desarrollo económico (apoyando los derechos sociales y económicos). Sin embargo, esta facilidad en el intercambio y la creación de información también presenta desafíos tanto para las organizaciones como para las per- sonas que son usuarias de dichas redes, tanto como fuente, como usuario …nal. Aunque estos desafíos varían en escala, todos son igualmente signi…cativos. Algunos de los más destacados incluyen el desafío a la calidad super…cial de la información, la susceptibilidad a la información errónea y la exposición a ataques cibernéticos. Por lo tanto, la necesidad de mitigar y mantener la in- tegridad de esta información se ha convertido en un área de trabajo creciente para muchas organizaciones públicas y privadas. En las siguientes secciones se ofrece una variedad de técnicas y mejores prácticas para mitigar y contrarrestar los desafíos mencionados anterior- mente. Sin embargo, es importante tener en cuenta, al leer estas recomen- daciones, la posición que representas o con la que te asocias. Algunas de las recomendaciones pueden no ser aplicables a una …gura pública, como políti- cos, activistas u otros actores cuyas mejores prácticas en las redes sociales están sujetas a un mayor escrutinio. En este sentido, el ejercicio de los dere- chos de expresión, reunión y protesta se debe respetar, y debe ser respetado, en el ámbito digital al tiempo que se garanticen prácticas más seguras de internet.

11.1 Amenazas a la Ciberseguridad La aparición de vulnerabilidades en los sistemas operativos y los métodos de encubrimiento de los atacantes, lo convierten en una práctica en aumento. Algunos de los principales ataques en la red, hacia donde dirigen su mirada los Hackers para vulnerar la seguridad, pueden de…nirse como:

Malware: el término se re…ere de forma genérica a cualquier Software  malicioso que tiene por objetivo in…ltrarse en un sistema para dañarlo. Comúnmente se asocian como tipos de Malware a los virus, gusanos y troyanos.

Virus: es un código que infecta los archivos del sistema mediante un  programa maligno, pero para ello necesita que el usuario lo ejecute di- rectamente. Una vez activo, se disemina por todo el sistema a donde [email protected] 345 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

el equipo o cuenta de usuario tenga acceso, desde dispositivos de Hard- ware hasta unidades virtuales o ubicaciones remotas en una red. Gusanos: es un programa que, una vez infectado el equipo, realiza  copias de sí mismo y las difunde por la red. A diferencia del virus, no necesita la intervención del usuario, ya que pueden transmitirse utilizando las redes o el correo electrónico. Son difíciles de detectar, pues su objetivo es difundirse e infectar a otros equipos, y no afectan inicialmente el funcionamiento normal del sistema. Su uso principal es el de la creación de redes zombis (Botnets), utilizadas para ejecutar acciones de forma remota como ataque de denegación de servicio (DoS) a otro sistema. Troyanos: similares a los virus, sin embargo, mientras que este último  es destructivo por sí mismo, el troyano lo que busca es abrir una puerta trasera (Backdoor) para favorecer la entrada de otros programas ma- liciosos. Su misión es precisamente pasar desapercibido e ingresar a los sistemas sin que sea detectado como una amenaza potencial. No se propagan a sí mismos y suelen estar integrados en archivos ejecutables aparentemente inofensivos. Spyware: es un programa espía, cuyo objetivo es recopilar información  de un equipo y transmitirla a una entidad externa sin el consentimiento del propietario. Su trabajo suele ser silencioso, sin dar muestras de su funcionamiento, llegando incluso a instalar otros programas sin que se perciban. Las consecuencias de su infección incluyen, además, pérdida considerable del rendimiento del sistema y di…cultad para conectarse a internet. AdWare: su función principal es la de mostrar publicidad. Aunque su  intención no es la de dañar equipos, es considerado por algunos una clase de Spyware, ya que puede llegar a recopilar y transmitir datos para estudiar el comportamiento de los usuarios y orientar mejor el tipo de publicidad. Ransomware: Este es uno de los más so…sticados y modernos ataques,  ya que lo que hace es secuestrar datos (encriptándolos) y pedir un rescate por ellos. Normalmente, se solicita una transferencia en dinero electrónico (Bitcoins), para evitar el rastreo y localización. Este tipo de ciberataque va en aumento y es uno de los más temidos en la actualidad. [email protected] 346 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Escaneo de Puertos: técnica empleada para auditar dispositivos y redes  con el …n de conocer qué puertos están abiertos o cerrados, los servicios que son ofrecidos, así como comprobar la existencia de algún cortafue- (Firewall), la arquitectura de la red, o el sistema operativo, entre otros aspectos. Su empleo permite al atacante realizar un análisis pre- liminar del sistema y sus vulnerabilidades, con miras a algún otro tipo de ataque, pues cada puerto abierto en un dispositivo, es una potencial puerta de entrada al mismo.

Phishing: no es un Software, se trata más bien de diversas técnicas de  suplantación de identidad para obtener datos privados de las víctimas, como contraseñas o datos bancarios. Los medios más utilizados son el correo electrónico, mensajería o llamadas telefónicas, y se hacen pasar por alguna entidad u organización conocida, solicitando datos con…den- ciales, para posteriormente ser utilizado por terceros en su bene…cio.

Whaling: es un método para simular ocupar cargos de nivel superior en  una organización con el objeto de conseguir información con…dencial u obtener acceso a sistemas informáticos con …nes delictivos.

El Smishing: ocurre cuando se recibe un mensaje de texto corto (SMS)  en el teléfono celular, por medio del cual se solicita al usuario llamar a un número de teléfono o ir a un sitio Web.

El Vishing: es la estafa que se produce mediante una llamada telefónica  que busca engañar, suplantando la identidad de una persona o entidad para solicitar información privada o realizar alguna acción en contra de la víctima.

Juice-jacking o Video-jacking: son los nombres que se han puesto a los  procesos por los cuales, a través de un puerto (generalmente USB) nos conectamos a un puerto Hackeado, de esta forma el ciberdelincuente puede instalar, grabar datos, tomar video o sacar datos de nuestros dispositivos móviles. Esto se ha vuelto común en los puertos de recarga de energía públicos a través del puerto USB. Si se hará uso de este tipo de servicios, es recomendable adquirir un dispositivo del tipo PortaPow de carga rápida con adaptador USB que inhabilitan los pines de datos permitiendo sólo la carga del dispositivo.

[email protected] 347 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Keylogger (registrador de teclas): es un Software malicioso o dispositivo  en Hardware -generalmente conectado al teclado- que se encarga de re- gistrar las pulsaciones que se realizan en el teclado, para posteriormente usarlas para robar información privada.

Criptomining es un Malware diseñado para la extracción de Criptomone-  das en nuestros dispositivos. Si el usuario accesa a un sitio Web que este infectado, el Malware se puede descargar de forma inadvertida a través de una descarga automática y nuestro dispositivo comenzará a desenterrar una moneda criptográ…ca seleccionada para los Hackers; la infección será notoria por un uso intensivo de nuestro dispositivo.

Botnets (Redes de robots): Son computadoras o dispositivos conecta-  dos a la red (teléfonos inteligentes, tabletas, etc.) infectados y contro- lados remotamente, que se comportan como robots (Bots) o zombis, quedando incorporados a redes distribuidas, las cuales envían de forma masiva mensajes de correo Spam o código malicioso, con el objetivo de atacar otros sistemas o dejarlos fuera de servicio.

Denegación de Servicios: tiene como objetivo inhabilitar el uso de un  sistema o computadora, con el …n de bloquear el servicio para el que está destinado. Los servidores Web poseen la capacidad de resolver un número determinado de peticiones o conexiones de usuarios de forma simultánea, en caso de superar ese número, comienzan a ralentizarse o incluso bloquearse y desconectarse de la red. Existen dos técnicas para este ataque: la denegación de servicio o DoS (Denial of Service) y la denegación de servicio distribuido o DDoS (Distributed Denial of Service); la diferencia entre ambos es el número de equipos de cómputo que realizan el ataque. En el primero, las peticiones masivas al servi- cio se realizan desde una misma máquina o dirección IP, consumiendo así los recursos que ofrece el servicio hasta que no tiene capacidad de respuesta y comienza a rechazar peticiones (denegar el servicio); en el segundo, las peticiones o conexiones se realizan empleando un gran número de computadoras o direcciones IP, todas al mismo tiempo y hacia el mismo servicio objeto del ataque, de forma general, las com- putadoras que lo realizan se encuentran infestadas, formando parte de una Botnet, y comportándose como zombis.

Ataque MITM (Man In The Middle): conocido como "hombre en el  [email protected] 348 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

medio", ocurre cuando una comunicación entre dos sistemas es inter- ceptada por una entidad externa simulando una falsa identidad. En este sentido, el atacante tiene control total de la información que se intercambia, pudiendo manipularla a voluntad, sin que el emisor y el receptor lo perciban rápidamente. Es común que se realice empleando redes WI-FI públicas y abiertas, y es muy peligroso ya que se puede obtener información sensible de las víctimas, y es difícil identi…carlo si no se poseen los mínimos conocimientos sobre el tema. Rootkit: es un tipo de Malware diseñado para infectar una PC, el  cual permite instalar diferentes herramientas que dan acceso remoto al equipo de cómputo. Este Malware se oculta en la máquina, dentro del sistema operativo y sortea obstáculos como aplicaciones antimal- ware o algunos productos de seguridad. El Rootkit contiene diferentes herramientas maliciosas como un módulo para robar los números de tarjeta o cuentas bancarias, un bot para ataques y otras funciones que pueden desactivar el Software de seguridad. SIM Swapping: es la duplicación del SIM de un número telefónico que  permite a un atacante usurpe nuestra identidad, pudiendo autenti…- carse por medio de SMS en diversos servicios que usen la autenti…cación de dos pasos, incluyendo los servicios bancarios. SIM Jacker: es el envió de un mensaje malicioso al dispositivo destino,  que si se abre el enlace adjunto, el dispositivo inteligente queda com- prometido y se puede extraer toda la información del mismo incluyendo la ubicación. 0-Day (día cero): es una nueva vulnerabilidad para la cual no se han  creado parches o revisiones, y que se emplea para llevar a cabo un ataque. El nombre se debe a que no existe ninguna revisión para mit- igar el aprovechamiento de la(s) vulnerabilidad(es), estas pueden ser utilizadas para que troyanos, Rootkits, virus, gusanos y otros se propaguen e infecten más equipos. En general, para poder llevar a cabo alguno de estos ataques, los intrusos deben disponer de los medios técnicos, los conocimientos y las herramientas adecuadas, deben contar con una determinada motivación o …nalidad, y se tiene que dar además una oportunidad que facilite el desarrollo del ataque, como podría ser un fallo en la seguridad del sistema informático elegido. [email protected] 349 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

11.2 Recomendaciones de Ciberseguridad Como usuarios de equipo de cómputo tenemos poca o nula capacitación en cuanto a las normas básicas de ciberseguridad, las más importantes son: usar contraseñas fuertes y diferentes para cada caso, mantener actualizado el sistema operativo, al navegar en internet hacerlo de forma segura, hacer uso seguro de las herramientas de la Nube, generar respaldos de nuestra información, hacer correcto uso de redes Wi-Fi, conocer y no caer en ataques de técnicas de inteligencia social, al hacer uso de videoconferencias conocer las políticas de privacidad y las medidas de seguridad, entre otras tantas cosas que el usuario actual de las Tecnologías de la Información y la Comunicación (TIC) debe dominar. Algunas recomendaciones para reducir nuestra huella en internet:

El uso de cuentas de correo alternativas nos permite registrarnos en  diferentes sitios Web sin utilizar datos y/o cuentas personales. Usar cuentas de correo seguro, anónimo y bidireccional como el servicio  de ProtonMail. O usar el modo con…dencial -en el cual podemos es- tablecer fecha de vencimiento y contraseña para cada correo- al enviar correos desde cuentas Google. Acceder a las opciones del navegador para eliminar cada cierto tiempo  la información almacenada en formas de Cookies, caché o el historial de navegación. El uso de modo privado o incógnito en el navegador nos permite no  almacenar información sobre las páginas Web visitadas ni se guardan las Cookies, ya que se eliminarán al salir del navegador. Evitar revelar información sensible en redes sociales sobre nosotros,  familia y conocidos, en medida de lo posible debemos vigilar lo que publicamos, quién puede verlo y con…gurar las opciones de privacidad. El uso de Webs seguras (https y certi…cados digitales) aseguran que  la información que intercambiamos con ellas, como datos bancarios o contraseñas viajen de forma cifrada. Usar navegadores especializados (Tor) y lugares de búsqueda de infor-  mación (DuckDuckGo) que nos permitan una navegación segura al no guardar lo que buscamos, ni los sitios donde accedemos. [email protected] 350 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

El uso del GPS en nuestros dispositivos móviles es una gran herramienta  en nuestra vida digital, pero debemos tenerlo activado sólo cuando sea necesario, ya que muchas aplicaciones comparte nuestra ubicación en tiempo real sin nuestro cononocimiento.

11.2.1 Contraseñas Robustas Las contraseñas protegen la información que contienen los dispositivos y cuentas de los usuarios. No obstante, ante la cantidad de claves y com- binaciones que cotidianamente se deben utilizar, la mayoría de las personas opta por contraseñas fáciles de recordar por la comodidad que esto implica, o bien, por la falta de conocimiento de lo fácil que puede ser para un ciberdelin- cuente obtenerlas. Para asegurar la efectividad de las contraseñas73 y evitar el robo de éstas, es recomendable poner en práctica las siguientes acciones:

Al generar las contraseñas de los dispositivos y cuentas se deben utilizar  claves largas -mínimo 15 caracteres74- y únicas para cada caso, evitando utilizar la misma contraseña para diferentes dispositivos o cuentas.

Se deben evitar las combinaciones sencillas como fechas de nacimiento,  secuencias consecutivas, repeticiones de un mismo dígito o palabras simples como "password" o "contraseña".

La mayor longitud de la contraseña, así como la incorporación de  mayúsculas, minúsculas, números y símbolos (#$,.-_%&*!?), contribu- yen a que ésta sea más segura y difícil de vulnerar75.

73 Para conocer la seguridad de una clave, podemos revisarla en: https://howsecureismypassword.net/ 74 Solo para tener una idea del tiempo necesario para encontrar la clave de 13 caracteres aleatorios de símbolos, números, letras mayúsculas y minúsculas usando fuerza bruta en un solo core en el que se ejecuten más de mil millones de intentos por segundo se tar- daría 9.6 millones años. Si se aumentan el número de cores los tiempos se acortaran de forma drástica, por ejemplo si se usa una supercomputadora que intente 100 millones de contraseñas por segundo bajaría de 9.6 millones a 96 años. https://i.imgur.com/e3mGIFY.png 75 GnuPG y OpenSSl son herramientas en línea de comandos de seguridad en comunica- ciones electrónicas en donde se utiliza criptografía de clave pública para que los usuarios puedan comunicarse de un modo seguro. Para instalar el paquete GnuPG, usamos: # apt install gnupg [email protected] 351 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

No usar una contraseña única o similar para tus cuentas  Se debe evitar escribir contraseñas en papeles o tener archivos con esa  información que sean fácilmente accesibles para otros.

Habilitar el doble factor de autenticación o veri…cación en dos pasos.  Esta medida es una capa adicional de seguridad disponible para cada vez más servicios en la que, además de la contraseña, durante el inicio de sesión se solicita información sobre otro medio al que sólo el usuario autorizado tiene acceso (por ejemplo, veri…cación para entrar al correo electrónico mediante la recepción de un código vía SMS, llamada o mensaje de WhatsApp).

Es importante no facilitar a nadie, aunque así lo solicite, por ningún  medio, contraseñas y/o códigos para el inicio de sesión.

Es recomendable cambiar con frecuencia las contraseñas a efecto de  evitar accesos no autorizados.

Es recomendable usar un gestor de contraseñas76 (como KeePassXC,  KeePass, , , NordPass, LastPass, , Keeper

para generar clave aleatoria de por ejemplo 32 caracteres, usamos: $ gpg –gen-random –armor 1 32 Para instalar el paquete OpenSSL, usamos: # apt install gnupg para generar clave aleatoria de por ejemplo 32 caracteres, usamos: $ openssl rand -base64 32

76 Un administrador de contraseñas tiene dos funciones principales: (1) almacenar con- traseñas, y (2) generar contraseñas seguras y únicas. Esta aplicación es esencialmente como un libro digital que almacena todas sus contraseñas usando una "clave maestra". Al ingresar esta clave, se le otorga acceso al resto de las contraseñas. Por lo tanto, dicha clave o contraseña debe permanecer altamente protegida. Pero su segundo uso es mucho más práctico. El administrador de contraseñas genera automáticamente contraseñas que contienen una combinación compleja de mayúsculas y minúsculas, números, símbolos y caracteres especiales, que puede complicar el descifrado o la detección de la contraseña por parte de piratas informáticos. Al utilizar un administrador de contraseñas, se evita el error común de usar una sola contraseña en las diversas plataformas en línea, evitando así ataques de relleno de credenciales (credential stu¢ ng). [email protected] 352 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Password Manager, , Password Gorilla, UPM, Buttercup, , , , etc) para generar y almacenar las claves de acceso estrictamente necesarias. Este es un programa de seguridad que almacena de forma segura todas las contraseñas en una caja fuerte virtual cifrada, los hay locales a tu dispositivo o en línea.

11.2.2 Encriptar Discos o Archivos La encriptación de datos o cifrado de archivos es un procedimiento mediante el cual los discos, archivos, o cualquier tipo de documento, se vuelven com- pletamente ilegibles gracias a un algoritmo que desordena sus componentes. Así, cualquier persona que no disponga de las claves correctas no podrá ac- ceder a la información que contiene. A menudo nos referimos a los datos encriptados como texto cifrado. El propósito de la encriptación es proteger la con…dencialidad de los datos digitales. En el mundo criptográ…co, cifrar es un procedimiento que utiliza un al- goritmo matemático. Estos algoritmos modi…can los datos, de manera que sólo sabiendo el mismo algoritmo se puede descifrar para saber qué es lo que se dice. Como puede imaginarse, la protección de datos se ha convertido en una preocupación importante para las personas y compañías con el signi…cativo crecimiento del volumen de datos y la so…sticación de la amenaza. A estos hechos, hay que añadir el riesgo que supone cada uno de nosotros lleva consigo grandes cantidades de datos con…denciales en sus ordenadores portátiles y dispositivos móviles.

¿Qué es encriptar? a pesar de los complicados cálculos matemáticos involucrados, la acción de encriptar datos no es difícil de entender. Simple- mente, consiste en bloquear los datos mediante un código secreto que oculta su verdadero signi…cado. De esta forma, si alguien accede a ellos, encontrará que la información carece de sentido. Y es que, para que los datos encriptados tengan sentido, se necesita la clave del código. Existen dos tipos de cifrado: simétrico y asimétrico. En términos simples, el cifrado simétrico es la técnica más antigua y conocida. Utiliza una clave secreta para cifrar y descifrar los datos. Tanto el remitente como el receptor conocen la clave. El cifrado asimétrico es un método más nuevo y también conocido como criptografía de clave pública. Utiliza dos claves en lugar de una: una pública [email protected] 353 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM y una privada. Las claves públicas permiten que cualquiera envíe información a otra persona, pero solo cada individuo conoce su clave privada.

Para qué sirve el cifrado de mensajes y otros datos sirve para hacer las comunicaciones más seguras, y lo mismo se puede decir a la hora de aplicarlo a internet. La primera funcionalidad para conseguirlo es la de la con…dencialidad de los mensajes, ya que al no ir al descubierto, cuando tú le envías algo a otra persona, los algoritmos criptográ…cos de la aplicación ayudan a que no se pueda leer fácilmente si alguien lo intercepta en el camino. Siendo la con…dencialidad la primera de las ventajas que ofrece el cifrado de mensajes, la segunda podríamos decir que es la integridad. El encapsular un mensaje dentro de un sobre de cifrado, dicho así para hacerse una mejor imagen mental, ayuda que todo lo que haya cifrado se mantenga correcto y completo. También hay algoritmos criptográ…cos que proporcionan mecanismos para veri…car la identidad de la persona que envía un mensaje. Además, hay méto- dos de cifrado que también ayudan a vincular un documento o transacción a una persona o sistema de gestión concretas. Pero a nivel general, para lo que más se suele utilizar es para proteger las comunicaciones. Si tú envías un SMS se envía en texto plano, sin cifrar, y si un operador o alguna agencia inter…ere el mensaje, puede leer todo lo que hay escrito. Sin embargo, apli- caciones como WhatsApp, Gmail o Telegram aplican cifrados para que esto no sea tan fácil.

¿Qué se debe encriptar? en términos generales, hay dos tipos de datos que se deben encriptar:

Información de identi…cación personal. En este grupo se incluye cual-  quier tipo de información que otra persona pueda usar para identi…car a un individuo de manera única. Esto incluye la licencia de conducir, número de seguridad social, etc. Los ladrones pueden usar esta infor- mación para robar una identidad, lo que les permite cometer delitos mayores, como solicitar tarjetas de crédito y préstamos a nombre de otra persona. Combatir esta clase de ataques requiere esfuerzos en mu- chos frentes. La información de identi…cación personal reside en los teléfonos, tabletas y computadoras portátiles , por lo que esos disposi- tivos y su almacenamiento se deben encriptar. [email protected] 354 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Información con…dencial de Negocios y Propiedad Intelectual. Los  datos a los que los empleados acceden cada día acerca de los clientes, los planes para un nuevo producto o los datos sobre la próxima cam- paña de marketing entrarían en este grupo. De toda esta información podrían sacar provecho los competidores y, por tanto, puede convertirse en objetivo de piratas informáticos. Ante las di…cultades para decidir si se deben o no encriptar algunos datos, basta con preguntarse si se destruirían antes de tirarlos a la basura, caso de estar en formato papel o si, en el caso de que se …ltraran por accidente causarían daño a los empleados o clientes. En ambos casos, si la respuesta es a…rmativa, hay que encriptar.

Encriptar Discos Los discos duros externos y los dispositivos USB son la manera perfecta de poder llevarnos en nuestros viajes todos nuestros archivos importantes. Pero cuando estos archivos son personales y privados es posible que no quieras que nadie pueda acceder a ellos en caso de que se te pierda el USB o te lo quiten de alguna manera. Por eso, todos los sistemas operativos suelen darte la opción de aplicarles un cifrado y protegerlos con una contraseña de tu elección, un proceso dife- rente al de protegerlos contra escritura. Hoy te vamos a enseñar a hacerlo paso a paso con Windows con una de sus herramientas nativas, y también te diremos brevemente cómo hacer lo mismo en MacOS y GNU/Linux pero de una forma aún más sencilla.

Cifrar Windows la manera de cifrar unidades externas en Windows tiene un nombre: BitLocker. Se trata de una herramienta desarrollada por Microsoft que suele venir preinstalada en casi todas las versiones de su sistema operativo, pero que de no ser así puedes conseguir en su página de descarga, donde se pueden descargar sus versiones de 32 y 64 bits.

En GNU/Linux y MacOS en el caso de que tengas un Mac el proceso es aún más fácil, ya que lo único que tienes que hacer es tener la unidad formateada, conectarla al equipo y dar Click derecho sobre su icono cuando aparezca en el escritorio. En el menú desplegable sólo tendrás que elegir la opción: "Encriptar" para introducir con qué contraseñas lo quieres bloquear. En las distribuciones GNU/Linux por su parte también basta con dar Click derecho sobre la unidad, sólo que en este caso la opción a elegir es: [email protected] 355 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

"Formatear volumen". La clave aquí la tienes en el tipo de de formateo, ya que en él tendrás la opción Cifrado -LUKS o Cryptsetup-. De esta mane- ra, formatearás el disco duro aplicándole directamente un cifrado con una contraseña que elijas.

En Android siguiendo estos pasos podemos encriptar el disco:

1.- Ve a: "Ajustes". 2.- Selecciona: "Seguridad". 3.- Pulsa en: "Cifrar teléfono" y con…gura una contraseña (véase sección 11.2.1). 4.- Espera tranquilamente a que el proceso acabe, puede tardar más de media hora fácilmente.

Es importante destacar que la única forma de quitar el encriptado es reseteando de fábrica el dispositivo, lo que signi…ca el borrado total del con- tenido que en el haya almacenado. Si tienes una tarjeta microSD insertada, los datos dentro también serán encriptados y no podrás acceder a ellos en otro dispositivo.

Encriptar Archivos

En Windows la herramienta que trae Windows preinstalada (ediciones Education, Pro y Enterprise) es un buen comienzo para cifrar nuestros datos. Para ello, deberemos seguir los siguientes pasos:

1. Haz Clic con el botón derecho en un archivo o carpeta (o mantenlo presionado) y selecciona: "Propiedades". 2. Selecciona el botón: "Avanzados" y haz Clic en la casilla de veri…cación: "Cifrar contenido" para proteger datos. 3. Pulsa el botón: "Aceptar" para cerrar la ventana: "Atributos avanzados" y a continuación, selecciona el botón: "Aplicar" y después: "Aceptar".

Una vez cifrada la información, solo podremos acceder si disponemos de la clave de cifrado correcta. [email protected] 356 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

En GNU/Linux y MacOS es posible encriptar archivos usando GnuPG, esta es una herramienta en línea de comandos de seguridad en comunicaciones electrónicas en donde se utiliza criptografía simétrica y de clave pública para que los usuarios puedan comunicarse de un modo seguro77. Dentro de las funciones de GnuPG se incluyen generar un par de claves, intercambiar y comprobar la autenticidad de claves, cifrar y descifrar documentos, etc. Para instalar el paquete GnuPG, usamos: # apt install gnupg Es posible cifrar archivos usando sólo una clave (véase sección 11.2.1)- cifrado simétrico- para cifrar el archivo. La clave que se usa para el cifrado simétrico deriva de la contraseña dada en el momento de cifrar el documento. El cifrado simétrico es útil para asegurar archivos cuando no sea necesario dar la contraseña a otros. Un archivo puede ser cifrado con una clave simétrica usando la opción –symmetric, por ejemplo: $ gpg –symmetric doc o $ gpg -c doc y podemos descifrar usando: $ gpg doc.gpg

11.2.3 Sistema Operativo Mantener actualizados los sistemas operativos y las aplicaciones de los dispo- sitivos, incluidas las computadoras personales (PC), los teléfonos inteligentes y las tabletas78. Estas actualizaciones incluyen cambios importantes que mejoran el rendimiento y la seguridad de los equipos; muchos de estos pro- gramas, incluso, se actualizan de manera automática. Además de: 77 Otras opciones son: ccrypt y mcrypt. 78 En el caso del sistema operativo Android hay una gran fragmentación de versiones en el mercado coexistiendo, esto debido a que los fabricantes y proveedores tienen un modelo de mercado que prioriza la venta de equipo nuevo y no la seguridad del usuario. Forzando a que las actualizaciones del sistema operativo dependan en gran medida del fabricante del dispositivo o del proveedor del servicio de telefonía, ya que ellos personalizan el sistema operativo, di…cultando la actualización de los dispositivos. Lo que ocasiona que la gran mayoría de los dispositivos no reciban las actualizaciones de seguridad y nuevas versiones del sistema operativo publicadas por Android. [email protected] 357 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Cifrar el disco (véase sección 11.2.2) donde reside el sistema operativo  y nuestros datos, sin este cifrado cualquier persona con acceso físico a nuestro equipo de cómputo, tableta, teléfono o dispositivo electrónico puede copiar sus contenidos incluso si no tienen la clave de acceso a ellos.

Instalar solo aquellos programas y complementos que realmente uses,  porque además de que pueden mermar la velocidad de tu equipo, es posible que estés cediendo más permisos de los que te imaginas.

Activar funcionalidades de protección, como el cortafuegos79 (Firewall),  incorporadas en los sistemas operativos más comunes. Un cortafuegos es la primera línea de defensa ante un ataque a tu red desde internet y permite proteger el equipo de programas maliciosos o atacantes que intenten conectarse al equipo de forma remota. Además, permite es- tablecer reglas para indicar qué conexiones de red se deben aceptar y cuáles no. Al mismo tiempo, admite el normal intercambio de datos entre la computadora y servicios veri…cados de internet.

En caso de usar el sistema operativo Windows o Android se debe ins-  talar un antivirus80, estos programas ayudan a proteger los dispositivos contra la mayoría de los virus, gusanos, troyanos y otros tipos de Mal- ware que pueden infectar a los dispositivos, por ello se recomienda:

79 Un cortafuegos es un sistema tecnológico cuya misión es la de dar paso o prohibir conexiones entre dispositivos informáticos, en base a una serie de reglas que el usuario puede establecer según las necesidades de cada dispositivo. Dichos sistemas puede ser implementados tanto en Hardware (físicos) como en Software (lógicos), o bien una com- binación de ambos. En ambos casos, la tarea del cortafuegos es permanecer a la escucha de qué paquetes de información tratan de salir o entrar de nuestro equipo para desechar aquellos que no deseados. 80 Debido a que el Internet es una red abierta, cualquier computadora o dispositivo puede conectarse a este desde cualquier lugar. El uso de software antivirus sirve como un escáner inicial de cualquier actividad sospechosa o maliciosa a la que los usuarios están expuestos a través de las redes sociales. El software antivirus puede ayudar a supervisar la entrega de noticias y puede ofrecer un nivel adicional de protección en el evento que el usuario haga clic erróneamente en enlaces sospechosos que pueden contener spam y diferentes tipos de virus, como gusanos . Pero tener instalado un software antivirus no es una protección general ya que no puede atrapar todo el malware; el dispositivo aún puede estar infectado. Sin embargo, le agrega una capa de protección que puede ser bene…ciosa para el usuario. Por eso es tan importante usar el sentido común también y descon…ar de cualquier mensaje que parezca extraño o sospechoso. [email protected] 358 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Instalar y mantener actualizados los antivirus, pre…riendo aqué- llos que incorporan funcionalidades de protección contra Malware y cortafuegos (Firewall), también conocidos como "suites de se- guridad". Evitar tener dos antivirus en un mismo dispositivo. Tener dos antivirus activos no signi…ca mayor protección; de hecho, puede ocasionar diferentes problemas en el sistema. Un antivirus que esté trabajando se convertirá en un "Software malicioso" a los ojos del otro, el cual intentará bloquearlo y eliminarlo, y se corre el riesgo de afectar el desempeño del sistema por el consumo extra de recursos. Todas las instalaciones y actualizaciones de programas y apli- caciones deben hacerse desde el sitio Web o…cial del fabricante o desde las tiendas o…ciales de apps -veri…cando la identidad del autor de la aplicación-, evitando descargar e instalar aquéllas de dudosa procedencia. Deshabilitar la auto ejecución de memorias USB, para evitar que, por ese medio, se instalen programas maliciosos. En los sistemas operativos que lo soporten, habilitar la limpieza remota del dispositivo en caso de perdida o robo.

Respaldos a veces, no importa cuan cuidadoso sea uno, existe la posi- bilidad de perder tus datos o que te puedan Hackear. Si ese es el caso, a menudo la única forma en la que puedes recuperar tu información personal es restaurar desde un respaldo. Asegúrate de realizar respaldos periódicamente -preferentemente encriptados (véase sección 11.2.2)- de cualquier información importante y veri…ca que puedas restaurar tu información a partir de ellos. Es posible usar servicios en red como Google Drive y dispositivos USB para guardar en ellos los respaldos. Una buena estrategia de respaldo es la siguiente: Mantener tres copias de cualquier …chero importante (una principal y  dos respaldos). Mantener los …cheros en dos tipos distintos de almacenamiento para  protegerlos ante distintos riesgos. Almacenar una copia de seguridad fuera de nuestra casa u o…cina.  [email protected] 359 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

11.2.4 Máquinas Virtuales Entendamos por una máquina virtual a un programa de cómputo que simula a una computadora, en la cual se puede instalar y usar otros sistemas opera- tivos de forma simultánea como si fuese una computadora real sobre nuestro sistema operativo huésped81. Una característica esencial de las máquinas virtuales82 es que los procesos que ejecutan están limitados por los recursos y abstracciones proporcionados por ellas. Estos procesos no pueden escaparse de esta "computadora virtual". Uno de los usos más extendidos de las máquinas virtuales es ejecutar sistemas operativos nuevos u obsoletos adicionales a nuestro sistema habitual. De esta forma podemos ejecutar uno o más sistemas operativos -Linux, Mac OS, Windows- desde nuestro sistema operativo habitual sin necesidad de instalarlo directamente en nuestra computadora y sin la preocupación de que se descon…gure el sistema operativo huésped o a las vulnerabilidades del sistema virtualizado, ya que podemos aislarlo para evitar que se dañe. Las máquinas virtuales son una verdadera opción para coexistir simultá- neamente diferentes versiones de sistemas operativos y en un mismo sistema máquinas virtuales ejecutando las diversas versiones de un mismo programa de cómputo, además se pueden con…gurar para que al momento de iniciarlas siempre se ejecuten a partir de una con…guración e instalación base, de tal forma que al ser lanzadas, el usuario pueda instalar, con…gurar e inclusive dañar la máquina virtual, pero al reiniciarse la máquina virtual en una nueva sesión, se regresa a la con…guración de la versión base, de esta forma no hay posibilidad de infección de virus entre diversos lanzamientos de sesiones de la máquina virtual. El uso de las máquina virtual es variado, ‡exible y permite ser usado en diversos ámbitos de la educación, del desarrollo y prueba de programas de

81 Tal y como puede verse re‡ejado en la de…nición de máquina virtual, en este texto nos estamos focalizando en las máquinas virtuales de sistema. Existen otro tipo de máquinas virtuales, como por ejemplo las máquinas virtuales de proceso o los emuladores. 82 Una máquina virtual dispone de todos los elementos de un equipo de cómputo real, de disco duro, memoria RAM, unidad de CD o DVD, tarjeta de red, tarjeta de vídeo, etc., pero a diferencia de un equipo de cómputo real estos elementos en vez de ser físicos son virtuales. Así, una vez instalado un sistema operativo en la máquina virtual, podemos usar el sistema operativo virtualizado del mismo modo que lo usaríamos si lo hubiéramos instalado en nuestro equipo de cómputo. Algunas opciones de manejadores de máquinas virtuales son: Virtualbox, Vmware Work- station Player, Parallels, Windows Virtual PC, QEMU/KVM. [email protected] 360 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM cómputo y en general, en Ciencias e Ingeniería. Algunas de las utilidades y bene…cios que podemos sacar de una máquina virtual son los siguientes:

Para aprender a instalar, probar diversas opciones de con…guración  y usar múltiples sistemas operativos. El proceso de instalación de la máquina virtual no requiere crear particiones adicionales en nuestro disco ni alterar la con…guración de la máquina an…triona.

Para usar un Software que no esta disponible en nuestro sistema ope-  rativo habitual. Por ejemplo, si somos usuarios de Linux y queremos usar Photoshop, lo podemos hacer a través de una máquina virtual.

En ocasiones tenemos que usar Software que únicamente se puede eje-  cutar en sistemas operativos obsoletos -Windows XP por ejemplo-, podemos crear una máquina virtual con dicho sistema y usar el Soft- ware de forma aislada sin preocuparnos de sus vulnerabilidades.

Podemos experimentar en el sistema operativo que corre dentro de la  máquina virtual haciendo cosas que no nos atreveríamos a realizar con nuestro sistema operativo habitual, como por ejemplo, instalar Software no seguro que consideramos sospechoso, etc.

Si se hace el adecuado aislamiento de una máquina virtual en la que se  instale alguna versión de Windows, esta puede ser inmune a los virus y no requiere el uso de antivirus.

Si eres un desarrollador de Software puedes revisar si el programa que  estas desarrollando funciona correctamente en varios sistemas opera- tivos y/o navegadores de Web.

Podemos usar las máquinas virtuales para hacer SandBox83 con el …n  de ejecutar aplicaciones maliciosas o abrir correos sospechosos en un ambiente controlado y seguro.

Para probar versiones Alfa, Beta y Release Candidate de ciertos pro-  gramas y sistemas operativos.

83 Un sistema de aislamiento de procesos o entorno aislado, a menudo usando como medida de seguridad para ejecutar programas con seguridad y de manera separada del sistema an…trión. [email protected] 361 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Para probar multitud de programas en Windows y evitar que se en-  sucie el registro mediante las instalaciones y desinstalaciones de los programas.

Podemos navegar en sitios Web maliciosos sin poner en peligro nuestro  equipo, ya que podemos con…gurar la máquina virtual para que se pierdan los cambios al ser reiniciada.

11.2.5 Navegación Segura Elegir un buen navegador es fundamental para garantizar que tus datos se mantengan a salvo. A efecto de promover la navegación segura en internet, se sugiere adoptar las siguientes recomendaciones:

No guardar contraseñas en el navegador, aunque sea muy cómodo que  el navegador tenga tus contraseñas guardadas para entrar rápidamente a todas las páginas que visitas con regularidad, lo cierto es que permitir que los navegadores Web guarden estos datos tan delicados nos pone en una situación de debilidad, ya que cualquier persona que consiga acceder a nuestro ordenador tendría acceso a nuestra información84.

Cuando se trabaja desde la Web es recomendable usar el modo Privado  o Incógnito para no guardar el historial de navegación, información introducida en los formularios y borrar al cerrar el navegador los datos de los sitios visitados. Pero recuerda que los sitios Web que visitamos sí guardan información de nuestra visita, nuestro proveedor de internet también guarda constancia de nuestra visita y si descargamos algo, esto no se borra al igual que el historial de descargas, además de las marcas de páginas o favoritos se conservarán al cerrar el navegador.

Utilizar cifrado de principio a …n (End-toEnd) que utiliza una combi-  nación de algoritmos para identi…car al usuario y otros algoritmos que identi…can a una conversación para cifrar mensajes y evita que terceros vean la conversación.

También es posible usar el protocolo mensajería con…dencial (O¤-The-  Record Messaging , OTR), es un protocolo criptográ…co que propor- ciona un cifrado fuerte para conversaciones de mensajería instantánea.

84 Es recomendable usar un gestor de contraseñas para almacenar las claves de acceso. [email protected] 362 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

La principal motivación debajo de este protocolo es ocultar la identidad de los participantes en la conversación a la vez que se mantenía la con- …dencialidad de la propia conversación, como si fuera una conversación privada de la vida real.

No dejar a la vista de otras personas información relevante, como  aquélla sensible o claves de acceso, ni documentos o carpetas de trabajo.

Mantener siempre la computadora, tableta, teléfono celular o cualquier  otro dispositivo para el trabajo, en un lugar seguro y con contraseña (véase sección 11.2.1), a …n de restringir el acceso de personas no auto- rizadas.

Al alejarse de los dispositivos de trabajo, es importante bloquear la  sesión.

Mantener cubierta la cámara Web cuando no la estas utilizando, para  limitar el acceso que pudieran llegar a tener a ésta aplicaciones o pro- gramas no autorizados.

Sé selectivo con las extensiones y complementos que instalas y usas,  a cuantas menos aplicaciones le des acceso a tus datos mejor, ya que pueden mermar el desempeño de tu navegador y es posible que estés cediendo más permisos de los que imaginas.

Si tu organización facilita los recursos necesarios para el teletrabajo, es  indispensable realizar un uso exclusivamente profesional de los medios proporcionados. No se recomienda, en ninguna circunstancia, manipu- larlos, modi…car su con…guración, o prestarlos a otras personas.

Realizar copias de seguridad periódicas -preferentemente encriptadas  (véase sección 11.2.2)- de la información para garantizar el acceso a la información almacenada, ya sea personal o de la organización. Así, en caso de que ocurra cualquier incidente de seguridad (robo, pérdida del dispositivo, o avería, etc.), se podrá mantener el acceso a la misma. Proteger con contraseña los dispositivos donde se almacene informa- ción (memorias USB o discos externos) para proteger la información de posibles accesos malintencionados y garantizar así su con…denciali- dad e integridad. [email protected] 363 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Ingresar sólo a sitios Web con…ables, escribiendo uno mismo la direc-  ción de la página a la que se quiere acceder y evitando utilizar ligas proporcionadas por terceros.

Conocer y aplicar las funcionalidades de "navegación privada" o "nave-  gación segura", que impiden el almacenamiento del historial en el nave- gador, así como imágenes, nombres de usuario y contraseñas.

Cuando se realicen transacciones o intercambio de información sensible,  asegurarse de que la dirección de la página Web comience con: "https" (no "http"), lo que contribuye a mantener segura la información trans- mitida.

Desactivar la compartición de tu ubicación geográ…ca, a menos que sea  estrictamente necesario.

Evitar el ingreso de información personal en formularios dudosos. Si  te encuentras ante un formulario que solicita información sensible (por ejemplo, nombre de usuario y contraseña), es recomendable veri…car la legitimidad del sitio antes de responder.

Usar cuentas de correo seguro, anónimo y bidireccional como el servicio  de ProtonMail. O usar el modo con…dencial -en el cual podemos es- tablecer fecha de vencimiento y contraseña para cada correo- al enviar correos desde cuentas Google.

Usar buscadores que no dejan rastro de nuestras búsquedas en vez del  buscador de Google, como pueden ser: DuckDuckGo, Startpage, Yippy, Gibiru, Disconnect Search, Lukol, Metager, entre otros.

Al terminar de navegar en internet, es importante cerrar la sesión y  limpiar el Cache, sobre todo si se utiliza un equipo compartido, para evitar que otras personas tengan acceso a cuentas e información pri- vada.

Usar el navegador Tor, este provee una red abierta y distribuida que te  ayuda a defenderte de una forma de vigilancia en la red que amenaza tu libertad y privacidad, tus actividades personales y relaciones, además de la seguridad gubernamental. También, te protege redirigiendo tus

[email protected] 364 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

comunicaciones alrededor de una red distribuida de retransmisores rea- lizados por voluntarios alrededor del mundo: lo cual previene que al- guien observe tus comunicaciones a partir de los sitios que visitas, tam- bién evita que los sitios que navegas obtengan tu ubicación física.

11.2.6 Banca en Línea Segura El uso de la banca en línea es una gran alternativa para todos los usuarios de dichos servicios, pero el acceso a las aplicaciones bancarias debe ser usando un navegador Web seguro o por medio de las aplicaciones del banco desa- rrolladas para dispositivos móviles, en ambos casos es necesario usarlas en un dispositivo de con…anza, encriptado, con contraseña segura para el acceso (véase sección 11.2.1), el sistema operativo actualizado, usando las medidas básicas de protección y con un mínimo de aplicaciones instaladas para evitar Malware, además se sugiere adoptar las siguientes recomendaciones: Solicitar al banco que nos envíe alertas de todas las transacciones de  nuestras cuentas y mantengamos estas monitoreadas de actividad no autorizada. Cuando se deba tener acceso a banca en línea es necesario conectarse  usando redes seguras en las que uno con…é, nunca desde redes públicas Cuando se deba tener acceso a banca en línea desde la Web es recomen-  dable usar el modo Privado o Incógnito y no guardar contraseñas en el navegador. Ingresar sólo a sitios Web con…ables, escribiendo uno mismo la dirección  de la página a la que se quiere acceder y evitando utilizar ligas pro- porcionadas por terceros y asegurarse de que la dirección de la página Web comience con: "https" (no "http"). Usar en la medida de posible contraseñas seguras del mayor tamaño  permitido por la aplicación bancaria. No dejar a la vista de otras personas información relevante, como  aquélla sensible o claves de acceso, ni documentos o carpetas de trabajo. Mantener siempre la computadora, tableta o teléfono inteligente usado  para acceder a la banca en línea en un lugar seguro y con contraseña segura, a …n de restringir el acceso de personas no autorizadas. [email protected] 365 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Al alejarse de los dispositivos de trabajo, es importante cerrar la sesión  bancaria y bloquear la sesión del usuario. Ser selectivo con las extensiones y complementos que instalas y usas,  a cuantas menos aplicaciones le des acceso a tus datos mejor, ya que pueden mermar el desempeño de tu navegador y es posible que estés cediendo más permisos de los que imaginas. Al terminar de navegar en internet, es importante cerrar la sesión y  limpiar el Cache, sobre todo si se utiliza un equipo compartido, para evitar que otras personas tengan acceso a nuestras cuentas bancarias.

11.2.7 Uso Seguro de las Herramientas de la Nube La nube permite almacenar y administrar datos, así como ejecutar apli- caciones en línea, entre muchas otras funciones. Con relación al almace- namiento, la nube permite acceder a archivos y datos desde cualquier dis- positivo conectado a internet; es decir, la información está disponible en cualquier lugar en el que te encuentres y siempre que la necesites. Para hacer uso de los servicios de la nube de manera segura y evitar el robo o mala utilización de la información almacenada, es conveniente tener en mente las siguientes recomendaciones: Tener conocimiento de las condiciones de uso y las políticas de privaci-  dad antes de utilizar cualquier servicio en la nube. Utilizar servicios de almacenamiento que cuenten con cifrado "https"  y certi…cado de seguridad. Esto lo puedes veri…car en la barra de direcciones de tu navegador de internet. No subir a la nube información sensible con acceso público o abierto. Se  recomienda utilizar herramientas de cifrado, como es el uso de carpetas con contraseña y acceso restringido. Veri…car periódicamente los archivos y carpetas que tenemos compar-  tidos desde nuestra cuenta, a …n de deshabilitar los enlaces y acceso de terceros que ya no sean necesarios. Utilizar contraseñas robustas para acceder al servicio y, preferente-  mente, activar el doble factor de autenticación o veri…cación en dos pasos. [email protected] 366 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Realizar periódicamente un respaldo de la información almacenada en  la nube en otro tipo de dispositivo, por ejemplo, en un disco duro ex- terno debidamente protegido por contraseña (véase sección 11.2.2). De esa manera, se mantiene el acceso a la información en caso de cualquier contratiempo, como una conexión limitada a internet.

Cerrar la sesión de la nube al concluir las actividades que se estén  realizando.

11.2.8 Teléfonos Inteligentes y Tabletas Estos dispositivos están omnipresentes en nuestra vida, además pueden alma- cenar mucha más información de la que nos imaginamos y muchos de nosotros los usamos para acceder a casi toda nuestra información digital desde ellos. Por tanto, necesitan protegerse activamente para evitar que el contenido que almacenan y al que tienen acceso termine en manos de terceras personas. En ellos se guarda todo tipo de datos personales, mensajes, imágenes y vídeos en los que aparecen los usuarios, amigos y otras personas. A veces incluso se puede haber recibido o grabado contenido íntimo o de connotación sexual85. No olvidemos que cualquier método de almacenaje de información digital puede sufrir …ltraciones o ataques informáticos, pero los dispositivos móviles son aún más vulnerables. Pueden extraviarse, también pueden ser robados en diversas situaciones o, simplemente, ser interceptados en un momento de despiste. Por ello estos son algunos de los hábitos que debemos practicar a diario para mejorar la protección del dispositivo y nuestros datos:

Todos los dispositivos móviles y tarjetas de respaldo extraíbles deben  ser cifrados y se debe usar una contraseña robusta para el acceso al mismo (véase sección 11.2.1), es decir, utilizar una combinación com- pleja -de al menos 15 caracteres- de letras mayúsculas, minúsculas, números y símbolos es siempre la mejor opción. Además, es impre- scindible no con…arla a sus amistades y cambiarla siempre que tengan dudas de su …abilidad. 85 En el caso de los adolescentes no siempre son conscientes del riesgo que supone pro- ducirlo o guardarlo, Pero, en cualquier caso, requiere una protección especial, y como adultos podemos mostrarles la importancia de proteger estos contenidos. Este tipo de contenido es extremadamente sensible y, de hecho, cuando se trata de imágenes o vídeos en los que aparecen menores de edad ni siquiera es legal almacenarlo en ningún tipo de formato. [email protected] 367 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Es fundamental que se comprenda que toda la información que guardan  en el dispositivo es susceptible de caer en manos de terceras personas. Por eso, lo ideal es que no guarden imágenes, vídeos o datos de carácter sensible. Es preferible que revisen periódicamente sus archivos, elimi- nen de forma e…caz aquello de lo que puedan prescindir y, en el caso de querer guardar algunos contenidos, los almacenen en otros dispositivos más seguros, como un disco duro externo encriptado (véase sección 11.2.2) que mantengan en casa. Cuanta menos información lleven en su dispositivo, menor riesgo.

Cualquier dispositivo ofrece un sistema de bloqueo para que nadie que  no sea el usuario pueda acceder a él. En el caso de móviles y tabletas, tienen diferentes alternativas, como usar su huella dactilar, un sistema de reconocimiento facial, un código PIN, una contraseña o un patrón. Cualquier opción es buena, pero hay que tener en cuenta que un pa- trón o un código PIN siempre son más fáciles de observar y memorizar por otras personas. Obviamente, esta función pierde su e…cacia si no se acostumbran a bloquear el dispositivo siempre que no lo estén uti- lizando.

Algunos servicios de internet, como cuentas de correo o redes sociales,  ofrecen un sistema combinado de autenticación. De esta forma, además de solicitar la contraseña para acceder, utilizan un segundo paso para comprobar la identidad del usuario. Puede ser un código que llegue a su teléfono móvil, por ejemplo, y es muy útil contra el robo de contraseñas. Para ponernos en situación, si alguien averigua la clave de acceso a su cuenta de Instagram no podrá acceder porque también necesitará disponer del dispositivo para ver el código de veri…cación.

Siempre es una buena costumbre cerrar la sesión de cada servicio al  concluir su uso. Por ejemplo, si se entra en redes sociales o en su cuenta de correo en el ordenador público, es fundamental que cierren la sesión y limpiar el Cache antes de irse, comprobando que su contraseña no ha quedado guardada.

Hoy en día todos los servicios digitales incorporan opciones de seguridad  y privacidad que se han diseñado para proteger nuestra información. Una buena práctica es revisar la con…guración de cada aplicación o servicio que se utilice, personalizando todas aquellas funciones que les [email protected] 368 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

sean de utilidad. Así, se pueden establecer cuentas de redes sociales como privadas o revisar los permisos que otorgan a cada aplicación.

Existen muchas más funciones que pueden ser útiles para salvaguardar  todas esos datos, imágenes y vídeos que se guardan en dispositivos. Todo es cuestión de investigar y buscar soluciones siempre que sien- tan que su información es vulnerable. Por ejemplo, pueden bloquear la galería de su móvil o el explorador de archivos, de forma que sea necesario utilizar su huella para acceder. También pueden crear listas de amistades en las redes sociales para que las publicaciones sean más personales y no lleguen a todos los seguidores.

Activar la función de búsqueda y bloqueo de dispositivo frente a pérdi-  das o robos. Cada vez hay más opciones de seguridad disponibles, solo hay que motivar su uso en la prevención de riesgos.

Activar el Wi-Fi y Bluetooth sólo cuando se usen, de esta forma se min-  imiza la posibilidad que un usuario mal intencionado intente conectarse a nuestro dispositivo.

Es posible poner un código de acceso en su tarjeta SIM, esto puede  protegerla de la suplantación de SIM. La con…guración de este código se puede hacer en un iPhone yendo a Con…guración > Celular > PIN de SIM. Ingrese su PIN existente para habilitar el bloqueo. Los usuarios de Android pueden ir a Con…guración > Seguridad > Bloqueo de tarjeta SIM. Aquí puede habilitar la opción para bloquear su SIM.

Se debe evitar el uso de puertos de carga USB no con…ables, como los de  energía públicos, ya que ellos se pueden Hackear, y el ciberdelincuente puede instalar, grabar datos, tomar video o sacar datos de nuestros dispositivos móviles. Si se hará uso de este tipo de servicios, es re- comendable adquirir un dispositivo del tipo PortaPow de carga rápida con adaptador USB que inhabilitan los pines de datos permitiendo sólo la carga del dispositivo.

Escaneo de Códigos QR Los códigos QR cada vez están más presentes en nuestras vidas, sin embargo, éstos no están exentos de riesgos de seguridad, riesgos de los que muchos usuarios no son conscientes.

[email protected] 369 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Los QR son Menos Transparentes que una URL comencemos por lo más obvio, es relativamente fácil distinguir una URL maliciosa de una legítima, pero no ocurre lo mismo con los QR, lo que facilita que seamos remitidos a Webs de Phising o con Malware. Alex Mosher, vicepresidente de soluciones globales de MobileIron, a…rma que espera que "pronto veamos una avalancha de ataques a través de códigos QR" dirigidos a robar datos de nuestros dispositivos móviles o tomar nuestras credenciales y datos person- ales.

No Entendemos qué Puede Abrir un Código QR otro problema es que los usuarios no terminan de comprender qué es lo que pueden hacer los códigos QR, mientras que el 67% piensa (correctamente) que pueden abrir URLs, sólo una tercera parte de ellos es consciente de que eso permite también realizar toda una serie de acciones más allá de abrir una página Web, como:

Escribir un correo electrónico o un mensaje SMS.  Añadir un contacto a tu agenda.  Añadir un evento a tu calendario.  Añadir credenciales de acceso a un red WiFi.  Realizar un pago online.  Iniciar una llamada telefónica.  Enviar información sobre tu localización a una app.  Empezar a seguir a alguien en redes sociales.  Aunque todas éstas actividades son en cierto modo lícitas, pueden engen- drar una gran brecha de seguridad en nuestros dispositivos móviles.

11.2.9 Redes Sociales El uso generalizado de las redes sociales entraña algunos riesgos que, sigu- iendo recomendaciones básicas, se pueden evitar. Como cualquier comunidad frecuentada por miles de usuarios (o, como sucede a veces con las redes so- ciales, por millones), se deben conocer los mecanismos de control y de seguri- dad para poder utilizarlos con …abilidad para mantener nuestra privacidad [email protected] 370 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM y es por eso que el usuario tiene que ser especialmente cuidadoso con el uso que hace de la red social, a continuación daremos algunas recomendaciones:

La gente tiende a inundar de información mientras completa los per-  …les en redes sociales. Hay que tener en cuenta que no estamos ante una entrevista de trabajo o que sólo nuestros amigos lo van a leer. No necesitamos informar de todo y a todos, y menos con información sen- sible. Los expertos creen que revelar demasiada información personal crea una grieta de seguridad. Los atacantes usan información personal como la fecha de nacimiento, el nombre de los miembros de la familia, los números de teléfono, la dirección física, etc. Todo ello para ejecutar múltiples iteraciones para descifrar las contraseñas. Por ello, cuanta menos información pongamos, mejor.

A menudo publicamos notas o mensajes en el muro de un amigo. Esto  también es visible para otros usuarios de Facebook o de la red social que sea. No existe una fórmula para decidir qué es seguro publicar en público y qué no, pero hay que usar el sentido común. Algunas cosas deben mantenerse entre amigos o familiares. Publicar cierta informa- ción en muros públicos pone en riesgo no solo a nosotros mismos sino a la privacidad de nuestros amigos.

Se dice que una foto vale más que mil palabras. En el caso de las redes  sociales incluso más. Además si subimos imágenes con una leyenda informativa, nos pone aún más en riesgo. Estamos dando información sobre nuestros hábitos, nuestros movimientos, a posibles atacantes. Es un aspecto importante para mantener la seguridad en redes sociales.

Hay que asegurarse de que nuestro contenido en las redes sociales sea  visible solo para amigos y familiares. Podemos crear listas de tipos de amigos y personalizar la visibilidad de cada publicación. No todo debe estar visible para esa persona que trabajó con nosotros durante unas semanas hace unos años, por poner un ejemplo. Puede que haya cosas que no queramos compartir con todos los contactos.

El GPS es una característica común en todos los teléfonos inteligentes  en la actualidad. Además de ayudarnos mientras pasamos por una ciudad desconocida, el GPS también se utiliza para el geoetiquetado. Signi…ca que podemos adjuntar información de ubicación a cualquier [email protected] 371 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

contenido multimedia que enviemos o recibamos. Twitter, Facebook e Instagram usan esta característica extensivamente para ayudar a los usuarios a marcar la ubicación donde se hizo una foto, y ayudar a que el per…l sea más «social» . Los atacantes cibernéticos pueden interpretar fácilmente información como nuestro estado económico, estilo de vida, lugares frecuentes y la rutina diaria a través de los medios con etiquetas geográ…cas.

Una de las maneras más elementales de fortalecer nuestra cuenta de  redes sociales es crear una contraseña robusta (véase sección 11.2.1), es decir, utilizar una combinación compleja -de al menos 15 caracteres- de letras mayúsculas, minúsculas, números y símbolos es siempre la mejor opción. Además, es imprescindible no con…arla a sus amistades y cambiarla siempre que tengan dudas de su …abilidad.

Guardar contraseñas en el dispositivo es una práctica muy habitual.  Simplemente la abrimos y ya está, sin necesidad de tener que poner la clave cada vez que la usamos. Sin embargo esto no es un buen método. Si alguien accede físicamente a nuestro teléfono o al ordenador, podría entrar sin problemas a nuestras cuentas. Lo más recomendable es no guardar contraseñas.

En las redes sociales debemos de tener cuidado con los Links que nos  llegan. Incluso si éstos proceden de algún amigo. Hay que …jarse bien en el enlace. En lo que contiene. Muchas veces puede ser una trampa. Nuestro contacto lo hace de forma inconsciente, claro. Pero se trata realmente de un Malware.

Algo que no puede faltar es contar con programas y herramientas de  seguridad. Pero esto no se extiende únicamente a la seguridad en redes sociales, sino a cualquier acción que hagamos en internet. Siempre tenemos que tener algún antivirus instalado. Así podremos hacer frente a posibles amenazas que pongan en riesgo el buen funcionamiento de nuestro equipo.

En una red social lo normal es que cada usuario se identi…que con su  nombre y apellido real y que aporte datos personales, como si estudia o trabaja, con quién se relaciona o en qué ciudad vive. También es muy frecuente subir fotografías personales donde el usuario es perfectamente [email protected] 372 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

identi…cable. Esto hace que su exposición pública sea mucho mayor que antes, esto implica la pérdida del anonimato algo que antes era común y habitual en internet. En las redes sociales, una vez que se pulsa el botón de "publicar", esa  información es enviada a los contactos del usuario. Eso signi…ca que si más adelante el usuario se arrepiente de lo dicho, publicado o mostrado y trata de borrarlo, solo conseguirá eliminarlo de su propio per…l, pero no de las cuentas de todos sus amigos. Es muy común que de forma periódica aparezcan solicitudes de amistad  en el per…l de cada usuario, por parte de personas que en realidad no se conocen. Muchas veces el acto de aceptar una de esas solicitudes es tan automático que no se vigila si se está admitiendo a una per- sona conocida o no. Los amigos se pueden contar con los dedos de las manos (con una suele ser su…ciente) mientras que lo que encontramos en las redes sociales son conocidos con los que debemos mantener la correspondiente distancia. Una red social es un lugar muy atractivo para estar; mientras más  amigos se tienen, más novedades aparecen de forma constante en la página de cada uno, creándose un ciclo de interacciones que no tiene un …nal concreto. Eso hace que algunas veces el usuario sienta la necesidad de estar siempre pendiente y atento a su red social, dándose casos esporádicos y extremos de dependencia total a su red. Quizás lo más importante de estos consejos para mantener la seguri-  dad en redes sociales es el sentido común. La gran mayoría del Malware necesita la interacción del usuario para ejecutarse. Debemos estar siem- pre alerta y usar el sentido común.

Acuerdos de Privacidad La lectura de los acuerdos de privacidad orien- tará al usuario sobre qué datos se comparten o no, y también se ofrece la opción de seleccionar o anular las opciones de privacidad, seguridad o ad- ministrativas escogidas para proteger la cuenta y el dispositivo. Estas son algunas recomendaciones generales a tener en cuenta para administrar mejor la con…guración de privacidad en una cuenta de redes sociales: Selecciona quién tiene acceso de visualización a la actividad en redes  sociales pasada, presente y futura (por ejemplo, Tuits, Me gusta, etc.). [email protected] 373 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Revisa qué contenido se le puede agregar (es decir, etiquetar) a una  cuenta cuando otras personas suban o publiquen contenido.

Revisa, comprende y de…ne la audiencia con la que se puede compartir  contenido.

Revisa, comprende y determina los formularios a través de los cuales  otros usuarios pueden encontrar y conectarse con tu cuenta.

Revisa, comprende y determina la cantidad de información personal  que se incluye al bloguear o publicar información en línea.

Monitorea periódicamente la seguridad y la información de inicio de  sesión de las cuentas y revisa la probabilidad de que se esté realizan- doalguna actividad sospechosa.

Selecciona una copia de seguridad con…able, que pueda detectar o  recibir alertas de alguna actividad sospechosa.

Monitorea si y qué aplicaciones pueden acceder a alguno de tus datos  y/o información en redes sociales, especialmente en segundo plano.

Ten en cuenta las implicaciones de incluir la ubicación al publicar con-  tenido en línea.

Con…gura una autenticación de dos factores para iniciar sesión.  Revisa la política de privacidad de la plataforma para saber qué datos  recopilan los servicios, con quién se comparten y selecciona tus prefer- encias en estos dos temas.

Al registrarte en una cuenta de redes sociales, por defecto, toda la infor- mación anotada en un per…l se hace pública, lo que signi…ca que cualquier persona puede acceder al contenido que hayas registrado en una cuenta. Sin embargo, las necesidades y preferencias de privacidad varían de persona a persona. Mientras que algunos usuarios pre…eren tener una mayor exposi- ción y así poder promocionar su contenido en redes sociales, otros pre…eren incluir muy poca o ninguna información. Para lograr una mayor protección del usuario y su información, es impor- tante evaluar en qué medida la persona está dispuesta a incluir información personal en su per…l. Por consiguiente, ten en cuenta lo siguiente al: [email protected] 374 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Seleccionar un nombre de usuario: el nombre de usuario es el "nombre  digital" que una persona se asigna a sí misma o a su organización para ser identi…cada en línea. Si existe la preferencia de no ser fácilmente identi…cada en ninguna plataforma, pero poder continuar usando estas redes, la persona puede asignar y usar un seudónimo que puede estar relacionado o no con esa persona. Además, la persona puede cambiar su nombre de usuario en cualquier momento simplemente ingresando a la con…guración de su (s) cuenta (s). El nombre de usuario no tiene que ser coherente en todas las redes sociales; estas pueden variar según las preferencias en cada una. Incluir una imagen en la cuenta: el usuario tiene la opción de person-  alizar una cuenta con la inclusión de una foto del per…l. Cuando un usuario pre…ere no ser identi…cado, se sugiere elegir una imagen en la que no pueda ser identi…cado y cambiarla cuando sea necesario. Ten en cuenta que cuando se usa la misma imagen en todas las redes sociales, la simple búsqueda de imágenes puede llevar a otras cuentas. Incluir una ubicación: cuando se activan los servicios de ubicación en la  plataforma de redes sociales, estos les permiten a los usuarios rastrear el origen de cualquier actividad de medios en línea. Es importante tener en cuenta que una vez que se activa esta función, permanecerá activa hasta que se elija deshabilitarla en la con…guración de privacidad. A pesar de que se permitía que esta característica estuviera activa en el pasado, las plataformas tienen la funcionalidad de deshabilitar la ubicación de cualquier contenido que se haya publicado en sus cuentas. Sin embargo, aunque un usuario active o desactive la función de com- partir la ubicación, potencialmente, la ubicación de un usuario podrá ser descubierta por el contenido que comparta o las imágenes que haya elegido para compartir.

11.2.10 Videoconferencias También conocidas como teleconferencias o videollamadas86 se han conver- tido en una herramienta indispensable para el trabajo, estudio y placer de 86 Algunas opciones son: Google Meet, Microsoft Teams, Jitsi Meet, , Talk, Riot.im, BigBlueButton, Wire, Skype, Hangouts, WhatsApp, FaceTime, , , Gruveo, Instagram, Snapchat, Meet, Line, Blue Jeans, Teams, Webex, Facebook Messenger, ZooRoom, Zoom, Signal, Viber, WeChat, etc. [email protected] 375 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM muchas personas, e incluso, el medio para dar continuidad a asuntos la- borales, la vida cotidiana y la comunicación con familiares y amigos. Lo novedoso de estos servicios para muchos usuarios y la aparición de algunas vulnerabilidades en ciertas plataformas87, supone para los ciberdelincuentes la oportunidad para el acceso no autorizado a información, robo de cre- denciales y acceso a los distintos recursos del dispositivo (como micrófono, cámara, etc.). Por lo anterior, es necesario promover la adecuada protección de los usua- rios para evitar incidentes al usar estos servicios tales como:

Informarse sobre las políticas de privacidad y las medidas de seguridad  que implementa el servicio que se desea utilizar.

Descargar e instalar la aplicación correspondiente desde la página Web  o…cial del desarrollador o desde las tiendas o…ciales de apps.

Mantener actualizada la aplicación que se utilice, pues es a través de  este proceso que se puede asegurar que las vulnerabilidades detectadas y corregidas por el desarrollador se están implementando.

Al organizar una videoconferencia se recomienda tener en cuenta:  En el caso de reuniones privadas, compartir el enlace directa- mente con los participantes, haciendo uso de las funciones para compartir de las propias aplicaciones, y evitando el uso de redes

Si bien el equipo mínimo necesario para participar en videoconferencias es un equipo Atom o Celeron con 2 GB de RAM, casi todas las plataformas de videoconferencia re- comiendan un equipo de cómputo como el de Intel con 2GB de RAM -o su equivalente en AMD- para ser partícipe, en el caso de ser el an…trión de la reunión se recomienda un equipo i5 con 4 GB de RAM -o su equivalente en AMD-. En cualquier caso, es común hacer un uso intenso de CPU, generando más calor que en su uso cotidiano. Esto ocasionará que los ventiladores del equipo trabajen a toda su capacidad para disipar el calor generado. Por ello es recomendable que el equipo esté conectado a la corriente eléctrica, cerrar las aplicaciones innecesarias y que el equipo esté bien ventilado, además de no maximizar la ventana de visualización de la videoconferencia pues esto generará mayor uso de CPU. En el caso de usar dispositivos móviles como tabletas o teléfonos inteligentes para ser partícipe en videoconferencias, es recomendable instalar las aplicaciones de videoconfe- rencia respectiva y tratar de no hacerlo mediante el navegador, para así optimizar el uso de Hardware y batería. 87 Una de las aplicaciones más usadas es Zoom, la cual ha tenido múltiples problemas de seguridad y privacidad. [email protected] 376 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

sociales o canales de comunicación abiertos que podrían promover accesos no deseados. Proteger la conferencia con una contraseña robusta, para res- tringir el acceso a ésta a personas no autorizadas. Si la plataforma la incorpora, activar la funcionalidad que per- mite al organizador veri…car y, en su caso, aprobar el acceso de los participantes que deseen acceder a la videoconferencia.

Los participantes en videoconferencia deben evitar compartir su es-  critorio de forma predeterminada ya que esto podría provocar fugas de información.

Se debe cuidar el encendido del micrófono y la cámara de video para  evitar situaciones incómodas o embarazosas.

Si la videoconferencia es grabada, el organizador debe comunicarlo a  los participantes.

11.2.11 Seguridad de la Red Una parte importante del trabajo y estudio a distancia es la aplicación de medidas de seguridad de las redes. Es cada vez más común que los usuarios tengan acceso a un Ruteador inalámbrico (Wi-Fi) para conectar sus disposi- tivos a internet sin necesidad de cables.

Redes Wi-Fi casi todas las redes domesticas comienzan con una red inalámbricas (Wi-Fi), la mayoría de las redes inalámbricas están controladas por el Router de internet o punto de acceso inalámbrico separado y dedicado. Ambas trabajan de la misma manera: transmitiendo señales inalámbricas que permiten que los dispositivos de tu casa se conecten a internet. Para evitar que usuarios no autorizados se conecten de forma inalámbrica al Ruteador88 y tengan la posibilidad de acceder a la conexión, e incluso al resto de los dispositivos conectados y a la información que se transmite, es importante mantenerlo actualizado y asegurar que la red Wi-Fi cuente con

88 Si no se estas seguro de como con…gurar tu dispositivo de acceso a internet, consulta el sitio Web de tu proveedor de servicios de internet o consulta el sitio Web del proveedor para tu Router o punto de acceso inalámbrico. [email protected] 377 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM contraseña robusta (véase sección 11.2.1) que el usuario debe introducir al conectar por primera vez un dispositivo. Los Ruteadores ofrecen varios tipos de contraseñas y cifrados (que codi- …can los datos del usuario, usando un valor o clave secreta y los hace incom- prensibles para terceros), como los siguientes:

Las redes sin cifrado, o abiertas, son aquéllas que no tienen ninguna  contraseña o cifrado y permiten a cualquier usuario conectarse. Una red con estas características no es recomendable su uso. El cifrado Wired Equivalent Privacy (WEP, por sus siglas en inglés) es  considerado, hoy en día, un sistema poco seguro y no se aconseja su uso ya que, con las herramientas y conocimientos adecuados, se puede llegar a conseguir la clave de acceso a la red Wi-Fi en pocos minutos. El cifrado Wi-Fi Protected Access (WPA, por sus siglas en inglés),  especí…camente en su versión 2 (WPA2) o más actualizada, es consi- derado seguro y se recomienda comprobar que esté habilitado como parte de las medidas de seguridad de la red. Para comprobarlo, es necesario entrar desde la computadora a las propiedades de la red, para ver el tipo de seguridad de la conexión. Se recomienda tener habilitada alguna de las variantes de WPA2, al menos. Puedes solicitar apoyo a tu proveedor de servicios de internet para más orientación. Se recomienda cambiar las contraseñas predeterminadas en el Ruteador  por unas de elección del usuario y distinta a la utilizada para conectarse a la red inalámbrica, utilizando contraseñas robustas, se recomienda que incluya mayúsculas, minúsculas, números y símbolos. Cuanto mayor sea la longitud de la contraseña, más difícil será que un ata- cante pueda descubrirla. Es importante evitar compartir la clave de la red Wi-Fi con otras per-  sonas, pues quien tenga acceso a tu red inalámbrica podría tener acceso a todos los dispositivos conectados a ella. Es importante evitar la conexión a redes Wi-Fi públicas abiertas (o  Hotspots Wi-Fi). Estas redes son totalmente inseguras ya que permiten que cualquier dispositivo se conecte al Ruteador sin ningún tipo de seguridad, por lo que cualquier usuario podría capturar la información que se transmita a través de dicha conexión. [email protected] 378 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

De ser posible usar …ltrado por MAC para asegurar que cada dispositivo  que acceda a la red sea el autorizado por el administrador de la misma.

VPN o red privada virtual (Virtual Private Network, VPN) es un ser- vicio mediante el cual se establece una conexión segura a través de internet, entre los usuarios y los servicios o páginas Web de internet a los que éstos acceden. Si imaginamos el internet como un río en el que ‡uye el agua (datos e información), la VPN es un tubo, sumergido en el río, que impide ver todo lo que pasa dentro de él, debido a que la conexión entre los dispositivos y el servidor VPN siempre está cifrada (protegida). De esa manera, si alguien interceptara tus comunicaciones, sería incapaz de interpretar la información transmitida. En algunas ocasiones, las empresas ponen a disposición de sus empleados acceso a través de VPN; de no ser éste el caso o para añadir una capa extra de seguridad a tus comunicaciones personales, las VPN pueden contratarse como servicio (no se recomienda utilizar servicios de VPN gratuitos, pues éstos podrían tener el efecto contrario al deseado de proteger la información). En este sentido, es esencial utilizar un servidor VPN de con…anza para el teletrabajo. Como usuario de una conexión VPN, somos capaces de establecer comu- nicación con servidores alojados en todo el mundo. ¿Esto qué quiere decir? entre otras cosas, la página Web que visitemos registrará la IP que ofrece el servidor VPN determinado, y pongamos que se encuentra alojado en Estados Unidos. El sitio Web identi…cará la comunicación como proveniente de este país americano. Y esto ofrece una serie de ventajas como:

Consumir contenido en Streaming de otros países -por una simple cues-  tión de derechos de autor-, cada país cuenta con su propio catálogo de contenidos en Streaming, ya sea Net‡ix o Amazon Prime Video. Incluso existen ciertos servicios exclusivos de un país, imposibles de acceder desde otros. Gracias a una conexión VPN, la orden del servidor para conectarnos a una de estas plataformas llega desde un país extranjero, por lo que el servicio detectará que estamos en ese país y nos ofrecerá el contenido correspondiente. [email protected] 379 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Seguridad en el teletrabajo, gracias a las redes VPN los distintos equipos  de una compañía pueden establecer comunicación entre sí, sin necesi- dad de que estos se encuentren conectados a la misma red. Pueden, incluso, estar en diferentes sucursales de su empresa, situadas en dis- tintos puntos de la geografía mundial. Permitir el acceso a la red local de empresa desde un sitio externo supone un peligro para los datos almacenados. Sin VPN se pueden establecer contraseñas para acceder a esa red local, pero seguirá siendo susceptible de ataque. A través de una red VPN el acceso y la seguridad de los datos están protegidos. Evitar la censura en internet, ciertos países mantienen un control férreo  de lo que lo que sus habitantes pueden consumir o no en internet. Por ello, una manera sencilla y segura de saltarse la censura es habilitando en su ordenador una conexión VPN. Por ejemplo, países como China, Corea del Norte o Emiratos Árabes Unidos captan ciertos contenidos que pueden ser accesibles gracias a la conexión VPN. Seguridad adicional en nuestra navegación, las conexiones VPN pueden  venir acompañadas de un cifrado de la información que se transmite con ellas. Protección en descargas P2P, algunos proveedores bloquean la descarga  de Torrents a través de programas P2P. Y sin tener en cuenta que podemos estar descargando material legítimo. Gracias a las conexiones VPN esto se podrá evitar.

Prevención de Ataques a una Red para mantener un cierto grado de protección de la información conectada a la red, las organizaciones, entidades y personas en general, deben comprender que su seguridad, y las formas en que esta se trata de vulnerar, mejoran constantemente; por tanto, lo principal y primero es entender cómo pueden sucederse estos ataques y en qué consisten dichas amenazas, con el …n de poder remediarlas de la mejor forma posible. Existen diferentes formas efectivas para lidiar y mitigar los ataques que pueden suceder en una red. En función del tipo de ataque, algunas de ellas son: Para prevenir Malware, Adware y Spyware: instalar en los dispositivos  un Software antivirus como primera protección, mantenerlo actualizado [email protected] 380 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

como segunda, y realizar escaneos periódicos como tercera. Ejecutar parches de seguridad en los sistemas operativos que se empleen, realizar copias de seguridad de los datos y emplear contraseñas diferentes y bien formadas para cada servicio al que se accede, con…gurar adecuadamente la seguridad de los navegadores y no descargar de la red aplicaciones o archivos de procedencia desconocida.

Para prevenir Ransomware: La primera recomendación es tener actua-  lizado el sistema operativo y todas las soluciones de seguridad, así como el antivirus y el cortafuegos personal habilitado (Firewall); evitar los ac- cesos administrativos desde fuera de la entidad, y en caso necesario, per- mitirlos sólo mediante protocolos seguros. Activar la visua-lización de las extensiones de los …cheros para evitar ejecución de código dañino ca- mu‡ado como …cheros legítimos no ejecutables, deshabilitar las macros en los documentos, educar a los usuarios de la red para reconocer ame- nazas antes de abrir archivos adjuntos enviados por correo electrónico, y realizar copias periódicas de respaldo de información para sistemas críticos.

Para prevenir el Escaneo de Puertos: una forma efectiva es cerrar los  puertos o servicios que no se utilizan en los sistemas, siempre que sea posible, emplear puertos no conocidos para determinadas aplicaciones (y no los con…gurados por defecto), tener con…gurado un cortafuegos (Firewall), y silenciar o desinformar las respuestas a encuestas de puer- tos.

Para prevenir el Phishing: se recomienda a los usuarios de la red ir  despacio ante cada acción, sin importar la urgencia que se emplee en los mensajes que se reciben; investigar los hechos y sospechar de cualquier comunicación no solicitada o desconocida. Rechazar y no responder ninguna solicitud de información con…dencial como contraseñas o datos de tarjetas de crédito, así como nunca descargar ni ejecutar archivos adjuntos de personas desconocidas.

Para prevenir ataques de Botnets: es necesario cambiar regularmente  las contraseñas de acceso, incluido el Router de conexión; mantener actualizado el sistema operativo y el antivirus instalado, evitar realizar descargas P2P o vía Torrent porque, en muchas ocasiones, es la prin- cipal vía de entrada para estas infecciones, así como limitar el acceso a [email protected] 381 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

sitios cuya seguridad resulte sospechosa.

Para prevenir la Denegación de Servicios (DoS): se deben bloquear di-  recciones IP que no se empleen, así como deshabilitar puertos y servicios de red innecesarios, aplicar …ltros de enrutamiento, permitiendo solo el acceso al trá…co deseado, realizar una efectiva política de contraseñas, así como establecer la cantidad de ancho de banda a emplear por los usuarios.

Para prevenir ataques de intermediario (Man In The Middle, MITM):  la variante más adecuada es encriptar el trá…co que se envía por redes abiertas. Para ello se utilizan las redes virtuales privadas (VPN) y se emplea para los documentos la Infraestructura de las Llaves Públicas (Public key Infrastructure, PKI), Certi…cados Digitales, y una Entidad Certi…cadora, lo que contribuye a proteger los documentos enviados y con…rmar la identidad de los usuarios mediante el cifrado de los men- sajes. Una PKI establece un esquema de con…anza en el cual ambas partes de una comunicación electrónica confían en un ente emisor para que veri…que y con…rme la identidad de ambas.

11.2.12 Ataques con Técnicas de Inteligencia Social Los ataques de ingeniería social buscan engañar a los usuarios para obtener nombres de usuario y contraseñas, así como otra información sensible. La capacidad de identi…car un ataque de ingeniería social minimiza, en gran medida, el riesgo de ser víctimas de los ciberdelincuentes y ver comprometida información personal o de la organización para la que trabajamos. Para ello, se recomienda:

Estar alertas ante comunicaciones, como llamadas, correos electrónicos,  mensajes cortos (SMS), enlaces de teleconferencias e invitaciones de calendario de remitentes desconocidos.

Antes de abrir cualquier enlace, archivo anexo, mensaje de texto o  llamada de un remitente desconocido, hay que preguntarse lo siguiente:

¿Espero esa información? Si el mensaje proviene de un remi- tente desconocido (persona u organización), analizar bien antes de responder o hacer clic y/o descargar cualquier archivo adjunto. [email protected] 382 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

¿Reconozco al remitente? Comprobar si la dirección está bien escrita (veri…car que no haga falta ninguna letra, por ejemplo) y si el dominio (la terminación del correo electrónico) es de con…anza y corresponde al nombre de quien envía el mensaje. ¿Solicitan que haga algo? Los correos electrónicos fraudulentos (Phishing) o los mensajes de texto de este tipo (Smishing) suelen pedir que se realice alguna acción como: hacer Clic en un hiper- vínculo, descargar algún archivo, responder al mensaje proporcio- nando información personal, etc. Con frecuencia, buscan generar una sensación de urgencia y provocar una reacción inmediata e irracional. Es necesario analizar con calma antes de proporcionar cualquier información que pudiera resultar comprometedora. Se debe descon…ar, particularmente, de los mensajes que pare- cerían genéricos (como "Estimados:", "A quien corresponda:", etc.). En el caso de comunicaciones referentes a instituciones banca- rias y …nancieras, se recomienda nunca dar Clic en los enlaces contenidos en un correo o mensaje y no proporcionar información de acceso a tus cuentas. Si tienes alguna duda, debes contac- tar directamente a tu institución …nanciera (utilizando el número telefónico que vienen atrás de tu tarjeta, por ejemplo) para más orientación.

Siempre hemos de tener presente que garantizar la protección absoluta de su información digital es difícil sino imposible, pero debemos aprovechar todas las herramientas y avances que están a nuestro alcance. De esta forma, estaremos mejorando la seguridad de nuestros datos personales y sus con- tenidos. Son pequeños gestos diarios que, en caso de problemas, marcarán una gran diferencia.

11.3 Meltdown, Spectre y lo que se Acumule El tres de enero del 2018 se dio a conocer al público, que 6 meses antes se habían detectado dos distintos fallos en los procesadores de los equipos de cómputo, comunicaciones y redes de internet que usamos. Esto para dar tiempo a los desarrolladores de procesadores y de sistemas operativos de implementar estrategias para mitigar el problema. Estos son problemas [email protected] 383 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM de diseño de los procesadores de Intel, AMD, IBM POWER y ARM, esto signi…ca que procesos con privilegios bajos (aquellos que lanzan las aplica- ciones de usuarios convencionales) podían acceder a la memoria del Kernel del sistema operativo. Un ataque que explotase dicho problema permitiría a un Software mali- cioso espiar lo que están haciendo otros procesos y también espiar los datos que están en esa memoria en el equipo de cómputo (o dispositivo móvil) ata- cado. En máquinas y servidores multiusuario, un proceso en una máquina virtual podría indagar en los datos de los procesos de otros procesos en ese servidor compartido. Ese primer problema, es en realidad solo parte del desastre. Los datos actuales provienen especialmente de un grupo de investigadores de seguridad formados por expertos del llamado Project Zero89 de Google. Ellos han publicado los detalles de dos ataques (no son los únicos90) basados en estos fallos de diseño. Los nombres de esos ataques son Meltdown y Spectre. Y en un sitio Web dedicado a describir estas vulnerabilidades destacaban que "aunque los programas normalmente no tienen permiso para leer datos de otros programas, un programa malicioso podría explotar Meltdown, Spectre y apropiarse de secretos almacenados en la memoria de otros programas". Como revelan en su estudio, la diferencia fundamental entre ambos es que Meltdown permite acceder a la memoria del sistema, mientras que Spectre permite acceder a la memoria de otras aplicaciones para robar esos datos.

En GNU/Linux, el Kernel (si usamos una versión actualizada) nos indica las fallas del procesador a las que es vulnerable, usando:

$ cat /proc/cpuinfo

89 https://googleprojectzero.blogspot.com/ 90 Entre las distintas vulnerabilidades detectadas y sus variantes resaltan: Meltdown (AC, DE, P, SM, SS, UD, GP, NM, RW, XD, BR, PK, BND), Spectre (PHT, BTB, RSB, STL, SSB, RSRE), PortSmash, Foreshadow, Spoiler, ZombieLoad (1 y 2), Kaiser, RIDL, Plundervolt, LVI, Take a Way, Collide+Probe, Load+Reload, LVI-LFB, MSD, CSME, RYZENFALL (1, 2, 3, 4), FALLOUT (1, 2, 3) , CHIMERA (FW, HW), MASTERKEY (1, 2, 3), SWAPGS, ITLB_Multihit, SRBDS, L1TF, etc. Más información en:

https://cve.mitre.org https://meltdownattack.com/

[email protected] 384 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Ya que Meltdown y Spectre son problemas de diseño en los procesadores, no es posible encontrar solución por Hardware para los procesadores exis- tentes y dado que constantemente aparecen nuevas formas de explotar dichos fallos, la única manera de mantener el equipo de cómputo, comunicaciones y redes de internet a salvo es mediante Software que debe implementar las soluciones en los sistemas operativos. En particular en el Kernel de Linux se trabaja en parchar en cada versión del Kernel todos los fallos reportados, por esto y por otra gama de fallos e inseguridades es necesario mantener siempre el sistema operativo y sus aplicaciones actualizadas. Como se había comentado anteriormente, estos problemas de diseño afec- tan a todos los procesadores Intel, AMD, IBM POWER y ARM. Eso incluye básicamente a todos los procesadores que están funcionando al día de hoy en nuestros equipos, ya que estos procesadores llevan produciéndose desde 1995. Afecta a una amplia gama de sistemas. En el momento de hacerse pública su existencia se incluían todos los dis- positivos que no utilizasen una versión convenientemente parcheada de IOS, GNU/Linux, MacOS, Android, Windows y Android. Por lo tanto, muchos servidores y servicios en la nube se han visto impactados, así como poten- cialmente la mayoría de dispositivos inteligentes y sistemas embebidos que utilizan procesadores con arquitectura ARM (dispositivos móviles, televisores inteligentes y otros), incluyendo una amplia gama de equipo usado en redes. Se ha considerado que una solución basada únicamente en Software para es- tas fallas enlentecería los equipos de cómputo entre un 20 y un 40 por ciento dependiendo de la tarea que realizasen y el procesador del equipo.

¿Qué es Meltdown? este fallo explota una condición de carrera inhe- rente al diseño de muchas CPU actuales. Esta condición se da entre los accesos a la memoria y la comprobación de privilegios durante el proce- samiento de instrucciones. Además, en combinación con un ataque de canal lateral a la memoria caché de la CPU, esta vulnerabilidad permite que un proceso se salte las comprobaciones habituales de nivel de privilegio que nor- malmente aislarían al proceso maligno e impedirían que accediese a datos que pertenecen al sistema operativo y otros procesos concurrentes. La vulnerabilidad permite que un proceso no autorizado lea información de cualquier dirección mapeada al espacio de memoria del proceso actual. Dado que la segmentación de instrucciones reside en los procesadores afec- tados, la información de una dirección no autorizada casi siempre se cargará [email protected] 385 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM temporalmente en la memoria caché de la CPU durante la ejecución fuera de orden, pudiendo posteriormente leerse desde la memoria caché. Esto puede suceder incluso cuando la instrucción de lectura original falla debido a una comprobación de privilegios que da negativo, o cuando no produce un resul- tado legible. Dado que muchos sistemas operativos mapean la memoria física, los pro- cesos del núcleo y otros procesos del espacio de usuario en el espacio de di- recciones de cada proceso, Meltdown permite que un proceso maligno pueda leer cualquier memoria mapeada física, del núcleo o de otro proceso, con in- dependencia de si debería o no poder hacerlo. Las defensas contra Meltdown exigirían evitar el uso del mapeo de memoria de un modo que resultase vul- nerable a tales amenazas (una solución basada en Software), o bien evitar la condición de carrera subyacente (una modi…cación del microcódigo de la CPU o la ruta de ejecución). El agujero es viable en cualquier sistema operativo en el que la información privilegiada se mapea a memoria virtual para procesos no privilegiados, una característica que incorporan muchos sistemas operativos actuales. Por lo tanto, potencialmente Meltdown puede afectar a una gama de dispositivos mayor que la identi…cada actualmente, dado que apenas hay variaciones entre las familias de microprocesadores utilizados por estos sistemas.

¿Qué es Spectre? es una vulnerabilidad que permite a los programas alojados en el sistema operativo del usuario acceder a una dirección arbitraria del espacio de memoria de un programa. En lugar de una única vulnerabi- lidad de fácil corrección, el documento de Spectre describe una clase entera de vulnerabilidades potenciales. Todas esas vulnerabilidades se basan en explotar los efectos secundarios de la ejecución especulativa, una técnica empleada comúnmente para combatir la latencia de la memoria y acelerar así la ejecución en los microprocesadores modernos. En particular, Spectre se centra en la predicción de saltos, un caso especial de la ejecución especulativa. A diferencia de la vulnerabilidad Meltdown hecha pública la misma fecha, Spectre no depende de una característica en particular de la gestión de memoria de un procesador en concreto o de cómo proteja el acceso a esa memoria, sino que tiene un enfoque más general. El punto de partida del documento de Spectre es un ataque sincronizado de canal lateral aplicado al sistema de predicción de saltos de un micro- procesador moderno que utilice ejecución fuera de orden. Si bien al nivel [email protected] 386 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM arquitectónico documentado en las hojas técnicas de los procesadores los resultados de un fallo en la predicción se especi…can que quedarán anulados tras darse dicha circunstancia, la ejecución especulativa resultante puede aun así dejar efectos colaterales, como líneas de caché cargadas con determinada información. Estos efectos colaterales pueden posteriormente afectar a los denominados aspectos no funcionales del sistema informático. Si tales efectos colaterales -incluyendo, entre otros, los tiempos de acceso a la memoria- resultan visibles para un programa malicioso, y puede hacerse que esos efectos dependan de información sensible en posesión del proceso que hace las veces de víctima, entonces estos efectos colatelares pueden hacer que la información sensible resulte deducible. Esto puede ocurrir aunque los sistemas de seguridad for- males a nivel de arquitectura funcionen de forma correcta -lo que sucede es que las optimizaciones en los niveles más bajos a nivel de microarquitectura dirigidas a la aceleración la ejecución de código pueden revelar información no esencial para la correcta ejecución de un programa-.

Falla en los Procesadores Snapdragon El día 8 de agosto del 2020 se publico que los procesadores Qualcomm Snapdragon91 de más de 3 mil millones de dispositivos Android del mundo son vulnerables a ataques que pueden convertirlos en herramientas de espionaje al explotar más de cua- trocientas vulnerabilidades y no se sabe cuando Google y los fabricantes de dispositivos móviles incorporaraán la solución de Qualcomm. Las vulnerabilidades pueden explotarse cuando un objetivo descarga un video u otro contenido que es procesado por el chip. Los objetivos tam- bién pueden ser atacados instalando aplicaciones maliciosas que no requieren ningún permiso. Desde allí, los atacantes pueden monitorear ubicaciones y escuchar audio cercano en tiempo real y …ltrar fotos y videos. Las infec- ciones se pueden ocultar del sistema operativo de tal manera que di…culta la desinfección. Snapdragon es lo que se conoce como un sistema en un chip que propor- ciona una gran cantidad de componentes, como una CPU y un procesador de grá…cos. Una de las funciones conocida como procesamiento de señal digital o DSP, aborda una variedad de tareas, incluidas las capacidades de carga y de las funciones de video, audio, realidad aumentada y otras funciones

91 Representa a más del 40% de los teléfonos inteligentes del mercado incluyendo a los teléfonos de las compañías Google, Samsung, LG, Xiaomi, OnePlus, Motorola, etc. [email protected] 387 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM multimedia. Los investigadores de la …rma de seguridad Check Point en un breve in- forme sobre las vulnerabilidades que descubrieron indican que estos Chips introducen una nueva super…cie de ataque y puntos débiles en estos dispos- itivos móviles por las múltiples vulnerabilidades de los DSP. Qualcomm ha lanzado una solución a las fallas, pero hasta el momento no se han incorpo- rado al sistema operativo Android. Por el momento Check Point está reteniendo detalles técnicos sobre las vulnerabilidades y cómo se pueden explotar hasta que las soluciones lleguen a los dispositivos del usuario …nal. Check Point ha denominado a las vulne- rabilidades Achilles. Los más de 400 errores distintos se rastrean como: CVE-2020-11201, CVE-2020-11202, CVE-2020-11206, CVE-2020- 11207, CVE-2020-11208 y CVE-2020-11209. En un comunicado, los funcionarios de Qualcomm dijeron: "Con respecto a la vulnerabilidad de Qualcomm Compute DSP revelada por Check Point, trabajamos diligentemente para validar el problema y poner las mitigaciones adecuadas a disposición de los OEM. No tenemos evidencia de que esté siendo explotado actualmente. Alentamos a los usuarios …nales a actualizar sus dispositivos a medida que los parches estén disponibles y solo a instalar aplicaciones de ubicaciones con…ables como Google Play Store". No hay mucha orientación útil para proporcionar a los usuarios cómo protegerse contra estos ataques. Descargar aplicaciones solo desde Play puede ayudar, pero el historial de veri…cación de aplicaciones de Google muestra que los consejos tienen una e…cacia limitada. Tampoco hay forma de identi…car e…cazmente el contenido multimedia explotable.

Falla en el Chip T2 de las Mac Expertos en ciberseguridad de la em- presa belga ironPeak han con…rmado los rumores de que los chips de se- guridad T2 pueden llegar a ser hackeados: una determinada combinación de dos ’exploits’diferentes proporciona al atacante la oportunidad no sólo de cambiar el comportamiento del chip, sino incluso de instalar Malware en el mismo (como keyloggers). Y hay tres factores que hacen que esta noticia resulte especialmente chocante... y preocupante: Que el objetivo de estos Chips T2 es precisamente el de salvaguardar  la seguridad de los datos: se trata de un procesador independiente [email protected] 388 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

que actúa de intermediario entre la CPU y el sistema operativo y que permite supervisar que sólo se ejecute en el equipo Software aprobado por Apple.

Que el Chip T2 viene instalado en todos los iMac Pro, Macbook Pro  y Macbook Air vendidos desde 2018, en todos los Mac Pro desde 2019 y en todos los iMac del 2020. Es decir, afecta a un número notable de usuarios.

Pero lo peor de todo es que, aunque el atacante puede modi…car el  comportamiento del Chip T2, la vulnerabilidad no puede ser parcheada preventivamente, porque ésta se basa precisamente en la escritura del apartado de sólo lectura del Chip.

¿Cómo Funciona este Ataque? los Exploits usados para esta clase de ataque son dos que ya se venían usando para aplicar el Jailbreak a dispos- itivos iOS (el T2 está basado en el chip A10, usado por los iPhones más an- tiguos). Según ironPeak, este método funciona porque: "Apple dejó abierta una interfaz de depuración cuando envió los Chips T2 a los clientes, lo que permite a cualquiera entrar en el modo de actualización de Firmware del dispositivo sin autenticación". Con este método, es posible crear un cable USB-C que puede explotar automáticamente la vulnerabilidad de su dispositivo MacOS durante el ar- ranque. Esto permite a un atacante obtener acceso root sobre el Chip T2 y modi…car o controlar cualquier cosa que se ejecute en el dispositivo atacado. El lado bueno de esto es que, como habrás deducido de leer lo anterior, esta clase de ataque requiere de acceso físico para funcionar (idealmente, de varios accesos físicos). En principio, el riego para un usuario medio de Mac es bastante bajo (otra cosa son aquellos equipos integrados en redes de grandes empresas y organismos públicos). Ante la imposibilidad de parchearlo, desde ironPeak se muestran conven- cidos de que Apple desarrollará una nueva versión del T2 para los próximos equipos que lance al mercado... la cual dejará de ser necesaria cuando desem- barque la próxima generación Apple Silicon, que traerá incluidas las funciones de seguridad en el propio Chip ARM.

[email protected] 389 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

11.4 Distribuciones de Linux «Seguras y para Pene- tración» Para muchos, Linux y Mac OS son dos sistemas operativos más seguros que Windows de Microsoft, pero con todo, hay algunas distribuciones especia- lizadas de Linux que satisfacen las necesidades de temas relacionados con la seguridad, pruebas de penetración, análisis forense y auditorías de seguridad. Las distribuciones seguras intentan preservar la privacidad y el anoni- mato, ayudan a utilizar internet de forma anónima y evitar la censura en prácticamente cualquier lugar y cualquier equipo de cómputo, pero sin dejar rastro a menos que lo solicites explícitamente. Las distribuciones para pruebas de penetración ofrecen herramientas para penetración, análisis forense y auditorías de seguridad en donde se realizan distintos tipos de tareas que identi…can, en una infraestructura objetivo, las vulnerabilidades que podrían explotarse y los daños que podría causar un atacante. En otras palabras, se realiza un proceso de Hacking ético para identi…car qué incidentes podrían ocurrir antes de que sucedan y, posterior- mente, reparar o mejorar el sistema, de tal forma que se eviten estos ataques. Las distribuciones anónimas ofrecen niveles adicionales de privacidad y seguridad y se complementan con las distribuciones para pruebas de pe- netración que ofrecen herramientas para penetración y auditorías de seguri- dad (mediante el uso de tecnologías como TOR92, Sandbox93, Firewall94,

92 Tor es una red abierta y distribuida que te ayuda a defenderte de una forma de vigilancia en la red que amenaza tu libertad y privacidad, tus actividades comerciales con…denciales y relaciones, además de la seguridad gubernamental. Además, te protege redirigiendo tus comunicaciones alrededor de una red distribuida de retransmisores rea- lizados por voluntarios alrededor del mundo: lo cual previene que alguien observe tus comunicaciones a partir de los sitios que visitas, también evita que los sitios en que navegas obtengan tu ubicación física. 93 Sandbox es un mecanismo para ejecutar programas con seguridad y de manera sepa- rada. A menudo se utiliza para ejecutar código nuevo, o Software de dudosa con…abilidad proveniente de terceros. Ese entorno aislado permite controlar de cerca los recursos pro- porcionados a los programas cliente a ejecutarse, tales como espacio temporal en discos y memoria. Habitualmente se restringen las capacidades de acceso a redes, la habilidad de inspeccionar la máquina an…trión y dispositivos de entrada entre otros. En este sentido, el aislamiento de procesos es un ejemplo especí…co de virtualización. 94 Un cortafuegos es una parte de un sistema o una red que está diseñada para bloquear el acceso no autorizado, permitiendo al mismo tiempo comunicaciones autorizadas. Se trata de un dispositivo o conjunto de dispositivos con…gurados para permitir, limitar, cifrar o descifrar el trá…co entre los diferentes ámbitos sobre la base de un conjunto de normas y [email protected] 390 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM herramientas criptográ…cas95, etc.). De ambos tipos de hay varias alternativas diferentes, tanto comerciales como de Software libre, por lo que decidirse por una u otra, en ocasiones puede ser una tarea un tanto compli- cada. Es por ello que aquí listamos algunas de las distribuciones de Linux más usadas en la actualidad, apartados con los que cada vez debemos prestar más atención. Las distribuciones seguras y para penetración son sistemas operativos Live96 diseñados para ser usados desde un CD, DVD, memoria USB o máquina virtual independientemente del sistema operativo original de la computadora.

Distribuciones de GNU/Linux «Seguras»

Tails (https://tails.boum.org/) Para muchos esta es la primera opción a la hora de buscar una solución de seguridad en Linux. También conocida como «The Amnesic Incognito Live System» , esta es una distribución basada en Debian. Es un proyecto de código abierto que se publicó por primera vez hace 8 años y que redirige todo el trá…co Web a través de Tor logrando la privacidad a través del anonimato. Además, almacena todo en la RAM y evita el uso del disco duro, por lo que borra todo una vez se apaga. La imagen tiene un tamaño menor de 1.2 GB y necesita al menos 2 GB de RAM en un equipo de 64 bits, se puede usar en formato Live, como máquina Virtual o bien instalarse en una USB, DVD o en el disco duro del equipo.

Whonix (https://www.whonix.org/) Es una distribución que se basa en Debian y consta de dos máquinas virtuales, una es Tor Gateway que se ejecuta en Debian, mientras que la otros criterios. Los cortafuegos se utilizan con frecuencia para evitar que los usuarios de internet no autorizados tengan acceso a redes privadas, especialmente intranets. 95 El surgimiento de redes de comunicación, en particular de internet, ha abierto nuevas posibilidades para el intercambio de información. Al mismo tiempo, son cada vez mayores las amenazas a la seguridad de la información que se transmite. Es necesario entonces, crear diferentes mecanismos, dirigidos a garantizar la con…dencialidad y autenticidad de los documentos electrónicos, todo ello es parte de la Criptografía. 96 Linux es uno de los sistemas operativos pioneros en ejecutar de forma autónoma o sin instalar en la computadora, existen diferentes distribuciones Live -descargables para formato CD, DVD, USB- de sistemas operativos y múltiples aplicaciones almacenados en un medio extraíble, que pueden ejecutarse directamente en una computadora, estos se descargan de la Web generalmente en formato ISO. [email protected] 391 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM otra es una Workstation. Whonix se instala en un sistema operativo Host proporcionado por el usuario que puede ser Linux, Windows, MacOS o Qubes OS. Así al utilizar la red abierta y distribuida de transmisión de Tor, Whonix echa abajo las posibilidades de vigilancia de la Red. Además, y por motivos de seguridad, hace todo lo posible para ocultar nuestra dirección IP real.

Qubes OS (https://www.qubes-os.org/) Se conoce como uno de los sistemas operativos más seguros del mundo y se basa en realizar la virtualización mediante el «hipervisor » -un hipervisor imita el Hardware y permite ejecutar varias máquinas virtuales simultáneamente-. El entorno de usuario de Qubes OS podría ser Fedora, Debian, Whoix o Windows y, al igual que Tails. Así mismo utiliza diferentes dominios para separar los niveles de con…anza, por ejemplo, un dominio de trabajo, un dominio para el ocio, etc.; los cuales se ejecutan en diferentes máquinas virtuales, esta versión requiere un mínimo de 16 GB de RAM.

Subgraph OS (https://subgraph.com/) Nos encontramos con un sistema operativo seguro basado en Debian que promete proporcionar una experiencia digital anónima. Ha sido diseñado para evitar diferentes ataques de Malware, es capaz de ser una plataforma de comunicación segura además de proporcionar una interfaz de usuario muy sencilla.

Discreete Linux (https://www.privacy-cd.org/) En este caso nos encontramos con un proyecto de Software libre que puede ser utilizado por cualquier persona que desee llevar una vida digital anónima también basado en Debian. Además, protege a sus usuarios contra los ataques de vigilancia accionados por troyanos y hoy en día esta en fase Beta. Es una de las alternativas más adecuadas para los usuarios que no tienen un conocimiento muy profundo de estos sistemas pero que consideran la seguridad en internet como su principal preocupación. Hace uso de cifrados y entornos aislados para proporcionar un entorno de trabajo seguro. Así mismo no utiliza los discos duros internos del equipo, ya que almacena todos sus datos en la memoria RAM o en una unidad de disco USB externa.

Kodachi (https://www.digi77.com/linux-kodachi/)

[email protected] 392 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Es un sistema operativo centrado en la seguridad y basado en Debian cuyo objetivo es proporcionar una experiencia informática segura. Ponerlo en marcha es muy sencillo y no necesita demasiado tiempo, ya que permite la opción de arrancar desde el Hardware del PC, o desde una unidad USB externa para mayor seguridad. Hace uso de elementos tales como una cone- xión VPN activa, el servicio TOR y DNScrypt con el que garantiza un buen nivel de privacidad. Además, todo el sistema operativo se ejecuta desde la memoria RAM del equipo, por lo que después de apagado no queda ningún rastro de actividad.

Tens (https://www.spi.dod.mil/lipose.htm) También conocido como Trusted End Node Security, este sistema es distribuido y desarrollado por el Departamento de Defensa de los Estados Unidos. Se basa en Arch Linux y puede ejecutarse en cualquier equipo con tecnología Intel. Sólo arranca desde la RAM y viene cargado con un asis- tente de encriptación, un Software de encriptación simple y potente para la protección de nuestra información con…dencial.

Tin Hat (https://sourceforge.net/projects/tinhat/) Esta propuesta es una derivación de y es un sistema operativo seguro que se ejecuta en su totalidad en la RAM del equipo, por lo que no monta ningún sistema de archivos directamente en el dispositivo de arranque, evitando así la posibilidad de dejar expuesto cualquier dato. Como era de esperar, podremos arrancarlo desde un CD o desde una unidad ‡ash USB. Puede ejecutarse tanto en arquitecturas de Hardware de 32 como de 64 bits y es recomendable tener conocimientos previos de .

IprediaOS (https://www.ipredia.org/os/) Para empezar diremos que I2P es una capa de comunicación P2P anónima que se crea utilizando herramientas de código abierto, algo en lo que se basa IprediaOS, ya que orienta todo su trá…co a través de I2P y se asegura de que toda su actividad Online no pueda ser interceptada por terceros. Así hace uso de múltiples capas de cifrado y cabe mencionar que la red I2P es una red dinámica y distribuida.

Alpine Linux (https://alpinelinux.org/)

[email protected] 393 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Es una distribución diseñada principalmente para los usuarios avanzados que valoran la seguridad, la e…ciencia de recursos y la simplicidad. En un principio parte como bifurcación del proyecto LEAF aunque, a diferencia de este, Alpine mejora las características de seguridad y cuenta con un Kernel más actual. Su funcionamiento se centra en la privacidad, por lo que utiliza su propio sistema de gestión de paquetes.

Openwall (https://www.openwall.com/Owl/) Es una pequeña distribución de Linux con seguridad mejorada (SELinux) para servidores, dispositivos y dispositivos virtuales. A diferencia de otras distribuciones, el uso de SELinux por parte de Openwall evita que se incor- pore Software vulnerable a la distribución, en lugar de depender de parches para remediar vulnerabilidades de seguridad conocidas o características dise- ñadas para disminuir el impacto de los errores de seguridad. Mediante el uso del marco SELinux, Openwall eclipsa a la mayoría de sus contrapartes más grandes en este sentido.

Distribuciones de GNU/Linux «Para Penetración» Realizar prue- bas de penetración, análisis forense y auditorías de seguridad resulta ser una tarea compleja e involucra un proceso en donde se realizan distintos tipos de tareas que identi…can, en una infraestructura objetivo, las vulnerabili- dades que podrían explotarse y los daños que podría causar un atacante. En otras palabras, se realiza un proceso de Hacking ético para identi…car qué incidentes podrían ocurrir antes de que sucedan y, posteriormente, reparar o mejorar el sistema, de tal forma que se eviten estos ataques. Para realizar una prueba de penetración de forma profesional, es nece- sario sumar a los conocimientos de Hacking ético, otros aspectos fundamen- tales como: programación, metodologías, documentación, entre otros. No obstante, esos aprendizajes suelen venir una vez que se conocen y se saben utilizar muchas herramientas que son parte del proceso de pruebas de pene- tración. Las siguientes herramientas se deben conocer, instalar y probar para dar los primeros pasos en este "arte".

Kali Linux (https://www.kali.org) Es una distribución para pruebas de penetración estándar de la indus- tria. Es una de las distribuciones más populares entre Pentesters, Hackers

[email protected] 394 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

éticos e investigadores de seguridad en todo el mundo y contiene cientos de herramientas para el trabajo forense, esta distribución es basada en Debian.

Parrot OS (https://parrotlinux.org) Puede verse como un laboratorio totalmente portátil para una amplia gama de operaciones de seguridad cibernética, desde pruebas de penetración hasta ingeniería inversa y análisis forense digital, pero esta distribución basada en Debian también incluye todo lo que necesita para proteger sus datos y de- sarrollar su propio Software.

BlackArch Linux (https://blackarch.org) Esta popular distribución de pruebas de penetración proviene de Arch Linux y contiene más de 2,400 herramientas de penetración y análisis forense diferentes, lo que le permite usar lo que necesite sin tener que descargar nuevas herramientas.

BackBox (https://www.backbox.org/) Es una distribución de Linux basada en Ubuntu destinada a ayudar a Hackers éticos y probadores de penetración en evaluaciones de seguridad. BackBox OS está diseñado con el objetivo de ser más rápido, fácil de operar y tener un entorno de escritorio mínimo. La ventaja clave de BackBox es que sus propios repositorios de software se actualizan a intervalos regulares para mantener la distribución estable y popular para las operaciones del mundo real.

DEFT Linux (http://www.linuxandubuntu.com/home/deft-linux-a-linux- distribution-for-computer-forensics) DEFT (Digital Evidence and Forensics Toolkit) se basa en GNU Linux y DART (Digital Advanced Response Toolkit), un sistema forense que com- prende algunas de las mejores herramientas para la respuesta forense y de incidentes. DEFT Linux está especialmente diseñado para llevar a cabo ta- reas forenses y se ejecuta en vivo en los sistemas sin alterar el disco duro o cualquier otro medio de almacenamiento. Se compone de más de 100 he- rramientas forenses y de piratería de alta cali…cación.

Network Security Toolkit (https://www.networksecuritytoolkit.org) [email protected] 395 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

El (NST), basado en Fedora, es una versión Live que consta de las 125 principales herramientas de seguridad de código abierto proporcionadas por insecure.org para validar la seguridad de la red, pruebas de penetración, diagnósticos de red y monitoreo del día. El objetivo principal detrás del desarrollo de NST es proporcionar a los administradores de red/sistemas un conjunto combinado de herramientas de seguridad de código abierto para llevar a cabo operaciones como análisis de trá…co de red, detección de intrusos, escaneo de red y parches de seguridad.

Otras Distribuciones Útiles Existe una gran variedad de distribuciones Live de Linux (The LiveCD List https://livecdlist.com/) que permiten hacer una gran cantidad de cosas útiles, a continuación damos una lista de algunas de ellas:

KNOPPIX (http://www.knoppix.org/)  GNOME Partition Editor (https://gparted.org/)  System Rescue (https://www.system-rescue.org)  Parted Magic (https://partedmagic.com/)  Ultimate Boot (https://www.ultimatebootcd.com/)  Super Grub2 (https://www.supergrubdisk.org/)  Rescatux (https://www.supergrubdisk.org/rescatux/)  Rescue (https://en.altlinux.org/Rescue)  Ddrescue (https://www.gnu.org/software/ddrescue/)  INSERT (http://www.inside-security.de/insert.html)  Boot-repair (https://sourceforge.net/p/boot-repair/home/Home/)  Rescuezilla (https://rescuezilla.com/)  Clonezilla (https://clonezilla.org/)  Redo Backup (ww12.redobackup.org)  [email protected] 396 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Mondo Rescue (www.mondorescue.org)  Live Wi…slax (https://www.wi…slax.com/)  (http://puppylinux.com/)  (http://tinycorelinux.net/)  Debian Live (https://www.debian.org/CD/live/)  Ubuntu (https://ubuntu.com/) 

[email protected] 397 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

12 Consideraciones y Comentarios Finales

Los paquetes comerciales — de Software propietario— en general proveen un ambiente integrado de trabajo que puede ser usado en la preparación de estudiantes para aplicar sus conocimientos al egresar en las diversas áreas de las carreras que imparte la UNAM, esto les permite laborar en empre- sas pequeñas, medianas y grandes con un mínimo de capacitación técnica adicional. Además, en un mercado tan competitivo como el actual, las organiza- ciones actuales focalizan sus recursos en las estrategias más adecuadas para conducir a la compañía hacia el éxito. Los paquetes propietarios y los inci- pientes paquetes de Software libre pueden ayudar a conseguir este objetivo, completando la inversión ya realizada en sistemas operacionales. Pero el hecho de que las organizaciones actuales, manejan una gran can- tidad de información, la cual puede o no estar dispersa en sus múltiples sistemas operacionales, requiere usar paquetes propietarios que tengan inte- grado el manejo de las grandes bases de datos distribuidas o centralizadas, esta integración ofrece bene…cios adicionales.

Por otro lado, notemos que, una vez que un producto de Software libre ha empezado a circular, rápidamente esta disponible a un costo muy bajo. Al mismo tiempo, su utilidad no decrece. El Software, en general, podría ser considerado un bien de uso inagotable, tomando en cuenta que su costo marginal es pequeño y que no es un bien sujeto a rivalidad (la posesión del bien por un agente económico no impide que otro lo posea). Puesto que el Software libre permite el libre uso, modi…cación y redis- tribución, a menudo encuentra un hogar entre usuarios para los cuales el coste del Software no libre es a veces prohibitivo, o como alternativa a la piratería (véase 14.3). También es sencillo modi…carlo localmente, lo que permite que sean posibles los esfuerzos de traducción a idiomas que no son necesariamente rentables comercialmente. La mayoría del Software libre se produce por equipos internacionales que cooperan a través de la libre asociación. Los equipos estan típicamente com- puestos por individuos con una amplia variedad de motivaciones, y pueden provenir tanto del sector privado, del sector voluntario o del sector público. En México el Software libre nació en las Universidades y los Centros de Investigación. Es por eso que, desde hace tres décadas, los estudiantes y los profesores usan Software libre para …nes didácticos y de investigación. Las [email protected] 398 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM universidades suelen optar por el uso de Software libre en vez de utilizar Software privativo porque satisface de una mejor manera sus necesidades de cómputo, dada su naturaleza de apertura del código y la libertad de compartir los resultados obtenidos. De forma colateral, no se tienen gastos adicionales derivados del pago de licenciamientos.

12.1 Integración del Cómputo en las Carreras de Cien- cias El uso de programas de cómputo esta integrado a las carreras de la Facul- tad de Ciencias desde hace mucho tiempo, pero la gran mayoría se realiza con productos propietarios, lo cual no representa ningún problema técnico, pero si un problema para la institución y estudiantes, ya que las versiones actualmente usadas, no son del todo compatibles entre sí, ello implica que se requiere o tener la última versión del producto o diferentes versiones del mismo para trabajos cotidianos en una misma computadora. El uso de programas de cómputo de Software libre esta cada día más integrado al uso cotidiano que hacen profesores, ayudantes y estudiantes en la Facultad de Ciencias, pero todavía para el Sistema Operativo Windows (véase [3]), así como para paquetes de uso común, no ha sido posible encontrar un adecuado reemplazo, los más comunes son MATLAB, Mathematica, Maple, SPSS, SAS y Microsoft O¢ ce. Para la Facultad de Ciencias y para la Universidad, el contar con las licencias necesarias para que cada máquina a la que los alumnos tienen acce- so cuente con una, es en extremo prohibitivo por el costo. Esto mismo sucede en el caso de los estudiantes, pues el costo de una sola licencia para uso académicos es onerosa más si consideramos la diversidad de programas requeridos para una sola meteria y esto pasa con cada uno de los cursos de la Facultad. Es por ello que el uso de herramientas de Software libre se visualiza como un reemplazo natural a los paquetes propietarios, pero la realidad dista de ser tan simple. Ya que, actualmente no es posible obtener las características mínimas en Software libre para que puedan ser un reemplazo real de los paquetes de propietarios. Este hecho ha ocasionado que existe un uso cada vez más generalizado entre profesores y alumnos a usar Software sin la licencia respectiva (véase 14.3).

En la UNAM, a través de la Dirección General de Cómputo y de Téc- [email protected] 399 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM nologías de la Información y Comunicación se dispone de un restringido número de paquetes y versiones que son puestos a disposición de la comu- nidad universitaria para usar en los equipos personales sin aparente costo para el usuario …nal — pero el costo de dichos paquetes son deducidos por la empresa como una donación, lo cual sí implica un costo real que se deduce en el ejercicio …scal de la empresa donante y éste repercute en los ingresos que el gobierno no recaudará por motivo de impuestos— .

12.2 Ventajas, Desventajas y Carencias del Software Libre Notemos que la ventaja de tener múltiples herramientas para realizar opera- ciones elementales y avanzadas de paquetes de cálculo numérico, simbólico, estadístico y o…mático es en sí misma una gran ventaja. Para los centros universitarios y usuarios ocasionales, las herramientas de Software libre son una herramienta invaluable, en el caso de empresas que requieren usar op- ciones avanzadas o generadas por terceros, los paquetes propietarios destacan como herramientas de trabajo óptimas. Pero para todos los casos, hay que destacar:

Funcionalidades básicas: Todos los paquetes implementan las funciona-  lidades básicas, ya que todos los paquetes llevan años desarrollándose.

Funcionalidades avanzadas: Por mucho, los paquetes propietarios tienen  implementadas cientos de funciones avanzadas que pueden ser muy útiles para usuarios avanzados, pero rara vez son usados por los usua- rios noveles o cotidianos.

Fiabilidad: En los paquetes en desarrollo son comunes las caídas del  programa, pero en los de Software propietario se destaca por ser más …able que los demás.

Información: El Software propietario son paquetes con una abundante  bibliografía y la propia ayuda del programa.

Facilidad de Manejo: Ninguno de los programas presenta grandes di…-  cultades a la hora de su uso. Pero en menor o mayor medida, todos los paquetes del Software libre presentan entornos de desarrollo funcional, pero perfectible. [email protected] 400 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Costo: El costo de las diversas versiones de Software propietario suele  ser prohibitivo para instituciones educativas y usuarios ocasionales, en el caso del Software libre, los paquetes se pueden descargar de la red sin más costo que el acceso a Internet y los medios de instalación cuando son requeridos.

El Software libre es aún joven, en los miles de proyectos actuales se esta trabajando a diario en mejorar la parte computacional de los algoritmos involucrados en el paquete, haciendo y puliendo interfaces grá…cas, generando ayuda en línea así como la documentación necesaria para que usuarios noveles y avanzados usen la mayor cantidad de opciones programadas en los paquetes. Para muestra de este maravilloso avance, tomemos el proyecto del Ker- nel de Linux y su uso en los sistemas operativos Android, Ubuntu, Debian GNU/Linux, que actualmente se ejecuta en millones de equipos y contiene miles de aplicaciones y estan soportados por una gran cantidad de usuarios y empresas comerciales. Estos han logrado desplazar a muchos de sus competi- dores por sus múltiples bondades y bajo costo de desarrollo, al reusar miles de aplicaciones ya existentes que usan Software libre y permitir desarrollar otro tanto de aplicaciones bajo una plataforma que se ejecutan en los más diversos procesadores. Así también, en los últimos años, muchos proyectos han pasados de ser simples programas en línea de comandos a complejas aplicaciones multi- plataforma — ejecutan en distintos sistemas operativos como son Windows, Linux y Mac— con ambientes grá…cos multimedia que en muchos casos han superado a sus contrapartes comerciales, por ejemplo los navegadores Web tipo FireFox y la suite o…mática tipo Libre O¢ ce, entre muchos otros.

12.3 Comentarios Finales A diferencia de otros paquetes, SPSS, SAS, Microsoft O¢ ce, etc. ofrecen soluciones en forma de una suite completa para la gestión de información para encontrar el llamado poder del conocimiento, pero el costo de las versiones completas y aún las educativas es prohibitivo para la gran mayoría de las instituciones educativas, en particular para la UNAM. Por ello, el resto de los paquetes propietarios y libres ofrecen una ventaja competitiva, al permitirle al profesor y sus estudiantes contar con versiones completas y funcionales en las que pueden ser aplicados los conocimientos adquiridos en los diversos cursos de la carrera. [email protected] 401 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Por otro lado, para reforzar la apropiación del Software libre por parte de la comunidad de la Facultad de Ciencias de la UNAM, es necesario pro- porcionar a la comunidad demostraciones y cursos cortos de las herramientas de Software libre, iniciando con mostrar el uso de sistemas operativos libres basados en Linux. Ello es posible haciendo uso de los sistemas llamados "Live", ya que cada alumno puede probar y usar el sistema operativo en conjunto con cientos de herramientas libres, sin la necesidad de instalar Soft- ware en la máquina que utilice para practicar. Cuando el alumno se sienta cómodo con el sistema, es posible ayudarlo a instalar mediante tutoriales en línea y/o presenciales el sistema en su equipo de cómputo. Lo mismo es posible hacer, al preparar demostraciones del Software que puede reemplazar paquetes muy difundidos en la comunidad como son: MAT- LAB, Mathematica, Maple, SPSS, SAS y Microsoft O¢ ce. Estos cursos no necesariamente se centrarían en las similitudes o diferencias entre paquetes libres y propietarios, más bien, para cautivar a usuarios noveles y futuros ayudantes a dar cursos completos de las herramientas libres mostrando su aplicabilidad en diferentes ramas de las matemáticas aplicadas. Para realizar dichos cursos, se cuenta con todos los recursos necesarios. Por un lado, se dispone de laboratorios y talleres con Software libre instalado en los equipos de cómputo, además, se pueden usar los sistemas "Live" que pueden ser proporcionados en DVDs o en unidades ‡ash USB. Estas últimas, proporcionan mejor rendimiento, pueden ser actualizadas y reutilizados tan- tas veces como sea necesario para conocer uno o más sistemas operativos. Estos sistemas "Live" pueden ser generados por el propio usuario, usando las decenas de paquetes disponibles en Windows o Linux que generan sistemas "Live" a partir de las imágenes ISO bajadas de la red — por ejemplo, de sistemas operativos como Knoppix (véase [98])— . De esta forma, se puede coadyvar a que alumnos, ayudantes y profesores conozcan el mundo del Software libre, para que con el tiempo se adopte su uso, sin dejar de lado, el proporcionar cuando sea necesario, cursos de Software privativo pero siempre teniendo en cuenta que se puede — en medida de lo posible— trabajar con paquetes alternativos, como los que proporciona el Software libre. Además, el Software libre ofrece una ventaja competitiva, al permitirle al profesor y sus estudiantes contar con versiones completas y funcionales en las que pueden ser aplicados los conocimientos adquiridos en los diversos cur- sos de las carreras de Ciencias, dejando el manejo especializado de paquetes a cursos avanzados o para cuando el educando realice sus prácticas profe- [email protected] 402 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM sionales. De esta forma se pueden preparar a los estudiantes para aplicar sus conocimientos al egresar en diversas áreas de la carreras de Ciencias y con pocos conocimientos técnicos adicionales puedan laborar en pequeñas, medianas y grandes empresas.

[email protected] 403 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

13 Apéndice A: Cómputo en Instituciones Ed- ucativas

Hace algunos años la disposición de un equipo de cómputo por cada estu- diante era algo difícil de satisfacer para las instituciones educativas. Ahora, las cosas son distintas, cada vez más estudiantes disponen y tienen acceso a dispositivos de cómputo — computadoras de escritorio, portátiles, tabletas, y teléfonos inteligentes— que en principio pareciera que permitirían satisfacer la creciente demanda de recursos computacionales de los estudiantes. Pero una computadora requiere de un sistema operativo además de los diversos paquetes de Software — que esten disponibles para esa versión del sistema operativo— que permitan resolver los problemas para los cuales usa el equipo de cómputo. Aquí es donde empiezan los problemas para los usuarios de equipos de cómputo, puesto que hay una gran cantidad de equipos de cómputo con diversas tecnologías y recursos que soportan alguna versión de sistema operativo acorde a los recursos computacionales del equipo adquirido que no necesariamente soportan a todos y cada uno de los programas de cómputo que el usuario requiere. Ante la creciente necesidad de programas de cómputo podríamos pensar en que cada usuario que requiera hacer uso de ellos tenga acceso a un equipo de cómputo adecuado, conjuntamente con el sistema operativo que lo soporte. Pero esto dista mucho de la realidad, puesto que la gran mayoría de los usuarios no pueden hacer esos gastos y menos una institución educativa.

¿Entonces que opciones tenemos para satisfacer la creciente de- manda de recursos computacionales?

Por un lado, si ya disponemos de un equipo de cómputo con su respec-  tivo sistema operativo, entonces hacer uso de sólo aquellos programas de cómputo que nuestro equipo soporte, teniendo cuidado de no instalar programas de cómputo antagonistas.

Otra opción es, si ya disponemos de un equipo de cómputo, entonces  tener dos o más versiones de sistema operativo que permitan instalar una mayor diversidad de programas de cómputo y tener el cuidado de no instalar programas de cómputo incompatibles. Así, dependiendo de nuestras necesidades podemos hacer uso de uno u otro sistema opera- tivo y sus respectivos programas. [email protected] 404 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

La opción más viable, es una que conjugue las dos anteriores. Pero  además, podríamos emular Hardware del que no disponemos mediante el uso de máquinas virtuales (véase 17) que nos permitirían en un sólo equipo de cómputo usar simultáneamente diversos sistemas operativos para distintas arquitecturas y sus respectivos programas que ahora es posible instalar en las máquinas virtuales programas de cómputo in- compatibles de forma aislada unos de otros.

Usando esta última opción es posible satisfacer en un sólo equipo de cóm- puto una gran variedad de necesidades computacionales. Esto permite que a nivel de usuario (estudiante, ayudante y profesor) o institución educativa, el equipo de cómputo usando Software de virtualización pueda proporcionar un marco que permita satisfacer las diversas y crecientes necesidades com- putacionales. Pero hay que notar que aún esta opción no esta exenta de problemas legales y técnicos, pero en principio es una opción viable para la gran mayoría de los usuarios y la institución educativa. Tomando esto en cuenta, es viable tener una cantidad adecuada de paque- tes de cómputo, que permitieran satisfacer las necesidades especializadas de la gran mayoría de los cursos y estos estar instalados en aquellos espacios en los cuales se asignarían los cursos, además de las áreas comunes de cómputo en la que los estudiantes requiriesen hacer uso de dichos paquetes. Además, de proporcionar un mecanismo para que los profesores y ayudantes que re- quieran enseñar algo con alguna versión privativa que no se disponga, sea implementada — en medida de lo posible— en los paquetes disponibles. Pero hay que hacer notar, que no todas aquellas funciones que hace una versión particular de un paquete, es posible hacerlas con otras versiones o paquetes alternativos. Esto es muy común con ciertas actividades especia-lizadas — al hacer cálculo simbólico, cálculo numérico, manejo de datos y trabajar en entornos de desarrollo— . Ello implicaría, por un lado restringir el Software instalado en los equipos de cómputo o por el otro instalar todas y cada una de las solicitudes de Software, aún cuando se requiera más de una versión de un paquete particular. El restringir el Software instalado, impediría al profesor — que así lo re- quiera por la libertad de cátedra— enseñar aquello que considera que es nece- sario — en particular el manejo de uno o más paquetes especializados de cómputo— para proporcionar las herramientas básicas a sus alumnos y que estos deben de dominar para aprobar su curso. [email protected] 405 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

En el caso de dar ‡exibilidad, para que cada profesor solicite la insta- lación del paquete o los paquetes que requiera para sus cursos, implica que el Software solicitado puede o no contar con licencia adecuada de uso. Así, se estaría permitiendo que se tenga instalado Software del que se viola la licencia de uso (véase 14.3). En cuanto a tener la lista de…nitiva de Software que usaran todos y cada uno de los profesores o ayudantes de los cursos asignados a un espacio es difícil tener antes del inicio del curso — por la costante evolución del Software y las cambiantes necesidades de la enseñanza— , además de depender de la forma de asignación de estos en los laboratorios y talleres de cómputo. En cuanto a la solicitud para hacer la instalación correspondiente, se requiere tener certeza de en que espacio serán asignados todos y cada uno de los cursos.

Por ello se han buscado opciones97 — no siempre las más adecuadas o lícitas (véase 14.3)— para que sin importar en que espacio sea asignado el curso — siempre y cuando el equipo de cómputo lo soporte— se tenga desde los primeros días de uso del espacio el paquete solicitado y en casos excep- cionales el tiempo de espera sea menor a unos horas o días sin importar la plataforma — Windows o Linux— o el tipo de Software solicitado — libre o privativo— , se ha optado por la virtualización98, usando como sistema operativo base a Debian GNU/Linux Estable, instalando como paquete de vitualización a KVM/QEMU. Aquí, se montan las múltiples máquinas vir- tuales que son ejecutadas según las necesidades del usuario. Para controlar la actualización de las máquinas virtuales sin que se requiera intervención del usuario, se usa RSYNC tunelizado mediante SSH que sincroniza las máquinas virtuales y la con…guración del equipo base de forma remota. Para tener la ‡exibilidad anteriormente comentada, es necesario poder contar con distintas versiones de sistemas operativos, de cada una de las ver- siones — en caso de Windows, tener independientemente los Service Pack— .

97 En el caso que el equipo sólo tenga un sistema operativo sin virtualización, es necesario esperar a que las asignaciones de los cursos y sus respectivas peticiones de uso de paquetes de cómputo estén completas, para entonces proceder a realizar instalación del Software que no sean antagónicos. Nótese que, por lo general, los cursos requieren el uso de los equipos de cómputo y el Software solicitado de forma inmediata, por lo cual esperar tiempo (días) para tener acceso al mismo no es una opción viable. 98 Una vez creada la máquina virtual, esta es un archivo que puede ser copiado o descar- gado de la red, por ello el usuario — estudiante, ayudante o profesor— puede llevarse la máquina virtual para hacer uso de ella en el equipo al que tenga acceso, teniendo como único requisito tener instalado el programa de virtualización. [email protected] 406 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

De tal forma que sea posible instalar cada versión de Software solicitada en la plataforma adecuada, teniendo en cuenta que muchas versiones del Software son mutuamente excluyentes para ser instaladas en una misma versión del sistema operativo simultáneamente.

Por todo lo anterior, el uso de máquinas virtuales — que permiten tener múltiples versiones de sistemas operativos independientemente, así como de una versión particular tener por separado cada una de ellas con los respec- tivos Service Pack— es una opción viable para proporcionar el servicio de instalación centralizada de los diversos paquetes de cómputo solicitados por los profesores de las diversas carreras de la Facultad de Ciencias. Esta op- ción minimiza los tiempos de espera para la instalación de un paquete en particular y agiliza las prestaciones a todos y cada uno de los grupos que se atienden semestralmente en los cientos de equipos en los laboratorios y talleres de cómputo.

[email protected] 407 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

14 Apéndice B: Software Libre y Propietario

Hoy en día los usuarios disponemos de dos grandes opciones para adquirir y usar el Software necesario para que nuestra computadora funcione, a saber:

Por un lado, podemos emplear programas comerciales, de los cuales no  somos dueños del Software, sólo concesionarios al adquirir una licencia de uso del Software y nos proporcionan un instalable del programa adquirido. La licencia respectiva es en la gran mayoría de los casos muy restrictiva, ya que restringe su uso a una sola máquina y/o usuario simultáneamente.

Por otro lado, existe el Software libre, desarrollado por usuarios y para  usuarios que, entre otras cosas, comparten los códigos fuente, el pro- grama ejecutable y dan libertades para estudiar, adaptar y redistribuir a quien así lo requiera el programa y todos sus derivados.

14.1 Software Libre La de…nición de Software libre (véase [19], [20], [12], [13], [11] y [15]) estipula los criterios que se tienen que cumplir para que un programa sea considerado libre. De vez en cuando se modi…ca esta de…nición para clari…carla o para resolver problemas sobre cuestiones delicadas. «Software libre» signi…ca que el Software respeta la libertad de los usuarios y la comunidad. En térmi- nos generales, los usuarios tienen la libertad de copiar, distribuir, estudiar, modi…car y mejorar el Software. Con estas libertades, los usuarios -tanto individualmente como en forma colectiva- controlan el programa y lo que hace. Cuando los usuarios no controlan el programa, el programa controla a los usuarios. Los programadores controlan el programa y, a través del programa, controlan a los usuarios. Un programa que no es libre, llamado «privativo o propietario» , y es considerado por muchos como un instrumento de poder injusto. El Software libre es la denominación del Software que respeta la liber- tad de todos los usuarios que adquirieron el producto y, por tanto, una vez obtenido el mismo puede ser usado, copiado, estudiado, modi…cado, y re- distribuido libremente de varias formas. Según la Free Software Foundation

[email protected] 408 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

(véase [19]), el Software libre se re…ere a la libertad de los usuarios para eje- cutar, copiar, distribuir, y estudiar el mismo, e incluso modi…car el Software y distribuirlo modi…cado. Un programa es Software libre si los usuarios tienen las cuatro libertades esenciales:

0. La libertad de usar el programa, con cualquier propósito.

1. La libertad de estudiar cómo funciona el programa y modi…carlo, adap- tándolo a tus necesidades.

2. La libertad de distribuir copias del programa, con lo cual puedes ayudar a tu prójimo.

3. La libertad de mejorar el programa y hacer públicas esas mejoras a los demás, de modo que toda la comunidad se bene…cie.

Un programa es Software libre si los usuarios tienen todas esas libertades. Por tanto, el usuario debe ser libre de redistribuir copias, tanto con o sin mo- di…caciones, ya sea gratuitamente o cobrando una tarifa por la distribución, a cualquiera en cualquier parte. El ser libre de hacer estas cosas signi…ca, entre otras cosas, que no tiene que pedir ni pagar el permiso. También debe tener la libertad de hacer modi…caciones y usarlas en pri- vado para su propio trabajo o pasatiempo, sin siquiera mencionar que exis- ten. Si publica sus cambios, no debe estar obligado a noti…carlo a nadie en particular, ni de ninguna manera en particular. La libertad de ejecutar el programa signi…ca que cualquier tipo de persona u organización es libre de usarlo en cualquier tipo de sistema de computación, para cualquier tipo de trabajo y …nalidad, sin que exista obligación alguna de comunicarlo al programador ni a ninguna otra entidad especí…ca. En esta libertad, lo que importa es el propósito de los usuarios, no el de los programadores. El usuario es libre de ejecutar el programa para alcanzar sus propósitos, y si lo distribuye a otra persona, también esa persona será libre de ejecutarlo para lo que necesite; nadie tiene derecho a imponer sus propios objetivos. La libertad de redistribuir copias debe incluir las formas binarias o eje- cutables del programa, así como el código fuente, tanto para las versiones modi…cadas como para las que no lo estén. Distribuir programas en forma de ejecutables es necesario para que los sistemas operativos libres se puedan [email protected] 409 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM instalar fácilmente. Resulta aceptable si no existe un modo de producir un formato binario o ejecutable para un programa especí…co, dado que algunos lenguajes no incorporan esa característica, pero debe tener la libertad de re- distribuir dichos formatos si encontrara o programara una forma de hacerlo. Para que se de la libertad que se menciona en los puntos 1 y 3 de realizar cambios y publicar las versiones modi…cadas tenga sentido, el usuario debe tener acceso al código fuente del programa. Por consiguiente, el acceso al código fuente es una condición necesaria para el Software libre. El «código fuente» compilado no es código fuente real, y no cuenta como código fuente. La libertad 1 incluye la libertad de usar su versión modi…cada en lugar de la original. Si el programa se entrega con un producto diseñado para eje- cutar versiones modi…cadas de terceros, pero rechaza ejecutar las suyas, una práctica conocida como «tivoización» o «arranque seguro» [«Lockdown» ] la libertad 1 se convierte más en una …cción teórica que en una libertad prác- tica, esto no es su…ciente, en otras palabras, estos binarios no son Software libre, incluso si se compilaron desde un código fuente que es libre. Una manera importante de modi…car el programa es agregándole subruti- nas y módulos libres ya disponibles. Si la licencia del programa especi…ca que no se pueden añadir módulos que ya existen y que están bajo una licencia apropiada, por ejemplo si requiere que usted sea el titular de los derechos de autor del código que desea añadir, entonces se trata de una licencia demasia- do restrictiva como para considerarla libre. La libertad 3 incluye la libertad de publicar sus versiones modi…cadas como Software libre. Una licencia libre también puede permitir otras formas de publicarlas; en otras palabras, no tiene que ser una licencia de . No obstante, una licencia que requiera que las versiones modi…cadas no sean libres, no se puede considerar libre. «Software libre» no signi…ca que «no es comercial» . Un programa libre debe estar disponible para el uso comercial, la programación comercial y la distribución comercial. La programación comercial de Software libre ya no es inusual; el Software libre comercial es muy importante, ejemplo de ello es la empresa RedHat (ahora propiedad de IBM). Puede haber pagado dinero para obtener copias de Software libre, o puede haber obtenido copias sin costo. Pero sin tener en cuenta cómo obtuvo sus copias, siempre tiene la libertad de copiar y modi…car el Software, incluso de vender copias. El término Software no libre se emplea para referirse al Software dis- tribuido bajo una licencia de Software más restrictiva que no garantiza estas cuatro libertades. Las leyes de la propiedad intelectual reservan la mayoría de [email protected] 410 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM los derechos de modi…cación, duplicación y redistribución para el dueño del Copyright; el Software dispuesto bajo una licencia de Software libre rescinde especí…camente la mayoría de estos derechos reservados. Los manuales de Software deben ser libres por las mismas razones que el Software debe ser libre, y porque de hecho los manuales son parte del Software. También tiene sentido aplicar los mismos argumentos a otros tipos de obras de uso práctico; es decir, obras que incorporen conocimiento útil, tal como publicaciones educativas y de referencia. La Wikipedia es el ejemplo más conocido. Tanto la Open Source Initiative como la Free Software Foundation mantie- nen en sus páginas Web (véase [19], [20], y [15]) listados o…ciales de las licencias de Software libre que aprueban.

14.1.1 Tipos de Licencias Una licencia es aquella autorización formal con carácter contractual que un autor de un Software da a un interesado para ejercer "actos de explotación legales". Pueden existir tantas licencias como acuerdos concretos se den entre el autor y el licenciatario. Desde el punto de vista del Software libre, existen distintas variantes del concepto o grupos de licencias:

Licencias GPL Una de las más utilizadas es la Licencia Pública General de GNU ( GNU GPL). El autor conserva los derechos de autor (Copyright), y permite la redistribución y modi…cación bajo términos diseñados para ase- gurarse de que todas las versiones modi…cadas del Software permanecen bajo los términos más restrictivos de la propia GNU GPL. Esto hace que sea im- posible crear un producto con partes no licenciadas GPL, el conjunto tiene que ser GPL. En la práctica, esto hace que las licencias de Software libre se dividan en dos grandes grupos, aquellas que pueden ser mezcladas con código licenciado bajo GNU GPL (y que inevitablemente desaparecerán en el proceso, al ser el código resultante licenciado bajo GNU GPL) y las que no lo permiten al incluir mayores u otros requisitos que no contemplan ni admiten la GNU GPL y que por lo tanto no pueden ser enlazadas ni mezcladas con código gobernado por la licencia GNU GPL.

GPL Versión 1 la versión 1 de GNU GPL,19 fue presentada el 25 de febrero de 1989, impidió lo que eran las dos principales formas con las que los [email protected] 411 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM distribuidores de Software restringían las libertades de…nidas por el Software libre. El primer problema fue que los distribuidores publicaban únicamente los archivos binarios, funcionales y ejecutables, pero no entendibles o modi- …cables por humanos. Para prevenir esto, la GPLv1 estableció que cualquier proveedor de Software libre además de distribuir el archivo binario debía li- berar a su vez código fuente entendible y que pudiera ser modi…cado por el ser humano, bajo la misma licencia (secciones 3a y 3b de la licencia). El segundo problema era que los distribuidores podían añadir restric- ciones adicionales, ya fuera añadiendo restricciones a la licencia o mediante la combinación del Software con otro que tuviera otras restricciones en su distribución. Si esto se hacía, entonces la unión de los dos conjuntos de restricciones sería aplicada al trabajo combinado entonces podrían añadirse restricciones inaceptables. Para prevenir esto, GPLv1 obligaba a que las versiones modi…cadas en su conjunto, tuvieran que ser distribuidas bajo los términos GPLv1 (secciones 2b y 4 de la licencia). Por lo tanto, el Software distribuido bajo GPLv1 puede ser combinado con Software bajo términos más permisivos y no con Software con licencias más restrictivas, lo que entraría en con‡icto con el requisito de que todo Software tiene que ser distribuido bajo los términos de la GPLv1.

GPL Versión 2 según Richard Stallman, el mayor cambio en GPLv2 fue la cláusula "Liberty or Death" («libertad o muerte» ), como la llama en la sección 7 de ese documento. Esta sección dice que si alguien impone restricciones que le prohíben distribuir código GPL de tal forma que in‡uya en las libertades de los usuarios (por ejemplo, si una ley impone que esa persona únicamente pueda distribuir el Software en binario), esa persona no puede distribuir Software GPL. La esperanza es que esto hará que sea menos tentador para las empresas el recurrir a las amenazas de patentes para exigir una remuneración de los desarrolladores de Software libre. En 1991 se hizo evidente que una licencia menos restrictiva sería estratégi- camente útil para la biblioteca C y para las bibliotecas de software que esen- cialmente hacían el trabajo que llevaban a cabo otras bibliotecas comerciales ya existentes. Cuando la versión 2 de GPL fue liberada en junio de 1991, una segunda licencia Library General Public License fue introducida al mismo tiempo y numerada con la versión 2 para denotar que ambas son complemen- tarias. Los números de versiones divergieron en 1999 cuando la versión 2.1 de LGPL fue liberada, esta fue renombrada como GNU Lesser General Public [email protected] 412 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

License para re‡ejar su lugar en esta …losofía.

GPL Versión 3 A …nales de 2005, la Free Software Foundation (FSF) anunció estar trabajando en la versión 3 de la GPL (GPLv3). El 16 de enero de 2006, el primer borrador de GPLv3 fue publicado, y se inició la consulta pública. La consulta pública se planeó originalmente para durar de nueve a quince meses, pero …nalmente se extendió a dieciocho meses, durante los cuales se publicaron cuatro borradores. La GPLv3 o…cial fue liberada por la FSF el 29 de junio de 2007. Según Stallman los cambios más importantes se produjeron en el campo de las patentes de software, la compatibilidad de licencias de Software libre, la de…nición de código fuente, y restricciones a las modi…caciones de Hard- ware. Otros cambios están relacionados con la internacionalización, cómo son manejadas las violaciones de licencias, y cómo los permisos adicionales pueden ser concedidos por el titular de los derechos de autor. También añade disposiciones para quitar al DRM su valor legal, por lo que es posible romper el DRM en el Software de GPL sin romper leyes como la DMCA.

GPLv2 vs GPL v3 GPLv3 contiene la intención básica de GPLv2 y es una licencia de código abierto con un copyleft estricto. Sin embargo, el idioma del texto de la licencia fue fuertemente modi…cado y es mucho más completo en respuesta a los cambios técnicos y legales y al intercambio internacional de licencias. La nueva versión de la licencia contiene una serie de cláusulas que abordan preguntas que no fueron o fueron cubiertas solo de manera insu…ciente en la versión 2 de la GPL. Las nuevas regulaciones más importantes son las siguientes:

GPLv3 contiene normas de compatibilidad que hacen que sea más fácil  combinar el código GPL con el código que se publicó bajo diferentes licencias. Esto se re…ere en particular al código bajo la licencia de Apache v. 2.0.

Se insertaron normas sobre gestión de derechos digitales para evitar  que el Software GPL se modi…que a voluntad, ya que los usuarios re- currieron a las disposiciones legales para protegerse mediante medidas técnicas de protección (como la DMCA o la directiva sobre derechos de [email protected] 413 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

autor). La efectividad en la práctica de las regulaciones contractuales en la GPL aún está por verse.

La licencia GPLv3 contiene una licencia de patente explícita, según la  cual las personas que licencian un programa bajo licencia GPL otorgan derechos de autor y patentes, en la medida en que esto sea necesario para utilizar el código que ellos otorgan. Por lo tanto, no se concede una licencia de patente completa. Además, la nueva cláusula de patente intenta proteger al usuario de las consecuencias de los acuerdos entre los titulares de patentes y los licenciatarios de la licencia pública general que solo bene…cian a algunos de los licenciatarios (correspondientes al acuerdo Microsoft / Novell). Los licenciatarios deben garantizar que todos los usuarios disfrutan de tales ventajas (licencia de patente o liberación de reclamos) o que nadie puede bene…ciarse de ellos.

A diferencia de la GPLv2, la GPLv3 establece claramente que no es  necesario divulgar el código fuente en un uso ASP de los programas GPL, siempre que no se envíe una copia del software al cliente. Si el efecto copyleft debe extenderse al uso de ASP, debe aplicarse la Licencia pública general de A¤ero, versión 3 (AGPL) que solo di…ere de la GPLv3 en este considerar.

Licencias estilo BSD Llamadas así porque se utilizan en gran cantidad de Software distribuido junto a los sistemas operativos BSD. El autor, bajo tales licencias, mantiene la protección de Copyright únicamente para la renuncia de garantía y para requerir la adecuada atribución de la autoría en traba- jos derivados, pero permite la libre redistribución y modi…cación, incluso si dichos trabajos tienen propietario. Son muy permisivas, tanto que son fácil- mente absorbidas al ser mezcladas con la licencia GNU GPL con quienes son compatibles. Puede argumentarse que esta licencia asegura "verdadero" Soft- ware libre, en el sentido que el usuario tiene libertad ilimitada con respecto al Software, y que puede decidir incluso redistribuirlo como no libre.

Licencia Copyleft Hay que hacer constar que el titular de los derechos de autor (Copyright) de un Software bajo licencia Copyleft puede también realizar una versión modi…cada bajo su Copyright original, y venderla bajo cualquier licencia que desee, además de distribuir la versión original como Software libre. Esta técnica ha sido usada como un modelo de negocio por [email protected] 414 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM una serie de empresas que realizan Software libre (por ejemplo MySQL); esta práctica no restringe ninguno de los derechos otorgados a los usuarios de la versión Copyleft.

Licencia estilo MIT Las licencias MIT son de las más permisivas, casi se consideran Software de dominio público. Lo único que requieren es incluir la licencia MIT para indicar que el Software incluye código con licencia MIT.

Licencia La licencia Apache trata de preservar los dere- chos de autor, incluir la licencia en el Software distribuido y una lista de los cambios realizados. En modi…caciones extensivas del Software original permite licenciar el Software bajo otra licencia sin incluir esas modi…caciones en el código fuente.

Licencia MPL Esta licencia requiere que los archivos al ser distribuidos conserven la misma licencia original pero pueden ser usados junto con archivos con otra licencia, al contrario de la licencia GPL que requiere que todo el código usado junto con código GPL sea licen- ciado como código GPL. También en caso de hacer modi…caciones extensivas permite distribuirlas bajo diferentes términos y sin incluir el código fuente en las modi…caciones.

Licencia Código de dominio público Es un código que no está sujeto a derechos de autor que puede utilizarse sin restricciones.

Licencia Creative Commons Las licencias de Creative Commons son más utilizadas para cualquier creación digital que para el Software, enten- diendo como creación digital desde fotos, artículos en blogs, música, vídeos, este trabajo, etc. Hay varios tipos de licencias de Creative Commons dife- renciando entre permitir modi…caciones a la obra original, solicitando crédito de la creación o permitiendo un uso comercial de la obra.

Licencias de Código Abierto Las licencias de código abierto son un intermedio entre las licencias privativas y las licencias de Software libre. Las licencias de código abierto permiten el acceso al código fuente pero no todas se consideran licencias de Software libre al no otorgar otros derechos que se [email protected] 415 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM requieren para considerar un Software como Software libre como el derecho al uso o con cualquier propósito, modi…cación y distribución. Dado el éxito del Software libre como modelo de desarrollo de Software al- gunas empresas cuyo Software era privativo pueden decidir hacerlo de código abierto con la intención de suplir algunas carencias de Software privativo pero sin perder ciertos derechos que son la fuente de sus ingresos como la venta de licencias. Las expresiones «Software libre» y «código abierto» se re…eren casi al mismo conjunto de programas. No obstante, dicen cosas muy diferentes acerca de dichos programas, basándose en valores diferentes. El movimiento del Software libre de…ende la libertad de los usuarios de ordenadores, en un movimiento en pro de la libertad y la justicia. Por contra, la idea del código abierto valora principalmente las ventajas prácticas y no de…ende principios. Esta es la razón por la que gran parte de la comunidad de Software libre está en desacuerdo con el movimiento del código abierto y nosotros no empleamos esta expresión en este texto.

Licencia Microsoft Public License La Microsoft Public License es una licencia de código abierto que permite la distribución del Software bajo la misma licencia y la modi…cación para un uso privado. Tiene restricciones en cuanto a las marcas registradas. En caso de distribuir el Software de forma compilada o en forma de objeto binario no se exige proporcionar los derechos de acceso al código fuente del Software compilado o en forma de objeto binario. En este caso esta licencia no otorga más derechos de los que se reciben pero si permite otorgar menos derechos al distribuir el Software al distribuir Software compilado o en forma de objeto binario.

Modelo de desarrollo de Software bazar y catedral El tipo de li- cencia no determina qué Software es mejor o peor, si el privativo o de Soft- ware libre, la diferencia entre las licencias está en sus características éticas y legales. Aunque el modelo de desarrollo con una licencia de código abierto a la larga suele tener un mejor desarrollo y éxito que el Software privativo, más aún con un medio como internet que permite colaborar a cualquier persona independiente de donde esté ubicada en el mundo.

[email protected] 416 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Comparación con el Software de Código Abierto Aunque en la prác- tica el Software de código abierto y el Software libre comparten muchas de sus licencias, la Free Software Foundation opina que el movimiento del Software de código abierto es …losó…camente diferente del movimiento del Software libre. Los defensores del término «código abierto (Open Source)» , a…rman que éste evita la ambigüedad del término en ese idioma que es «Free» en «Free Software» . Mucha gente reconoce el bene…cio cualitativo del proceso de desarrollo de Software cuando los desarrolladores pueden usar, modi…car y redistribuir el código fuente de un programa. El movimiento del Software libre hace especial énfasis en los aspectos morales o éticos del Software, viendo la excelencia técnica como un producto secundario de su estándar ético. El movimiento de código abierto ve la excelencia técnica como el objetivo prioritario, siendo el compartir el código fuente un medio para dicho …n. Por dicho motivo, la FSF se distancia tanto del movimiento de código abierto como del término «código abierto (Open Source)» . Puesto que la «iniciativa de Software libre Open Source Initiative (OSI)» sólo aprueba las licencias que se ajustan a la «de…nición de código abierto (Open Source De…nition)» , la mayoría de la gente lo interpreta como un es- quema de distribución, e intercambia libremente "código abierto" con "Soft- ware libre". Aún cuando existen importantes diferencias …losó…cas entre ambos términos, especialmente en términos de las motivaciones para el de- sarrollo y el uso de tal Software, raramente suelen tener impacto en el proceso de colaboración. Aunque el término "código abierto" elimina la ambigüedad de libertad frente a precio (en el caso del inglés), introduce una nueva: entre los progra- mas que se ajustan a la de…nición de código abierto, que dan a los usuarios la libertad de mejorarlos, y los programas que simplemente tienen el código fuente disponible, posiblemente con fuertes restricciones sobre el uso de dicho código fuente. Mucha gente cree que cualquier Software que tenga el código fuente disponible es de código abierto, puesto que lo pueden manipular, sin embargo, mucho de este Software no da a sus usuarios la libertad de dis- tribuir sus modi…caciones, restringe el uso comercial, o en general restringe los derechos de los usuarios.

[email protected] 417 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

14.2 Software Propietario No existe consenso sobre el término a utilizar para referirse al opuesto del Software libre. La expresión «Software propietario ()» (véase [14]), en la lengua anglosajona, "Proprietary" signi…ca «poseído o controlado privadamente (Privately Owned and Controlled)» , que destaca la manutención de la reserva de derechos sobre el uso, modi…cación o redis- tribución del Software. Inicialmente utilizado, pero con el inconveniente que la acepción proviene de una traducción literal del inglés, no correspondiendo su uso como adjetivo en el español, de manera que puede ser considerado como un barbarismo. El término "propietario" en español resultaría inadecuado, pues signi…ca que «tiene derecho de propiedad sobre una cosa» , por lo que no podría cali…- carse de "propietario" al Software, porque éste no tiene propiedad sobre nada (es decir, no es dueño de nada) y, además, no podría serlo (porque es una cosa y no una persona). Así mismo, la expresión "Software propietario" podría ser interpretada como "Software sujeto a propiedad" (derechos o titularidad) y su opuesto, el Software libre, también está sujeto al derecho de autor. Otra interpretación es que contrariamente al uso popular del término, se puede a…rmar de que "todo Software es propietario", por lo que la forma correcta de referirse al Software con restricciones de uso, estudio, copia o mejora es la de Software privativo, según esta interpretación el término "propietario" podría aplicarse tanto para Software libre como Software privativo, ya que la diferencia entre uno y otro está en que el dueño del Software privativo lo licencia como propiedad privada y el de Software libre como propiedad social. Con la intención de corregir el defecto de la expresión "Software propie- tario" aparece el llamado "Software con propietario", sin embargo se ar- gumenta contra del término "con propietario" justamente su similitud con Proprietary en inglés, que sólo haría referencia a un aspecto del Software que no es libre, manteniendo una de las principales críticas a éste (de "Soft- ware sujeto a derechos" o "propiedad"). Adicionalmente, si "propietario" se re…ere al titular de los derechos de autor -y está claro que no se puede referir al usuario, en tanto éste es simplemente un cesionario-, no resuelve la contradicción: todo el Software libre tiene también titulares de derechos de autor. La expresión Software no libre (en inglés Non-Free Software) es usado por la FSF para agrupar todo el Software que no es libre, es decir, incluye al llamado en inglés "Semi-Free Software" (Software semilibre) y al "Propietary [email protected] 418 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Software". Asimismo, es frecuentemente utilizado para referirse al Software que no cumple con las Directrices de Software libre de Debian GNU/Linux, las cuales siguen la misma idea básica de libertad en el Software, propugnada por la FSF, y sobre las cuales está basada la de…nición de código abierto de la Open Source Initiative. Adicionalmente el Software de código cerrado nace como antónimo de Software de código abierto y por lo tanto se centra más en el aspecto de ausencia de acceso al código que en los derechos sobre el mismo, éste se re…ere sólo a la ausencia de una sola libertad por lo que su uso debe enfocarse sólo a este tipo de Software y aunque siempre signi…que que es un Software que no es libre, no tiene que ser Software de código cerrado. La expresión Software privado es usada por la relación entre los conceptos de tener y ser privado. Este término sería inadecuado debido a que, en una de sus acepciones, la palabra "privado" se entiende como antónimo de "público", es decir, que «no es de propiedad pública o estatal, sino que pertenece a par- ticulares» , provocando que esta categoría se interpretará como no referente al Estado, lo que produciría la exclusión del Software no libre generado por el aparato estatal. Además, el "Software público" se asocia generalmente con Software de dominio público.

14.3 Implicaciones Económico-Políticas del Software Libre Una vez que un producto de Software libre ha empezado a circular, rápida- mente está disponible a un costo muy bajo. Al mismo tiempo, su utilidad no decrece. El Software, en general, podría ser considerado un bien de uso inagotable, tomando en cuenta que su costo marginal es pequeñísimo y que no es un bien sujeto a rivalidad -la posesión del bien por un agente económico no impide que otro lo posea-. Puesto que el Software libre permite el libre uso, modi…cación y redis- tribución, a menudo encuentra un hogar entre usuarios para los cuales el coste del Software no libre es a veces prohibitivo, o como alternativa a la pi- ratería. También es sencillo modi…carlo localmente, lo que permite que sean posibles los esfuerzos de traducción a idiomas que no son necesariamente rentables comercialmente, además:

Porque así no se condiciona a los estudiantes a usar siempre lo mismo.  [email protected] 419 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Porque así no se fomenta la piratería en los estudiantes al no pagar  licencias. Porque así no se obliga a usar una solución concreta y se ofrece libertad  de elección a los estudiantes. Porque es mucho más seguro ya que el Software libre es público y se  puede ver qué hace exactamente sin recelos.

La mayoría del Software libre se produce por equipos internacionales que cooperan a través de la libre asociación. Los equipos están típicamente com- puestos por individuos con una amplia variedad de motivaciones, y pueden provenir tanto del sector privado, del sector voluntario o del sector público. En México el Software libre nació en las Universidades y los Centros de Investigación. Es por eso que, desde hace tres décadas, los estudiantes y los profesores usan Software libre para …nes didácticos y de investigación. Las universidades suelen optar por el uso de Software libre en vez de utilizar Software privativo porque satisface de una mejor manera sus necesidades de cómputo, dada su naturaleza de apertura del código y la libertad de compartir los resultados obtenidos. De forma colateral, no se tienen gastos adicionales derivados del pago de licenciamientos. Computólogos, físicos, químicos, matemáticos, otros profesionistas y cien- tí…cos utilizan Software libre como herramienta de investigación y creación. Un claro ejemplo de ello es la llamada Delta Metropolitana, que es una red de supercomputadoras que están en varios puntos de la Ciudad de México, en el CINESTAV, el IPN, la UAM y la UNAM. Esa red de supercómputo uti- liza Software libre para consolidar sus recursos, hacer investigación y generar conocimiento. Por otro lado, dadas las características del Software de código cerrado, un usuario común ignora absolutamente el contenido del mismo y por tanto si existe dentro de las líneas del código alguna amenaza contra su equipo o su información, además el usuario no sólo tiene prohibido el intentar eliminar o cambiar esa parte del código sino que puede ser perseguido por la ley por el hecho de intentar conocer si existe tal amenaza en dicho Software. Además, en una sociedad de la información, el Software se ha convertido en una herramienta importante de productividad, y una licencia de Software privativo constituye un acuerdo o contrato entre dos sujetos jurídicos que vo- luntariamente acuerdan las condiciones de uso de un programa, pero el costo económico de dicha licencia es cada vez más alto y en el caso de instituciones [email protected] 420 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM educativas, gubernamentales y sociedades civiles es en la mayoría de los casos -por decir lo menos- prohibitivo.

Ya hace un tiempo, en varios periódicos de circulación nacional (véase [100]) fue publicado el siguiente anuncio:

El Instituto Mexicano de la Propiedad Industrial (IMPI) anunció que en las próximas semanas dará inicio una serie de clausuras a negocios que utilicen Software licenciado de manera ilegal; esto como parte del acuerdo que tiene la dependencia con The Software Alliance (BSA) desde el 2002, el cual busca fomentar el uso de programas informáticos legales y disminuir el índice de piratería en el país. De acuerdo a la BSA, el porcentaje de Software ilegal utilizado en el territorio aún se ubica en un 56 por ciento, cifra considera- blemente menor a lo visto en el 2005, cuando el número ascendía a más del 65 por ciento. Sin embargo, México continúa siendo uno de los mayores compradores de piratería a nivel mundial, y lo que se busca con este tipo de acciones en el 2013 es disminuir, al menos, un punto porcentual. "Si como consecuencia de una visita de inspección completa se encuentra la existencia de Software ilegal, se procede a la sanción. En el 2012 incrementaron hasta un 200% las sanciones por el uso ilegal de Software", dijo Kiyoshi Tsuru, director general en México de la BSA. Aquí es donde algunos se preguntarán, ¿y qué autoridad tiene The Software Alliance para ejecutar estas determinaciones? Pese a que cuenta con el apoyo de empresas como Microsoft, Apple, Autodesk, Adobe, Aveva, AVG, CISCO, Dell, Hewlett Packard, IBM, SAP y Symantec, lo cierto es que la BSA no puede clausurar legalmente ningún negocio. La verdadera autoridad llega en su acuerdo con el IMPI, el cual sí tiene las facultades para aplicar sanciones.

Además, la UNAM, desde junio 9 del 2009 …rmó un acuerdo (véase [101]):

Con el objetivo de fomentar la cultura de la legalidad en lo que se re…ere al uso del Software entre los estudiantes, la Universidad [email protected] 421 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Nacional Autónoma de México y la Business Software Alliance (BSA) …rmaron un convenio general de colaboración. Mediante este acuerdo, se promoverá el uso ético de las tec- nologías de la información y comunicación, y se compartirán cono- cimientos en materia de propiedad intelectual y Software, a …n de apoyar el desarrollo y explotación de bienes digitales en la UNAM, así como de…nir programas para contribuir al avance de un mundo digital seguro, informaron ambas organizaciones en un comunicado. El secretario general de la máxima casa de estudios, Sergio M. Alcocer Martínez de Castro, reconoció que la UNAM necesita hacer un esfuerzo en el ámbito institucional y en cada una de las entidades que la conforman, para brindar educación a sus alumnos, profesores y trabajadores en este campo. “Se pretende”, destacó, “que el convenio sea operativo y que se desarrolle en cada una de las entidades con la impartición de cursos y capacitación y en una rendición de cuentas para que el Software que se utilice sea legal”. El funcionario reconoció a los miembros de Business Software Alliance en Latinoamérica, y apuntó que la Universidad Nacional hará lo necesario para facilitar el uso responsable, ético y seguro del Software. Informó también que ambas partes se reunirán seis meses des- pués del inicio de este convenio de colaboración para analizar los avances. En tanto, el director General de BSA-México, Kiyoshi Tsuru Al- berú, resaltó que con la …rma de este convenio podrán impulsar un plan conjunto relacionado con alta tecnología, ética y legalidad “Estamos seguros que en el mediano plazo se tendrán resultados importantes y se podrá hacer la diferencia”, señaló. Por su parte, el abogado general, Luis Raúl González Pérez, co- mentó que la UNAM busca difundir estos valores entre su co- munidad, y llegar especialmente a los estudiantes que inician el bachillerato, porque desde edad temprana es importante fomentar la cultura de la legalidad. [email protected] 422 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Ante este escenario, una alternativa viable podría ser optar por el Soft- ware libre, aunque, pese a su incipiente desarrollo es seguro que en un futuro podría alcanzar a suplir todas las necesidades básicas de los usuarios, dejando la adquisición de paquetes especializados sólo para los cursos avanzados que justi…que el uso de Software privativo.

14.4 Nuevas Licencias para Responder a Nuevas Necesi- dades El mundo de la tecnología avanza mucho más rápido que las leyes y estas tienen que esforzarse para alcanzarlo. En el caso del Software libre y de código abierto, tanto la Free Software Foundation como la Open Source Initiative (los organismos encargados de regular las diferentes licencias) enfrentan pe- riódicamente el problema de cómo mantener sus principios y al mismo tiempo evitar que alguien se aproveche indebidamente. En el último tiempo, la Open Source Initiative le dio el sello de aprobación a 4 nuevas licencias para propósitos especí…cos.

Nuevas licencias de código abierto Cryptographic Autonomy License version 1.0 (CAL-1.0)  Fue creada en el 2019 por el equipo del proyecto de código abierto Holochain, esta licencia fue desarrollada para ser utilizada con aplicaciones criptográ…- cas distribuidas. El inconveniente con las licencias tradicionales es que no obligaba a compartir los datos. Esto podría perjudicar el funcionamiento de toda la red. Por eso la CAL también incluye la obligación de proporcionar a terceros los permisos y materiales necesarios para utilizar y modi…car el Software de forma independiente sin que ese tercero tenga una pérdida de datos o capacidad. Open Hardware Licence (OHL)  De la mano de la Organización Europea para la Investigación Nuclear (CERN) llegó esta licencia con tres variantes enfocadas en la posibilidad de compartir libremente tanto Hardware como Software. Hay que hacer una aclaración. La OSI fue creada en principio pensando en el Software por lo que no tiene mecanismos para la aprobación de licencias de Hardware. Pero, como la propuesta del CERN se re…ere a ambos rubros, esto posibilitó la aprobación: [email protected] 423 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

– CERN-OHL-S es una licencia fuertemente recíproca: El que utilice  un diseño bajo esta licencia deberá poner a disposición las fuentes de sus modi…caciones y agregados bajo la misma licencia. – CERN-OHL-W es una licencia débilmente recíproca: Sólo obliga a distribuir las fuentes de la parte del diseño que fue puesta ori- ginalmente bajo ella. No así los agregados y modi…caciones. – CERN-OHL-P es una licencia permisiva: Permite a la gente tomar un proyecto, relicenciarlo y utilizarlo sin ninguna obligación de distribuir las fuentes.

Hay que decir que la gente del CERN parece haber encontrado la solución a un problema que viene afectando a algunos proyectos de código abierto. Una gran empresa utiliza ese proyecto para comercializar servicios y no solo hace ningún aporte al proyecto original (ya sea con código o dando apoyo …nanciero) si no que también compite en el mismo mercado.

14.5 La Nube y el Código Abierto Desde hace años se han creado nuevos desafíos para el código abierto que plantea la nube, un término que para el usuario promedio puede signi…car cosas diferentes, pero que para la empresa se resume en servicios. Y es que los bene…cios económicos que genera el mero Software de código abierto no son comparables a los que se obtienen cuando se ofrece ese mismo Software a través de servicios, más allá -pero incluyendo- del soporte. Este hecho diferencial lleva tiempo provocando fricciones entre desarro- lladores y proveedores y hay quien adelantó incluso el …n del modelo de desarrollo del código abierto tal y como lo conocemos. ¿Quién tiene la razón?, ¿Es para tanto la situación?. En sus exposiciones, representantes de compañías y proyectos de código abierto muy populares en el ámbito empresarial, explican el supuesto per- juicio que les ocasiona el uso que los grandes proveedores de servicios en la nube hacen del Software que ellos desarrollan, y cómo algunos han conside- rado y aplicado un enfoque más cerrado para sus productos con el …n de evitar lo que denominan como expolio. Hay declaraciones que merecen ser rescatar para dotar de contexto a la discusión:

El papel que juega el código abierto en la creación de oportunidades  comerciales ha cambiado, durante muchos años les permitimos que las [email protected] 424 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

empresas de servicios tomaran lo que se ha desarrollado y ganasen dinero con ello.

Empresas como Amazon Web Services, Azure de Microsoft, etc. Han  ganado cientos de millones de dólares ofreciendo a sus clientes servicios basados en Software libre sin contribuir tanto a la comunidad de código abierto que construye y mantiene ese proyecto. Es imposible saber exactamente de cuánto dinero estamos hablando, pero es cierto que los proveedores de la nube se bene…cian del trabajo de los desarrolladores de código abierto que no emplean.

Hay un mito ampliamente instalado en el mundo de código abierto  que dice que los proyectos son impulsados por una comunidad de con- tribuyentes, pero en realidad, los desarrolladores pagados contribuyen con la mayor parte del código en la mayoría de los proyectos de código abierto modernos.

En resumen, todas estas voces se quejan de dos cosas: los grandes be- ne…cios que obtienen los proveedores de servicios en la nube con su Software sin retribuirles en consecuencia, y la falta de colaboración manteniendo los productos con los que lucran. Sin embargo, no nos engañemos, el quid de la cuestión está principalmente en el dinero: la opinión generalizada de la comunidad es que el Software de código abierto nunca fue pensado para que las empresas de servicios en la nube lo tomasen y lo vendieran. Por otro lado, si es posible bifurcar un proyecto libre que se cierra, ¿no hubiese sido mejor colaborar con él antes y haber evitado el cierre? Si no se invierte y se mantiene con salud aquello que da bene…cios, puede terminar por desaparecer. A medio camino entre el depredador y el parásito: así es como ven muchas desarrolladoras de código abierto a los proveedores de servicios en en la nube. Vale la pena retomar ahora la frase esa de que «el Software de código abierto nunca fue pensado para que las empresas de servicios en la nube lo tomasen y lo vendieran» . ¿Para qué fue pensado el código abierto, entonces? No hay ninguna licencia de código abierto o Software libre reconocida por la Free Software Foundation o la Open Source Initiative que prohíba hacer negocio con el Software. Lo que prohíben es la discriminación en la capacidad y alcance de su uso en función de la parte, se trate de un individuo o de la mayor multinacional imaginable. [email protected] 425 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

¿Cuál es la solución a un embrollo de tamaña envergadura? Lo único claro es que no es una cuestión de blancos y negros y las consideraciones son demasiadas como para seguir ahondando: empresas que cotizan en bolsa quieren más dinero de otras compañías -que también cotizan en bolsa y por mucho más-, que además del Software ponen la infraestructura sobre la que distribuyen sus ofertas y que tienen la capacidad de clonar tu producto en un abrir y cerrar de ojos, no solo porque tienen el capital, sino porque tienen la experiencia necesaria tras contribuir técnica, pero también en muchos casos, económicamente, durante largo tiempo. Pese a ello, esta situación está alterando el paradigma actual, en el que el modelo de desarrollo del código abierto se ha impuesto como impulsor de la innovación en el sector empresarial, y ya hay quien habla de que nos acercamos al …n, o al principio del …n de la Era del Open Source, cuya preponderancia estaría sentenciada por la revolución de la nube, a la postre el mayor estímulo que haya tenido el código abierto hasta la fecha. El futuro, pues, pasaría por el Shared Source Software, bajo el cual diferentes compañías con intereses alineados colaborarán en el desarrollo de proyectos concretos, pero limitando su explotación comercial a sí mismas. Todavía no estamos ahí, no obstante, y no parece tampoco que el relevo se vaya a dar en breve. De suceder, será muy llamativo: la muerte del código abierto por un éxito mal entendido.

El Código Abierto como Base de la Competitividad En septiembre del 2021, se publico un amplio y detallado informe llevado a cabo por el Fraunhofer ISI y por OpenForum Europe para la Comisión Europea, «The impact of open source software and hardware on technological independence, competitiveness and innovation in the EU economy» , cuanti…ca la importan- cia económica del código abierto aplicado tanto al Software como al Hard- ware, su efecto en la contribución al producto interior bruto generado, la reducción en aspectos como el coste total de propiedad, dependencia del proveedor y autonomía digital; y lanza una serie de recomendaciones especí- …cas de políticas públicas destinadas a lograr un sector público digitalmente autónomo, una I+D abierta que fomente el crecimiento europeo, y una in- dustria más digitalizada y competitiva. En las estimaciones del informe se apunta que las empresas europeas invirtieron alrededor de mil millones de euros en Software de código abierto en 2018, lo que resultó en un impacto en la economía europea de entre 65,000 [email protected] 426 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM y 95,000 millones de euros. El análisis estima una relación coste-bene…cio superior a 1:4, y predice que un aumento del 10% de las contribuciones de a repositorios de código abierto sería susceptible de generar anualmente entre un 0.4% y un 0.6% adicional en el PIB, así como más de seiscientas nuevas empresas tecnológicas en la Unión Europea. El análisis de las contribuciones a repositorios de Software de código abierto en la Unión Europea revela que el ecosistema tiene una naturaleza diferente frente al norteamericano, con un volumen de contribuciones que proviene sobre todo de empleados de compañías pequeñas o muy pequeñas, frente a un escenario en los Estados Unidos en el que predominan grandes compañías tecnológicas que se bene…cian en sus modelos de negocio de la gran cantidad y de la rápida mejora del Software disponible. En Europa, los contribuyentes individuales ascendieron a más de 260,000, lo que representa el 8% de los casi 3.1 millones de empleados de la UE en el sector de la de- sarrollo de Software en 2018. En total, los más de 30 millones de desarrollos consolidados en repositorios en los estados miembros de la Unión Europea representan una inversión de personal equivalente a casi mil millones de eu- ros, que han pasado a estar disponibles en el dominio público y que, por lo tanto, no tienen que ser desarrollados por otros actores. Según el análisis, cuanto más pequeña es la empresa, mayor es la inver- sión relativa en Software de código abierto (las empresas con 50 empleados o menos asumieron casi la mitad de los desarrollos en la muestra de las com- pañías más activas). Aunque más del 50% de los contribuyentes pertenecen a la industria tecnológica (el 8% del total de sus empleados participaron en estos desarrollos), también hubo participación signi…cativa de empresas de consultoría, cientí…cas, técnicas y, en menor medida, de distribuidores, minoristas y empresas del ámbito …nanciero. ¿Puede una …losofía de desarrollo como el código abierto, disponible para todo el mundo, llegar a convertirse en una fuente de ventajas diferenciales para el resto de los países, que se ha visto tradicionalmente muy superado en su relevancia en el entorno tecnológico por los gigantes tecnológicos de Esta- dos Unidos o de China? El informe a…rma que su uso puede llegar a incidir en gran medida en el desarrollo de una independencia tecnológica superior, de una mayor competitividad y de más innovación. Veremos si llegamos a ver en el resto del mundo políticas que incentiven el uso del código abierto como una variable estratégica clave para ello. La idea, capitalizar la tecnología de una forma más orientada al procomún y al desarrollo colaborativo, suena sin duda atractiva e interesante. [email protected] 427 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

15 Apéndice C: El Sistema GNU/Linux

GNU/Linux se ve y se siente muy parecido a cualquier otro sistema UNIX, y de hecho la compatibilidad con UNIX ha sido una importante meta del diseño del proyecto Linux. No obstante, Linux es mucho más joven que la mayor parte de los sistemas UNIX. Su desarrollo se inicio en 1991, cuando un estudiante …nlandés, Linus Torvalds, escribió y bautizó un pequeño pero autosu…ciente núcleo para el procesador 80386, el primer procesador de 32 bits verdadero en la gama de CPU compatibles con el PC de Intel. En los albores de su desarrollo, el código fuente de Linux se ofrecía gra- tuitamente en internet. En consecuencia, su historia ha sido una colaboración de muchos usuarios de todo el mundo que se han comunicado casi exclusi- vamente a través de internet. Desde un núcleo inicial que implementaba parcialmente un subconjunto pequeño de los servicios de UNIX, Linux ha crecido para incluir cada vez más funcionalidades UNIX. En sus inicios, el desarrollo de Linux giraba en gran medida alrededor del núcleo del sistema operativo central: el ejecutivo privilegiado que administra todos los recursos del sistema e interactúa directamente con el Hardware. Desde luego, se requiere mucho más que este núcleo para producir un sistema operativo completo. Resulta útil hacer la distinción entre el núcleo (Kernel) de Linux y un sistema Linux: el núcleo en Linux es una identidad de Software totalmente original desarrollada desde cero por la comunidad Linux (suele encontrarse en el directorio /boot en el sistema de archivos); el sistema Linux, tal como lo conocemos hoy, incluye una multitud de componentes, algunos escritos desde cero, otros tomados en préstamo de otros proyectos o creados en colaboración con otros equipos como el proyecto GNU de la Free Software Fundation. El sistema Linux básico es un entorno estándar para aplicaciones y pro- gramación de los usuarios, pero no obliga a adoptar mecanismos estándar para controlar las funcionalidades disponibles como un todo. A medida que Linux ha madurado, se ha hecho necesaria otra capa de funcionalidad encima del sistema Linux. Una distribución de GNU/Linux incluye todos los compo- nentes estándar del sistema Linux, más un conjunto de herramientas admi- nistrativas que simpli…can la instalación inicial y desinstalación de paquetes del sistema. GNU/Linux puede funcionar tanto en entorno grá…co como en modo con- sola (línea de comandos o Shell). La consola es común en distribuciones para servidores, mientras que la interfaz grá…ca esta orientada al usuario …nal [email protected] 428 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM del hogar como empresarial. Así mismo, también existen los entornos de escritorio (GNOME, KDE, LXQt, LXDE, Xfce, Unity, MATE, Cinnamon, Pantheon, Deepin, Budgie, PIXEL, Enlightenment, Trinity, Moksha, Ukui, etc.), que son un conjunto de programas conformado por ventanas, íconos y muchas aplicaciones que facilitan el uso de la computadora.

Hardware en GNU/Linux El soporte del Hardware en Linux es un asunto complicado, es lo que más problemas da. Linux soporta la mayor parte del Hardware, pero a veces pueden existir problemas99:

si es Hardware muy antiguo, muy moderno o muy raro.  si es un dispositivo exclusivo para Windows, como los Winmodems  (linmodems.org).

Si el Hardware es "de verdad" (no Winmodems), de marca conocida y actual, casi con toda seguridad estará soportado por Linux. Los instaladores de Linux reconocen prácticamente todo el Hardware du- rante la instalación, por lo que la mejor manera de evitar problemas con el Hardware es instalarlo desde el principio. Si añadimos Software posterior- mente nos costará hacerlo funcionar. ¡Incluso puede ser más rápido instalar el sistema desde cero!

¿Cómo puedo saber si mi Hardware está soportado por Linux (antes de comprarlo y cometer un error de forma irreparable)? Fácil: consultando en internet.

99 Mito: Linux se puede usar para revivir un ordenador viejo. La realidad es que si bien, hay múltiples distribuciones de Linux que corren en una gran cantidad de procesadores antiguos y actuales, los Drivers necesarios para reconocer periféricos como tarjetas grá…cas, de red alámbrica e inalámbrica, entre muchos otros, no tienen soporte en Linux, lo cual hará imposible su uso en Linux. Esto es cierto en cualquier computadora no importa de cual generación es el equipo de cómputo. La verdad de todo esto, es que los fabricantes están enfocados en producir Hardware y Drivers que corran en los sistemas operativos con mayor cuota de mercado y por el momento Linux no es uno de ellos.

[email protected] 429 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

¿Qué sabe Linux de mi Hardware? El Kernel se encarga de la gestión del Hardware usando herramientas como Udev (sistema de nombrado del Hardware), Hotplug (mecanismo de avisos), Dbus (comunicaciones entre procesos) o Hal (capa de abstracción de Hardware), y mapea todo el Hard- ware en archivos de dispositivos ubicados en los directorios /dev y /sys. Algunos comando usados para conocer el Hardware: lscpu - Información de procesador  lshw - Lista de Hardware en Linux  hwinfo - Información del Hardware en Linux  lspci - Lista PCI  lsscsi - Listar dispositivos SCSI  lsusb - Lista de los buses y detalles del dispositivo  inxi - Script mega Bash para usuarios no técnicos  lsblk - Lista de dispositivos de bloque  df - espacio en disco de los sistemas de archivos  pydf - Python df  fdisk - Informa y permite modi…car las particiones de disco  mount - Permite montar y desmontar y ver sistema de archivo montados  free - Da información de la memoria RAM y Swap  hdparm - Información de disco duro  Archivos del directorio /proc, contienen información accesible usando el comando cat: Información de CPU  Información del Kernel de Linux  Dispositivos Sata / SCSI  Particiones  [email protected] 430 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Componentes de un Sistema GNU/Linux El sistema GNU/Linux se compone de tres cuerpos principales de código, al igual que la mayor parte de las implementaciones de UNIX.

El núcleo se encarga de mantener todas las abstracciones importantes  del sistema operativo, incluidas cosas tales como memoria virtual y procesos.

Las bibliotecas del sistema de…nen un conjunto estándar de funciones a  través de las cuales las aplicaciones pueden interactuar con el núcleo y que implementan gran parte de la funcionalidad del sistema operativo que no necesita todos los privilegios del código del núcleo.

Las utilerías del sistema que son programas que realizan tareas de ad-  ministración especializadas individuales. Algunos programas utilitarios pueden invocarse una sola vez para asignar valores iniciales y con…gurar algún aspecto del sistema; otros llamados demonios100 podrían ejecu- tarse de forma permanente, realizando tareas tales como responder a conexiones de red entrantes, aceptar solicitudes de ingreso al sistema desde terminales, o actualizar archivos de bitácora.

Principios de Diseño Unix y posteriormente Linux se diseñaron como sistemas de tiempo compartido. La interfaz estándar con el usuario (el Shell) es sencilla y puede ser sustituida por otra si se desea101. El sistema de archivos es un árbol invertido con múltiples niveles, que permite a los usuarios crear sus propios subdirectorios. Cada archivo de datos de usuario es tan solo una secuencia de Bytes. El sistema UNIX/Linux fue diseñado por programadores para progra- madores; por ello, siempre ha sido interactivo, y las funciones para desarro- llar programas siempre han tenido prioridad. Tales recursos incluyen a los programas make, gcc, git, etc.

100 En sistemas UNIX/LINUX se conoce como demonio o Daemon (Disk And Execution Monitor) a un proceso que se ejecuta en segundo plano del sistema operativo, se ejecuta en todo momento y no posee interacción directa con el usuario, también se le conoce genéricamente como servicio o proceso, del cual no percibimos su ejecución. Un demonio realiza una operación especí…ca en tiempos prede…nidos o en respuesta a ciertos eventos del sistema. 101 Algunos de los distintos tipos de Shell son: Shell Bourne, Shell Zsh, Shell C, Shell Korn, Shell Bourne-Again (mejor conocido como Bash, Bourne again shell), etc. [email protected] 431 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Los archivos de disco y los dispositivos de Entrada/Salida (E/S) se tratan de la manera más similar posible. Así, la dependencia de dispositivos y las peculiaridades se mantienen en el núcleo hasta donde es posible; aún en el núcleo, la mayor parte de ellas están con…nadas a los Drivers de los dispositivos. Un archivo en Unix/Linux es una secuencia de Bytes. Los diferentes programas esperan distintos niveles de estructura, pero el núcleo no im- pone ninguna estructura a los archivos. Por ejemplo, la convención para los archivos de texto es líneas de caracteres ASCII separadas por un solo carácter de nueva línea (que es el carácter de salto de línea en ASCII ), pero el núcleo nada sabe de esta convención. Los archivos se organizan en directorios en estructura de árbol. Los direc- torios también son archivos que contienen información sobre como encontrar otros archivos. Un nombre de camino, trayectoria o ruta de un archivo es una cadena de texto que identi…ca un archivo especi…cando una ruta a través de la estructura de directorios hasta el archivo. Sintácticamente, una trayec- toria consiste en nombres de archivos individuales separados por el carácter diagonal. Por ejemplo /usr/local/fuente, la primera diagonal indica la raíz del árbol de directorios, llamado directorio raíz o root. El siguiente elemento, usr, es un subdirectorio de la raíz, local es un subdirectorio de usr y fuente es un archivo o directorio que está en el directorio local. No es posible deter- minar a partir de la sintaxis del nombre de una trayectoria si fuente es un archivo ordinario o un directorio. Un archivo puede conocerse por más de un nombre en uno o más direc- torios. Tales nombres múltiples se denominan enlaces, también se manejan enlaces simbólicos, que son archivos que contienen el nombre de una ruta de otro archivo o directorio. Las dos clases de enlaces también se conocen como enlaces duros y enlaces blandos. Los enlaces blandos (simbólicos), a dife- rencia de los duros pueden apuntar a directorios y pueden cruzar fronteras de sistemas de archivos (apuntar a otros sistemas de archivos) y el sistema operativo trata igualmente todos los enlaces. El nombre de archivo "." en un directorio es un enlace duro al directorio mismo. El nombre de archivo ".." es un enlace al directorio padre. Por tanto, si el directorio actual es /usr/jlp/programa, entonces ../bin/wdf se re…ere a /usr/jpl/bin/wdf. Los dispositivos de Hardware tienen nombres en el sistema de archivos. El núcleo sabe que estos archivos especiales de dispositivos o archivos especiales son interfaces con dispositivos, pero de todos modos el usuario accede a ellos [email protected] 432 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM prácticamente con las mismas llamadas al sistema que otros archivos.

15.1 Sistema de Archivos y Estructura de Directorios El Sistema de Archivos de Linux o cualquier sistema de archivos, general- mente es una capa bajo el sistema operativo la cual maneja el posicionamiento de tus datos en el almacenamiento, sin este el sistema no puede saber dónde empieza y termina un archivo.

Tipos de Sistema de Archivos de GNU/Linux Cuando intentas ins- talar Linux, ves que ofrece distintos sistemas de archivos como los siguientes:

Ext, Ext2, Ext3, Ext4, JFS, XFS, Btrfs y Swap

Así que, ¿qué son estos sistemas de archivos que ofrece Linux?

Ext: Antiguo y descontinuado debido a sus limitaciones.  Ext2: Primer sistema de archivos de Linux que permite 2 Terabytes de  datos.

Ext3: Evolución del Ext2, con actualizaciones y retrocompatibilidad102.  Ext4: Es más rápido y permite archivos mucho más grandes con una  velocidad signi…cativa103.

JFS: Sistemas de archivos antiguos hechos por IBM. Funcionan bien  con archivos grandes y pequeños, pero falla y los archivos se corrompen después de un largo tiempo de utilización, según los reportes.

XFS: Sistema de archivos antiguo que funciona lento con archivos pe-  queños.

Btrfs: Hecho por Oracle. No es estable como Ext en algunas distribu-  ciones, pero se puedes decir que es buen reemplazo, si es necesario. Tiene buen rendimiento. 102 El único problema que tiene es que los servidores no utilizan este tipo de sistema de archivos debido a que no soporta recuperación de archivos o Snapshots del disco. 103 Es una muy buena opción para discos de estado sólido SSD, además puedes darte cuenta que cuando intentas instalar cualquier distribución de Linux este es el sistema de archivo por defecto que sugiere Linux. [email protected] 433 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Swap: Es un espacio de intercambio que es utilizado para almacenar  datos temporales, reduciendo así el uso de la RAM, normalmente es del doble del tamaño de la RAM del equipo.

En el sistema de archivos de Linux, se tiene asociado un elemento en la tabla que guarda a los archivos y directorios dentro del sistema de archivos, que contiene un número. Este número identi…ca la ubicación del archivo dentro del área de datos llamado inodo. Cada inodo contiene información de un …chero o directorio. En concreto, en un inodo se guarda la siguiente información:

El identi…cador de dispositivo del dispositivo que alberga al sistema de  archivos.

El número de inodo que identi…ca al archivo dentro del sistema de  archivos.

La longitud del archivo en Bytes.  El identi…cador de usuario del creador o un propietario del archivo con  derechos diferenciados.

El identi…cador de grupo de un grupo de usuarios con derechos dife-  renciados.

El modo de acceso: capacidad de leer, escribir, y ejecutar el archivo  por parte del propietario, del grupo y de otros usuarios.

Las marcas de tiempo con las fechas de última modi…cación (mtime),  acceso (atime) y de alteración del propio inodo (ctime).

El número de enlaces (Hard Links), esto es, el número de nombres  (entradas de directorio) asociados con este inodo.

El área de datos ocupa el resto del disco y es equivalente a la zona de  datos en FAT. En esta zona, como su nombre indica, están almacenados los …cheros y directorios de nuestro sistema.

[email protected] 434 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Estructura de Directorios en GNU/Linux Además de los sistemas de archivos que di…ere de la de Windows, la estructura de directorios en Linux es distinta, y es necesario conocerla para encontrar …cheros de con…guración, instalar ciertos paquetes en el lugar adecuado, localizar las fuentes del Kernel, o la imagen de este, nuestros …cheros personales, entre otros.

Figura 1: Jerarquía del sistema de archivos de Linux.

De hecho, la Fundación Linux mantiene un estándar de jerarquía del sistema de archivos, este de…ne la estructura de directorios y el contenido de los directorios en las distribuciones Linux. Gracias a este estándar es posible encontrar la misma estructura de directorios en (casi) todas las distribuciones de Linux104 que a continuación describiremos brevemente:

/ es el directorio principal, la raíz o root. Contiene el resto de directo- rios, es decir, todos los demás serían subdirectorios de este (incluso si están en particiones o discos diferentes). Sin duda es el más importante.

/bin es el directorio donde se almacenan los binarios, es decir, los pro- gramas que emplea el sistema para labores administrativas como los coman- 104 Recordemos que Linux se basa en UNIX y, por tanto, toma prestada su jerarquía de sistema de archivos de UNIX. Encontramos una estructura similar en sistemas operativos similares a UNIX, como BSD y MacOS. [email protected] 435 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM dos cp, echo, grep, mv, rm, ls, kill, ps, su, tar, etc.

/sbin la S es de System, y como su nombre indica, aquí se almacenan los binarios o programas que emplea el propio sistema operativo para tareas de arranque, restauración, etc. Por ejemplo, fsck, mount, mkfs, reboot, swapon.

/boot es el directorio de arranque, donde está la o las imágenes del Kernel Linux que se cargarían durante el arranque, y también directorios y con…guración del propio gestor de arranque.

/etc muy importante para el administrador, ya que aquí residen los …cheros de con…guración de los componentes del sistema y otros programas instalados.

/dev es un directorio muy especial donde se encuentran los dispositivos de bloques o caracteres, es decir, …cheros que representan la memoria, par- ticiones, discos, dispositivos de Hardware, etc. Ya sabes que en LINUX y UNIX todo es un archivo, y no unidades como en Windows. Por ejemplo, el disco duro o particiones serían /dev/sda1, /dev/sda2, /dev/sdb1, etc.

/proc es otro directorio muy especial, más que un directorio es una interfaz por decirlo de un modo sencillo. Y aquí el sistema nos presenta los procesos105 como directorios numerados con el identi…cador de procesos PID (Process ID). Dentro de cada uno de ellos estaría toda la información necesaria para la ejecución de cada proceso en marcha. Además, encontrarías …cheros de los que extraer información importante, como cpuinfo, meminfo, etc. Es precisamente de estos …cheros de los que extraen información algunos comandos que usamos habitualmente, como por ejemplo, cuando hacemos uso de free para consultar la memoria disponible, este comando realmente estaría mostrando el contenido de /proc/meminfo de una forma ordenada.

105 Existen procesos activos y dormidos, procesos huérfanos y procesos zombis. Los procesos activos son aquellos que están en ejecución en el sistema y los procesos dormidos son aquellos que esperan algún recurso o señal para continuar con su ejecución. Los procesos huérfanos son aquellos que se siguen ejecutando a pesar que su proceso padre concluyo su operación. Los procesos zombis es un proceso que ha concluido pero aún están presentes en la tabla de procesos. [email protected] 436 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

/media o /mnt son los directorios donde se establecen generalmente los puntos de montaje. Es decir, cuando insertamos algún medio extraíble o recurso de red compartido, etc., que hayamos montado, estaría aquí si lo hemos puesto como punto de montaje. El primero es más especí…co para medios que se montan de una forma temporal.

/home es el directorio para los usuarios estándar. Por ejemplo, aquí se almacenan dentro de directorios separados (uno para cada usuario con su nombre), los …cheros personales. Por ejemplo, /home/antonio sería mi directorio personal.

/lib o /lib64 es donde se alojan las bibliotecas necesarias para los binarios presentes en el sistema. En /lib64 estarían las de las aplicaciones de 64 bits y en /lib estarían las aplicaciones de 32 bits.

/opt es un directorio que almacenarán los paquetes o programas ins- talados en el sistema que son de terceros. Por ejemplo, si instalamos algún antivirus, Chrome, Arduino IDE o ciertos paquetes grandes, suelen instalarse aquí.

/root no hay que confundirlo con /, una cosa es el directorio raíz o root y otra muy diferente /root. En este caso, se puede asemejar a un /home pero es exclusivo para el usuario root o usuario administrador.

/svr almacena …cheros y directorios relativos a servidores que tienes instalados en el sistema, como Web, FTP, CVS, etc.

/sys junto con /dev y /proc, es otro de los especiales. Y como /proc, realmente no almacena nada, sino que es una interfaz también. En este caso, son …cheros virtuales con información del Kernel e incluso, se pueden emplear algunos de sus …cheros para con…gurar ciertos parámetros del Kernel.

/tmp es el directorio para …cheros temporales de todo tipo. Es em- pleado por los usuarios para almacenar de forma temporal ciertos …cheros o incluso para almacenar Cache o ciertos …cheros volátiles de navegadores Web, etc. No obstante, hay otro directorio para lo mismo en /var/tmp. [email protected] 437 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

/var se trata de un directorio con directorios y …cheros que suelen cre- cer de tamaño, como bases de datos, logs, etc. Es precisamente los logs o registros del sistema por lo que es más popular este directorio, y allí encon- trarás muchísima información de todo lo que ocurre en el sistema: /var/logs/. Dentro de dicho directorio encontrarás separados por directorios, los logs de multitud de Software, incluido el sistema.

/usr son las siglas de User System Resources, y actualmente almacena …cheros de solo lectura relativos a utilidades del usuario, como los paquetes que instalamos mediante el gestor de paquetes en nuestra distribución. Den- tro hay como una jerarquía de árbol de directorios vistos hasta ahora (casi todos) como si de un segundo nivel se tratase. Vas a encontrar /usr/bin, /usr/lib, /usr/sbin, /usr/src, etc., que por lo dicho anteriormente y sus nombres, es intuitivo saber lo que almacenan que almacenan. Solo decir que /usr/src es donde permanecerán los …cheros de código fuente. Ten en cuenta que no todas las distribuciones de Linux siguen este es- quema y puede haber pequeñas variaciones, pero si se adaptan al estándar, no tendrás problemas al navegar por la estructura de archivos.

Rutas Absolutas o Relativas cuando se empieza a manejar un intérprete de comandos, una de las cosas que más cuesta es acostumbrarte a encontrar y hacer referencia a elementos del sistema de …cheros. Mientras que en un en- torno grá…co tenemos que hacer Click en carpetas y subcarpetas hasta llegar al elemento deseado, en el intérprete de comandos tendremos que conseguir lo mismo, pero indicando el lugar mediante una cadena de texto compuesta por los nombres de las carpetas que hay que recorrer hasta el lugar donde se encuentra el elemento deseado. Según el sistema cada nombre de carpeta se separa por un carácter especial, que en Linux será la diagonal ( / ). Estas rutas serán usadas por los comandos para saber dónde encontrar los elementos sobre los que tienen que realizar la acción correspondiente106. Hay dos formas de utilizar rutas, una es de forma absoluta y la otra de forma relativa. Vamos a explicar la diferencia a continuación:

106 Por ejemplo, si quiero posicionarme en un directorio determinado, utilizaré el comando cd y para indicar el sitio adonde quiero ir usaré una ruta, por ejemplo cd /home/. El comando cp copia elementos, en este caso necesitaremos dos rutas una para el origen (elemento que quiero copias) y otra para el destino (elemento nuevo que voy a crear o lugar donde voy a dejar las copias). Por lo tanto podría poner: cp /etc/passwd /home/copia_passwd. [email protected] 438 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Rutas Absolutas El sistema de …cheros es una estructura jerárquica que en el caso de Linux tiene una raíz que se indica cuando se pone solamente el carácter diagonal / . En la raíz estan los directorios principales del sistema que a su vez tendrán subdirectorios en su interior. Cuando quiero indicar dónde se encuentra un elemento usando una ruta absoluta, tendré que indi- carle todos los directorios por los que hay que pasar empezando desde la raíz del sistema. O lo que es lo mismo, siempre empezarán por /. Ejemplos:

/etc/apt/sources.list /var/log/syslog /home/alumno/.bashrc /usr/bin/

estas rutas suelen ser bastante largas, pero tiene como ventaja que funcio- nan siempre, independientemente del lugar desde el que ejecute la orden107.

Rutas Relativas Las rutas relativas indican el camino para encontrar un elemento, pero basándonos en el directorio desde el que se ejecuta la orden. Son mucho más cortas que las absolutas, pero para saber si son correctas o no, tenemos que saber siempre desde dónde se han utilizado. Un atajo fundamental para la construcción de rutas relativas es conocer que al escribir .. en la ruta hace referencia al directorio padre. Por lo tanto si ejecuto:

$ cd ..

estoy dando la orden de cambiar de directorio al padre del actual, es decir, al que esta justo antes en la estructura jerárquica. El único elemento que no tiene padre es la propia raíz del sistema ( / ). Las rutas relativas harán referencia a un elemento que se encuentre en el directorio desde el que ejecutamos la orden, o usará los dos puntos para ascender a directorios superiores. Siempre que sean correctos, podemos com- binarlos de la forma que necesitemos separando cada directorio por una dia- gonal. Por ejemplo una ruta correcta podría ser: ../../fotos/personales/

107 Es muy recomendable utilizar la facilidad que brinda el BASH de completar el nombre de un elemento del sistema de …cheros pulsando la tecla tabulador. Ahorrará mucho tiempo y errores. [email protected] 439 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Metacarácter o Shell Globbing los metacarácteres son caracteres que tienen un signi…cado especial en la línea de comandos, estos son comodines que el sistema permite usar para especi…car los archivos que satisfacen el …ltro especi…cado a la hora de buscar, eliminar o …ltrar nombres de archivo, estos metacarácteres son: *, ?, [ ] y [^]108.

* Se utiliza para reemplazar cero o más caracteres. Puede ser sustituido  por cualquier cadena de caracteres, ejemplo:

$ ls a*.pdf

? Sustituye un carácter cualquiera, ejemplo:  $ ls a?chivo.pdf

[ ] Se usa para de…nir rangos o conjuntos de caracteres a localizar, para  de…nir los rangos se debe usar el guión -, si son varios caracteres se separan por coma, ejemplo:

$ ls [Aa]rchivo[0-9].pdf

[^] o [!]Este caso es contrario al anterior, este representa que se busque  algo exceptuando lo que se encuentra entre los corchetes, también tra- baja con rangos, ejemplo:

$ls [^A]rchivo.pdf

Permisos de Archivos y Directorios GNU/Linux, al ser un sistema dis- eñado fundamentalmente para trabajo en red, la seguridad de la información que almacenemos en nuestros equipos (y no se diga en los servidores) es fun- damental, ya que muchos usuarios tendrán o podrán tener acceso a parte de los recursos de Software (tanto aplicaciones como información) y Hardware que están gestionados en estos equipos de cómputo. ¿Ahora podemos ver porque la necesidad de un sistema de permisos? En GNU/Linux, los permisos o derechos que los usuarios pueden tener sobre determinados archivos contenidos en él se establecen en tres niveles claramente diferenciados. Estos tres niveles son los siguientes:

108 Vease también el uso de las secuencias (véase ??). [email protected] 440 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Permisos del propietario.  Permisos del grupo.  Permisos del resto de usuarios (o también llamados "los otros").  Para tener claros estos conceptos, en los sistemas en red siempre existe la …gura del administrador, superusuario o root. Este administrador es el encargado de crear y dar de baja a usuarios, así como también, de establecer los privilegios que cada uno de ellos tendrá en el sistema. Estos privilegios se establecen tanto para el directorio de trabajo (Home) de cada usuario como para los directorios y archivos a los que el administrador decida que el usuario pueda acceder.

Permisos del propietario el propietario es aquel usuario que genera o crea un archivo/carpeta dentro de su directorio de trabajo, o en algún otro directorio sobre el que tenga derechos. Cada usuario tiene la potestad de crear, por defecto, los archivos que quiera dentro de su directorio de trabajo. En principio, él y solamente él será el que tenga acceso a la información contenida en los archivos y directorios que hay en su directorio trabajo o Home -bueno, no es del todo cierto esto, ya que el usuario root siempre tiene acceso a todos los archivos y directorios del sistema-.

Permisos del grupo lo más normal es que cada usuario pertenezca a un grupo de trabajo. De esta forma, cuando se gestiona un grupo, se gestionan todos los usuarios que pertenecen a éste. Es decir, es más fácil integrar varios usuarios en un grupo al que se le conceden determinados privilegios en el sistema, que asignar los privilegios de forma independiente a cada usuario.

Permisos del resto de usuarios por último, también los privilegios de los archivos contenidos en cualquier directorio, pueden tenerlos otros usuarios que no pertenezcan al grupo de trabajo en el que está integrado el archivo en cuestión. Es decir, a los usuarios que no pertenecen al grupo de trabajo en el que está el archivo, pero que pertenecen a otros grupos de trabajo, se les denomina resto de usuarios del sistema.

[email protected] 441 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

¿cómo puedo identi…car todo esto? sencillo, abre una terminal y realiza lo siguiente: $ ls -l entregará una salida como esta:

Figura 2: Estructura de permisos en la salida de: ls -l

Veamos por partes: El primer carácter al extremo izquierdo, representa el tipo de archivo, los posibles valores para esta posición son los siguientes: - Archivo  d Directorio  Los siguientes 9 restantes, representan los permisos del archivo y deben verse en grupos de 3 y representan: - Sin permiso  r Permiso de lectura  w Permiso de escritura  x Permiso de ejecución  Los tres primeros representan los permisos para el propietario del archivo, los tres siguientes son los permisos para el grupo del archivo y los tres últimos son los permisos para el resto del mundo o otros. Luego viene el contador de ligas simbólicas, el dueño del archivo, grupo al que pertenece, el tamaño en Bytes, la fecha de última modi…cación y …nalmente el nombre. [email protected] 442 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Entrada y Salida Estándar los procesos pueden abrir archivos a discre- ción, pero la mayor parte de los procesos esperan a que estén abiertos tres descriptores de archivos (nume-rados 0, 1 y 2) cuando inician. Estos de- scriptores se conocen como entrada estándar (0), salida estándar (1) y error estándar (2). Es común que los tres estén abiertos en la terminal del usuario. Así, el programa puede leer lo que el usuario teclea leyendo la entrada están- dar, y puede enviar salidas a la pantalla del usuario escribiendo en la salida estándar. El deScriptor de archivo de error estándar también esta abierto para escritura, y se usa para los mensajes de error.

Standard input la Entrada estándar, en inglés standard input (mejor conocido como stdin) es el mecanismo por el cual un usuario le indica a los programas la información que estos deben procesar. Por omisión, el teclado es la entrada estándar. La entrada estándar representa los datos que nece- sita una aplicación para funcionar, como por ejemplo un archivo de datos o información ingresada desde la terminal y es representado en la terminal como el tipo 0.

Standard output la Salida estándar, en inglés standard output (mejor conocido como stdout) es el método por el cual el programa puede comuni- carse con el usuario. Por omisión, la salida estándar es la pantalla donde se ejecutaron las instrucciones. La salida estándar es la vía que utilizan las aplicaciones para mostrarte información, allí podemos ver el progreso o simplemente los mensajes que la aplicación quiera darte en determinado momento y es representado en la terminal como el tipo 1.

Standard error por último existe un ‡ujo conocido como Error están- dar, en inglés standard error output (mejor conocido como stderr) que es utilizado por las instrucciones para desplegar mensajes de error que surjan durante el transcurso de su ejecución. Al igual que stdout, el error estándar será la pantalla donde se procesaron las instrucciones. El error estándar es la forma en que los programas te informan sobre los problemas que pueden encontrarse al momento de la ejecución y es representado en la terminal como el tipo 2.

Redirección mediante pipe las tuberías (pipe) unen la salida están- dar de un comando con la entrada estándar de otro, es decir, la salida de [email protected] 443 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM un comando se emplea como entrada del siguiente. Para ello se emplea el símbolo pipe " ". La utilización de tuberías evita la generación constante de archivos intermediosj reduciendo el tiempo de procesamiento.

Redirección hacia el dispositivo nulo en GNU/Linux, /dev/null es un archivo especial al que se envía cualquier información que quiera ser descartada. Aunque al principio no lo parezca, el uso del dispositivo nulo es muy útil.

15.2 Interfaz de Usuario Tanto el programador como el usuario de Linux manejan principalmente el conjunto de programas de sistemas que se ha escrito y están disponibles para ejecutarse. Estos programas efectúan llamadas al sistema operativo necesarias para apoyar su función, pero las llamadas al sistema en sí están contenidas dentro del programa y no tienen que ser obvias para el usuario. GNU/Linux puede funcionar tanto en entorno grá…co109 (Graphical User Interce, GUI) como en modo línea de comandos (Command-Line Interface, CLI) también conocida como consola o Shell. La consola es común en dis- tribuciones para servidores, mientras que la interfaz grá…ca esta orientada al usuario …nal del hogar como empresarial. Los entornos de escritorio pertenecen a la interfaz grá…ca, son un con- junto de programas conformado por ventanas, íconos, imágenes y muchas aplicaciones que facilitan el uso de la computadora. Los entornos de escrito- rio más populares en GNU/Linux son: GNOME, KDE, LXQt, LXDE, Xfce, Unity, MATE, Cinnamon, Pantheon, Deepin, Budgie, PIXEL, Enlighten- ment, Trinity, Moksha, Ukui, etc. Dependiendo la distribución se pueden tener uno o más escritorios instalados, por ejemplo en Debian GNU/Linux están disponibles los más usados y si el usuario los instala, puede decidir al

109 Un servidor de pantalla en GNU/Linux es un programa que es responsable de la coor- dinación de entrada y salida de sus clientes, hacia y desde en resto del sistema operativo, y entre el Hardware y el sistema operativo. El servidor de visualización proporciona el marco para un entorno grá…co para que se pueda utilizar el Mouse y el teclado para inter- actuar con las aplicaciones. El servidor de pantalla se comunica con sus clientes a través del protocolo del servidor de pantalla como: X11, Wayland o . El servidor de visua- lización es un componente clave en cualquier interfaz grá…ca de usuario, especí…camente el sistema de ventanas. No debemos confundir el servidor de visualización con el entorno de escritorio. El entorno de escritorio utiliza un servidor de pantalla debajo. [email protected] 444 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM iniciar sesión cual usar.

15.2.1 Interfaz Grá…ca de Usuario La interfaz grá…ca de usuario es un tipo de visualización que permite al usuario elegir comandos, iniciar programas y ver listas de archivos y otras opciones utilizando las representaciones visuales (iconos) y las listas de ele- mentos del menú. Las selecciones pueden activarse bien a través del teclado o con el ratón. Para los autores de aplicaciones, las interfaces grá…cas de usuario ofrecen un entorno que se encarga de la comunicación con la computadora. Esto hace que el programador pueda concentrarse en la funcionalidad, ya que no está sujeto a los detalles de la visualización ni a la entrada a través del ratón o del teclado. También permite a los programadores crear programas que realicen de la misma forma las tareas más frecuentes, como guardar un archivo, porque la interfaz proporciona mecanismos estándar de control como ventanas y cuadros de diálogo. Otra ventaja es que las aplicaciones escritas para una interfaz grá…ca de usuario son independientes de los dispositivos: a medida que la interfaz cambia para permitir el uso de nuevos dispositivos de entrada y salida, como un monitor de pantalla grande o un dispositivo óptico de almacenamiento, las aplicaciones pueden utilizarlos sin necesidad de cambios.

¿Qué es un entorno de escritorio? un entorno de escritorio es un conjunto de Software para ofrecer al usuario de una computadora una inte- racción amigable y cómoda. El Software es una solución completa de interfaz grá…ca de usuario, ofrece iconos, barras de herramientas, carpetas, fondos de pantalla y Widgets de escritorio, e integración entre aplicaciones con habil- idades como, arrastrar y soltar. En general cada entorno de escritorio se distingue por su aspecto y comportamiento particular, aunque algunos tien- den a imitar características de escritorios ya existentes. El primer entorno moderno de escritorio que se comercializó fue desarrollado por Xerox en los años 80. Actualmente el entorno más conocido es el ofrecido por la familia Windows aunque existen otros como los de: Macintosh (Classic y Cocoa) y de código abierto como: GNOME, KDE, LXQt, LXDE, Xfce, Unity, MATE, Cinnamon, Pantheon, Deepin, Budgie, PIXEL, Enlightenment, Trinity, Mok- sha, Ukui, etc. [email protected] 445 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

¿Qué son los gestores de ventanas? un gestor de ventanas o en inglés Windows Manager, es un programa que controla la ubicación y apari- encia de las aplicaciones bajo el sistema X Windows. Las computadoras suelen ofrecer una interfaz grá…ca de usuario que facilita la interacción con el sistema operativo. Las plataformas Windows y Macintosh ofrecen métodos de visualización y control de las ventanas e interacción con las aplicaciones, estandarizados por sus vendedores. En cambio el sistema grá…co X Windows, popular en el ámbito de sistemas Unix y similares, como GNU/Linux, permite al usuario escoger entre varios gestores según sus gustos o necesidades. Los gestores de ventanas di…eren entre sí de muchas maneras, incluyendo aparien- cia, consumo de memoria, opciones de personalización, escritorios múltiples o virtuales y similitud con ciertos entornos de escritorio ya existentes. Estos se dividen en 3 tipos, que son los siguientes:

Stacking: Aquellos que imitan las apariencias y funcionalidades de Win-  dows y Mac OS X, poe ende, gestionan las ventanas como pedazos de papel en un escritorio, que pueden ser apiladas unas sobre otras.

Tiling: Aquellos de tipo "mosaico" donde las ventanas no se superpo-  nen, y donde suelen hacerse un uso muy extenso de atajos de teclado, y se obtienen una menor dependencia del uso del ratón.

Dynamics: Aquellos que permiten alterar dinámicamente el diseño de  las ventanas entre mosaicos o ‡otantes.

Las acciones asociadas al gestor de ventanas suelen ser, abrir, cerrar, minimizar, maximizar, mover, escalar y mantener un listado de las ventanas abiertas. Es también muy común que el gestor de ventanas integre elementos como: el decorador de ventanas, un panel, un visor de escritorios virtuales, iconos y un tapiz.

Entornos de Escritorios más Conocidos:

KDE (htps://.org) proyecto que fue iniciado en octubre de 1996 por el programador alemán , quien buscaba crear una interfaz grá…ca uni…cada para sistemas Unix. En sus inicios imitó a CDE (Common Environ- ment), un entorno de escritorio utilizado por varios Unix. Este es un entorno [email protected] 446 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM de escritorio, multitud de aplicaciones e infraestructura de desarrollo para diversos sistemas operativos como GNU/Linux, Mac OS X, Windows, etc. Los principales componentes de Software elaborados por KDE se agrupan bajo el nombre KDE Frameworks, KDE Plasma y KDE Applications. Las aplicaciones KDE están traducidas a aproximadamente 88 idiomas y están construidas con los principios de facilidad de uso y de accesibilidad moderna en mente y funcionan de forma completamente nativa en GNU/Linux, BSD, Solaris, Windows y Mac OS X.

GNOME (https://www.gnome.org) este proyecto fue iniciado por los programadores mexicanos y Federico Mena y forma parte o…cial del proyecto GNU. Nació como una alternativa a KDE bajo el nombre de GNU Network Object Model Environment (Entorno de Modelo de Objeto de Red GNU). Actualmente, GNOME se está traduciendo a 193 idiomas. Donde 38 de estos ya cuentan con al menos el 80% de cadena traducidas. Está disponible en las principales distribuciones GNU/Linux, incluyendo Fedora, Debian, Ubuntu, Manjaro Linux, , SUSE Linux Enterprise, CentOS, , Arch Linux, Gentoo6, SteamOS, entre otras. También, se encuentra disponible en Solaris, un importante sistema operativo UNIX y en Sistemas operativos Unix-like como FreeBSD.

Xfce (https://www.xfce.org) es un entorno de escritorio libre para sistemas tipo Unix como GNU/Linux, BSD, Solaris y derivados. Su objetivo es ser rápido y ligero, sin dejar de ser visualmente atractivo y fácil de usar. Consiste en varios componentes empaquetados por separado que en conjunto proporcionan la funcionalidad completa del entorno de escritorio, pero se pueden seleccionar por separado para que el usuario pueda adaptar el ambiente de trabajo a sus necesidades. Puede ser instalado en varias plataformas como: Linux, NetBSD, FreeBSD, OpenBSD, Solaris, Cygwin and MacOS X, sobre x86, PPC, Sparc, Alpha.

LXDE (https://lxde.org) es un entorno de escritorio libre para Unix y otras plataformas POSIX, como Linux o BSD. El nombre corresponde a "Lightweight X11 Desktop En- vironment", que en español signi…ca Entorno de escritorio X11 ligero. Es un proyecto que apunta a entregar un nuevo entorno de escritorio ligero y [email protected] 447 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM rápido. No está diseñado para ser tan complejo como KDE o GNOME, pero es bastante usable y ligero, y mantiene una baja utilización de recursos y energía. A diferencia de otros ambientes de escritorio, los componentes no se integran …rmemente. Al contrario, los componentes son independientes, y cada uno de ellos se puede utilizar independientemente con muy pocas depen- dencias. Y usa como gestor de ventanas predeterminado y apunta a ofrecer un escritorio ligero y rápido basado en componentes independientes que pueden ser utilizados en otros entornos.

LXQt (https://lxqt.github.io) es un entorno de escritorio libre y de código abierto para Linux, resultado de la fusión entre los proyectos LXDE y Razor-qt. LXQt conjuga la …losofía de LXDE con las librerías QT, usa el gestor de ventanas del escritorio Razor- qt, un escritorio muy liviano y es considerado por muchos como el sucesor de LXDE.

Gestores de Ventanas más Conocidos:

Enlightenment (https://www.enlightenment.org) también conocido simplemente como E, es un gestor de ventanas X11 ligero para UNIX y GNU/Linux. Uno de sus objetivos es llegar a ser un entorno de escritorio completo. Es muy con…gurable y muy atractivo visual- mente. Durante un tiempo fue el gestor de ventanas de GNOME.

IceWM (https://ice-wm.org) es un gestor de ventanas para el X Windows System grá…co de infraestruc- tura escrito por Marko Macek. Se ha codi…cado desde cero en C++ y es liberado bajo GNU. IceWM es ligero y personalizable. Se puede con…gurar a partir de archivos de texto almacenados en un directorio Home del usuario, haciendo fácil de personalizar y copia de con…guraciones. Posee soporte o…- cial para menús de GNOME y KDE previamente disponible como un paquete separado.

Windows Maker (https://www.windowsmaker.org) es un popular gestor de ventanas para X Windows System diseñado para emular NeXT del GUI como OpenStep compatible, ha sido descrito como [email protected] 448 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

"uno de los más útiles y universales gestores de ventanas disponibles. Win- dows Maker tiene la reputación de ser rápido, e…ciente y altamente estable y es muy popular entre las soluciones de código abierto para su uso tanto en nuevas como en viejas máquinas. Como con la mayoría de gestores de ventanas, soporta un montón de temas disponibles.

Fluxbox (http://‡uxbox.org) es un gestor de ventanas X basado en 0.61.1.Su objetivo es ser ligero y personalizable, y cuenta con un apoyo mínimo de iconos grá…cos. Su interfaz de usuario sólo tiene una barra de tareas y un menú que se puede acceder pulsando con el botón derecho sobre el escritorio. Todas las con…guraciones básicas están controladas por …cheros de texto. puede mostrar algunos eye candys: colores, gradientes, bordes y una que otra apariencia básica. Las versiones recientes soportan esquinas redondeadas y elementos grá…cos. Fluxbox también tiene varias características de las cuales Blackbox carece, incluyendo ventanas con pestañas y un título con…gurable.

Openbox (http://openbox.org/new/) es un famoso gestor de ventanas libre para el sistema de ventanas X, licenciado bajo la GNU General Public License. Openbox fue originalmente derivado de Blackbox 0.65.0, pero ha sido totalmente reescrito en el lenguaje de programación C y desde la versión 3,0 no se basa en ningún código de Blackbox. Su sistema de menú tiene un método para utilizar los menús dinámicos.

Otros existen muchos otros gestores de ventanas que pudiéramos men- cionar, tales como: , , AfterStep, Scwm, Blackbox, Bspwm, Byobu, Cinnamon, , Deepin, , Fvwm, Icewm, Jwm, Kahakai, Lumina, Qtile, Wmii, WindowLab, , Saw…sh, , , Wmx, StumpWM, , Waimea, , I3, E16.

15.2.2 Línea de Comandos y Órdenes La mayoría de los usuarios de ordenadores de hoy sólo están familiarizados con la interfaz grá…ca de usuario o GUI y los vendedores y los expertos les han enseñado que la interfaz de línea de comandos o CLI es una cosa espantosa del pasado. Es una pena, porque una buena interfaz de línea de comandos [email protected] 449 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM es una maravillosa y expresiva forma de comunicarse con el ordenador, muy parecida a lo que el lenguaje escrito es para los seres humanos. Se ha dicho que "las interfaces grá…cas de usuario hacen fáciles las tareas fáciles, mientras que las interfaces de línea de comandos hacen posibles las tareas difíciles" y eso es muy cierto aún hoy. Dado que Linux fue desarrollado desde la familia de sistemas operativos Unix, comparte la misma rica herencia de herramientas de línea de comandos que Unix. Unix saltó a la fama en los primeros años ochenta (aunque fue desarrollado una década antes), antes de que se extendiera la adopción de las interfaces grá…cas de usuario, y por eso, se desarrolló una amplia interfaz de línea de comandos en su lugar. De hecho, una de las razones más potentes para que los primeros que utilizaron Linux lo eligieran sobre, digamos, Win- dows NT, era la poderosa interfaz de línea de comandos que hacía las "tareas difíciles posibles".

Emuladores de Terminal Cuando utilizamos una interfaz grá…ca de usuario, necesitamos otro programa llamado emulador de terminal para interactuar con el Shell. Si buscamos en nuestros menús de escritorio, probablemente en- contraremos uno. KDE usa y GNOME usa Gnome-terminal, aunque es probable que se llame simplemente "Terminal" en nuestro menú. Hay mu- chos otros emuladores de terminal disponibles para Linux, pero todos hacen básicamente lo mismo; nos dan acceso al Shell.

El Shell Los programas, tanto los escritos por el usuario como los de sis- temas, normalmente se ejecutan con un intérprete de órdenes. El intérprete de órdenes en Linux es un proceso de usuario como cualquier otro y recibe el nombre de Shell (concha o cáscara) por que rodea al núcleo del sistema operativo.

El Interprete de Órdenes de Consola o Shell es un programa in- formático, cuya función consiste en interpretar órdenes, y un lenguaje de consola. El más conocido es Bash110. Es una Shell de Unix compatible con POSIX y el intérprete de comandos por defecto en la mayoría de las dis- tribuciones GNU/Linux, además de Mac OS. También se ha llevado a otros

110 Su nombre es un acrónimo de Bourne-again Shell ("Shell Bourne otra vez"), haciendo un juego de palabras (born-again signi…ca "nacido de nuevo") sobre la Bourne Shell (sh), que fue uno de los primeros intérpretes importantes de Unix. [email protected] 450 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM sistemas como Windows y Android. Algunas alternativas a Bash son: SH (Bourne Shell), CSH (C Shell), KSH (Korn Shell), Fish (Friendly Interactive Shell), ZSH (Z Shell), TSCH (TS Shell), Dash (Debian Almquist Shell), DSH (Distributed Shell).

El Shell indica que está listo para aceptar otra orden exhibiendo una señal de espera (Prompt) y el usuario teclea una orden en una sola línea. En el Bourne Shell y sus derivados como Bash el Prompt que nos permite escribir los diferentes comandos, generalmente termina con el carácter:

$ para usuario sin privilegios  # para el administrador, conocido como root  Trabajando en Línea de Comandos Las órdenes se pueden agrupar en varias categorías; la mayor parte de ellas están orientadas hacia archivos o directorios. Por ejemplo los programas que de sistema que manipulan directorios son mkdir para crear directorio nuevo, para eliminar un directorio, cd para cambiar el directorio actual a otro y para visualizar el nombre de la ruta absoluta del directorio actual (de trabajo). El programa ls lista los nombres de los archivos del directorio actual. Cualquiera de las más de 20 opciones de ls puede hacer que se exhiban también las propiedades de los archivos, por ejemplo, la opción -l pide un listado largo, que muestra el nombre de cada archivo, su dueño, la protección, la fecha y hora en que se creó, su tamaño. El programa cp crea un archivo nuevo que es una copia de uno ya existente. El programa mv cambia de lugar un archivo dentro del árbol de directorios. En la mayor parte de los casos, este movimiento sólo requiere un cambio de nombre de archivo, pero si es necesario el archivo se copia en su nueva posición y la copia vieja se elimina. Los archivos se eliminan con el programa rm. Para mostrar el contenido de un archivo en la terminal, un usuario puede ejecutar cat. El programa cat toma una lista de archivos y los concatena, copiando el resultado en la salida estándar, que normalmente es la terminal. Claro que la terminal el archivo podría exhibirse con demasiada rapidez como para leerse. El programa exhibe el archivo pantalla por pantalla y hace una pausa hasta que el usuario teclea un carácter para continuar con la siguiente pantalla. El programa head exhibe sólo las primeras líneas del archivo; tail muestra las últimas líneas. [email protected] 451 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Estos son algunos de los programas que usa Linux, además hay editores de texto (ed, sed, emacs, nano, vi, etc.), compiladores (de C, C++, Java, Python, etc.), formateadores de texto (LaTeX, tro¤, etc.), programas para ordenar (sort) y comparar (cmp, di¤ ) archivos, buscar patrones (grep, awk) y muchas otras actividades.

La ejecución de una orden se efectúa con una o más llamadas al sistema operativo. Por lo regular, el Shell ejecuta una pausa cuando se le pide ejecutar una orden, queda en espera a que esta termine se de ejecutar. Existe una sintaxis sencilla (un signo & al …nal de la línea de órdenes) para indicar que el Shell no debe esperar hasta que termine de ejecutarse la orden. Una orden que deja de ejecutándose de esta manera mientras el Shell sigue interpretando órdenes subsecuentes es una orden en segundo plano, o que se ejecuta en segundo plano. Los procesos para los cuales e Shell sí espera se ejecutan en primer plano. El Shell del sistema GNU/Linux ofrece un recurso llamado control de trabajos (y visualizarlos con los comandos ps o top) implementado espe- cialmente en el núcleo. El control de trabajos permite transferir procesos entre el primer y segundo plano. Los procesos pueden detenerse y reiniciarse según diversas condiciones, como que un trabajo en segundo plano requiera entradas desde la terminal del usuario. Este esquema hace posible la mayor parte del control de procesos que proporcionan las interfaces de ventanas, pero no requiere Hardware especial. Cada ventana se trata como una termi- nal, y permite a múltiples procesos estar en primer plano (uno por ventana) en cualquier momento. Desde luego pueden haber procesos de segundo plano en cualquiera de las ventanas.

Correr múltiples comandos en uno solo Supongamos que se tiene que ejecutar varios comandos uno tras otro -sin conocer si el comando anterior fue exitoso para ejecutar el nuevo-, para este propósito se usa el separador ";", de esta manera se pueden ejecutar una serie de comando en una línea, ejemplo:

$ mkdir tmp ; ls ; cd tmp ; ls

en este ejemplo se crea en directorio, luego visualiza el contenido del di- rectorio, para luego cambiar de directorio y …nalmente visualiza el contenido del directorio recién creado. [email protected] 452 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Si necesitamos ejecutar múltiples comandos en uno solo, sólo si el co- mando anterior fue exitoso, en este caso se usa el separador "&&", ejemplo:

$ mkdir tmp && ls && cd tmp && ls

Notemos que si ejecutamos:

$ mkdir tmp & ls & cd tmp & ls

el resultado obtenido en nada se parece a lo que esperamos, ya que los comando pasarán a ser ejecutados en segundo plano y sin orden alguno, por lo que el resultado no será el deseado.

Ya vimos como usar un solo comando para ejecutar varios comandos. Pero, ¿qué debo hacer en caso que el primer comando no se ejecute correc- tamente?, ¿deseo ejecutar el comando siguiente?. Podemos usar para que si el primer comando falla se ejecute el segundo, pero si no falla nojj ejecutará el segundo comando, por ejemplo:

$ yu ls jj

También podemos combinar los comandos && y los cuales se compor- tarán como el operador ternario de C y C++ (condición?jj expresión_verdadera; expresión_falsa):

$ comando1 && comando2 comando3 jj por ejemplo:

$ [-f archivo.txt ] && echo "Archivo existe" echo "Archivo no existe" jj

podemos combinar ;, && y para correr múltiples comandos en Scripts. jj

[email protected] 453 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Cambiar de Usuario en Linux El comando su (Switch User) se utiliza para cambiar de usuario cuando estamos dentro de la consola de Linux, ejemplo:

$ su antonio

si delante del usuario ponemos - nos abrirá una nuevo Shell con las pre- ferencias del usuario al que cambiemos, por ejemplo:

$ su - administracion

Por otro lado, si usamos el comando su sin usuario, nos permitirá ingresar como el usuario administrador del sistema root (por defecto), pidiendo el clave o Password de dicho usuario, ejemplo:

$ su

Una de las funciones del usuario administrador es hacer la instalación, actualización y borrado de paquetes, el comando más usado actualmente es apt (Advanced Pakaging Tool, herramienta avanzada de empaquetado que es una interfase del paquete apt-get), es un programa de gestión de paquetes . creado por el proyecto Debian, apt simpli…ca en gran medida la instalación, actualización y eliminación de programas en GNU/Linux. Existen también programas que proporcionan estos mismos servicios como: apt-get, , tasksel y dpkg. Ya siendo el usuario root, podemos solicitar la descarga de las actualiza- ciones disponibles, usando:

# apt update

para conocer los paquetes que se necesitan actualizar, usamos:

# apt list –upgradeable

para actualizar los paquetes instalados en el sistema111, usamos:

111 Podemos hacer la actualización en un solo comando, usando:

# apt update && apt upgrade && apt clean [email protected] 454 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

# apt upgrade

algunas veces ciertos paquetes ya no se usarán al actualizar el sistema, para borrarlos usamos:

# apt autoremove

para buscar paquetes que son potencialmente instalables, usamos:

# apt search nombre

para conocer las características de un paquete a instalar, usamos:

# apt show nombre

para instalar uno o más paquetes, usamos:

# apt install paquete

para remover uno o más paquetes, usamos:

# apt purge paquete

al …nal, se solicita el borrado de los archivos .deb de los paquetes descar- gados (Cache de descarga), mediante:

# apt clean

podemos conocer todos los paquetes instalados en el sistema, usando:

$ apt list –installed

El usuario root en GNU/Linux es el usuario que tiene acceso admi- nistrativo al sistema. Los usuarios normales no tienen este acceso por ra- zones de seguridad. Sin embargo, en múltiples sistemas derivados de Debian GNU/Linux no incluye el usuario root (por ejemplo en todos los derivados de Ubuntu). En su lugar, se da acceso administrativo a usuarios individuales, que pueden utilizar la aplicación sudo para realizar tareas administrativas. La primera cuenta de usuario que creó en su sistema durante la instalación tendrá, de forma predeterminada, acceso a sudo. [email protected] 455 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Cuando se necesite ejecutar una aplicación que requiere privilegios de ad- ministrador, sudo le pedirá que escriba su contraseña de usuario normal. Esto asegura que aplicaciones incontroladas no puedan dañar su sistema, y sirve como recordatorio de que está a punto de realizar acciones administrativas que requieren que tenga cuidado. Para usar sudo en la línea de comandos, simplemente escriba sudo antes del comando que desea ejecutar, sudo le pedirá su contraseña112:

$ sudo apt update

15.3 Trabajando en Línea de Comandos Linux es un potente sistema operativo visual y de línea de comandos113. En esta última se tiene una potente herramienta, en ella se encuentran desde los comandos básicos hasta los más avanzados114, algunos de ellos son: Manipulación de archivos y directorios115

ls, pwd, cd, mkdir, rmdir, cp, mv, rename, rm, ln, unlink, cat, touch, cmp, di¤, wc, tail, head, more, less, paste, cut, tr, fold, nano 112 Sudo recordará su contraseña durante un periodo de tiempo (predeterminado a 15 minutos). Esta característica se diseñó para permitir a los usuarios realizar múltiples tareas administrativas sin tener que escribir su contraseña cada vez. 113 Android tiene la base de Linux, por ello en cualquier dispositivo que soporte dicho sistema operativo es posible instalar una aplicación para acceder a la terminal de línea de comandos — por ejemplo ConnectBot— , y en ella podemos correr los comandos que mostramos en esta sección. 114 En la Web se puede obtener acceso a diversos proyectos que ponen a disposición del usuario la documentación de una gran variedad de comandos de Linux, algunos de estos proyectos son: http://man7.org/linux/man-pages/ https://linux.die.net/man/ https://www.kernel.org/doc/man-pages/ 115 Existe la opción de gestionar …cheros comprimidos, gracias a los comandos zgrep, zegrep, zless, zmore, zdi¤, zcmp, zcat. Como te puedes dar cuenta la función de cada uno de estos comandos será la misma que su homónimos sin «z» (grep, egrep, less, more, di¤, cmp, cat) pero para …cheros comprimidos con gzip y extensión .gz. De forma análoga para archivos comprimidos usando bz2, están los comandos bzgrep, bzegrep, bzless, bzmore, bzdi¤, bzcmp, bzcat y para archivos comprimidos usando xz, están los comandos xzgrep, xzegrep, xzless, xzmore, xzdi¤, xzcmp, xzcat.

[email protected] 456 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Comandos generales man, help, info, whatis, which, whereis, clear, w, time, whoami, date, cal, uptime, uname, df, du, free, bc, history, echo Administración y Permisos chmod, chown, chgrp, su, useradd, usermod, deluser, passwd, lsattr, chattr, id Búsqueda …nd, grep, locate Respaldo tar, gzip, bzip2, zip, unp Varios …le, stat, type, ps, kill, killall, pgrep, pwdx, awk, sort, sed, md5sum, sleep, watch Monitorear el desempeño lscpu, free, top, whowatch, dstat, vmstat, iotop, iostst, lsof, lsusb, tcpdump, nmcli, ip

A continuación detallamos el uso de varios de estos comandos que se ejecutan en la línea de comandos de GNU/Linux o Terminal116. Hay que recalcar que cada comando tiene una gran variedad de opciones, pero la des- cripción completa de cada comando y opciones de este, se escapa de nuestros …nes, por ello si se necesita conocer la referencia completa de dichos comandos hay varias maneras de obtenerla, entre otras haciendo uso de man, help, info o whatis aplicado al comando de nuestro interés. 116 Existen varios atajos de teclado que facilitan el navegar en la terminal de comandos, entre los que destacan: CTRL L Limpia el contenido de la terminal CTRL C Concluye el programa que esta en ejecución CTRL D Concluye la sesión en la terminal cerrando esta SHIFT Page Up/Down Navega en la terminal una página arriba o abajo CTRL A Posiciona el cursor al inicio de la línea CTRL E Posiciona el cursor al …nal de la línea [email protected] 457 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Manipulación de Archivos y Directorios

ls (de listar), permite listar el contenido de un directorio o …chero. La sintaxis es:

$ ls /home/directorio

el comando ls tiene varias opciones que permiten organizar la salida, lo que resulta particularmente útil cuando es muy grande. Por ejemplo, puedes usar -a para mostrar los archivos ocultos, -i para mostrar el inodo117, -l para mostrar los usuarios, permisos, tamaño en Bytes y la fecha de los archivos; -S ordena por tamaño, -R recursivo, -r en orden inverso, -t ordenados por fecha de modi…cación, -h muestra el tamaño en unidades fáciles de leer -como KB, MB o GB-. Así como para todos los comandos Linux, estas opciones pueden combinarse, terminando en algo como:

$ ls - /home/directorio

por ejemplo para mostrar primero los archivos recientemente modi…cados, usamos:

$ ls -lt

o los más recientes al …nal, usamos:

$ ls -ltr

podemos pedir que sólo liste los directorios en la actual trayectoria:

$ ls -d */

CTRL U Borra lo que esta a la izquierda del cursor CTRL K Borra lo que esta a la derecha del cursor CTRL W Borra la palabra a derecha del cursor CTRL Y Pega lo que se quito con CTRL U, K, W TAB Autocompletar el nombre de archivo o comando CTRL R Permite buscar dentro del historial de comandos !! Permite repetir el último comando CTRL Z Detiene la ejecución del comando actual (permite continuar la ejecución con fg en primer plano o bg en segundo plano) 117 El inodo es un registro en el disco que contiene la información del archivo como su propietario, tamaño, fecha de creación, ubicación, entre otros. [email protected] 458 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

pwd (de print working o imprimir directorio de trabajo), es un comando que imprime nuestra ruta o ubicación al momento de ejecutarlo, así evitamos perdernos si estamos trabajando con múltiples directorios y carpetas. Su sintaxis sería:

$ pwd

cd (de change directory o cambiar directorio), es como su nombre lo indica el comando que necesitarás para acceder a una ruta distinta de la que te encuentras. Por ejemplo, si estas en el directorio /home y deseas acceder a /home/ejercicios, sería:

$ cd /home/ejercicios

teclear el comando cd solo regresa al directorio home del usuario (lo mismo hace al teclear cd ~), teclear el comando cd - retorna al último directorio antes de hacer cambio de directorio, si estas en /home/ejercicios y deseas subir un nivel (es decir ir al directorio /home), ejecutas:

$ cd ..

mkdir (de make directory o crear directorio), crea un directorio nuevo tomando en cuenta la ubicación actual. Por ejemplo, si estas en /home y deseas crear el directorio ejercicios, sería:

$ mkdir /home/ejercicios

mkdir tiene una opción bastante útil que permite crear un árbol de di- rectorios completo que no existe. Para eso usamos la opción -p:

$ mkdir -p /home/ejercicios/prueba/uno/dos/tres

o podemos pedir que cree múltiples directorios simultáneamente:

$ mkdir {uno, dos, tres}

[email protected] 459 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

rmdir (de remove directory o borrar directorio), borra un directorio vació:

$ rmdir /home/ejercicios

o podemos pedir que borre múltiples directorios vacios simultáneamente:

$ rmdir {uno, dos, tres}

cp (de o copiar), copia un archivo o directorio origen a un archivo o directorio destino. Por ejemplo, para copiar el archivo prueba.txt ubicado en /home a un directorio de respaldo, podemos usar:

$ cp /home/prueba.txt /home/respaldo/prueba.txt

en la sintaxis siempre se especi…ca primero el origen y luego el destino. Si indicamos un nombre de destino diferente, cp copiará el archivo o directorio con el nuevo nombre. El comando también cuenta con la opción -r que copia no sólo el directorio especi…cado sino todos sus directorios internos de forma recursiva. Suponiendo que deseamos hacer una copia del directorio /home/ejercicios que a su vez tiene las carpetas ejercicio1 y ejercicio2 en su interior, en lugar de ejecutar un comando para cada carpeta, ejecutamos:

$ cp -r /home/ejercicios /home/respaldos/

también podemos usar -u para copiar aquellos archivos que no existen o son nuevos en el directorio destino:

$ cp -u /home/ejercicios/*.dat /home/respaldos/

mv (de move o mover), mueve un archivo a una ruta especí…ca, y a diferencia de cp, lo elimina del origen …nalizada la operación. Por ejemplo:

$ mv /home/prueba.txt /home/respaldos/prueba2.txt

al igual que cp, en la sintaxis se especi…ca primero el origen y luego el destino. Si indicamos un nombre de destino diferente, mv moverá el archivo o directorio con el nuevo nombre. Si queremos solo cambiar la extensión de un archivo podemos usar:

$ mv archivo.{old,new} [email protected] 460 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

rename este comando permite renombrar118 un grupo de archivos, por ejemplo deseamos renombrar todos los archivos con extensión .htm y rem- plazarlos con la extensión .html, entonces usamos:

$ rename .htm .html *.htm

si tenemos directorios dir1, dir2, dir3 y los queremos renombrar como dir001, etc., usamos:

$ rename -v dir dir00 dir?

rm (de remove o remover), es el comando necesario para borrar un archivo o directorio. Para borrar el archivo prueba.txt ubicado en /home, ejecutamos:

$ rm /home/prueba.txt

este comando también presenta varias opciones. La opción -r borra todos los archivos y directorios de forma recursiva. Por otra parte, -f borra todo sin pedir con…rmación. Estas opciones pueden combinarse causando un borrado recursivo y sin con…rmación del directorio que se especi…que. Para realizar esto en el directorio respaldos ubicado en el /home, usamos:

$ rm -rf /home/respaldos

Este comando es muy peligroso, por lo tanto es importante que nos docu- mentemos bien acerca de los efectos de estas opciones en nuestro sistema para así evitar consecuencias nefastas.

118 El comando mmv permite copiar, mover, hacer ligas simbólicas de múltiples archivos, se instala usando:

# apt install mmv

[email protected] 461 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

ln permite crear enlaces a los archivos, tanto duros (Hard Links) como simbólicos -s (Soft Links). En pocas palabras, un enlace simbólico es como un acceso directo en Windows o un alias en Mac OS X mientras que un enlace duro es un nombre diferente para la misma información en disco. Todos los archivos que apuntan a un mismo enlace duro, comparten el inodo -este es un registro en el disco que contiene la información del archivo como su propietario, tamaño, fecha de creación, ubicación, entre otros-. Para crear un enlace duro usamos:

$ ln archivo_origen nombre_enlace

para conocer el inodo de un archivo, usamos:

$ ls -li archivo

para conocer todos los archivos que apuntan a un mismo enlace duro cuyo inodo conozcamos, usamos:.

$ …nd / -inum

y para conocer a todos los archivos que comparten inodo, usamos:

$ …nd . -type f -printf ’%10i %p n’ sort uniq -w 11 -d -D less n j j j

En caso de necesitar actualizar un enlace duro con otro archivo podemos usar:

$ ln -f nuevo enlace

Para crear un enlace simbólico, hacemos:

$ ln -s archivo_origen nombre_enlace

si bien para conocer a donde apunta un enlace simbólico podemos usar ls -l, también podemos usar:

$ readlink nombre_enlace

en caso de necesitar actualizar un enlace simbólico existente con otro archivo podemos usar: [email protected] 462 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

$ ln -fs nuevo ligaexistente

Si por alguna razón el archivo al que apunta la liga simbólica se borra, esto genera una liga rota, para encontrar las ligas rotas en nuestro árbol de archivos, usamos:

$ …nd . -xtype l

y si queremos conocer todas las ligas y a quien apuntan, usamos:

$ …nd . -type l -print xargs ls -ld awk ’{print $9 $10 $11}’ j j unlink sirve para remover un archivo, en caso de que el archivo sea un enlace creado por ln, solo borra al archivo no a su enlace, por ejemplo:

$ unlik nombre_enlace

cat (de concatenar), Nos permite visualizar el contenido de un archivo de texto sin la necesidad de un editor. Para utilizarlo solo debemos men- cionarlo junto al archivo que deseamos visualizar:

$ cat prueba.txt

touch crea un archivo vacío, si el archivo existe actualiza la hora de modi…cación. Para crear el archivo prueba1.txt en /home, sería:

$ touch /home/prueba1.txt

cmp compara el contenido de dos archivos y devuelve 0 si los archivos son idénticos ó 1 si los archivos tienen diferencias. En caso de error devuelve -1.

$ cmp -s archivo1 archivo2

también puede mostrar algo de información sobre las diferencias pero para un reporte más detallado tenemos el siguiente comando:

[email protected] 463 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

di¤ al igual que cmp, compara el contenido de dos archivos pero en lugar de devolver un valor imprime en pantalla un resumen detallado línea a línea de las diferencias. Ejecutarlo es tan simple como:

$ di¤ archivo1.txt archivo2.txt

también puede usarse con directorios. En este caso comparará los nombres de los archivos correspondientes en cada directorio por orden alfabético e imprimirá en pantalla los archivos que estén en un directorio pero no estén en el otro (otra opción es sdi¤ que permite mostrar las diferencias entre dos archivos y combinarlos de forma interactiva).

wc imprime en pantalla la cantidad de saltos de línea, palabras y Bytes totales que contenga un archivo. Para usarlo con un archivo cualquiera eje- cutamos:

$ wc archivo.txt

podemos solo pedir que cuente el número de líneas usamos -l, para el número de caracteres usamos -c o para el número de palabras usamos -w.

tail muestra en pantalla las últimas 10 líneas de un archivo:

$ tail archivo.txt

pero podemos indicarle un número diferente de líneas a visualizar usando el parámetro -n:

$ tail -n 30 archivo.txt

si el archivo solo tiene 43 líneas, podemos pedir que solo visualice la 42 y 43, mediante:

$ tail -n +42 archivo.txt

por último, si el archivo es generado por el sistema de mensajes de Linux(un archivo Log), podemos ver como se va generando sus entradas en tiempo real, usando:

$ tail -f /var/log/archivo.log [email protected] 464 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

head es el comando opuesto a tail, muestra las primeras líneas de un archivo.

$ head archivo.txt

al igual que tail, muestra por defecto las 10 primeras líneas pero podemos indicarle un número diferente usando el parámetro -n:

$ head -n 50 archivo.txt

o que muestre todo excepto las últimas N líneas, usando:

$ head -n -15 archivo.txt

también es posible visualizar las primeras líneas de múltiples archivos usando:

$ head -n 2 archivo1.txt archivo2.txt

a la salida de este último comando le podemos quitare el indicador del archivo, mediante:

$ head –qn 2 archivo1.txt archivo2.txt

Podemos combinarlo con tail para mostrar sólo una determinada línea de un archivo (digamos la 13), usamos:

$ head -n 13 archivo.txt tail +13 j y para mostrar un rango de líneas (digamos de la 10 a 15), usamos:

$ head -n 15 archivo.txt tail -n +10 j por último, podemos indicarle que solo nos muestre los primeros carac- teres, mediante -C, ejemplo:

$ head -C5 archivo.txt

[email protected] 465 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

more es un …ltro que permite paginar el contenido de un archivo para que se vea a razón de una pantalla a la vez. Para utilizarlo simplemente ejecutamos:

$ more archivo.txt

permite navegar a través del contenido del archivo usando las ‡echas direccionales Arriba y Abajo, Espacio o la tecla Enter y para buscar una cadena usamos /. Para salir de more usamos la tecla q. Además, podemos indicar que salte hasta donde se encuentra una determinada cadena usando +/cadena, o iniciar a partir de la línea +n del texto, por ejemplo:

$ more +/cadena archivo.txt $ more +30 archivo.txt

less Aunque su nombre es lo opuesto de more es realmente una versión mejorada de éste último. Es otro …ltro que permite paginar el contenido de un archivo pero que además de permitir la navegación hacia adelante y hacia atrás, esta optimizado para trabajar con archivos muy grandes. Ejecutarlo es tan simple como escribir:

$ less archivo.txt

permite navegar a través del contenido del archivo usando las ‡echas direccionales arriba y abajo, Espacio o la tecla Enter. Para salir de less también usamos la tecla Q.

paste uni…ca (en salida estándar) dos o más archivos de texto, fusio- nando líneas de manera que las entradas en la primera columna pertenecen al primer archivo, las de la segunda columna son para el segundo archivo (separadas por TABs), y así sucesivamente, ejemplo:

$ paste uno.txt dos.txt tres.txt

se puede de…nir delimitadores entre las entradas de cada …la resultante, usando -d , ejemplo:

$ paste -d : uno.txt dos.txt tres.txt [email protected] 466 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

además, se puede cambiarla operación de fusión se realice por …las, de manera que el primer renglón son las entradas del primer archivo (separadas por TABs), el segundo renglón son las entradas del segundo archivo, y así sucesivamente, para ello se emplea la opción -s, ejemplo:

$ paste -s uno.txt dos.txt tres.txt

cut se encarga de cortar columnas o campos seleccionados de uno o más …cheros (o entrada estándar), por ejemplo para conocer los usuarios del sistema y sus directorio de trabajo, usamos:

$ cut -d ":" -f 1,6 /etc/passwd

para indicar el delimitador usamos -d y para indicarle las columnas a visualizar usamos -f.

tr se encarga de sustituir un delimitador por otro de uno o más …cheros (o entrada estándar), por ejemplo: Se sustituye el delimitador ":" por un tabulador:

$ cut -d ":" -f 1,6 /etc/passwd tr -s ":" " t" j n o elimina las nuevas lineas ( n) de un archivo, usando: n $ tr -d n < entrada.txt > salida.txt n entre otras opciones podemos pedir que cambie de mayúsculas a minús- culas o viceversa, usando:

$ echo "Esto es una prueba" tr ’[:lower:]’ ’[:upper:]’ $ echo "Esto es una prueba" j tr ’[:upper:]’ ’[:lower:]’ j también podemos transformar un conjunto de caracteres en otro, ejemplo:

$ echo "Esto es una prueba" tr ’[aeiout]’’’ j o hacer el opuesto, es decir, transformar cualquier carácter que no este en conjunto, ejemplo:

$ echo "Esto es una prueba" tr -c ’[aeiout]’’’ j [email protected] 467 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

podemos borrar los caracteres indicados, ejemplo:

$ echo "Esto Es Una Prueba" tr -d ’[:lower:]’ j o cambiar las vocales de mayúsculas a minúsculas, ejemplo:

$ echo "Esto Es Una Prueba" tr ’aeiou’’AEIOU’ j es posible el reemplazo de rango de caracteres o números:

$ echo "Esto es una prueba" tr ’a-e’’x’ $ echo "5uch l337 5p34k" trj ’1-4’’x’ j y podemos indicar que reemplace una o múltiples ocurrencias por una sola, ejemplo:

$ echo "Esto es una prueba" tr -s ’’ j fold se usa para que todas las líneas de un archivo se dividan a un ancho especi…cado, ejemplo:

$ cat /etc/services fold -w 20 j se puede usar -s para solicitar que si puede corte sobre un espacio, ejemplo:

$ cat /etc/services fold -sw 20 j nano Es un pequeño editor de texto que esta disponible en casi todas las distribuciones actuales de Linux, funciona con un menú en la parte de inferior que se activa con la tecla Ctrl.

$ nano archivo.txt

Comandos Generales

man muestra la documentación completa de todos los comandos. Por ejemplo, para clear:

$ man clear [email protected] 468 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

help proporciona ayuda de los comandos, con frecuencia puede sustituir al comando man. Por ejemplo, para conocer la lista de comandos que soporta:

$ help

info proporciona ayuda de los comandos al igual que man y help, su uso es similar:

$ info mkdir

whatis proporciona una ayuda breve de lo que hacen los comandos, sin mostrar opciones del comando, ejemplo:

$ whatis ls

clear (de limpiar), es un sencillo comando que limpiará nuestra terminal por completo dejándola como recién abierta. Para ello ejecutamos:

$ clear

w nos proporciona la lista de los usuarios activos en la computadora -recordemos que Linux es un sistema multiusuario-, su uso es:

$ w

time proporciona el tiempo de ejecución, que es dividido en real, usuario y del sistema, muestra de su uso es la siguiente:

$ time ls

whoami (del inglés Who Am I o Quien Soy Yo en español) muestra el identi…cador del usuario actual. Para ejecutarlo solo basta con invocarlo:

$ whoami

[email protected] 469 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

date nos muestra la fecha y hora que tiene actualmente la computadora, ejemplo:

$ date

pero podemos formatear la salida del comando mediante:

$ date + "Weekday: %A Month: %B"119 $ date + "Week: %V Year: %y" $ date -d last-week120

cal muestra el calendario del mes actual, con -y nos muestra el calen- dario del año completo, con -jy nos muestra el calendario con el número de día del año y con -A n y -B m nos muestra el calendario de m meses antes de la fecha actual y n meses después, ejemplo:

$ cal -A 3 -B 2

uptime muestra el tiempo que el equipo de cómputo ha pasado encen- dido sin ser reiniciado, así como el load average o carga promedio del sistema que es el número de trabajos que se han realizado en los últimos 1, 5 y 15 minutos. Para ver su salida, solo escribimos en la terminal:

$ uptime

uname es un programa de sistemas operativos de tipo Unix que im- prime detalles de la máquina y del sistema operativo que se esta ejecutando. Su salida es diferente dependiendo de las opciones, por ejemplo, uname solo muestra el nombre del sistema operativo pero cuando le pasamos la opción -r muestra la versión del Kernel y con -a de all, su salida es mucho mas completa. Se ejecuta de la siguiente forma:

$ uname -a 119 Para conocer las diferentes banderas de date, usar: $ date - -help

120 podemos usar: tomorrow, last-year, next-year, next-month, entre otras. [email protected] 470 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

df nos muestra información de los discos y particiones en ellos, además de cuanto esta usado y libre en Bytes en cada una de las particiones, para ver la salida usando información en unidades Gb, Mb y Kb usamos la opción -h, para conocer el numero de inodos disponibles usamos la opción -i, podemos también conocer la información de todos los sistemas de …cheros usando -a y para conocer la información de los sistemas de archivos usamos -T, ejemplo: $ df -hT

du nos muestra en Bytes cuanto ocupan los directorios de nuestra actual trayectoria de archivos, usamos la opción -h para que muestra el tamaño en unidades fáciles de leer -como KB, MB o GB-, -a para conocer el tamaño de archivos y directorios y -s para el total de la trayectoria, ejemplo: $ du -sh

free nos muestra la cantidad de memoria y Swap usada y libre del sis- tema, ejemplo: $ free

bc es un lenguaje que soporta números de precisión arbitraria con eje- cución interactiva, ejemplo: $ bc -l escribir, por ejemplo: scale = 100 1/3 quit mostrará el resultado con 100 dígitos de precisión.

history muestra el historial de comandos ejecutados en la terminal, ejemplo: $ history para borrar dicho historial usar la opción -c, ejemplo: $ history -c [email protected] 471 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

echo sirve para mostar texto en la pantalla, su uso es el siguiente

$ echo "Esto es un texto"

permite con la opción -e la interpretación de caracteres de escape como retroceso b, nueva línea n, tabulador t, tabulador vertical v, retorno de carro r yn diagonal invertidan , ejemplo:n n n nn $ echo "Esto ves un ttexto" n n Permisos

chmod (del inglés change mode) es un comando que permite cambiar los permisos de acceso de un directorio o archivo. Su sintaxis es:

$ chmod [opciones]

donde opciones nos permite entre otras cosas, cambiar los permisos re- cursivamente para un directorio con -R, modo son los permisos de lectura, escritura y ejecución representados en notación octal121 y archivo es el nom- bre del directorio o archivo que queremos modi…car. Por ejemplo, para asignar permisos de lectura, escritura y ejecución para el dueño, el grupo y remover los permisos para el resto de los usuarios al archivo prueba.txt, sería:

$ chmod 770 prueba.txt

121 Octal Binario Modo Archivo 0 000 - - - 1 001 - - x 2 010 - w - 3 011 - w x 4 100 r - - 5 101 r w - 6 110 r w - 7 111 r w x

[email protected] 472 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

chown (del inglés change owner) nos permite cambiar el propietario de un archivo o directorio. Su sintaxis es:

$ chown [opciones]

donde opciones son las opciones del comando, como -R para cambiar recursivamente el propietario de un directorio y todo su contenido, nuevo- propietario será el nuevo propietario y archivo es el nombre del directorio o archivo que queremos modi…car. Por ejemplo, para cambiarle el propietario del directorio /home/ejercicios y todo su contenido y asignarlo al usuario pedro, hacemos:

$ chown -R pedro /home/ejercicios

chgrp (del inglés change group) nos permite cambiar el grupo de un archivo o directorio. Su sintaxis es:

$ chgrp [opciones]

donde opciones son las opciones del comando, como -R para cambiar re- cursivamente el grupo de un directorio y todo su contenido, nuevo-grupo será el nuevo grupo y archivo es el nombre del directorio o archivo que queremos modi…car. Por ejemplo, para cambiarle el grupo del directorio /home/ejercicios y todo su contenido y asignarlo al usuario pedro, hacemos:

$ chgrp -R pedro /home/ejercicios

su permite cambiar las credenciales del usuario, es decir ser otro usuario, el usuario del que comúnmente se desea adquirir sus credenciales es el de root, ejemplo:

$ su

[email protected] 473 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

useradd (de agregar usuario) se utiliza para crear nuevos usuarios en tu sistema Linux. Su sintaxis es: $ useradd [opciones] donde opciones nos permite asignar un grupo al usuario con -g, asignar el directorio /home con -d, crearlo con -m si no existía previamente y -s para asignarle un intérprete de comandos o Shell, entre otras. Así, para crear el usuario andrea cuyo grupo principal será editores, eje- cutamos: $ useradd -g editores -d /home/andrea -m -s /bin/Bash andrea

usermod (de modi…car usuario) modi…ca algunos parámetros de un usuario existente, como el nombre, su directorio /home y los grupos a los que pertenece, entre otros. Su sintaxis es: $ usermod [opciones] donde opciones cambia el directorio home con -d, mueve todo el contenido del directorio anterior con -m y cambia el nombre de usuario con -l, entre otras. Para cambiar el nombre al usuario andrea por violeta, sería: $ usermod -l violeta andrea

deluser (del inglés delete user) es un sencillo comando para borrar usuarios. Tiene la opción -r que adicionalmente borra su directorio /home. Para borrar el usuario violeta con su /home, ejecutamos: $ deluser -r violeta

passwd (del inglés password) es una utilidad que se usa para cambiar o generar la contraseña de un usuario existente. Al invocarlo, pedirá la contraseña actual (si existe) y luego que la contraseña nueva sea introducida dos veces para veri…car que fue escrita correctamente. Por ejemplo para asignar una contraseña al usuario antonio, sería: $ passwd antonio para conocer el estado del Password de mi cuenta puedo usar: $ passwd -S antonio [email protected] 474 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

lsattr permite listar los atributos asignados a los …cheros y directorios, para ver los atributos del actual directorio usamos:

$ lsattr -a

o de forma recursiva

$ lsattr -Ra

chattr permite cambiar los atributos asignados a los …cheros y direc- torios, las opciones se agregan con + y se quitan con - y podemos hacerlo de forma recursiva R, por ejemplo podemos poner el permiso de bloquear la modi…cación o borrado del archivo, mediante:

# chattr +i archivo

o quitar el permiso:

# chattr -i archivo

Podemos deshabilitar la modi…cación de la fecha de acceso al …chero (atime), mediante:

# chattr +A archivo

esto permite que cuando se acceda al …chero no se modi…que el registro de atime. De este modo no quedarán registrada la fecha de último acceso. Es posible comprimir automáticamente el …chero en disco por el Kernel y cuando se lea el archivo se verá descomprimido, ejemplo

# chattr +c archivo

Además se puede permitir la recuperación de un archivo aunque sea elim- inado, usando:

# chattr +u archivo

y el caso opuesto, al eliminar un archivo, sobrescribir con ceros todos sus bloques, mediante:

# chattr +e archivo [email protected] 475 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

id es un programa que muestra el identi…cador del usuario (UID) que ejecuta el programa, el identi…cador de su grupo (GID), así como todos los grupos a los cuales pertenece el usuario, ejemplo: $ id usuario

Búsqueda

…nd permite buscar dentro del sistema de archivos un directorio o archivos que concuerden con el patrón dado, por ejemplo: $ …nd /home -name *.pdf busca desde la trayectoria /home, todos los archivos que concluyan con .pdf y nos muestra las trayectorias a los archivos que concuerdan con lo solicitado. También podemos pasar la salida de …nd a otro comando como por ejemplo: $ …nd . -name Portada.pdf xargs ls -l j que nos mostrará la salida larga del comando ls de todos los archivos que encuentre …nd. Además, podemos hacer uso de expresiones regulares como: $ …nd . -regex "[a-f0-9 -] {36 } .jpg" n n n n grep permite buscar122 en archivos un determinado patrón123, mostrando la línea que lo contiene, por ejemplo: busca en todos los archivos *.txt la cadena chmod: 122 El comando grep comparte funcionalidad con egrep y fgrep. ¿Cuál es la diferencia entre grep, egrep y fgrep?, la e en egrep signi…ca extendido (grep -E) y la f en fgrep signi…ca …jo (grep -F). egrep permite el uso de expresiones regulares extendidas y fgrep no permite la expresión regular en absoluto. 123 Grep es una herramienta muy poderosa, pero existe otra: ripgrep, que es e…ciente en búsquedas recursivas, combinando con opciones avanzadas como el …ltrado, uso de expresiones regulares, colores, soporte Unicode. Se instala usando: # apt install ripgrep y lo usamos, por ejemplo buscando foobar en los archivos *.py: $ rg -tpy foobar [email protected] 476 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

$ grep chmod *.txt

indica el nombre de archivo en los cuales se encontró la cadena:

$ grep -l main *.java

busca en todos los archivos *.log la cadena error, ignorando si esta en mayúsculas o minúsculas:

$ grep -i error *.log

busca en todos los archivos *.log aquellas que no tengan la cadena error:

$ grep -v error *.log

busca en todos los archivos *.log aquellos que tengan a la cadena error o fatal:

$ grep ’error fatal’*.log nj busca en todos los archivos *.log aquellos que tengan a la cadena error o fatal:

$ grep -E ’error fatal’*.log nj busca en todos los archivos *.log aquellos que tengan a la cadena error o fatal e indica cuantas coincidencias encontró:

$ grep -c ’error fatal’*.log nj busca en todos los archivos *.log aquellos que tengan a la cadena error o fatal, marcando en color las cadenas encontradas:

$ grep –color -E "error fatal" *.log j regresa las líneas que no tengan la cadena indicada:

$ grep -v // Ejemplo.java

regresa las líneas que no contienen la cadena indicada y no son vacías: [email protected] 477 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

$ grep -Ev "^// ^$" Ejmplo.java j Podemos usar ^ y $ para forzar a que se encuentre solo al inicio o al …nal de la línea respectivamente, por ejemplo:

$ grep ^antonio /etc/passwd $ grep sh$ /etc/passwd

o buscar una línea que solo contenga una palabra, por ejemplo:

$ grep ’^texto$’archivo

o líneas en blanco usando:

$ grep ’^$’archivo

También podemos indicar que busque usando rango de caracteres medi- ante124:

$ grep ’[Aa]ntonio’archivo $ grep ’[Aa][Nn]tonio[0-9]’archivo $ grep ’[A-Z][a-z]’archivo $ grep [[:upper:]] archivo

locate permite buscar archivos o directorios cuyo nombre coincida con el patrón dado, por ejemplo:

$ locate *dir2*

si necesitamos que la búsqueda sea insensible a mayúsculas y minúsculas usamos: 124 Podemos usar [[:alnum:]] - Caracteres alfanuméricos [[:alpha:]] - Caracteres alfabéticos [[:blank:]] - Espacio o tabulador [[:digit:]] - Dígitos [[:lower:]] - Letras minúsculas [[:space:]] - Espacio, tabulador [[:upper:]] - Letras mayúsculas [email protected] 478 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

$ locate -i desktop.iso podemos limitar la búsqueda a un determinado número de ocurrencias, por ejemplo: $ locate "*.html" -n 20 o solo visualizar el número de ocurrencias encontradas, ejemplo: $ locate -c "*.html"

Respaldo

tar permite respaldar en un solo archivo un grupo de archivos y/o di- rectorios sin compactarlos, para ello usar: $ tar -cvf nombre.tar directorio para restaurar usar: $ tar -xvf nombre.tar

gzip permite respaldar en un solo archivo un grupo de archivos y/o directorios compactandolos usando gzip, para ello usar: $ tar -cvf nombre.tar directorio $ gzip –best nombre.tar o usar: $ tar -zcvf nombre.tar.gz directorio para restaurar usar: $ gunzip nombre.tar.gz $ tar -xvf nombre.tar o usar: $ tar -zxvf nombre.tar.gz con GZIP comprimir y descomprimir respectivamente: $ gzip …chero $ gzip -d …chero.gz [email protected] 479 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

bzip2 permite respaldar en un solo archivo un grupo de archivos y/o directorios compactándolos usando bzip2, para ello usar:

$ bzip …chero $ bzip -d …chero.bz2

zip permite respaldar en un solo archivo un grupo de archivos y/o di- rectorios compactándolos usando zip, para ello usar:

$ zip archivo.zip …cheros $ zip -r archivo.zip directorio/

y descomprimir usando:

$ unzip archivo.zip

también podemos indicar el directorio en en cual descomprimir, usando:

$ unzip archivo.zip -d /home/usuario/temp/

si al descompactar existe algún error, es posible recuperar parte de los archivos mediante:

$ zip -F archive.zip -O archive-…xed.zip

o usar -FF, después usar:

$ jar xvf archive-…xed.zip

otra alternativa es usar:

$ bsdtar xf archivo.zip

Si se requiere descomprimir múltiples archivos empaquetados podemos usar:

$ for z in *.zip; do unzip "$z"; done

[email protected] 480 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

unp permite descomprimir de casi cualquier formato de respaldo, su uso es de lo más sencillo, a saber:

$ unp archivo.compactado

Varios

…le determina el tipo de un archivo y te imprime en pantalla el resul- tado. No hace falta que el archivo tenga una extensión para que …le determine su tipo, pues la aplicación ejecuta una serie de pruebas sobre el mismo para tratar de clasi…carlo.

$ …le un_archivo_de_texto.txt

stat nos da información de un archivo, datos como: tamaño, blocks usados para almacenarlo, número de ligas, datos del dueño y grupo; fechas de acceso, modi…cación y cambio.

$ stat archivo

type permite identi…car el comando pasado como parámetro indicando la trayectoria si es comando externo o si es comando interno al Shell, ejemplo:

$ type ls

ps nos muestra los procesos activos del sistema junto con información de la ejecución de los mismos, para ver todos los procesos en el sistema usar -ef, para conocer los procesos de un usuario usamos -U , para conocer los procesos de un determinado grupo usamos -G , para conocer todos los procesos de un determinado programa usamos -C , para ver todos los procesos en forma de árbol y saber que proceso depende de que otros, usamos -ejH, ejemplo:

$ ps -ejH

Podemos pedirle al comando que nos muestre algunos datos informativos de los comandos en ejecución y mandar a un archivo los procesos que más consumen memoria, ejemplo: [email protected] 481 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

ps -eo cmd,pid,ppid,%mem,%cpu –sort=-%mem head tee topprocs.txt j j

si queremos adicionar datos al archivo previamente creado usamos:

$ ps -eo cmd,pid,ppid,%mem,%cpu –sort=-%mem head tee -a topprocs.txt j j

kill es un comando utilizado para enviar mensajes sencillos a los proce- sos ejecutándose en segundo plano en el sistema. Por defecto el mensaje que se envía es la señal de terminación. Su sintaxis más sencilla es:

$ kill [-s]

donde -s es la señal a enviar, de no ser especi…cada ninguna se manda la señal por defecto (SIGTRM ) y pid es el identi…cador del proceso. Otra de sus opciones es -9 (SIGKILL) que fuerza la terminación de un proceso, para conocer los posibles mensajes de kill usar: $ kill -l. En Linux cada comando, proceso o ventana grá…ca tiene un número de proceso (PID), este se puede obtener mediante el comando ps o top, y el comando kill puede concluir con la ejecución del PID indicado y todos sus subprocesos -el usuario sólo puede matar sus propios procesos, root puede …nanizar (matar) los procesos de cualquier usuario-, ejemplo: Por ejemplo, para terminar un proceso cuyo PID es 3477, ejecutamos:

$ kill 3477

Otra señal importante es 1 (SIGHUP) que permite parar y reinicializar el proceso indicado, por ejemplo para detener el proceso 2434, usamos:

$ kill -1 2434

y lo reiniciamos usando:

$ kill -1 2434

killall permite …nalizar (matar) todas las instancias de ejecución de un comando, por ejemplo:

$ killall …refox-esr [email protected] 482 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

pgrep permite conocer los identi…cadores de proceso de una determi- nada aplicación corriendo en el sistema, por ejemplo: $ pgrep …refox

pwdx permite conocer el directorio de trabajo de una aplicación a través de su identi…cador de proceso pasado como parámetro a pwdx, ejemplo: $ pwdx 4534 o $ pwdx $(pgrep …refox)

awk permite procesar, analizar archivos de texto que estén organizados por …las y columnas, ejemplo: $ awk -F’:’’{print $1 }’/etc/passwd nos mostrarán todos los usuarios que tiene el sistema, los cuales están dados de alta en el archivo del sistema /etc/passwd. Si necesitamos visualizar una determinada línea de un archivo (digamos la 5), podemos usar: $ awk ’NR==5’archivo.txt en el caso de necesitar visualizar un rango de líneas de un archivo (digamos de la 20 a 25), usamos: $ awk ’NR>=20 && NR<=25’archivo.txt

sort imprime en pantalla las líneas de un archivo ordenadas alfabética- mente. Para ejecutarlo basta con: $ sort archivo.txt podemos solicitar que lo haga en orden inverso usando -r, que haga el ordenamiento numérico usando -n, podemos omitir los duplicados usando -u, ordenar ignorando mayúscula y minúsculas con -f, ordenamiento tomando en cuenta valores alfanuméricos -h, ordenamiento aleatorio con -R, que ordene por meses -M, que haga el ordenamiento de los renglones tomando como índice cierto renglón, por ejemplo: $ ls -al sort -k 4 -n j [email protected] 483 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

sed es considerado un editor de texto orientado a "‡ujo" -en contraposi- ción a los clásicos editores «interactivos» - el cual acepta como entrada un archivo o entrada estándar; cada línea es procesada y el resultado es enviado a la salida estándar. Por ejemplo, borrar las líneas tres a cinco de archivo archivo.txt: $ sed ’3,5d’archivo.txt otro ejemplo, borrar todas las líneas en blanco (no las que sólo tengan tabuladores y/o espacios) del archivo …chero.txt $ sed ’/^$/d’archivo.txt para quitar las líneas en blanco y las que sólo tengan tabuladores y/o espacios, usamos: $ sed sed ’/^[ t]*$/d’archivo.txt n si deseamos visualizar una determinada línea de un archivo (digamos la 13), usamos: $ sed -n ’13p’archivo.txt si queremos visualizar un rango de líneas de un archivo (digamos de la 20 a 25), usamos: $ sed -n ’20,25p’archivo.txt si necesitamos cambiar las vocales de un archivo de minúsculas a mayús- culas, podemos usar: $ sed ’y/aeiou/AEIOU/’archivo.txt $ sed ’s/[aeiou]/ U&/g’archivo.txt n md5sum genera la suma de veri…cación md5 (Compute and Check MD5 Message Digest) o Hash usada para veri…car la integridad de los archivos, esta puede haber cambiado como resultado de una transferencia de archivos defectuosa, un error en disco o una interferencia maliciosa, ejemplo125: $ md5sum debian.testing-amd64-netinst.iso 125 Otras opciones son: $ shasum debian.testing-amd64-netinst.iso $ shasum -a256 debian.testing-amd64-netinst.iso [email protected] 484 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

sleep se utiliza para temporalizar un intervalo de tiempo determinado, la unidad por defecto es el segundo (s), pero se puede usar minutos (m), horas (h) o días (d), por ejemplo:

$ sleep 3m && ls -al

watch permite correr un comando de forma repetitiva y a intervalos regulares (2 segundos por omisión) mostrando su salida, por ejemplo:

$ watch free

de ser necesario, podemos quitarle el título, usando:

$ watch -t free

podemos indicar el intervalo de ejecución usando:

$ watch -n 5 free

Podemos solicitarle que nos muestre los cambios sobre la última salida, usando:

$ watch -n 5 -d free

y podemos indicarle que concluya la ejecución si la salida actual es distinta a la anterior, usando:

$ watch -n 5 -g free

Monitorear el Desempeño Existen múltiples herramientas para ser us- adas en línea de comandos y ambiente grá…co que permiten monitorear el desempeño y uso de una computadora con GNU/Linux, estas se pueden usar para administrar el sistema y las comunicaciones por red, estos comandos126 están disponibles en todas las distribuciones de GNU/Linux y son normal- mente usados para determinar problemas de desempeño en nuestro sistema de cómputo.

126 Algunos comandos son utilizados por cualquier usuario y otros solo por el admin- istrador. [email protected] 485 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

lscpu para conocer el tipo de CPU y sus características usamos: $ lscpu podemos usar también cat /proc/cpuinfo, si deseamos un análisis más detallado están los comandos: lscpi, cpuid, dmidecode, inxi, hardinfo, lshw, hwinfo, nproc

free despliega la memoria total, usada, compartida, en Cache y libre del sistema: $ free podemos usar también cat /proc/meminfo, si deseamos un análisis más detallado están los comandos: top, vmstat, dstat

top muestra el desempeño de nuestro equipo actualizando cada segundo el uso del CPU, Memoria, Swap, Cache, Bu¤er y los procesos que están corriendo en el sistema actualmente y en cada proceso que corre, se muestra el identi…cador, el porcentaje de CPU y memoria usada: $ top para salir del programa se debe presionar la tecla q. Otras variantes son: bashtop, htop, glances, conky, nmon, atop, atop, vtop, gtop, ps, mpstat, collectl, sar, pstree, pmap, pgrep, pkill, kill, killall, Linux Process Viewer, etc.

whowatch es una utilidad simple que muestra de forma interactiva y en tiempo real los usuarios y procesos activos en el sistema: $ whowatch Otras opciones son: bashtop, htop, glances, conky, nmon, atop, gtop, ps, mpstat, collectl, sar, pstree, pmap, pgrep, pkill, kill, killall, Linux Process Viewer, etc. [email protected] 486 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

dstat muestra las estadísticas de recursos de todo el sistema de forma versátil en tiempo real:

$ dstat -c –top-cpu -dn –top-mem –mem

combina la capacidad de comandos como iostat, vmstat, netstat e ifstat. Otras opciones son:

nload, collectl, iptraf, iftop, mtr, bmon, slurn, tcptrack, nethogs, monitorix, nmon, glances

vmstat muestra las estadísticas de la memoria virtual, hilos del Kernel, uso de discos, procesos del sistema, entradas y salidas de bloque, interruptores y actividad del CPU, entre otras opciones, este comando esta contenido en el paquete systat: $ vmstat 1 otras opciones son:

dstat, sar, vnstat, vnstati, mpstat, iostat, iotop, top, collectl, nmon, glances

netstat permite monitorizar los paquetes de red que entran y salen, genera estadísticas de su uso, es un paquete que permite encontrar problemas de desempeño en las comunicaciones de red:

$ netstat

podemos solicitar que sólo nos muestre lo referente a un solo puerto, usando:

netstat -ltnp grep -w ’:80’ j otras opciones son:

dstat, collectl, iptraf, iftop, ifstat, mtr, nethogs, monitorix, nmon, bwm-ng, cbm, speedometer, pkstat, netwatch, trafshow, netload, glances

[email protected] 487 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

iotop permite conocer qué procesos están generando actividades de lec- tura y grabación en los discos del sistema, así es posible conocer qué procesos están sobrecargando el sistema:

$ iotop

otras opciones son:

iostat, vmstat, htop, glances, netdata, netstat, nmon, collectl, glances

iostat este permite conocer estadísticas de uso del sistema de entrada/salida incluyendo dispositivos, discos locales, discos remotos tales como NFS y SAMBA:

$ iostat

Otras opciones son:

iotop, dstat, nfsstat, ifstat, atop, nmon, collectl, glances

lsof permite conocer la lista de archivos abiertos además de Sockets Network, Pipes, dispositivos y procesos:

$ lsof

Lista todos los procesos que tiene abierto el archivo:

$ lsof /trayectoria/archivo

Lista todos los archivos abiertos por el usuario:

$ lsof -u usuario

también se pueden indicar múltiples usuarios:

$ lsof -u usuario1, usuario2

o bién por todos los usuarios menos uno, por ejemplo root: [email protected] 488 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

$ lsof -u ^root

Lista todos los archivos abiertos en un directorio:

$ lsof +D /trayectoria/directorio/

Lista todos los archivos abiertos por un identi…cador de proceso:

$ lsof -p

también podemos especi…car múltiples identi…cadores de proceso:

$ lsof -p pid1, pid2, pid3

Lista todos los archivos abiertos por un comando:

$ lsof -c

Busca archivos abiertos por un usuario, comando o proceso:

$ lsof -a -u usuario -c comando

Lista las conexiones y puertos de red abiertos:

$ lsof -i

podemos pedirle que nos muestre puertos tcp o udp:

$ lsof -i tcp

podemos conocer los procesos que usan el puerto TCP:80, mediante:

$ lsof -i TCP:80

o para el puerto TCP:22, mediante:

$ lsof -i TCP:22

Uno de sus principales usos es conocer qué proceso tiene acceso a un disco o partición que no se puede desmontar y manda un error de que un archivo esta siendo usado, pare ello usamos:

$ lsof /dev/sda2 [email protected] 489 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

lsusb lista los dispositivos USB del sistema además información del fabricante del mismo, ejemplo:

$ lsusb

tcpdump es uno de los comando más usados para analizar paquetes de red y es usado para capturar o …ltrar paquetes TCP/IP que se reciben o se trans…eren en una interfaz de red especi…ca: # tcpdump -i eth0 también permite grabar los paquetes capturados para un análisis poste- rior. Otras opciones son:

arpwatch, suricata, , vnstat, vnstati, negios, collectl, glances, ss, iptraf, nethogs, iftop, mtr

ip muestra información y permite manipular los dispositivos de red (in- terfaces y tuneles), uso:

$ ip address

nmcli información sobre los dispositivos de red y su con…guración, uso:

$ nmcli

Aprender a Trabajar con Linux En la red existen múltiples sitios espe- cializados y una amplia bibliografía para aprender a trabajar en cada uno de los distintos aspectos de Linux, nosotros hemos seleccionado diversos textos que ponemos a su disposición en:

Sistemas Operativos

[email protected] 490 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

15.4 Desde la Nube Existen diferentes servicios Web127 que permiten instalar, con…gurar y usar cientos de sistemas operativos Linux y Unix -máquinas virtuales usando ser- vicios Web en Debian GNU/Linux y QEMU (véase sección 18)- desde el navegador, esto en aras de que los usuarios que cuenten con algún sistema de acceso a red y un navegador puedan usar, con…gurar e instalar algún sis- tema operativo y su respectiva paquetería sin hacer instalación alguna en su equipo de cómputo, tableta o teléfono celular128. Una muestra de estos proyectos son: Distrotest (https://distrotest.net) y JSLinux (https://bellard.org/jslinux).

Algunas versiones listas para usar son:

4mLinux, AbsoluteLinux, Academix, AlpineLinux, , antiX Linux, Aptosid, ArchBang, ArchLabs, ArchLinux,

Archman, ArchStrike, ArcoLinux, ArtixLinux, AryaLinux, AV Linux, BackBoxLinux, BigLinux, Bio-Linux, BlackArch,

BlackLab, BlackPantherOS, BlackSlash, blag, BlankOn, Bluestar, Bodhi, BunsenLabs, ByzantineOS, Caine, Calculate

Linux Desktop, CentOS, Chakra, ChaletOS, ClearOS, Clonezilla, ConnochaetOS, Cucumber, , Damn

Small Linux Not, Debian, DebianEdu, deepin, DEFT, Devil-Linux, , DragonFly BSD, Dragora, DuZeru, Dyne:bolic,

Edubuntu, elementaryOS, Elive Linux, Emmabuntüs, Emmi OS, Endless OS, EnsoOS, Exe GNU/Linux, ExTiX, Fat- dog64, Fedora Atomic, Fedora Server, Fedora Workstation, FerenOS, FreeBSD, FreeDOS, Frugalware, G4L, GeckoLinux,

Gentoo, GNewSense, GoboLinux, Gparted, GreenieLinux, , GuixSD, Haiku, Heads, , , KaOS,

Knoppix, Kodachi, KolibriOS, Korora, , Kwort, , Linux Mint, LiveRaizo, LMDE, , LXLE

OS, Macpup, , MakuluLinux, Manjaro, Matriux, MauiLinux, MenuetOS, MinerOS, MiniNo, Modicia, Musix, MX

Linux, Nas4Free, Neptune, NetBSD, Netrunner, NixOs, NST, NuTyX, OpenIndiana, OpenMandriva, openSUSE, Ora- cleLinux, OSGeo live, OviOS, Parabola CLI, Parabola LXDE, Pardus, Parrot Home, Parrot Security, Parrot Studio, Par- six, PCLinuxOS, PeachOSI, Pentoo, Peppermint, PeppermintOS, Pinguy, PinguyOS, plopLinux, PointLinux, Pop!_OS,

PORTEUS, Puppy Linux, PureOS, Q4OS, QubesOS, Quirky, Raspberry Pi Desktop, ReactOS, Redcore, Rescatux, Reven- geOS, RoboLinux, Rockstor, ROSA FRESH, Runtu, Sabayon, SalentOS, Salix, Scienti…cLinux, Siduction, , Slax,

SliTaz, , SolydK, SolydX, SparkyLinux, Springdale, StressLinux, SubgraphOS, SwagArch, Tails, Tanglu, Tiny Core,

Trisquel, TrueOS, TurnKey Linux, Ubuntu, , , UbuntuKylin, Uruk, VectorLinux, VineLinux,

VoidLinux, Voyager, VyOS, WattOs, , Zentyal, , Zevenet, Zorin OS

127 Cuando se trabaja desde la Web es recomendable usar el modo Privado o Incógnito para no guardar el historial de navegación, información introducida en los formularios y borrar al cerrar el navegador los datos de los sitios visitados. Pero recuerda que los sitios Web que visitamos sí guardan información de nuestra visita, nuestro proveedor de internet también guarda constancia de nuestra visita y si descargamos algo, esto no se borra al igual que el historial de descargas, además de las marcas de páginas o favoritos se conservarán al cerrar el navegador. 128 Estos servicios son conocidos como computación en la nube (Cloud Computing). [email protected] 491 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Terminales de Linux en la Web https://www.tutorialspoint.com/execute_bash_online.php  http://www.webminal.org/  https://bellard.org/jslinux/  https://codeanywhere.com/  https://copy.sh/v86/  https://www.masswerk.at/jsuix/  https://linuxcontainers.org/lxd/try-it/  http://cb.vu/  Editores BAHS en la Web https://www.shellcheck.net/  https://www.learnshell.org/  https://www.tutorialspoint.com/execute_bash_online.php  https://paiza.io/en/projects/new?language=bash  https://www.jdoodle.com/test-bash-shell-script-online  http://rextester.com/l/bash_online_compiler  Usar Linux en Dispositivos Android En los dispositivos Android es posible usar un simulador de la línea de comandos del Shell usado en Linux, de forma que podremos introducir todos los comandos habituales para trabajar desde ahí en la comunidad de nuestra terminal Android. Uno de los paquetes más completo es:

https://termux.com

El paquete cuenta con una página Wiki en:

https://wiki.termux.com [email protected] 492 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Usando este paquete, las aplicaciones instaladas disponen de varias mejo- ras respecto al clásico Android , como el hecho de tener acceso a una gran biblioteca de paquetes de Linux para instalar desde la ter- minal -usando el comando apt (véase sección ??)-, así como algunos atajos de teclado transformados en combinaciones con los botones físicos de volumen y apagado de la terminal. Igualmente, es compatible con todo tipo de teclados físicos externos. Siendo posible trabajar con lenguajes como NodeJ, Rubi, Python, C y paquetes como Nano, Vi, SSH, Git, Subversion, zsh Shell, etc.

Usar Linux en Formato Live Linux es uno de los sistemas operativos pioneros en ejecutar de forma autónoma o sin instalar en la computadora, existen diferentes distribuciones Live -descargables para formato CD, DVD, USB- de sistemas operativos y múltiples aplicaciones almacenados en un medio extraíble, que pueden ejecutarse directamente en una computadora, estos se descargan de la Web generalmente en formato ISO129, una de las listas más completas de versiones Live esta en: https://livecdlist.com

En el caso de tener un archivo ISO de algún sistema operativo (por ejem- plo ubuntu-11.10-desktop-i386.iso) y se quiere ejecutar su contenido desde una máquina virtual con QEMU/KVM sólo es necesario usar: $ kvm -m 512 -cdrom ubuntu-11.10-desktop-i386.iso en este ejemplo usamos en KVM la arquitectura por omisión y memoria de 512 MB (-m 512).

Knoppix es una versión Live ampliamente conocida y completa, esta se puede descargar de: http://mmc.geo…sica.unam.mx/Replicas/knoppix/ y usar mediante: $ kvm -m 1024 -cdrom KNOPPIX_V8.2-2018-05-10-EN.iso aquí se usa la arquitectura por omisión y memoria de 1024 MB.

129 Una imagen ISO es un archivo informático donde se almacena una copia exacta de un sistema de archivos y de esta se puede generar una imagen para CDROM, DVD o USB. [email protected] 493 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Usar Máquinas Virtuales de Linux Existen diversos proyectos que per- miten descargar decenas de máquinas virtuales listas para ser usadas, para los proyectos VirtualBox y VMWare (y por ende para KVM/QEMU), estas se pueden descargar de múltiples ligas, algunas de ellas son:

https://www.osboxes.org https://virtualboxes.org/images/

Si desargamos y descomprimimos el archivo lubuntu1210. (véase sec- ción 18.9), esto dejará la imagen de VirtualBox de LUBUNTU cuyo nom- bre es lubuntu1210.vdi. Entonces esta imagen la usaremos directamente en KVM/QEMU, mediante:

$ kvm -m 2000 -hda lubuntu1210.vdi

Nota: esta imagen usa como usuario y clave de acceso: lubuntu/lubuntu

Distribuciones de Sistemas Operativos Existen diversos sitios Web que están enfocados a explorar detalladamente cada distribución actual o antigua, a un nivel técnico acompañado de grandes y útiles análisis técnicos sobre los mismos, lo que facilita el aprendizaje puntual sobre que distribución usar o empezar a usar sin tanta incertidumbre.

ArchiveOS https://archiveos.org  Distro Chooser https://distrochooser.de/es/  Distro Watch https://distrowatch.com  Linux Distribution List https://lwn.net/Distributions/ 

[email protected] 494 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

16 Apéndice D: Programación Orientada a Objetos Java vs Python

Muchos programadores de Java en últimas fechas se trasladan a Python, a menudo luchan con el enfoque de Python para la programación orientada a objetos (POO). El enfoque para trabajar con objetos, tipos de variables y otras capacidades de lenguaje tomadas por Python vs Java es bastante diferente. Puede hacer que cambiar entre ambos lenguajes sea muy confuso. Este apartado se compara y contrasta el soporte de programación ori- entada a objetos en Python vs Java. Al …nal, podremos aplicar nuestros conocimientos de programación orientada a objetos a Python al comprender cómo reinterpretar nuestra comprensión de los objetos de Java en Python y utilizar los objetos de una manera Pythonica. A lo largo de este apartado, podremos:

Construir una clase básica tanto en Java como en Python  Explorar cómo funcionan los atributos de objeto en Python vs Java  Comparar y contrastar los métodos de Java y las funciones de Python  Descubrir los mecanismos de herencia y polimor…smo en ambos lengua-  jes

Investigar la re‡exión en Python vs Java  Aplicar todo en una implementación de clase completa en ambos lengua-  jes

Este apartado no es una introducción a la programación orientada a ob- jetos. Más bien, compara características y principios orientados a objetos de Python vs Java. Es recomendable que el tenga conocimiento de Java y también este familiarizado con la codi…cación de Python.

16.1 Ejemplo de Clases Java vs Python Para comenzar, implementaremos la misma clase pequeña tanto en Java como en Python para ilustrar las diferencias entre ellos (se harán modi…caciones a ellas a medida que avancemos). [email protected] 495 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Primero, supongamos que se tiene la siguiente de…nición de clase Carro en Java: public class Carro { private String color; private String modelo; private int anio; public Car(String color, String modelo, int anio) { this.color = color; this.modelo = modelo; this.anio = anio; } public String getColor() { return color; } public String getmodelo() { return modelo; } public int getAnio() { return anio; } } Las clases de Java se de…nen en archivos con el mismo nombre que la clase. Entonces, se debe guardar esta clase en un archivo llamado Carro.java. Solo se puede de…nir una clase en cada archivo. Una clase de Carro pequeña similar está escrita en Python de la siguiente manera: class Carro: def __init__(self, color, modelo, anio): self.color = color self.modelo = modelo self.anio = anio En Python se puede declarar una clase en cualquier lugar, en cualquier archivo, en cualquier momento. Por ejemplo, guardamos esta clase en el archivo carro.py. Usando estas clases como base, podremos explorar los componentes bási- cos de clases y objetos. [email protected] 496 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

16.2 Atributos de Objetos Todos los lenguajes orientados a objetos tienen alguna forma de almacenar datos sobre el objeto. En Java y Python, los datos se almacenan en atributos, que son variables asociadas con objetos especí…cos. Una de las diferencias más signi…cativas entre Python y Java es cómo se de…nen y administran los atributos de clase y objeto. Algunas de estas dife- rencias provienen de las limitaciones impuestas por los lenguajes, mientras que otras provienen de las mejores prácticas de programación.

Declaración e Inicialización En Java, declaramos atributos en el cuerpo de la clase, fuera de cualquier método, con un tipo de…nido. Se debe de…nir los atributos de la clase antes de que se utilicen:

public class Carro { private String color; private String modelo; private int anio; ...

En Python, ambos se declaran y de…nen atributos dentro de la clase .__init__(), que es el equivalente al constructor de Java:

def __init__(self, color, modelo, anio): self.color = color self.modelo = modelo self.anio = anio

Al pre…jar los nombres de las variables con self, le dice a Python que estos son atributos. Cada instancia de la clase tendrá una copia. Todas las variables en Python están escritas de forma ‡exible, y estos atributos no son una excepción. También se puede crear variables de instancia fuera de .__init__(), pero no es una práctica recomendada ya que su alcance suele ser confuso. Si no se utilizan correctamente, las variables de instancia creadas fuera de .__init__() pueden provocar errores sutiles que son difíciles de encontrar. Por ejemplo, puede agregar un nuevo atributo .ruedas a un objeto carro como este: [email protected] 497 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

1 >>> import carro 2 >>> mi_carro = carro.Carro("amarillo", "beetle", 1967) 3 >>> print(f"mi carro es {mi_carro.color}") 4 mi carro es amarillo 5 6 >>> mi_carro.ruedas = 5 7 >>> print(f"ruedas: {mi_carro.ruedas}") 8 ruedas: 5

Sin embargo, si olvidamos mi_carro.ruedas = 5 en la línea 6, Python muestra un error:

1 >>> import Carro 2 >>> mi_carro = Carro.Carro("amarillo", "beetle", 1967) 3 >>> print(f"Mi carro es {mi_carro.color}") 4 Mi carro es amarillo 5 6 >>> print(f"ruedas: {mi_carro.ruedas}") 7 Traceback (most recent call last): 8 File "", line 1, in 9 AttributeError: ’Carro’object has no attribute ’ruedas’

En Python, cuando declaras una variable fuera de un método, se trata como una variable de clase. Si actualizamos la clase Carro de la siguiente manera: class Carro: ruedas = 0 def __init__(self, color, modelo, anio): self.color = color self.modelo = modelo self.anio = anio Esto cambia la forma en que usa la variable .ruedas. En lugar de referirse a él usando un objeto, se re…ere a él usando el nombre de la clase:

1 >>> import carro 2 >>> mi_carro = carro.Carro("amarillo", "beetle", 1967) 3 >>> print(f"Mi carro es {mi_carro.color}") 4 Mi carro es amarillo [email protected] 498 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

5 6 >>> print(f"Este tiene {carro.Carro.ruedas} ruedas") 7 Este tiene 0 ruedas 8 9 >>> print(f"Este tiene {mi_carro.ruedas} ruedas") 10 Este tiene 0 ruedas

Nota: En Python, se hace referencia a una variable de clase con la siguiente sintaxis:

El nombre del archivo que contiene la clase, sin la extensión .py Un punto el nombre de la clase Un punto El nombre de la variable

Como guardó la clase Carro en el archivo carro.py, se re…ere a la variable de clase ruedas en la línea 6 como carro.Carro.ruedas.

Puedo consultar mi_carro.ruedas o carro.Carro.ruedas, pero hay que tener cuidado. Cambiar el valor de la variable de instancia mi_carro.ruedas no cambiará el valor de la variable de clase carro.Carro.ruedas:

1 >>> from carro import * 2 >>> mi_carro = carro.Carro("amarillo", "Beetle", "1966") 3 >>> mi_otro_carro = carro.Carro("rojo", "corvette", "1999") 4 5 >>> print(f"Mi carro es {mi_carro.color}") 6 Mi carro es amarillo 7 >>> print(f"Este tiene {mi_carro.ruedas} ruedas") 8 Este tiene 0 ruedas 9 10 >>> print(f"Mi otro carro es {mi_otro_carro.color}") 11 Mi otro carro es rojo 12 >>> print(f"Este tiene {mi_otro_carro.ruedas} ruedas") 13 Este tiene 0 ruedas [email protected] 499 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

14 15 >>> # cambiar el valor de la variable de clase 16 ... carro.Carro.ruedas = 4 17 18 >>> print(f"Este tiene {mi_carro.ruedas} ruedas") 19 Este tiene 4 ruedas 20 >>> print(f"Mi otro carro tiene {mi_otro_carro.ruedas} ruedas") 21 Mi otro carro tiene 4 ruedas 22 23 >>> # Cambiar el valor de la variable de instancia para mi_carro 24 ... mi_carro.ruedas = 5 25 26 >>> print(f"Mi carro tiene {mi_carro.ruedas} ruedas") 27 Mi carro tiene 5 ruedas 28 >>> print(f"Mi otro carro tiene {m_otro_carro.ruedas} ruedas") 29 Mi otro carro tiene 4 ruedas

Se han de…nido dos objetos Coche en las líneas 2 y 3:

1. mi_carro

2. mi_otro_carro

Al principio, ambos tienen cero ruedas. Cuando establece la variable de clase usando carro.Carro.ruedas = 4 en la línea 16, ambos objetos ahora tienen cuatro ruedas. Sin embargo, cuando con…gura la variable de instancia usando mi_carro.ruedas = 5 en la línea 24, solo ese objeto se ve afectado. Esto signi…ca que ahora hay dos copias diferentes del atributo de ruedas:

1. Una variable de clase que se aplica a todos los objetos Carro

2. Una variable de instancia especí…ca aplicable solo al objeto mi_carro

No es difícil referirse accidentalmente al incorrecto e introducir errores sutiles.

El equivalente de Java a un atributo de clase es un atributo estático: [email protected] 500 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

public class Carro { private String color; private String modelo; private int anio; private static int ruedas; public Car(String color, String modelo, int anio) { this.color = color; this.modelo = modelo; this.anio = anio; } public static int getRuedas() { return ruedas; } public static void setRuedas(int count) { ruedas = count; } }

Normalmente, se re…ere a variables estáticas utilizando el nombre de clase de Java. Puede hacer referencia a una variable estática a través de una instancia de clase como Python, pero no es una práctica recomendada. La clase de Java se está alargando. Una de las razones por las que Java es más detallado que Python es la noción de métodos y atributos públicos y privados.

Pública y Privada Java controla el acceso a métodos y atributos diferen- ciando entre datos públicos y datos privados. En Java, se espera que los atributos se declaren como privados o prote- gidos si las subclases necesitan acceso directo a ellos. Esto limita el acceso a estos atributos desde el código fuera de la clase. Para proporcionar acceso a atributos privados, se declara métodos públicos que establecen (setters) y recuperan (getters) datos de manera controlada. Recordando de la clase Java anterior que la variable de color se declaró como privada. Por lo tanto, este código Java mostrará un error de compi- lación en la últiuma línea:

Carro miCarro = new Carro("azul", "Ford", 1972); // Pintando el carro [email protected] 501 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

miCarro.color = "Rojo";

Si no especi…ca un nivel de acceso, el atributo predeterminado es paquete protegido, lo que limita el acceso a las clases en el mismo paquete. Debe marcar el atributo como público si desea que este código funcione. Sin embargo, declarar atributos públicos no se considera una práctica recomendada en Java. Se espera que declare los atributos como privados y utilice métodos de acceso público, como .getColor() y .getModelo() que se muestran en el código. Python no tiene la misma noción de datos privados o protegidos que tiene Java. Todo en Python es público. Este código funciona bien con su clase Python existente:

>>> mi_carro = Carro.Carro("azul", "Ford", 1972) >>> # Pintando el carro ... mi_carro.color = "rojo"

En lugar de privada, Python tiene la noción de una variable de instancia no pública. Cualquier variable que comience con un carácter de subrayado se de…ne como no pública. Esta convención de nomenclatura di…culta el acceso a una variable, pero es solo una convención de nomenclatura y aún puede acceder a la variable directamente. Si Agregamos la siguiente línea a la clase Python Carro:

class Carro: ruedas = 0 def __init__(self, color, modelo, anio): self.color = color self.modelo = modelo self.anio = anio self._portavasos = 6

Puede acceder a la variable ._portavasos directamente:

1 >>> import carro 2 >>> mi_carro = carro.Carro("amarillo", "Beetle", "1969") 3 >>> print(f"Fue construido en {mi_carro.anio}") 4 Fue construido en 1969 5 >>> mi_carro.anio = 1966 [email protected] 502 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

6 >>> print(f"Fue construido en {mi_carro.anio}") 7 Fue construido en 1966 8 >>> print(f"Tiene {mi_carro._portavasos} portavasos.") 9 Tiene 6 portavasos.

Python reconoce además el uso de caracteres de subrayado doble delante de una variable para ocultar un atributo en Python. Cuando Python ve una variable de subrayado doble, cambia el nombre de la variable internamente para di…cultar el acceso directo. Este mecanismo evita accidentes pero aún así no imposibilita el acceso a los datos. Para mostrar este mecanismo en acción, volvemos a cambiar la clase Python Carro:

class Carro: ruedas = 0 def __init__(self, color, modelo, anio): self.color = color self.modelo = modelo self.anio = anio self.__portavasos = 6

Ahora, cuando se intenta acceder a la variable .__portavasos se ve el siguiente error:

1 >>> import Carro 2 >>> mi_carro = Carro.Carro("amarillo", "Beetle", "1969") 3 >>> print(f"Fue contruido en {mi_carro.anio}") 4 Fue construido en 1969 5 >>> mi_carro.anio = 1966 6 >>> print(f"Fue construido en {my_car.anio}") 7 Fue construido en 1966 8 >>> print(f"Tiene {mi_carro.__portavasos} portavasos.") Traceback (most recent call last): File "", line 1, in AttributeError: ’Carro’object has no attribute ’__portava- sos’

[email protected] 503 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Entonces, ¿por qué no existe el atributo de .__portavasos? Cuando Python ve un atributo con guiones bajos dobles, cambia el atri- buto anteponiendo el nombre original del atributo con un guión bajo, seguido del nombre de la clase. Para usar el atributo directamente, también debe cambiar el nombre que usa:

>>> print(f"Tiene {mi_carro._Carro__portavasos} portava- sos") Tiene 6 portavasos

Cuando usa guiones bajos dobles para ocultar un atributo al usuario, Python cambia el nombre de una manera bien documentada. Esto signi…ca que un desarrollador determinado todavía puede acceder al atributo directa- mente. Entonces, si sus atributos de Java se declaran privados y sus atributos de Python están precedidos por guiones bajos dobles, ¿cómo proporciona y controla el acceso a los datos que almacenan?.

Control de acceso En Java, se accede a atributos privados usando getters y se establecen usando setters de manera controlada. Para permitir que los usuarios pinten sus autos, agregando el siguiente código a la clase de Java:

public String getColor() { return color; } public void setColor(String color) { this.color = color; }

Dado que .getColor () y .setColor () son públicos, cualquiera puede lla- marlos para cambiar o recuperar el color del automóvil. Las mejores prácticas de Java de usar atributos privados a los que se accede con captadores get y de…nidores set públicos es una de las razones por las que el código Java tiende a ser más detallado que Python. Como se vio anteriormente, acceder a los atributos directamente en Python. Dado que todo es público, puede acceder a cualquier cosa en cualquier mo- mento y desde cualquier lugar. Establece y obtiene valores de atributo direc- tamente haciendo referencia a sus nombres. Incluso puede eliminar atributos en Python, lo que no es posible en Java: [email protected] 504 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

1 >>> mi_carro = Carro("amarillo", "beetle", 1969) 2 >>> print(f"Mi carro fue construido en {mi_carro.anio}") 3 Mi carro fue construido en 1969 4 >>> mi_carro.anio = 1966 5 >>> print(f"Mi carro fue construido en {mi_carro.anio}") 6 Mi carro fue construido en 1966 7 >>> del mi_carro.anio 8 >>> print(f"Mi carro fue construido en {mi_carro.anio}") Traceback (most recent call last): File "", line 1, in AttributeError: ’Carro’object has no attribute ’anio’ Sin embargo, es posible que en ocasiones desee controlar el acceso a un atributo. En ese caso, puede usar las propiedades de Python. En Python, las propiedades proporcionan acceso controlable a los atribu- tos de la clase mediante la sintaxis del decorador de Python. Las propiedades permiten que se declaren funciones en clases de Python que son análogas a los métodos getter y setter de Java, con la ventaja adicional de permitirle eliminar atributos también. Podemos ver cómo funcionan las propiedades agregando una a la clase de Carro: class Carro: def __init__(self, color, modelo, anio): self.color = color self.modelo = modelo self.anio = anio self._voltaje = 12 @property def voltaje(self): return self._voltaje @voltaje.setter def voltaje(self, volts): print("Aviso: esto puede causar problemas!") self._voltaje = volts @voltaje.deleter def voltaje(self): print("Aviso: La radio dejara de funcionar!") del self._voltaje [email protected] 505 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Aquí, expandimos la noción de Carro para incluir vehículos eléctricos. Al Declarar el atributo ._voltaje para mantener el voltaje de la batería. Para proporcionar acceso controlado, de…nimos una función llamada voltaje() para devolver el valor privado. Al usar la decoración @property, lo marca como un captador al que cualquiera puede acceder directamente. De manera similar, se de…ne una función de establecimiento, también llamada voltaje(). Sin embargo, decoramos esta función con @voltaje.setter. Por último, usamos @voltaje.deleter para decorar un tercer voltaje(), lo que permite la eliminación controlada del atributo. Los nombres de las funciones decoradas son todos iguales, lo que indica que controlan el acceso al mismo atributo. Los nombres de las funciones también se convierten en el nombre del atributo que se usa para acceder al valor. Así es como funcionan estas propiedades en la práctica:

1 >>> from carro import * 2 >>> mi_carro = Carro("amarillo", "beetle", 1969) 3 4 >>> print(f"Mi carro usa {mi_carro.voltaje} volts") 5 Mi carro usa 12 volts 6 7 >>> mi_carro.voltaje = 6 8 Aviso: esto puede causar problemas! 9 10 >>> print(f"Mi carro ahora usa {mi_carro.voltaje} volts") 11 Mi carro ahora usa 6 volts 12 13 >>> del mi_carro.voltaje 14 Aviso: la radio dejara de trabajar!

Tengamos en cuenta que usamos .voltaje, no ._voltaje. Esto le dice a Python que use las funciones de propiedad que se de…nió:

Cuando imprime el valor de mi_carro.voltaje en la línea 4, Python  llama a .voltaje() decorado con @property.

Cuando asigna un valor a mi_carro.voltaje en la línea 7, Python llama  a .voltaje( ) decorado con @voltaje.setter.

[email protected] 506 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Cuando elimina mi_carro.voltaje en la línea 13, Python llama a .voltaje()  decorado con @voltaje.deleter. Las decoraciones @property, @.setter y @.deleter permiten controlar el acceso a los atributos sin requerir que los usuarios utilicen métodos diferentes. Incluso puede hacer que los atributos parezcan propiedades de solo lectura omitiendo las funciones decoradas @.setter y @.deleter. self and this En Java, una clase se re…ere a sí misma con la referencia this: public void setColor(String color) { this.color = color; } this está implícito en el código Java: normalmente no es necesario es- cribirlo, a menos que pueda haber confusión entre dos variables con el mismo nombre. Podemos escribir el mismo código de esta manera: public void setColor(String newColor) { color = newColor; } Dado que Carro tiene un atributo llamado .color, y no hay otra variable en el alcance con el mismo nombre, una referencia a ese nombre funciona. Usamos esto en el primer ejemplo para diferenciar entre el atributo y el parámetro, ambos con nombre color. En Python, la palabra clave self tiene un propósito similar. Así es como se re…ere a las variables de miembro, pero a diferencia de this de Java, es necesario si desea crear o hacer referencia a un atributo de miembro: class Carro: def __init__(self, color, modelo, anio): self.color = color self.modelo = modelo self.anio = anio self._voltaje = 12 @property def voltaje(self): return self._voltaje [email protected] 507 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Python requiere cada uno de ellos en el código anterior. Cada uno crea o hace referencia a los atributos. Si los omite, Python creará una variable local en lugar de un atributo. La diferencia entre cómo se usa self y this en Python y Java se debe a diferencias subyacentes entre los dos lenguajes y cómo nombran variables y atributos.

16.3 Métodos y Funciones Esta diferencia entre Python y Java es, en pocas palabras, que Python tiene funciones y métodos, mientras que Java sólo métodos. En Python, el siguiente código está perfectamente bien (y es muy común):

>>> def di_hola(): ... print("Hola!") ... >>> di_hola() Hola!

Se puede llamar a di_hola() desde cualquier lugar que sea visible. Esta función no tiene referencia a self, lo que indica que es una función global, no una función de clase. No puede alterar ni almacenar ningún dato en ninguna clase, pero puede usar variables locales y globales. Por el contrario, cada línea de código Java que escribe pertenece a una clase. Las funciones no pueden existir fuera de una clase y, por de…nición, todas las funciones de Java son métodos. En Java, lo más cerca que puede llegar a una función pura es mediante el uso de un método estático:

public class Utils { static void DiHola() { System.out.println("Hola!"); } }

Utils.DiHola() se puede llamar desde cualquier lugar sin crear primero una instancia de Utils. Como puede llamar a DiHola() sin crear un objeto primero, esta referencia no existe. Sin embargo, esta todavía no es una función en el sentido de di_hola() de Python. [email protected] 508 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

16.4 Herencia y Polimor…smo La herencia y el polimor…smo son dos conceptos fundamentales en la progra- mación orientada a objetos. La herencia permite a los objetos derivar atributos y funcionalidad de otros objetos, creando una jerarquía que se mueve de objetos más generales a más especí…cos. Por ejemplo, un automóvil y un bote son tipos especí…cos de vehículos. Los objetos pueden heredar su comportamiento de un único objeto principal o de varios objetos principales, y se denominan objetos secundarios cuando lo hacen. El polimor…smo permite que dos o más objetos se comporten entre sí, lo que permite que se usen indistintamente. Por ejemplo, si un método o función sabe cómo pintar un objeto Vehículo, también puede pintar un objeto Coche o Barco, ya que heredan sus datos y comportamiento del Vehículo. Estos conceptos fundamentales de POO se implementan de manera bas- tante diferente en Python vs Java.

Herencia Python admite la herencia múltiple o la creación de clases que heredan el comportamiento de más de una clase principal. Para ver cómo funciona esto, actualicemos la clase de Carro dividién- dola en dos categorías, una para vehículos y otra para dispositivos que usan electricidad:

class Vehiculo: def __init__(self, color, modelo): self.color = color self.modelo = modelo class Dispositivo: def __init__(self): self._voltaje = 12 class Carro(Vehiculo, Dispositivo): def __init__(self, color, modelo, anio): Vehiculo.__init__(self, color, modelo) Dispositivo.__init__(self) self.anio = anio @property def voltaje(self): return self._voltaje [email protected] 509 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

@voltaje.setter def voltaje(self, volts): print("Aviso: esto puede causar problemas!") self._voltaje = volts @voltaje.deleter def voltaje(self): print("Aviso: el radio dejara de trabajar!") del self._voltaje

Un vehículo se de…ne por tener atributos .color y .modelo. Entonces, un dispositivo se de…ne para tener un atributo ._voltaje. Dado que el objeto Carro original tenía estos tres atributos, se puede rede…nir para heredar las clases Vehiculo y Dispositivo. Los atributos de color, modelo y _voltaje serán parte de la nueva clase Carro. En .__init__() para Carro, llama a los métodos .__init__() para am- bas clases principales para asegurarse de que todo se inicialice correctamente. Una vez hecho esto, puede agregar cualquier otra funcionalidad que desee a su Carro. En este caso, agrega un atributo .anio especí…co para los objetos Carro y los métodos getter y setter para .voltaje. Funcionalmente, la nueva clase Carro se comporta como siempre. Creas y usa los objetos Carro como antes:

>>> from carro import * >>> mi_carro = Carro("amarillo", "beetle", 1969) >>> print(f"Mi carro es {mi_carro.color}") Mi carro es amarillo >>> print(f"Mi carro usa {mi_carro.voltaje} volts") Mi carro usa 12 volts >>> mi_carro.voltaje = 6 Aviso: esto puede causar problemas! >>> print(f"Mi carro ahora usa {mi_carro.voltaje} volts") Mi carro ahora usa 6 volts

Java, por otro lado, solo admite herencia única, lo que signi…ca que las clases en Java pueden heredar datos y comportamiento de una sola clase principal. Sin embargo, los objetos Java pueden heredar el comportamiento de muchas interfaces diferentes. Las interfaces proporcionan un grupo de métodos relacionados que un objeto debe implementar y permiten que varias clases secundarias se comporten de manera similar. [email protected] 510 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Para ver esto en acción, divida la clase Java Carro en una clase principal y una interfaz:

public class Vehiculo { private String color; private String modelo; public Vehiculo(String color, String modelo) { this.color = color; this.modelo = modelo; } public String getColor() { return color; } public String getModelo() { return modelo; } } public interface Dispositivo { int getVoltaje(); } public class Carro extends Vehiculo implements Dispositivo { private int voltaje; private int anio; public Car(String color, String modelo, int anio) { super(color, modelo); this.anio = anio; this.voltaje = 12; } @Override public int getVoltaje() { return voltaje; } public int getAnio() { return anio; } }

[email protected] 511 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Recordemos que cada clase e interfaz debe vivir en su propio archivo. Como hicimos con Python, creamos una nueva clase llamada Vehículo para contener los datos y la funcionalidades más generales relacionados con el vehículo. Sin embargo, para agregar la funcionalidad del dispositivo, debe crear una interfaz en su lugar. Esta interfaz de…ne un método único para devolver el voltaje del dispositivo. La rede…nición de la clase Carro requiere que heredes de Vehiculo usando extender e implemente la interfaz de Dispositivo usando implements. En el constructor, llama al constructor de la clase padre usando el super() incor- porado. Dado que solo hay una clase principal, solo puede hacer referencia al constructor del vehículo. Para implementar la interfaz, escribe getVoltaje() usando la anotación @Override. En lugar de obtener la reutilización del código de Dispositivo como lo hizo Python, Java requiere que implemente la misma funcionalidad en cada clase que implementa la interfaz. Las interfaces solo de…nen los métodos, no pueden de…nir datos de instancia o detalles de implementación. Entonces, ¿por qué es este el caso de Java? Todo se reduce a tipos.

Tipos y Polimor…smo La estricta veri…cación de tipos de Java es lo que impulsa el diseño de su interfaz. Cada clase e interfaz en Java es un tipo. Por lo tanto, si dos objetos Java implementan la misma interfaz, se considera que son del mismo tipo con respecto a esa interfaz. Este mecanismo permite usar indistintamente diferentes clases, que es la de…nición de polimor…smo. Puede implementar la carga del dispositivo para sus objetos Java creando un .cargar() que necesita un dispositivo para cargarse. Cualquier objeto que implemente la interfaz del dispositivo se puede pasar a .cargar(). Esto también signi…ca que las clases que no implementan Dispositivo generarán un error de compilación. Cree la siguiente clase en un archivo llamado Rinoceronte.java:

public class Rinoceronte { }

Ahora puede crear un nuevo Main.java para implementar .cargar() y explorar en qué se diferencian los objetos Carro y Rinoceronte:

public class Main{ [email protected] 512 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

public static void cargar(Dispositivo dispositivo) { dispositivo.getVoltaje(); } public static void main(String[] args) throws Exception { Carro carro = new Carro("amarillo", "beetle", 1969); Rinoceronte rinoceronte = new Rinoceronte(); cargar(carro); cargar(rinoceronte); } }

Esto es lo que debería ver cuando intente compilar este código:

Information:2021-02-02 15:20 - Compilation completed with 1 error and 0 warnings in 4 s 395 ms Main.java Error:(43, 11) java: incompatible types: Rinoceronte cannot be converted to Dispositivo

Dado que la clase Rinoceronte no implementa la interfaz del dispositivo, no se puede pasar a .cargar(). En contraste con la escritura de variables estricta de Java, Python usa un concepto llamado escritura de pato, que en términos básicos signi…ca que si una variable "camina como un pato y grazna como un pato, entonces es un pato". En lugar de identi…car objetos por tipo, Python examina su comportamiento. Podemos explorar la escritura de pato implementando capacidades de carga de dispositivo similares para la clase de Dispositivo Python:

>>> def cargar(dispositivo): ... if hasattr(Dispositivo, ’_voltaje’): ... print(f"Cargando a {dispositivo._voltaje} voltaje disposi- tivo ") ... else: ... print(f"No se puede cargar {dispositivo.__class__.__name__}") ... >>> class Telefono(Dispositivo): ... pass [email protected] 513 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

... >>> class Rinoceronte: ... pass ... >>> mi_carro = Carro("amarillo", "Beetle", "1966") >>> mi_telefono = Telefono() >>> mi_Rinoceronte = Rinoceronte() >>> cargar(mi_carro) Cargando 12 volts dispositivo >>> cargar(mi_telefono) Cargando a 12 volts Dispositivo >>> cargar(mi_Rinoceronte) No se puede cargar Rinoceronte

cargar() debe veri…car la existencia del atributo ._voltaje en el objeto al que se le pasa. Dado que la clase Dispositivo de…ne este atributo, cualquier clase que herede de él (como Carro y Telefono) tendrá este atributo y, por lo tanto, mostrará que se está cargando correctamente. Las clases que no heredan de Dispositivo (como Rinoceronte) pueden no tener este atributo y no podrán cargar (lo cual es bueno, ya que cargar rinocerontes puede ser peligroso).

Métodos Predeterminados Todas las clases de Java descienden de la clase Object, que contiene un conjunto de métodos que heredan todas las demás clases. Las subclases pueden anularlas o mantener los valores prede- terminados. La clase Object de…ne los siguientes métodos:

class Object { boolean equals(Object obj) { ... } int hashCode() { ... } String toString() { ... } }

De forma predeterminada, equals() compara las direcciones del objeto actual con un segundo objeto pasado, y hashcode() calcula un identi…cador único que también usa la dirección del objeto actual. Estos métodos se utilizan en muchos contextos diferentes en Java. Por ejemplo, las clases de [email protected] 514 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM servicios públicos, como las colecciones que clasi…can objetos en función del valor, necesitan ambas. toString() devuelve una representación de cadena del objeto. De forma predeterminada, este es el nombre de la clase y la dirección. Este método se llama automáticamente cuando se pasa un objeto a un método que requiere un argumento de cadena, como System.out.println():

Carro carro = new Carro("amarillo", "Beetle", 1969); System.out.println(carro);

Al ejecutar este código, se usará el .toString() predeterminado para mostrar el objeto de Carro:

Carro@61bbe9ba

No es muy útil, ¿verdad? Puede mejorar esto anulando el .toString() predeterminado. Agregue este método a la clase Java Carro:

public String toString() { return "Carro: " + getColor() + " : " + getmodelo() + " : " + getanio(); }

Ahora, cuando ejecutemos el mismo código de muestra, veremos lo si- guiente:

Carro: amarillo : Beetle : 1969

Python proporciona una funcionalidad similar con un conjunto común de dunder (abreviatura de "doble subrayado") de métodos. Cada clase de Python hereda estos métodos y puede anularlos para modi…car su compor- tamiento. Para las representaciones de cadena de un objeto, Python proporciona __repr__() y __str__(), que puede conocer en Pythonic OOP String Conversion: __repr__ vs __str__. La representación inequívoca de un objeto es devuelta por __repr__(), mientras que __str__() devuelve una representación legible por humanos. Estos son aproximadamente análogos a .hashcode() y .toString() en Java. Al igual que Java, Python proporciona implementaciones predetermi- nadas de estos métodos dunder: [email protected] 515 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

>>> mi_carro = Carro("amarillo", "Beetle", "1966") >>> print(repr(mi_carro)) >>> print(str(mi_carro))

Puede mejorar esta salida anulando .__str__(), agregando esto a la clase Python Carro:

def __str__(self): return f’Carro {self.color} : {self.modelo} : {self.anio}’

Esto le da un resultado mucho mejor:

>>> mi_carro = Carro("amarillo", "Beetle", "1966") >>> print(repr(mi_carro)) >>> print(str(mi_carro)) Carro amarillo : Beetle : 1966

Anular el método dunder nos dio una representación más legible de su Carro. Es posible que también desee anular el .__repr__(), ya que a menudo es útil para depurar. Python ofrece muchos más métodos dunder. Usando métodos dunder, puede de…nir el comportamiento de su objeto durante la iteración, compara- ción, adición o hacer que un objeto sea invocable directamente, entre otras cosas.

Sobrecarga del Operador La sobrecarga de operadores se re…ere a re- de…nir cómo funcionan los operadores de Python cuando operan en objetos de…nidos por el usuario. Los métodos dunder de Python le permiten imple- mentar la sobrecarga de operadores, algo que Java no ofrece en absoluto. Modi…cando la clase Python Carro con los siguientes métodos adicionales:

class Carro: def __init__(self, color, modelo, anio): self.color = color self.modelo = modelo self.anio = anio [email protected] 516 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

def __str__(self): return f’Carro {self.color} : {self.modelo} : {self.anio}’ def __eq__(self, other): return self.anio == other.anio def __lt__(self, other): return self.anio < other.anio def __add__(self, other): return Carro(self.color + other.color, self.modelo + other.modelo, int(self.anio) + int(other.anio))

La siguiente tabla muestra la relación entre estos métodos dunder y los operadores de Python que representan: Método Dunder Operator Propósito __eq__ == Revisa si son del mismo año __lt__ < Cual carro es un modelo más reciente __add__ + Concatena dos objetos Carro de una manera absurda Cuando Python ve una expresión que contiene objetos, llama a los méto- dos dunder de…nidos que correspondan a los operadores de la expresión. El siguiente código utiliza estos nuevos operadores aritméticos sobrecargados en un par de objetos Carro:

>>> mi_carro = Carro("amarillo", "Beetle", "1966") >>> tu_carro = Carro("rojo", "Corvette", "1967") >>> print (mi_carro < tu_carro) True >>> print (mi_carro > tu_corro) False >>> print (mi_carro == tu_carro) False >>> print (mi_carro + tu_Carro) Car amarillorojo : BeetleCorvette : 3933

Hay muchos más operadores que puede sobrecargar usando métodos dun- der. Ofrecen una forma de enriquecer el comportamiento de su objeto de una manera que los métodos predeterminados de la clase base común de Java no lo hacen.

[email protected] 517 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

16.5 Re‡exión La re‡exión se re…ere a examinar un objeto o clase desde dentro del objeto o clase. Tanto Java como Python ofrecen formas de explorar y examinar los atributos y métodos de una clase.

Examinar el Tipo de un Objeto Ambos lenguajes tienen formas de probar o veri…car el tipo de un objeto. En Python, usa type() para mostrar el tipo de una variable, e isinstance() para determinar si una variable dada es una instancia o hija de una clase especí…ca:

>>> mi_carro = Carro("amarillo", "Beetle", "1966") >>> print(type(mi_carro)) >>> print(isinstance(mi_carro, Carro)) True >>> print(isinstance(mi_carro, Dispositivo)) True

En Java, consulta el objeto por su tipo usando .getClass(), y usa el ope- rador instanceof para veri…car una clase especí…ca:

Carro carro = new Carro("amarillo", "beetle", 1969); System.out.println(carro.getClass()); System.out.println(carro instanceof Carro);

Este código genera la siguiente salida:

class com.realpython.Carro true

Examinar los Atributos de un Objeto En Python, puede ver todos los atributos y funciones contenidos en cualquier objeto (incluidos todos los métodos dunder) usando dir(). Para obtener los detalles especí…cos de un atributo o función determinados, use getattr():

[email protected] 518 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

>>> print(dir(mi_carro)) [’_Carro__portavasos’, ’__add__’, ’__class__’, ’__de- lattr__’,’__dict__’, ’__dir__’,’__doc__’,’__eq__’,’__format__’,’__ge__’, ’__getattribute__’, ’__gt__’,’__hash__’,’__init__’,’__init_subclass__’, ’__le__’,’__lt__’, ’__module__’,’__ne__’,’__new__’,’__reduce__’,’__re- duce_ex__’,’__repr__’, ’__setattr__’,’__sizeof__’,’__str__’,’__subclasshook__’, ’__weakref__’, ’_voltaje’,’color’,’modelo’,’voltaje’,’ruedas’,’anio’] >>> print(getattr(mi_carro, "__format__"))

Java tiene capacidades similares, pero el control de acceso del lenguaje y la seguridad de tipos lo hacen más complicado de recuperar. .getFields() recupera una lista de todos los atributos de acceso público. Sin embargo, dado que ninguno de los atributos de Carr es público, este código devuelve una matriz vacía:

Field[] …elds = carro.getClass().getFields();

Java trata los atributos y métodos como entidades independientes, por lo que los métodos públicos se recuperan mediante .getDeclaredMethods(). Dado que los atributos públicos tendrán un método .get correspondiente, una forma de descubrir si una clase contiene una propiedad especí…ca podría verse así:

Utilice .getDeclaredMethods() para generar una matriz de todos los métodos. Recorra todos los métodos devueltos: Para cada método descubierto, devuelve verdadero si el método: Comienza con la palabra get OR acepta cero argumentos Y no vuelve vacío Y incluye el nombre de la propiedad De lo contrario, devuelve falso. [email protected] 519 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Aquí hay un ejemplo rápido y sucio:

public static boolean getProperty(String name, Object ob- ject) throws Exception { Method[] declaredMethods = object.getClass().getDeclaredMethods(); for (Method method : declaredMethods) { if (isGetter(method) && method.getName().toUpperCase().contains(name.toUpperCase())) { return true; } } return false; } // Función auxiliar para obtener si el método es un método getter public static boolean isGetter(Method method) { if ((method.getName().startsWith("get") method.getParameterCount() == 0 ) &&jj !method.getReturnType().equals(void.class)) { return true; } return false; }

getProperty() es su punto de entrada. Llamandolo con el nombre de un atributo y un objeto. Devuelve verdadero si se encuentra la propiedad y falso si no.

Métodos de Llamada a Través de la Re‡exión Tanto Java como Python proporcionan mecanismos para llamar a métodos mediante la re- ‡exión. En el ejemplo de Java anterior, en lugar de simplemente devolver ver- dadero si se encuentra la propiedad, puede llamar al método directamente. Recuerde que getDeclaredMethods() devuelve una matriz de objetos Method. El objeto Method en sí tiene un método llamado .invoke(), que llamará al método. En lugar de devolver true cuando el método correcto se encuentra en la línea 7 anterior, puede devolver method.invoke(object) en su lugar. [email protected] 520 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Esta capacidad también existe en Python. Sin embargo, dado que Python no distingue entre funciones y atributos, debe buscar especí…camente en- tradas que sean invocables:

>>> for method_name in dir(mi_carro): ... if callable(getattr(mi_carro, method_name)): ... print(method_name) ... __add__ __class__ __delattr__ __dir__ __eq__ __format__ __ge__ __getattribute__ __gt__ __init__ __init_subclass__ __le__ __lt__ __ne__ __new__ __reduce__ __reduce_ex__ __repr__ __setattr__ __sizeof__ __str__ __subclasshook__

Los métodos de Python son más simples de administrar y llamar que en Java. Agregar el operador () (y cualquier argumento requerido) es todo lo que necesita hacer. El siguiente código encontrará el .__str__ () de un objeto y lo llamará a través de la re‡exión:

[email protected] 521 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

>>> for method_name in dir(mi_carro): ... attr = getattr(mi_carro, method_name) ... if callable(attr): ... if method_name == ’__str__’: ... print(attr()) ... Carro amarillo : Beetle : 1966

Aquí, se comprueba cada atributo devuelto por dir(). Obtiene el objeto de atributo real usando getattr( ) y veri…ca si es una función invocable usando callable(). Si es así, compruebe si su nombre es __str__() y luego llámelo.

[email protected] 522 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

17 Apéndice E: Máquinas Virtuales

Entendamos por una máquina virtual a un programa de cómputo (véase [48], [54], [47] y [46]) que simula a una computadora, en la cual se puede instalar y usar otros sistemas operativos de forma simultánea como si fuese una computadora real sobre nuestro sistema operativo huésped130.

Figura 3: Sobre un equipo AMD de gama baja y 4 GB de RAM, usando como sistema operativo huésped un Linux Debian estable, se ejecutan 4 máquinas virtuales (mediante KVM) de Windows XP con diferentes aplicaciones y dentro de cada una de ellas se muestra la RAM asignada, la usada en ese momento, el uso de CPU de cada máquina virtual, entre otros datos.

Una característica esencial de las máquinas virtuales es que los procesos que ejecutan están limitados por los recursos y abstracciones proporcionados por ellas. Estos procesos no pueden escaparse de esta "computadora virtual". Uno de los usos más extendidos de las máquinas virtuales es ejecutar sistemas operativos nuevos u obsoletos adicionales a nuestro sistema habitual.

130 Tal y como puede verse re‡ejado en la de…nición de máquina virtual, en este texto nos estamos focalizando en las máquinas virtuales de sistema. Existen otro tipo de máquinas virtuales, como por ejemplo las máquinas virtuales de proceso o los emuladores. [email protected] 523 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

De esta forma podemos ejecutar uno o más sistemas operativos -Linux, Mac OS, Windows XP, 7 ó 8- desde nuestro sistema operativo habitual - GNU/Linux, Unix o Windows- sin necesidad de instalarlo directamente en nuestra computadora y sin la preocupación de que se descon…gure el sistema operativo huésped o a las vulnerabilidades del sistema virtualizado, ya que podemos aislarlo para evitar que se dañe.

17.1 Tipos de Máquinas Virtuales Las máquinas virtuales se pueden clasi…car en dos grandes categorías según su funcionalidad y su grado de equivalencia a una verdadera máquina:

Máquinas virtuales de sistema (en inglés ).  También llamadas máquinas virtuales de Hardware131, permiten a la má-quina física subyacente compartirse entre varias máquinas virtuales, cada una ejecutando su propio sistema operativo132. A la capa de Soft- ware que permite la virtualización se le llama monitor de máquina vir- tual o . Un monitor de máquina virtual puede ejecutarse o bien directamente sobre el Hardware o bien sobre un sistema operativo ("Host Operating System").

Máquinas virtuales de proceso (en inglés Process Virtual Machine).  A veces llamada "máquina virtual de aplicación", se ejecuta como un proceso normal dentro de un sistema operativo y soporta un solo pro- ceso. La máquina se inicia automáticamente cuando se lanza el proceso que se desea ejecutar y se detiene para cuando éste …naliza. Su obje- tivo es el de proporcionar un entorno de ejecución independiente de la plataforma de Hardware y del sistema operativo, que oculte los de- talles de la plataforma subyacente y permita que un programa se ejecute siempre de la misma forma sobre cualquier plataforma.

131 La virtualización puede se por Software o con apoyo mediante el Hardware, en este último caso se obtienen varios ordenes de magnitud de rendimiento que por Software. 132 Que sus componentes sean virtuales no quiere decir necesariamente que no existan, por ejemplo una máquina virtual puede tener unos recursos reservados de 2 GB de RAM y 20 GB de disco que se obtienen del equipo donde este ejecutando la máquina virtual. Otros dispositivos podrían realmente ser inexistentes físicamente como por ejemplo un CD-ROM que en verdad es el contenido de una imagen ISO en vez de un lector de CD de verdad. [email protected] 524 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

17.2 Técnicas de Virtualización Las Máquinas Virtuales ya tienen más de 60 años de vida su origen en los primeros días de la informática en la década de 1960, cuando el tiempo compartido para los usuarios de la computadora central era un medio de separar el Software de un sistema an…trión físico. La máquina virtual se de…nió a principios de los 70 como "un duplicado e…ciente y aislado de una máquina de computación real". Las máquinas virtuales tal como las conocemos hoy en día han cobrado fuerza en los últimos 20 años a medida que las empresas adoptaron la vir- tualización de servidores para utilizar la potencia de computación de sus servidores físicos de manera más e…ciente, reduciendo la necesidad de servi- dores físicos y ahorrando así espacio en el centro de datos. Debido a que las aplicaciones con diferentes requisitos de sistema operativo podían funcionar en un solo Host físico, no se requería un Hardware de servidor diferente para cada una. Básicamente se reconocen tres tipos de virtualización, algunas de las cuales son usadas actualmente en la gran mayoría de los sistemas operativos, ge-neralmente sin que el usuario este consciente de que usa virtualización133, estos son:

Emulación del Hardware Subyacente (ejecución nativa) Esta téc- nica se suele llamar virtualización completa -Full - del Hard- ware, y se puede implementar usando un Hipervisor de Tipo I o de Tipo II:

1. Monitor de tipo I, se ejecuta directamente sobre el Hardware.

2. Monitor de tipo II, se ejecuta sobre otro sistema operativo.

Cada máquina virtual puede ejecutar cualquier sistema operativo sopor- tado por el Hardware subyacente. Así los usuarios pueden ejecutar dos o más sistemas operativos distintos simultáneamente en computadoras "privadas" virtuales. Actualmente tanto Intel como AMD han introducido prestaciones a sus procesadores x86_64 para permitir la virtualización de Hardware.

133 El ejemplo más común y omnipresente es la máquina virtual del lenguaje de progra- mación de JAVA o .Net Framework.

[email protected] 525 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Emulación de un Sistema no Nativo Las máquinas virtuales también pueden actuar como emuladores de Hardware, permitiendo que aplicaciones y sistemas operativos concebidos para otras arquitecturas de procesador se puedan ejecutar sobre un Hardware que en teoría no soportan. Esta técnica permite que cualquier computadora pueda ejecutar Software escrito para la máquina virtual. Sólo la máquina virtual en sí misma debe ser portada a cada una de las plataformas de Hardware.

Virtualización a Nivel de Sistema Operativo Esta técnica consiste en dividir una computadora en varios compartimientos independientes de manera que en cada compartimento podamos instalar un servidor. A estos compartimentos se les llama "entornos virtuales". Desde el punto de vista del usuario, el sistema en su conjunto actúa como si realmente existiesen varios servidores ejecutándose en varias máquinas distintas.

17.3 Otras Formas de Virtualización El éxito de las máquinas virtuales en la virtualización de servidores llevó a aplicar la virtualización a otras áreas, como son el almacenamiento, las redes o las computadoras de escritorio. Lo más probable es que, si hay un tipo de Hardware que se está utilizando en el centro de datos, se esté explorando el concepto de virtualizarlo.

Virtualización de escritorios Implementar los escritorios como un ser- vicio gestionado permite a las organizaciones de tecnología de la información responder más rápido a las necesidades cambiantes del entorno de trabajo y a las nuevas oportunidades. Los escritorios y las aplicaciones virtualizados también pueden distribuirse de forma rápida y sencilla a sucursales, emplea- dos subcontratados o en otros países y trabajadores móviles que utilizan dispositivos móviles como tabletas iPad y Android.

Virtualización de redes las empresas han explorado opciones de red como servicio y la virtualización de funciones de red -NFV, Network Func- tions Virtualization-, que utiliza servidores de productos básicos para susti- tuir los aparatos de red especializados y permitir servicios más ‡exibles y escalables. Esto di…ere un poco de la red de…nida por los programas in- formáticos, que separa el plano de control de la red del plano de reenvío [email protected] 526 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM para permitir un aprovisionamiento más automatizado y una gestión de los recursos de la red basada en políticas. Una tercera tecnología, las funciones de red virtual, son servicios basados en programas informáticos que pueden ejecutarse en un entorno NFV, inclu- idos procesos como el enrutamiento, el cortafuegos, el equilibrio de la carga, la aceleración de la WAN y el cifrado.

Máquinas Virtuales y Contenedores El crecimiento de las máquinas virtuales ha dado lugar a un mayor desarrollo de tecnologías como los con- tenedores, que llevan el concepto un paso más allá y está ganando atractivo entre los desarrolladores de aplicaciones Web. En el entorno de un contene- dor, una sola aplicación, junto con sus dependencias, puede ser virtualizada. Con muchos menos gastos generales que una máquina virtual, un contenedor sólo incluye binarios, bibliotecas y aplicaciones. Mientras que algunos piensan que el desarrollo de contenedores puede "matar" a la máquina virtual, hay su…cientes capacidades y bene…cios de las máquinas virtuales que mantienen la tecnología en movimiento. Por ejem- plo, las máquinas virtuales siguen siendo útiles cuando se ejecutan múltiples aplicaciones juntas o cuando se ejecutan aplicaciones heredadas en sistemas operativos más antiguos. Además, algunos opinan que los contenedores son menos seguros que los hipervisores de las máquinas virtuales porque los contenedores tienen un solo sistema operativo que las aplicaciones comparten, mientras que las máquinas virtuales pueden aislar la aplicación y el sistema operativo.

Máquinas Virtuales, 5G y Edge Computing Las máquinas virtuales son vistas como parte de nuevas tecnologías como el 5G y el Edge Com- puting. Por ejemplo, los proveedores de infraestructura de escritorio virtual -VDI, Infrastructure- como Microsoft, VMware y Citrix es- tán buscando formas de extender sus sistemas VDI a los empleados que ahora trabajan en casa a causa de la pandemia. Como muchas otras tecnologías que se utilizan hoy en día, éstas no se habrían desarrollado si no fuera por los conceptos originales de máquinas virtuales introducidos hace décadas.

[email protected] 527 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

17.4 Aplicaciones de las Máquinas Virtuales de Sis- tema Cada uno de los sistemas operativos que virtualizamos -con su propio sistema operativo llamado sistema operativo «invitado (Guest)» - es independiente de los otros sistemas operativos. De este modo, en caso que una de las máquinas virtuales deje de funcionar, el resto seguirá funcionando. Una máquina virtual dispone de todos los elementos de un equipo de cómputo real, de disco duro, memoria RAM, unidad de CD o DVD, tarjeta de red, tarjeta de vídeo, etc., pero a diferencia de un equipo de cómputo real estos elementos en vez de ser físicos son virtuales. Así, una vez instalado un sistema operativo en la máquina virtual, podemos usar el sistema operativo virtualizado del mismo modo que lo usaríamos si lo hubiéramos instalado en nuestro equipo de cómputo.

Figura 4: Al poder correr diferentes sistemas operativos y/o versiones del mismo en donde podemos instalar diversas aplicaciones antagónicas que no podrían coexistir en un sólo sistema operativo, nos permite ampliar el uso de nuestro equipo de cómputo.

Varios sistemas operativos distintos pueden coexistir sobre la misma com- putadora trabajando simultáneamente, en sólido aislamiento el uno del otro, [email protected] 528 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM por ejemplo para probar un sistema operativo nuevo sin necesidad de insta- larlo directamente. La máquina virtual puede proporcionar una arquitectura de instrucciones que sea algo distinta de la verdadera máquina, es decir, podemos simular Hardware. Además, todos los elementos de una máquina virtual se encapsulan en un conjunto pequeño de archivos -en KVM/QEMU es solo un archivo-, esto permite que podamos pasar un sistema operativo virtual de un equipo de cómputo a otro y realizar copias de seguridad de forma fácil y rápida. La gran mayoría de los manejadores de máquinas virtuales -KVM, Vir- tualBox o VMWare- permiten instalar prácticamente cualquier sistema ope- rativo -por ejemplo Linux, Android, Mac OS X, Windows, Chrome OS, etc.- . Sin embargo existen otros manejadores de máquinas virtuales -Virtual PC, Hiper-V o Parallels- que están principalmente destinados a virtualizar Windows. La virtualización es una excelente opción hoy en día, ya que las máquinas actuales -Laptops, Desktops y servidores- en la mayoría de los casos están siendo "subutilizados" -estos cuentan con una gran capacidad de cómputo, disco duro y memoria RAM- ya que no se utilizan todos los recursos todo el tiempo, teniendo un uso promedio que oscila entre 30% a 60% de su ca- pacidad total. Permitiendo así, ejecutar varias máquinas virtuales en un sólo equipo físico aumentando el porcentaje de uso de los recursos de cómputo disponibles -en el caso de virtualizar servidores, a este proceso se le conoce como consolidación de servidores-. Así, la consolidación de servidores con- tribuye a reducir el coste total de las instalaciones necesarias para mantener los servicios, permitiendo un ahorro considerable de los costos asociados - energía, mantenimiento, espacio, administración, etc.-, esto se hace patente en la «computación en la nube (Cloud Computing)» muy en boga actual- mente.

17.5 Ventajas y Desventajas Como toda tecnología, la virtualización tiene ventajas y desventajas, las cuales deben de ser sopesadas en cada ámbito de implementación. Lo que es un hecho que permite en un mismo equipo de cómputo ejecutar más de un sistema operativo o distintas versiones del mismo. Pero queda claro que uno de los inconvenientes de las máquinas virtuales, es que agregan gran complejidad al sistema en tiempo de ejecución. Esto tiene como efecto la ralentización del sistema, es decir, el programa no alcan- [email protected] 529 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM zará la misma velocidad de ejecución que si se instalase directamente en el sistema operativo «an…trión (Host)» o directamente sobre la plataforma de Hardware, sin embargo, a menudo la ‡exibilidad que ofrecen compensa esta pérdida de e…ciencia. Si la virtualización es por Hardware, la velocidad de ejecución es más que aceptable para la mayoría de los casos, por ejemplo, en el caso de usar KVM/QEMU soporta máquinas virtuales de hasta 255 CPUs y 4 TB de RAM, y el rendimiento de aplicaciones como Oracle, SAP, LAMP, MS Ex- change sobre máquinas virtuales puede oscilar entre el 95% y el 135% com- parado con su ejecución en servidores físicos. Además, se ha conseguido ejecutar hasta 600 máquinas virtuales en un solo servidor físico.

17.5.1 Ventajas Además de permitir ejecutar múltiples sistemas operativos, diferentes ver- siones de un mismo sistema pero con diferente Software que en principio puede ser incompatible entre sí. Para usuarios de Windows, el hecho en sí, de no tener porque lidiar con problemas derivados de virus y antivirus le con- …ere una gran ventaja desde el punto de vista administrativo y del usuario …nal. Además, permite una administración centralizada, ya que todas las máquinas virtuales tendrían la misma con…guración y paquetes sin importar el Hardware subyacente en las que se ejecute el sistema operativo huésped. En el caso de instituciones educativas de cualquier nivel académico, es común que en un mismo equipo de cómputo sea necesario ejecutar por un lado diferentes versiones de sistemas operativos -por ejemplo Linux, Windows XP, Windows 7, etc.- y por otro lado, en un sistema operativo, ejecutar diferentes versiones de un mismo paquete -generalmente no se pueden tener instalados simultáneamente más de una versión-. Las máquinas virtuales son una verdadera opción para coexistir simultá- neamente diferentes versiones de sistemas operativos y en un mismo sistema máquinas virtuales ejecutando las diversas versiones de un mismo programa de cómputo, además se pueden con…gurar para que al momento de iniciarlas siempre se ejecuten a partir de una con…guración e instalación base, de tal forma que al ser lanzadas, el usuario pueda instalar, con…gurar e inclusive dañar la máquina virtual, pero al reiniciarse la máquina virtual en una nueva sesión, se regresa a la con…guración de la versión base, de esta forma no hay posibilidad de infección de virus entre diversos lanzamientos de sesiones de la máquina virtual, la actualización es centralizada y se puede hacer por red, [email protected] 530 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM sin intervención del usuario. Por ello, es una opción viable y común tener en una máquina un sis- tema huésped como Debian GNU/Linux Estable y dentro de el, un grupo de máquinas virtuales de Windows -Windows XP, Windows 7, etc.-, en los que cada máquina virtual tenga instalado Software agrupado por las ca- racterísticas del sistema operativo necesario para ejecutar a todas las aplica- ciones seleccionadas -por ejemplo agrupados por la versión de Service Pack-. Por otro lado, si se descon…gura un sistema operativo virtualizado es sumamente fácil de restaurar si lo comparamos con un máquina real. Si tomamos las precauciones necesarias podemos restaurar el estado que tenía un sistema operativo virtualizado, de forma fácil y rápida. Si hablamos del entorno empresarial, la virtualización de sistemas operativos supone un ahorro económico y de espacio considerable. Ya que mediante el uso de la vir- tualización evitamos la inversión en multitud de equipos físicos, esto supone un ahorro importante en mantenimiento, en consumo energético, espacio y procesos administrativos. Por otro lado, mediante la virtualización y el balanceo dinámico podemos incrementar las tasas de prestación de servicios de un servidor del siguiente modo. Si disponemos de un servidor Web podemos asignar recursos adi- cionales al servidor, como por ejemplo memoria RAM y CPU en los picos de carga para evitar que el servidor se caiga y de este modo incrementar la tasa de e…ciencia. Una vez …nalizado el pico de carga podemos desviar los recursos aplicados al servidor Web a otra necesidad que tengamos. Por lo tanto, aparte de mejorar la tasa de servicio se pueden optimizar los recursos. Si estamos usando una máquina virtual en un entorno de producción, podemos ampliar los recursos de un sistema operativo o servidor de una forma muy sencilla, tan solo tenemos que acceder al Software de virtualiza- ción y asignar más recursos. Además, es fácil crear un entorno para realizar pruebas de todo tipo aislado del resto de sistema. Así, las máquinas virtuales y la virtualización permiten usar un solo servicio por servidor virtualizado de forma sencilla, de este modo aunque se caiga uno de los servidores virtua- lizado los otros seguirán funcionando. En resumen, la virtualización permite ofrecer un servicio más rápido, sencillo a usuarios (académicos, estudiantes, clientes, etc.) y es un pilar que debe ser considerado en una escuela, universidad o compañía en su proceso de transformación o consolidación, permitiendo escalonar y ser creativos a la hora de atender las necesidades crecientes y cambiantes de los usuarios; y contar con servicios agregados, ágiles y adaptables a los constantes cambios [email protected] 531 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM de tecnología de Hardware y Software permitiendo escalar a la hiperconver- gencia hacia la nube.

17.5.2 Desventajas Entre las principales desventajas de virtualizar sistemas propietarios134 como Windows (véase 14.2) -no así los sistemas libres como Debian GNU/Linux (véase 14.1)- es que se puede violar el sistema de licenciamiento (véase 14.3) del Software instalado en las máquinas virtuales, esto es especialmente im- portante cuando se usa en más de una máquina, pues la licencia usada para la instalación es violada cuando se tiene más de una copia de la máquina virtual o se ejecutan múltiples instancias de la máquina virtual. En el caso de Windows XP Home, no se infringe la licencia mientras se cuente con número de licencias igual al máximo número de máquinas vir- tuales lanzadas simultáneamente. Para otras versiones del sistema operativo Windows como es Windows XP Profesional, la virtualización se maneja con licencias adicionales a la del sistema operativo original y se debe de contar con tantas licencias como el máximo número de máquinas virtuales lanzadas si- multáneamente. Además, es necesario contar con el tipo de licencia adecuada para virtualizar a todos y cada uno de los paquetes de cómputo instalados en cada máquina virtual y en las instancias para el número de máquinas virtuales lanzadas simultáneamente en uno o más equipos. Para usar una máquina virtual en condiciones favorables, necesitamos un equipo de cómputo potente. Debemos que tener en cuenta que si usamos dos sistemas operativos de forma simultánea estamos empleando hasta el doble de recursos. No obstante cualquier equipo de cómputo doméstico de gama baja actual dispone de los recursos su…cientes para usar una o más máquinas virtuales. Los sistemas operativos y los programas se ejecutaran con mayor lentitud en las máquinas virtuales. Esto es debido a que las máquinas virtuales no pueden sacar un rendimiento ideal del Hardware que tenemos en nues-tro equipo. Cuanto más potente sea nuestro equipo de cómputo menos se notará la pérdida de rendimiento.

134 Según la Free Software Foundation (véase [19]), el «Software libre» se re…ere a la libertad de los usuarios para ejecutar, copiar, distribuir, y estudiar el mismo, e incluso modi…car el Software y distribuirlo modi…cado. Así, un Software que no es libre, es llamado «Software privativo o propietario» .

[email protected] 532 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Si tenemos un problema -de Hardware o Software- en el equipo de cóm- puto que aloja el sistema operativo an…trión puede caerse el servicio en la totalidad de máquinas virtuales. Por lo tanto el equipo de cómputo que hace funcionar la máquina virtual es una parte crítica del proceso de virtualización. A pesar de los inconvenientes que se citan en este apartado, bajo nuestro punto de vista, la virtualización y las máquinas virtuales proporcionan unas ventajas y una ‡exibilidad que compensan claramente los inconvenientes que acabamos de citar.

17.5.3 Consideraciones Técnicas y Legales de la Virtualización Como se mostrará en la siguiente sección, virtualizar sistemas operativos - Linux, Unix, Windows entre otros- no representa ningún problema técnico, pero no es el caso en cuanto a las implicaciones legales de hacer la vir- tualización que involucra el almacenamiento, distribución y el número de veces que se ejecuta simultáneamente una máquina virtual en uno o múlti- ples equipos, ya que en general, la máquina virtual esta contenida en un sólo archivo que facilita su distribución y almacenamiento, violando de esta forma la licencia de algunos sistemas operativos y/o programas instalados en el mismo. En el caso de virtualizar cualquier sistema operativo libre como Debian GNU/Linux (véase 14.1), el tipo de licencia que tiene, permite y alienta su uso para cualquier fín que uno desee, por ello no hay ningún problema en virtualizarlo, no así el caso de hacerlo en sistemas operativos propietarios tipo Windows, la licencia (véase 14.2) restringe su uso a un sólo equipo de cómputo y en muchos casos prohíbe expresamente su virtualización. Además hay que tomar en cuenta el resto del Software instalado en el sistema operativo, ya que estos también tienen sus propias restricciones legales a su uso y número de veces que se puede ejecutar simultáneamente un paquete dado. Esto es especialmente importante cuando se usa en más de una máquina física, la misma máquina virtual, pues la licencia usada para la instalación es violada cuando se tiene más de una copia de la máquina virtual o se ejecutan múltiples instancias de la máquina virtual, esta violación de licencia es su…ciente para ser sujeto a multas o incluso cárcel por dicho ilícito (véase 14.3). Por otro lado, cada vez que se adquiere una licencia de uso de algún Software que no caduque -la cual implica un alto costo monetario-, esta pueda seguir siendo usada en una máquina virtual con una versión tal vez [email protected] 533 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM obsoleta del sistema operativo que la soporte, pero corriendo en un sistema huésped moderno y protegido en Hardware de última generación de forma lícita y con el consiguiente ahorro económico.

17.6 Máquinas Virtuales en la Educación, Ciencias e Ingeniería Como hemos visto en las secciones anteriores, el uso de las máquinas virtuales es variado, ‡exible y permite ser usado en diversos ámbitos de la educación, del desarrollo y prueba de programas de cómputo y en general, en Ciencias e Ingeniería. Algunas de las utilidades y bene…cios que podemos sacar de una máquina virtual son los siguientes:

Para aprender a instalar, con…gurar y usar diversos sistemas opera-  tivos, además de poder probar diversas opciones de con…guración en ellos. El proceso de instalación de la máquina virtual no requiere crear particiones adicionales en nuestro disco ni alterar la con…guración de la máquina an…triona y podemos trasladar la máquina virtual a uno o más equipos de cómputo que la soporte.

Para usar un Software que no esta disponible en nuestro sistema ope-  rativo habitual. Por ejemplo, si somos usuarios de Linux y queremos usar Photoshop, lo podemos hacer a través de una máquina virtual.

En ocasiones tenemos que usar Software que únicamente se puede  ejecutar en sistemas operativos obsoletos -Windows 98 por ejemplo-, podemos crear una máquina virtual con dicho sistema y usar el Soft- ware de forma aislada sin preocuparnos de sus vulnerabilidades.

Podemos experimentar en el sistema operativo que corre dentro de la  máquina virtual haciendo cosas que no nos atreveríamos a realizar con nuestro sistema operativo habitual, como por ejemplo, instalar Software no seguro que consideramos sospechoso, etc.

En muchos casos se quiere aprender a instalar, administrar y usar  equipo al que no tenemos acceso como un equipo multiCore, con tarjeta CUDA instalada o un Cluster de múltiples nodos multiCore. Esto es posible hacer mediante el uso de máquinas virtuales en un equipo de gama media. [email protected] 534 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Si se hace el adecuado aislamiento de una máquina virtual en la que se  instale alguna versión de Windows, esta puede ser inmune a los virus y no requiere el uso de antivirus.

En el caso de instituciones educativas de cualquier nivel académico, es  común que en un mismo equipo de cómputo sea necesario ejecutar por un lado diferentes versiones de sistemas operativos -Linux, Windows XP, Windows 7, etc.- y por otro lado, en un sistema operativo, ejecutar diferentes versiones de un mismo paquete -generalmente no se puede tener instalada simultáneamente más de una versión- esto se logra con máquinas virtualizadas ad hoc coexistiendo en una misma máquina física.

Podemos crear/simular una red de equipos de cómputo con tan solo  un equipo de cómputo. Esta red de equipos de cómputo virtualizados la podemos usar con …nes formativos y de este modo adquirir pericia sobre administración de redes.

Si eres un desarrollador de Software puedes revisar si el programa que  estas desarrollando funciona correctamente en varios sistemas opera- tivos y/o navegadores de Web.

Podemos usar las máquinas virtuales para hacer SandBox135 con el …n  de ejecutar aplicaciones maliciosas o abrir correos sospechosos en un ambiente controlado y seguro.

Para probar versiones Alfa, Beta y Release Candidate de ciertos pro-  gramas y sistemas operativos.

Para montar un servidor Web, un servidor VPN, un servidor de correo  o cualquier otro tipo de servidor.

Para probar multitud de programas en Windows y evitar que se en-  sucie el registro mediante las instalaciones y desinstalaciones de los programas

135 Un sistema de aislamiento de procesos o entorno aislado, a menudo usando como medida de seguridad para ejecutar programas con seguridad y de manera separada del sistema an…trión.

[email protected] 535 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Consolidar servidores, i.e. lo que ahora hacen varias máquinas, se  pueden poner en un solo equipo físico dentro de varias máquinas vir- tuales independientes o interactuando entre ellas según se requiera.

Mantenimiento y pruebas de aplicaciones sin necesidad de adaptar  nuevas versiones del sistema operativo.

Aumentar la disponibilidad al reducir tiempo de parada y manteni-  miento. Ya que la máquina virtual esta hecha, se pueden poner a trabajar una o más copias en un equipo o en múltiples máquinas físicas en cuestión de segundos, permitiendo la continuidad de un negocio o servicio y de recuperación ante desastres.

Reducir costos de administración ya que se reducen y agilizan las  políticas de respaldo y recuperación, además de optimizar los recur- sos disponibles permitiendo escalabilidad al crecer con contención de costos, mejorando la e…ciencia energética al usar un menor número de equipos de cómputo.

Permite incursionar en la estrategia de nube híbrida proactiva creando  un conjunto de marcos de decisión en la nube y procesos para evaluar las oportunidades de computación en la nube en función de las necesidades y cargas de trabajo de los usuarios, por ejemplo el uso de supercómputo rentado.

Establecer las habilidades, herramientas y procesos para un entorno  dinámico e híbrido al asociarse los educadores y los especialistas en tecnologías de información para realizar un inventario de habilidades y competencias, e identi…car oportunidades de capacitación y áreas de vulnerabilidad potencial.

17.7 ¿Qué Necesito para Crear y Usar una Máquina Virtual? Actualmente la virtualización de un sistema operativo se puede implementar por Software o por Hardware, lo único que precisamos para poder usar una máquina virtual es un equipo de cómputo e instalar y con…gurar el programa manejador de la máquina virtual. Cuanto más potente y actual sea el equipo

[email protected] 536 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM de cómputo del que dispongamos, mejor experiencia obtendremos trabajando con sistemas operativos virtualizados. Algunos de los puntos importantes para obtener un rendimiento óptimo del sistema operativo virtualizado son los siguientes:

Preferentemente disponer de un procesador que disponga de capacidad  de virtualización por Hardware (Intel VTx/AMD-V). Casi cualquier equipo de cómputo actual dispone de un procesador apto para virtu- alizar sistemas operativos por Hardware.

Disponer de espacio su…ciente en el disco duro136, es preferible disponer  de un disco de estado sólido (SSD) por sus velocidades de lectura- escritura.

Necesitamos disponer de memoria RAM su…ciente y adecuada137. Cuanta  más memoria RAM y cuanto más rápida sea, mejores resultados de vir- tualización obtendremos.

Sin duda el hecho de tener una buena tarjeta grá…ca también ayudará  a disponer de una mejor experiencia de virtualización.

Para empezar, debemos decidir que manejador de máquinas virtuales usar, si trabajamos en Debian GNU/Linux, podemos usar QEMU/KVM y lo instalamos mediante:

# apt install qemu-kvm qemu qemu-utils

QEMU/KVM soporta emulación de IA-32 (x86) PC, AMD64 PC, MIPS R4000, Sun’sSPARC sun4m, Sun’sSPARC sun4u, ARM development boards (Integrator/CP y Versatile/PB), SH4 SHIX board, PowerPC (PReP y Power Macintosh), y arquitecturas ETRAX CRIS.

136 Una máquina virtual con Windows XP ocupa por lo menos 2 GB en disco y una con Windows 7 ocupa por lo menos 4 GB en disco. 137 La cantidad de memoria RAM ideal dependerá del sistema operativo que queremos virtualizar y del número de sistemas operativos que queramos virtualizar de forma si- multánea. Si tan solo queremos virtualizar un sistema operativo con 2 o 3 GB de RAM debería ser su…ciente.

[email protected] 537 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Ejemplo 1 Si hemos descargado la imagen ISO de algún sistema operativo, por ejemplo la de Knoppix138, la podemos usar mediante: $ kvm -m 1024 -cdrom KNOPPIX_V8.2-2018-05-10-EN.iso Aquí se usa la arquitectura por omisión y memoria de 1024 MB.

Ejemplo 2 Instalación y uso de una máquina virtual para Debian GNU/Linux estable a partir del archivo ISO139, para ello, primero necesitamos: Generar el disco virtual que la contendrá, por ejemplo de 10 GB con el nombre debianStable.img mediante: $ qemu-img create -f qcow2 debianStable.img 10G Después, instalar la imagen de Debian estable140 en el disco virtual genera- do en el paso anterior, solicitando a KVM que una vez terminada la insta- lación no haga el reinicio de la máquina virtual, esto mediante: $ kvm -no-reboot -boot d -cdrom debian-802-i386-netinst.iso -hda debianStable.img -m 400 n Ahora podemos usar la máquina virtual mediante: $ kvm -hda debianStable.img -m 800

Ejemplo 3 Instalación y uso de una máquina virtual para Windows XP, en este caso necesitamos: Crear el disco virtual, por ejemplo de 10 GB mediante: $ qemu-img create -f qcow2 WindowsXP.img 10G Hacer la instalación básica a partir del ISO, mediante: $ kvm -no-reboot -boot d -hda WindowsXP.img -m 400 -localtime -cdrom es_winxp_pro_with_sp2.iso n Y concluir la instalación mediante: $ kvm -no-reboot -boot c -hda WindowsXP.img -m 400 -localtime -cdrom es_winxp_pro_with_sp2.iso n Ahora podemos usar la máquina virtual mediante: $ kvm -boot c -hda WindowsXP.img -m 400 -localtime

138 Knoppix es una versión Live ampliamente conocida y completa de GNU/LINUX, se puede descargar de: http://mmc.geo…sica.unam.mx/Replicas/knoppix/ 139 Diversas imágenes ISO del proyecto Linux Debian se pueden descargar de: https://www.debian.org/CD/ 140 Instrucciones paso a paso de como instalar, con…gurar y optimizar Linux De- bian están disponibles en múltiples lugares de la red, pero se pueden descargar de: http://132.248.182.159/Replicas/debianInstall/

[email protected] 538 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

17.8 ¿Cómo Funciona una Máquina Virtual? Explicar el funcionamiento a detalle de una máquina virtual es engorroso y esta fuera del alcance del propósito de este texto. No obstante a grandes rasgos podemos decir que una máquina virtual es un Software que median- te una capa de virtualización141 se comunica con el Hardware que tenemos disponible en nuestro equipo de cómputo consiguiendo de este modo emular la totalidad de componentes de un equipo de cómputo real. De este modo la máquina virtual será capaz de emular un disco duro, una memoria RAM, una tarjeta de red, un procesador, etc. Una vez que sabemos esto, cuando abrimos una máquina virtual, como por ejemplo Virtualbox (véase [49]), nos encontramos con un entorno grá…co (en el caso de usar QEMU/KVM se usa la línea de comandos para crear y usar las máquinas virtuales, pero también se cuentan con entornos grá…cos que usan la línea de comandos internamente) que nos permitirá con…gurar y asignar recursos a cada uno de los componentes físicos que emula la máquina virtual. En prácticamente la totalidad de máquinas virtuales debemos de…nir detalles del siguiente tipo:

Tipo de procesador a usar  Espacio que queramos asignar al disco duro.  Memoria RAM que queremos asignar a la máquina virtual.  La memoria de nuestra tarjeta grá…ca.  La con…guración de red.  etc.  Una vez con…gurados estos parámetros habremos creado una máquina virtual para instalar un sistema operativo, de este modo tan solo tendremos que abrir la máquina virtual que se acaba de crear e instalar el sistema operativo tal y como si se tratará de un equipo de cómputo real.

141 La capa de virtualización es un sistema de archivos propietario y una capa de abstrac- ción de servicio del Kernel que garantiza el aislamiento y seguridad de los recursos entre distintos contenedores. La capa de virtualización hace que cada uno de los contenedores aparezca como servidor autónomo. Finalmente, el contenedor aloja la aplicación o carga de trabajo. [email protected] 539 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

17.9 Aplicaciones y Paquetes Disponibles A continuación mencionaremos algunas de las aplicaciones más conocidas y universalmente disponibles y/o usadas en los Sistemas Operativos GNU Linux/BSD, tanto en el ámbito personal, es decir, distribuciones usadas para …nes particulares (hogar), como en el ámbito profesional, es decir, en el área de servidores de organizaciones y empresas. Es importante destacar que, en este listado no se incluirán aquellas tec- nologías de virtualización que vienen como una solución integrada, todo en uno o llave en mano, tales como Promox.

VirtualBox Software desarrollado por Oracle multiplataforma, capaz de virtualizar prácticamente la totalidad de sistemas operativos con arquitec- tura x86/amd64. La base de este Software dispone de una la licencia GPL2, mientras que el Pack de extensiones que añaden funcionalidades están bajo licencia privativa. Virtualbox es gratuito para un uso no comercial. Es un Hipervisor de Tipo 2 multiplataforma, es decir, solo debe y puede ser ejecutado (instalado) en cualquier Host (Ordenador) con alguna de las versiones vigentes o antiguas de Sistemas Operativos Windows, Linux, Mac- intosh, Solaris, OpenSolaris, OS/2 y OpenBSD. Posee un continuo y progresivo ciclo de desarrollo con lanzamientos fre- cuentes, que la convierten en una excelente alternativa a otras soluciones parecidas, pero con una muy apreciable cantidad de características y fun- ciones, sistemas operativos invitados compatibles y plataformas en las que se puede ejecutar. En la mayoría de las distribuciones GNU Linux/BSD se encuentra dicha aplicación incluida en los repositorios, por lo que, con la siguiente orden de comando suele instalarse en todas ellas:

# apt install

Vale destacar para VirtualBox que, al usar esta aplicación siempre es ideal la instalación de las «Guest Additions» y el «Extension Pack» . Por ende, para esto y otras formas de instalación lo ideal es visitar el enlace o…cial de VirtualBox.

Vmware Workstation Player Software privativo multiplataforma de- sarrollado por EMC corporation y que es utilizado ampliamente en el entorno [email protected] 540 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM profesional en las áreas del Cloud Computing entre muchas otras. Al igual que Virtualbox, esta máquina virtual nos permite virtualizar in…nidad de sistemas operativos. Vmware dispone de muchas soluciones de virtualización y prácticamente todas son de pago, no obstante Vmware Workstation Player es totalmente gratuita para un uso no comercial.

Parallels aunque se trata de una máquina virtual multiplataforma, acostumbra a ser usado por los usuarios del sistema operativo OS X de Apple que desean virtualizar el sistema operativo Windows. Esta máquina virtual es de pago y únicamente puede virtualizar los sistemas operativos Windows y Mac OS. Quien quiera probar Parallels lo puede hacer descargando la versión de prueba.

Windows Virtual PC Software gratuito y privativo propiedad de Mi- crosoft que se puede usar tanto en Windows como en Mac OS. Virtual PC está destinado únicamente a Virtualizar sistemas operativos Windows.

Virtualización: GNOME Boxes es es una aplicación nativa del en- torno de Escritorio GNOME, que se utiliza para acceder a sistemas remotos o virtuales. Boxes o Cajas, utiliza las tecnologías de virtualización de QEMU, KVM y . Además, requiere que la CPU sea compatible con algún tipo de virtual- ización asistida por Hardware (Intel VT-x o AMD-V, por ejemplo); por lo tanto, GNOME Boxes no funciona en las CPUs con procesador Intel Pen- tium/Celeron, ya que, carecen de esta característica. En la mayoría de las distribuciones GNU Linux/BSD se encuentra dicha aplicación incluida en los repositorios, por lo que, con la siguiente orden de comando suele instalarse en todas ellas:

# apt install -boxes

Vale destacar para GNOME Boxes que, es una herramienta muy sencilla dirigida a usuarios novatos, permite descargar desde la aplicación diversas imágenes y no incorpora demasiadas opciones de con…guración que suelen ser muy conocidas y usadas en otras, tales como VirtualBox.

[email protected] 541 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Virt-Manager es una interfaz de usuario de escritorio para la adminis- tración de un Gestor de Máquinas Virtuales a través de Libvirt. Está dirigida principalmente a las máquinas virtuales gestionadas por KVM, pero también maneja las gestionadas por Xen y LXC. Virt-Manager presenta una vista resumida de los dominios en ejecución, su rendimiento en vivo y estadísticas de utilización de recursos. Los asistentes permiten la creación de nuevos dominios, y la con…guración y ajuste de la asignación de recursos de un dominio y el Hardware virtual. Un visor de cliente VNC y SPICE integrado presenta una consola grá…ca completa para el dominio invitado. En la mayoría de las distribuciones GNU Linux/BSD se encuentra dicha aplicación incluida en los repositorios, por lo que, con la siguiente orden de comando suele instalarse en todas ellas:

# apt install virt-manager

Vale destacar para Virt-Manager que, es también es una herramienta sencilla, aunque mucho más completa que GNOME Boxes, por lo que se puede considerar para usuarios medios o avanzados de primer nivel, dado que, fácilmente es capaz de permitir la gestión de todo el ciclo de vida de las máquinas virtuales existentes.

QEMU / KVM es un emulador y virtualizador de máquinas genérico y de código abierto, capaz de ejecutar sistemas operativos y programas hechos para una máquina en una máquina diferente con muy buen rendimiento, y capaz de lograr un rendimiento casi nativo ejecutando el código del huésped directamente en la CPU del Host. KVM es una solución de virtualización completa para Linux en Hardware x86 que contiene extensiones de virtualización (Intel VT o AMD-V) que con- siste en un módulo de Kernel cargable, que proporciona la infraestructura de virtualización del núcleo y un módulo especí…co del procesador. Y actual- mente funciona inmerso dentro de QEMU. En la mayoría de las distribuciones GNU Linux/BSD se encuentra dicha aplicación incluida en los repositorios, por lo que, con la siguiente orden de comando suele instalarse en todas ellas:

# apt install qemu-kvm [email protected] 542 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

además, en caso necesario podemos hacer uso de una interfaz grá…ca para trabajar con QEMU/KVM, tenemos varias opciones, algunas de ellas son:

# apt install qemu-system-gui # apt install aqemu # apt install qemuctl # apt install virt-manager # apt install gnome-boxes

Vale destacar que QEMU/KVM es también es una herramienta muy completa, ya que no solo emula (x86, x86-AMD64, MIPS, Arm, PowerPC, SPARC, etc.) sino que virtualiza, a diferencias de otros iguales de avanzadas como WMWare, que solo permite virtualizar. Para conocer las opciones de emulación usamos:

$ apt search qemu-system-

Cockpit es una interfase Web Open Source que permite manejar máquinas virtuales de KVM que provee acceso a sistemas Linux permitiendo la admin- istración, manejo y monitoreo a través de una interfaz grá…ca intuitiva, para usarlo hay que instalar primero KVM y luego hacer:

# apt install cockpit cockpit-machines

Librerías y Paquetes relacionados Estos últimos 3 paquetes men- cionados suelen instalar otros conexos (relacionados) como dependencias, por lo que, en caso de ser necesario, pueden instalar los mismos, junto a sus de- pendencias y otros paquetes útiles necesarios, como:

gnome-boxes virt-manager virt-goodies virt-sandbox virt-top virt-viewer virtinst libvirt-clients libvirt-daemon libvirt-daemon- system qemu qemu-kvm qemu-utils qemu-system qemu-system- gui qemu-block-extra freerdp2-x11 bridge-utils -guest-agent -container

Otros en caso de querer instalar otras tecnologías de virtualización disponibles sobre Linux/BSD se puede optar por: [email protected] 543 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Xen instalándolo con la orden de comando siguiente:

# apt install xen-system-amd64 xen-utils-4.11 xen-tools

LXC instalándolo con la orden de comando siguiente:

# apt install

Docker instalándolo con la orden de comando siguiente:

# apt install -ce docker-ce-cli containerd.io

Diferencias entre KVM y QEMU Cuando comenzamos en el mundo de la virtualización, la opción más recurrente para comenzar es KVM. Después nos damos cuenta de que se comienza a usar también otro componente muy a menudo, QEMU y siempre hay muchas preguntas en torno a cómo funciona KVM y QEMU o cual es la diferencia entre ellos.

Sobre KVM es un software de código abierto y signi…ca Kernel Virtual Machine (Máquina Virtual basada en el Kernel) es una solución de virtua- lización para Linux en hardware x86 que contiene extensiones de virtual- ización (Intel VT o AMD-V). KVM forma parte del Kernel de Linux desde la versión 2.6.20. Especí…camente, con KVM podemos convertir a Linux en un hipervisor para que nuestro Host ejecute entornos virtuales, es decir, máquinas virtuales. Cada máquina virtual se implementa como un proceso regular de Linux KVM ha jugado un papel clave en el entorno de virtualización de código abierto basado en Linux. De hecho, KVM es el único hipervisor para todos los productos de virtualización de Red Hat, tanto para RHOSP - Red Hat Openstack Platform, como para o abreviado, RHV. KVM en general es 2 cosas, un modulo del Kernel pero también KVM es es un Fork del ejecutable de QEMU (más adelante hablo de eso). Entonces como mencionábamos, KVM es un módulo Kernel que permite el uso de tecnologías de extensiones de virtualización Intel o AMD. En pocas palabras, estas extensiones permiten que múltiples sistemas operativos compartan una CPU física sin interferir entre ellos. Por otro lado, no resuelven compartir todos los dispositivos de Hardware, para esto KVM requiere una lógica extra y aquí es dónde comenzamos a hablar de QEMU. [email protected] 544 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Sobre QEMU es un emulador de procesadores basado en la traducción dinámica de binarios, es decir, realiza la conversión del código binario de la arquitectura fuente o Host, en código entendible por la arquitectura huésped o la máquina virtual. El resultado de usar QEMU es poder ejecutar el código original como si se estuviera ejecutando en la máquina emulada. Por ejemplo, se podría ejecutar código escrito para el procesador ARM en su máquina basada en Intel. QEMU es capaz de emular varias plataformas de Hardware diferentes, incluida la x86, plataformas PowerPC, sistemas basados en ARM y tam- bién sistemas SUN SPARC. Además del Hardware básico de estos sistemas, QEMU también proporciona emulación de varios módulos adicionales, como tarjetas grá…cas, tarjetas de sonido, dispositivos de red, dispositivos de alma- cenamiento y controladores, dispositivos serie/paralelo/USB y dispositivos de memoria. Esto signi…ca que en muchos casos las computadoras pueden ser completa y totalmente emuladas y utilizadas para ejecutar su Software original.

¿Cómo trabajan juntos? en el Hardware real, el sistema operativo traduce las instrucciones de los programas para que sean ejecutadas por el CPU físico. En una máquina virtual es lo mismo, pero la diferencia es que el CPU está virtualizado por el hipervisor y el hipervisor tiene que traducir las instrucciones del CPU virtual y convertirlo en instrucciones para el CPU físico. Esta traducción tiene una gran sobrecarga de rendimiento. Para minimizar esta sobrecarga, los procesadores admiten extensiones de virtualización. Intel soporta una tecnología llamada VT-X y el equivalente AMD es AMD-V. Con el uso de estos, una rebanada de CPU físico se puede asignar directamente al CPU virtual. Así que las instrucciones de la CPU virtual se pueden ejecutar directamente en la rebanada del CPU físico. Evi- tando así la traducción que tendría que hacer el hipervisor. KVM es el módulo del Kernel de Linux que permite esta asignación de CPU físico para CPU virtual. Esta asignación proporciona la aceleración de Hardware para la máquina virtual y aumenta su rendimiento. De hecho QEMU utiliza esta aceleración cuando el tipo de virtualización es elegido como KVM. Los desarrolladores de KVM aprovecharon la arquitectura QEMU y bási- camente crearon un nuevo modelo de CPU en QEMU. Este nuevo tipo de modelo tiene una lógica especí…ca de KVM. Así las llamadas al sistema que [email protected] 545 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM se harían de forma nativa pasan por del módulo KVM para que la ejecución se ejecute de forma nativa en la CPU, mientras que QEMU se utiliza para proporcionar el resto funcionalidad (emular los dispositivos). Al trabajar juntos, KVM accede directamente al CPU físico y a la memo- ria, a su vez QEMU emula los recursos de Hardware, como el disco duro, video, USB, etc. Hoy, cuando las personas se re…eren al hipervisor KVM, en realidad se re…eren a la combinación QEMU/KVM. KVM necesita QEMU (emulador) para la funcionalidad completa como hipervisor. QEMU es autosu…ciente y KVM es realmente un módulo del Kernel de Linux para la explotación de extensiones VT que actúa como con- trolador de las capacidades de CPU físicas. Así puedes notar entonces que QEMU necesita a KVM para aumentar su rendimiento... Por otro lado KVM por sí solo no puede proporcionar la solución de virtualización completa, necesita de QEMU.

17.10 Acceso a Datos Desde una Máquina Virtual Para acceder a los datos almacenados en máquinas virtuales, disponemos de las siguientes opciones:

a) Mediante el uso de algún navegador Web, se puede acceder a su cuenta de correo electrónico y al almacenamiento en la nube como Google Drive, Dropbox, HubiC, pCloud, MediaFire, Flip- Drive, Mega, entre otros. b) En el sistema operativo Linux, se puede acceder a cualquier servidor de internet mediante los protocolos SSH, SAMBA o mon- tar un sistema de archivos mediante NFS o SSHFS, entre otros. c) En cualquier sistema operativo podemos usar algún navega- dor grá…co de FTP, FTPS o SFTP como FileZilla, WinSCP, PSCP, PSFTP, FireFTP, CoreFTP, entre muchos otros, para transportar archivos y carpetas. d) En las máquinas virtuales de Windows usamos el protocolo SAMBA, para tener acceso a este, hay que conectarse a una unidad de red dentro del explorador de archivos de Windows. e) En Linux, por ejemplo con PCManFM, , Nautilus, , Konqueror, entre otros, podemos acceder a una máquina que tenga un servidor de la siguiente forma: [email protected] 546 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

1) Para acceder a un servidor SAMBA, escribir la ruta de archivos en el manejador de archivos: $ smb://[email protected]/estud/ 2) Para acceder a un servidor SSH, escribir la ruta de archivos en el manejador de archivos: $ sftp://[email protected]/home/usuario/ En línea de comandos, podemos: 3) Montar con SSHFS un directorio de otra máquina con servidor SSH : $ sshfs [email protected]:/home/usuario/ /home/algun/lugar 4) Montar con mount un directorio de otra máquina con servi- dor NFS: # mount 10.0.2.2:/directorio ./punto_montaje 5) Usar SCP y SFTP de SSH para transferir archivos, para copiar un archivo, usamos: $ scp archivo.dat [email protected]:~/Datos/ para copiar un subdirectorio, usamos: $ scp -r Directorio [email protected]:. para copiar un archivo de una máquina remota a nuestra máquina, usamos: $ scp [email protected]:/home/usuario/archivo . 6) Montar con CURLFTPFS un directorio de otra máquina con servidor FTP: # curlftpfs -o allow_other usuario:[email protected]:puerto /home/algun/lugar

17.11 Desde la Nube Existen diferentes servicios Web142 que permiten instalar, con…gurar y usar cientos de sistemas operativos Linux y Unix -máquinas virtuales usando ser- vicios Web en Debian GNU/Linux y QEMU- desde el navegador, esto en 142 Cuando se trabaja desde la Web es recomendable usar el modo Privado o Incógnito para no guardar el historial de navegación, información introducida en los formularios y borrar al cerrar el navegador los datos de los sitios visitados. Pero recuerda que los sitios Web que visitamos sí guardan información de nuestra visita, nuestro proveedor de internet también guarda constancia de nuestra visita y si descargamos algo, esto no se borra al igual que el historial de descargas, además de las marcas de páginas o favoritos se conservarán al cerrar el navegador. [email protected] 547 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM aras de que los usuarios que cuenten con algún sistema de acceso a red y un navegador puedan usar, con…gurar e instalar algún sistema operativo y su respectiva paquetería sin hacer instalación alguna en su equipo de cómputo, tableta o teléfono celular143. Una muestra de estos proyectos son: Distrotest (https://distrotest.net) y JSLinux (https://bellard.org/jslinux).

Algunas versiones listas para usar son:

4mLinux, AbsoluteLinux, Academix, AlpineLinux, Antergos, antiX Linux, Aptosid, ArchBang, ArchLabs, ArchLinux,

Archman, ArchStrike, ArcoLinux, ArtixLinux, AryaLinux, AV Linux, BackBoxLinux, BigLinux, Bio-Linux, BlackArch,

BlackLab, BlackPantherOS, BlackSlash, blag, BlankOn, Bluestar, Bodhi, BunsenLabs, ByzantineOS, Caine, Calculate

Linux Desktop, CentOS, Chakra, ChaletOS, ClearOS, Clonezilla, ConnochaetOS, Cucumber, Damn Small Linux, Damn

Small Linux Not, Debian, DebianEdu, deepin, DEFT, Devil-Linux, Devuan, DragonFly BSD, Dragora, DuZeru, Dyne:bolic,

Edubuntu, elementaryOS, Elive Linux, Emmabuntüs, Emmi OS, Endless OS, EnsoOS, Exe GNU/Linux, ExTiX, Fat- dog64, Fedora Atomic, Fedora Server, Fedora Workstation, FerenOS, FreeBSD, FreeDOS, Frugalware, G4L, GeckoLinux,

Gentoo, GNewSense, GoboLinux, Gparted, GreenieLinux, GRML, GuixSD, Haiku, Heads, Kali Linux, Kanotix, KaOS,

Knoppix, Kodachi, KolibriOS, Korora, Kubuntu, Kwort, Linux Lite, Linux Mint, LiveRaizo, LMDE, Lubuntu, LXLE

OS, Macpup, Mageia, MakuluLinux, Manjaro, Matriux, MauiLinux, MenuetOS, MinerOS, MiniNo, Modicia, Musix, MX

Linux, Nas4Free, Neptune, NetBSD, Netrunner, NixOs, NST, NuTyX, OpenIndiana, OpenMandriva, openSUSE, Ora- cleLinux, OSGeo live, OviOS, Parabola CLI, Parabola LXDE, Pardus, Parrot Home, Parrot Security, Parrot Studio, Par- six, PCLinuxOS, PeachOSI, Pentoo, Peppermint, PeppermintOS, Pinguy, PinguyOS, plopLinux, PointLinux, Pop!_OS,

PORTEUS, Puppy Linux, PureOS, Q4OS, QubesOS, Quirky, Raspberry Pi Desktop, ReactOS, Redcore, Rescatux, Reven- geOS, RoboLinux, Rockstor, ROSA FRESH, Runtu, Sabayon, SalentOS, Salix, Scienti…cLinux, Siduction, Slackware, Slax,

SliTaz, Solus, SolydK, SolydX, SparkyLinux, Springdale, StressLinux, SubgraphOS, SwagArch, Tails, Tanglu, Tiny Core,

Trisquel, TrueOS, TurnKey Linux, Ubuntu, Ubuntu Budgie, Ubuntu Studio, UbuntuKylin, Uruk, VectorLinux, VineLinux,

VoidLinux, Voyager, VyOS, WattOs, Xubuntu, Zentyal, Zenwalk, Zevenet, Zorin OS

Usar Linux en Formato Live Linux es uno de los sistemas operativos pioneros en ejecutar de forma autónoma o sin instalar en la computadora, existen diferentes distribuciones Live -descargables para formato CD, DVD, USB144- de sistemas operativos y múltiples aplicaciones almacenados en un medio extraíble, que pueden ejecutarse directamente en una computadora,

143 Estos servicios son conocidos como computación en la nube (Cloud Computing). 144 Para generar un dispositivo USB con la imagen contenida en un archivo ISO podemos usar el Software ETCHER, descargable para Linux, Windows y Mac OS desde https://etcher.io/.

[email protected] 548 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM estos se descargan de la Web generalmente en formato ISO145, una de las listas más completas de versiones Live esta en: https://livecdlist.com

En el caso de tener un archivo ISO de algún sistema operativo (por ejem- plo ubuntu-11.10-desktop-i386.iso) y se quiere ejecutar su contenido desde una máquina virtual con QEMU/KVM sólo es necesario usar: $ kvm -m 512 -cdrom ubuntu-11.10-desktop-i386.iso en este ejemplo usamos en KVM la arquitectura por omisión y memoria de 512 MB (-m 512). Knoppix es una versión Live ampliamente conocida y completa, esta se puede descargar de: http://mmc.geo…sica.unam.mx/Replicas/knoppix/ y usar mediante: $ kvm -m 1024 -cdrom KNOPPIX_V8.2-2018-05-10-EN.iso aquí se usa la arquitectura por omisión y memoria de 1024 MB.

Descarga de Máquinas Virtuales de Sistemas Operativos Existen diversos proyectos que permiten descargar decenas de máquinas virtuales listas para ser usadas, para los proyectos VirtualBox y VMWare (y por ende para KVM/QEMU), estas se pueden descargar de múltiples ligas, algunas de ellas son: https://www.osboxes.org https://www.virtualbox.org Si desargamos y descomprimimos el archivo lubuntu1210.7z, esto dejará la imagen de VirtualBox de LUBUNTU cuyo nombre es lubuntu1210.vdi. Entonces esta imagen la usaremos directamente en KVM/QEMU, mediante: $ kvm -m 2000 -hda lubuntu1210.vdi Nota: esta imagen usa como usuario y clave de acceso: lubuntu/lubuntu

145 Una imagen ISO es un archivo informático donde se almacena una copia exacta de un sistema de archivos y de esta se puede generar una imagen para CDROM, DVD o USB. [email protected] 549 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

18 Apéndice F: Creación, Uso y Optimización de Máquinas Virtuales Usando QEMU/KVM

Entendamos por una máquina virtual (véase sección 17) a un programa de cómputo que simula a una computadora, en la cual se puede instalar y usar otros sistemas operativos de forma simultánea como si fuese una computadora real sobre nuestro sistema operativo huésped. Hoy en día, tenemos a nuestra disposición varios manejadores de máquinas virtuales (MV), algunos de ellos son los siguientes:

Virtualbox (véase [49]) es un Software desarrollado por Oracle, se trata  de un Software multiplataforma capaz de virtualizar prácticamente la totalidad de sistemas operativos con arquitectura x86/AMD64. La base de este Software dispone de una licencia GPL2 (véase 14.1.1), mientras que el Pack de extensiones que añaden funcionalidades están bajo licencia privativa. Virtualbox es gratuito para un uso no comercial.

Vmware Workstation Player (véase [50]) es un Software privativo mul-  tiplataforma desarrollado por EMC corporation y es ampliamente usa- do en el entorno profesional en las áreas del Cloud Computing entre muchas otras. Al igual que Virtualbox, esta máquina virtual nos per- mite virtualizar una gran diversidad de sistemas operativos. Vmware dispone de muchas soluciones de virtualización y prácticamente todas son de pago, no obstante Vmware Workstation Player es gratuita para un uso no comercial.

Parallels (véase [53]) es un Software multiplataforma, es usado fre-  cuentemente por los usuarios del sistema operativo OS X de Apple que desean virtualizar el sistema operativo Windows. Esta máquina vir- tual es de pago y únicamente puede virtualizar los sistemas operativos Windows y Mac OS.

Windows Virtual PC (véase [51]) es un Software gratuito y privativo  propiedad de Microsoft que se puede usar tanto en Windows como en Mac OS. Virtual PC esta destinado únicamente a virtualizar sistemas operativos Windows.

QEMU/KVM (véase [46]) es un Software libre multiplataforma que  dispone de licencia GPL (véase 14.1.1). Además de virtualizar un gran [email protected] 550 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

número de sistemas operativos, permite emular diversas arquitecturas como por ejemplo X86, x86-AMD64, MIPS, Arm, PowerPC, etc.

¿Qué Manejadores Libres de Máquinas Virtuales Podemos Insta- lar?

QEMU Es un emulador de procesadores basado en la traducción diná- mica de binarios -conversión del código binario de la arquitectura fuente en código entendible por la arquitectura huésped-. QEMU también tiene capaci- dades de virtualización dentro de un sistema operativo, ya sea GNU/Linux, Windows, o cualquiera de los sistemas operativos admitidos; de hecho es la forma más común de uso. Esta máquina virtual puede ejecutarse en cualquier tipo de Microprocesador o arquitectura (x86, x86-64, PowerPC, MIPS, SPARC, etc.). esta licenciado en parte con la LGPL y la GPL de GNU (véase 14.1.1). El objetivo principal es emular un sistema operativo dentro de otro, sin tener que reparticionar el disco duro, empleando para su ubicación cualquier directorio dentro de éste. El programa no dispone de GUI146, pero existe otro programa llamado QEMU Manager que puede hacer de interfaz grá…ca si se utiliza QEMU desde Windows. También existe una versión para GNU/Linux llamada Qemu-Launcher. En Mac OS X puede utilizarse el programa Q que dispone de una interfaz grá…ca para crear y administrar las máquinas virtuales.

Kernel-based Virtual Machine (KVM) Máquina virtual basada en el núcleo es una solución para implementar virtualización completa con Linux. esta formada por un módulo del núcleo (con el nombre kvm.ko) y herramientas en el espacio de usuario, siendo en su totalidad Software libre (véase 14.1.1). El componente KVM para el núcleo esta incluido en Linux desde la versión 2.6.20. El proyecto KVM esta incluido en el proyecto QEMU. Las características principales de KVM/QEMU son: Cada máquina virtual se implementa como un proceso  KVM/QEMU aprovecha el modelo de seguridad estándar de Linux:  SELinux/AppArmor147. Estos modelos proporcionan el aislamiento y 146 (Interfaz grá…ca del usuario). 147 AppArmor fue creado en parte como alternativa a SELinux. [email protected] 551 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

el control de recursos necesarios

Hereda las características de gestión de memoria de Linux. La memoria  utilizada por una MV se gestionará de la misma forma que la de otro proceso, podrá ser guardada en disco, utilizada en páginas grandes y soporte NUMA148 de Linux permitiendo el uso de MVs de grandes cantidades de memoria

Soporta las últimas características de virtualización de memoria pro-  porcionada por los fabricantes como EPT (Extended Page Table de In- tel) ó RVI (Rapid Virtualization Indexing de AMD). Estas tecnologías persiguen reducir el uso de CPU y aumentar el rendimiento de los Hipervisores

El compartir páginas de memoria se consigue a través de la carac-  terística añadida a Linux llamada Kernel Same-page Merging (KSM). Escaneando las páginas de memoria de cada MV, si dos páginas coin- ciden, KSM las une en una sola página que se comparte entre las dos máquinas, almacenando únicamente una copia y si en cualquier mo- mento, una de las MV modi…ca la página, le da una copia privada

Permite utilizar cualquier tipo de almacenamiento soportado por Linux  para las imágenes de las MVs

Soporta el almacenamiento de …cheros distribuidos como GFS2149, OCFS150  o GlusterFS151. De esta forma las imágenes de las MV pueden ser com- partidas por varios Hipervisores

Las imágenes de disco soportan aprovisionamiento bajo demanda evi-  tando tener que reservar todo el espacio inicialmente asignado. El for- mato nativo de KVM es QCOW2152, el cual permite la realización de

148 Non-Uniform Memory Access (acceso a memoria no uniforme). 149 Global File System 2 es un sistema de archivos compartidos para clusters en Linux. 150 Oracle Cluster File System es un sistema de archivos de discos compartidos o sistema de archivos distribuidos para clústers de servidores de sistemas GNU/Linux desarrollado por distribuidos bajo los términos de la GNU General Public License. 151 Gluster File System es un sistema multiescalable de archivos NAS desarrollado ini- cialmente por Gluster Inc. 152 QEMU Copy-On-Write el formato de imagen para máquinas virtuales segunda versión de QCOW. [email protected] 552 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Snapshots153, compresión y cifrado Permite migraciones en vivo (Live Migrations), estas características  permite mover una MV en ejecución entre servidores físicos (Hipervi- sores) sin interrupción del servicio. Estas migraciones son transparentes para el usuario, ya que la MV permanece encendida, las conexiones de red activas y las aplicaciones en ejecución mientras la máquina se rea- comoda en un nuevo servidor KVM/QEMU soporta MV de hasta 255 CPUs y 4 TB de RAM. Y el  rendimiento de aplicaciones como Oracle, SAP, LAMP, MS Exchange sobre MV puede oscilar entre el 95% y el 135% comparado con su ejecu- ción en servidores físicos, se ha conseguido ejecutar hasta 600 máquinas virtuales en un sólo servidor físico Soporte de sistemas operativos invitados como Windows, Linux, An-  droid, Familia BDS (OpenBSD, FreeBSD, NetBSD), Solaris, etc. Es ampliamente usado en varios proyectos sobre Cloud Computing  como OpenStack, CloudStack, OpenNebula, etc.

En esta sección mostraremos como crear, con…gurar, optimizar y trabajar con las máquinas virtuales mediante KVM/QEMU en Debian GNU/Linux para probar imágenes ISO154 descargadas de la red, instalar y usar máquinas virtuales para Windows y Linux entre otros.

18.1 Tipo de Virtualización Soportado por la Máquina Huésped Primero es necesario saber si nuestro equipo soporta la virtualización por Hardware o debemos usar la virtualización por Software, suponiendo que tenemos acceso a una máquina con Linux o ha sido inicializada usando una versión «viva (Live)» 155 de CD, DVD o USB de Linux para iniciar la com- putadora.

153 Es una copia instantánea del sistema de archivos que contiene a la máquina virtual. 154 Una imagen ISO es un archivo informático donde se almacena una copia exacta de un sistema de archivos y de esta se puede generar una imagen para CDROM, DVD o USB. 155 Una opción es KNOPPIX, es una distribución de Linux basada en Debian y usa LXDE como entorno de escritorio, pude ser descargada de http://www.knopper.net/knoppix/ [email protected] 553 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Entonces, para revisar si hay soporte en Hardware para la virtualización, podemos usar cualquiera de estas cuatro opciones: 1) Buscar información en: /proc/cpuinfo, mediante:

$ egrep "vmx svm" /proc/cpuinfo j si se soporta la virtualización por Hardware aparecerá -entre otras156- la bandera

Procesadores INTEL: vmx Procesadores AMD: svm

2) Podemos usar lscpu que nos indicará las características de nuestro equipo, en particular en el apartado Virtualization nos indicará si es sopor- tada o no, para ello usamos:

$ lscpu grep Virtualization j 3) Podemos usar cpu-checker, instalando:

# apt install cpu-checker

y para conocer si es soportado, usamos:

$ kvm-ok

4) Podemos usar libvirt-client, instalando:

# apt installlibvirt-clients

y para conocer si es soportado, usamos:

$ virt-Host-validate 156 El signi…cado de las banderas de /proc/cpuinfo esta descrita en la sección 18.12.

[email protected] 554 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Instalar y Usar Máquinas Virtuales Por omisión, los equipos de tec- nología de bajo desempeño no soportan la virtualización a nivel Hardware, pero siempre es posible su emulación mediante QEMU. Si la computadora soporta virtualización a nivel Hardware es posible usar KVM (o en QEMU la bandera -enable-kvm). Según la versión de Linux, KVM puede existir como un paquete real o como uno virtual, si es virtual, al instalar KVM lo que realmente se instala es QEMU y al ejecutar KVM por ejemplo

$ kvm ...

es remplazado por

$ qemu-system-x86_64 -enable-kvm ...

Estos tienen la misma sintaxis de uso, y para nuestros ejemplos sólo es necesario remplazar qemu-system-x86_64 por kvm y en ambos siempre se usará qemu-img para manipular las imágenes. Instalación de KVM en Debian GNU/Linux (recomendado para virtua- lización por Hardware) es mediante:

# apt install qemu-kvm

Instalación de QEMU en Debian GNU/Linux (permite emular diversas arquitecturas de Hardware) es mediante:

# apt install qemu

Observación 1 El desempeño de la emulación versus virtualización por Hard- ware es de varios ordenes de magnitud menor, pero una imagen creada con cualquiera de ellos se puede usar con los otros virtualizadores. KVM sólo soporta virtualizar arquitecturas X86 y 64 de INTEL y AMD, QEMU emu- la diversas arquitecturas, como son ARM, CRIS, i386, M68k, MicroBlaze, MIPS, PowerPC, SH4, SPARC y x86-64.

[email protected] 555 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Problemas Comunes al Virtualizar Si se detecta la bandera para vir- tualización por Hardware y al tratar de usar KVM marca:

> open /dev/kvm: Permission denied > Could not initialize KVM, will disable KVM support

sólo hay que agregar, el login del usuario al grupo kvm en el archivo /etc/group.

Si marca:

> open /dev/kvm: No such …le or directory > Could not initialize KVM, will disable KVM support

sólo hay que activar en el BiOS la virtualización por Hardware

En KVM, al usar un procesador y solicitar la emulación de otro, es común que marque que ciertas banderas no son soportadas, por ejemplo al usar un procesador AMD y solicitar la emulación de un procesador Nehalem Intel Core i7 9xx (Nehalem Class Core i7) mediante:

$ kvm -cpu Nehalem -cdrom TinyCore-current.iso157

ó

$ qemu-system-x86_64 -enable-kvm -cpu Nehalem -cdrom TinyCore-current.iso n

es común que marque:

warning: Host doesn’tsupport requested feature:

CPUID.01H:ECX.ssse3 [bit 9]

warning: Host doesn’tsupport requested feature:

CPUID.01H:ECX.sse4.1.sse4_1 [bit 19]

157 TinyCoreLinux es un sistema operativo minimalista centrado en proveer un sistema base con núcleo Linux — es de tamaño de 11,16 MB y 106 Mb— , puede ser descargado de https://distro.ibiblio.org/tinyCorelinux [email protected] 556 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

warning: Host doesn’tsupport requested feature:

CPUID.01H:ECX.sse4.2.sse4_2 [bit 20] si es necesario usar dichas banderas en el CPU, entonces usar:

$ qemu-system-x86_64 -cpu Nehalem -cdrom TinyCore-current.iso

en este caso avisará que:

warning: TCG doesn’tsupport requested feature:

CPUID.01H:EDX.vme [bit 1]

i.e. soporta el chip, pero no la virtualización (vme: Virtual Mode Exten- sions [8086 mode]), se sacri…ca velocidad en aras de tener las prestaciones del chip emulado.

18.2 Salida Grá…ca de la Virtualización Usando VNC Si se usa el protocolo de Computación Virtual en Red (Virtual Network Computing VNC158) como visualizador de la salida grá…ca de KVM/QEMU, debemos agregar -vnc :n a la línea de comandos, donde n es el número de pantalla a usar, esto se hace mediante:

$ kvm -m 128 -cdrom TinyCore-current.iso -cpu kvm64 -vnc :0 & n 158 Virtual Network Computing (VNC) es un programa de Software libre basado en una estructura cliente-servidor que permite observar las acciones del ordenador servidor re- motamente a través de un ordenador cliente. VNC no impone restricciones en el sistema operativo del ordenador servidor con respecto al cliente, es posible compartir la pantalla de una máquina con cualquier sistema operativo que admita VNC conectándose desde otro ordenador o dispositivo que disponga de un cliente VNC portado, además permite usar Internet de baja velocidad en la visualización. Para visualizar la salida grá…ca usando VNC se debe instalar algún cliente de VNC, en Debian Linux existen una gran variedad de clientes, uno de ellos es tigervnc-viewer, y se instala mediante:

# apt install tigervnc-viewer

Otras opciones son vncviewer y xtightvncviewer. Ninguno de ellos requieren con…gu- ración adicional al ser instalados. [email protected] 557 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

y para ver la salida grá…ca159 en la misma máquina, usamos: $ vncviewer 0 Si se desea ver la salida grá…ca en otro equipo conectado en red (puede ser con sistema operativo Windows, Linux o MAC OS que tenga instalado vncviewer160), es recomendable hacer ajustes en la calidad de la salida grá…ca a mostrar y que no se vea afectada por la velocidad del internet, si suponemos que el servidor de la máquina virtual es 192.168.13.230, entonces lanzamos la máquina virtual mediante: $ kvm -m 128 -cdrom TinyCore-current.iso -cpu kvm64 -vnc :0,lossy & n y para ver la salida grá…ca en cualquier otro equipo interconectado por red, usamos: $ vncviewer 192.168.13.230:0 QualityLevel=3 donde la calidad del video QualityLevel=n161, es de 0 a 9, donde 0 es la más pobre y 9 la más alta calidad de la salida grá…ca. Nota: En caso que el cursor del Mouse de la máquina virtual no coincida con el del equipo an…trión es necesario agregar: -usb -device usb-tablet, al lanzar la máquina virtual: $ kvm -m 128 -cdrom TinyCore-current.iso -cpu kvm64 -usb -device usb-tablet -vnc :0 & n y para ver la salida grá…ca (como se comento antes) usamos: $ vncviewer 0 159 Después de que es ejecutado el comando vncviewer, aparecerá la ventana de la máquina virtual (optimizada para ser usada en conexiones de red de baja velocidad), en ella se puede usar la máquina virtual como si estuviese instalada en su equipo. Se puede cerrar la ventana de visualización de VNC y la máquina virtual seguirá trabajando en el servidor; de ser necesario se puede abrir el cliente de VNC tantas veces como requiera. Para apagar la máquina virtual en el servidor, se debe de solicitar a esta que se apague mediante el menú de inicio de la virtualización. 160 Otros proyectos multiplataforma son: Zoho Assist, TigerVNC, RealVNC, TeamViewer, , NoMachine, Apache Guacamole, XRDP, FreeNX, X2Go, , entre otros. 161 El valor por omisión es de 3 para una para una conexión de Internet de baja velocidad común en los hogares, en caso necesario usar un valor de 0, que permite usar VNC en conexiones de muy baja velocidad. [email protected] 558 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Uso de SSH para Interactuar con una Máquina Virtual de Forma Remota Si se tiene acceso a un servidor mediante SSH 162 en el cual este activo X11 Forwarding163 e instalado KVM/QEMU, entonces es posible eje- cutar una máquina remota en el servidor y visualizar la salida grá…ca en la máquina donde se ejecuta el comando SSH164. Primero, al hacer la conexión mediante SSH, es necesario solicitar en la conexión se habilite X11 Forwarding mediante: $ ssh -X -l usr 192.168.13.230 donde es el nombre del usuario en el equipo <192.168.13.230>. Después de hacer la conexión, ya podemos ejecutar la máquina virtual como se indico antes: $ kvm -m 128 -cdrom TinyCore-current.iso & y la salida grá…ca de la máquina virtual se trasmitirá por red de forma segura usando la tunelización de SSH.

18.3 Usando un Sistema Operativo Live como una Máquina Virtual Linux es uno de los sistemas operativos pioneros en ejecutar de forma autóno- ma o sin instalar en la computadora, existen diferentes distribuciones Live - descargables para formato CD, DVD, USB165- de sistemas operativos y múlti- ples aplicaciones almacenados en un medio extraíble, que pueden ejecutarse 162 SSH (o Secure SHell) es un protocolo que facilita las comunicaciones seguras entre dos sistemas usando una arquitectura cliente/servidor y que permite a los usuarios conectarse a un host remotamente. A diferencia de otros protocolos de comunicación remota tales como FTP o Telnet, SSH encripta la sesión de conexión, haciendo imposible que alguien pueda obtener contraseñas no encriptadas. 163 Es el servidor grá…co que usan casi todas las distribuciones Linux. Este servidor permite, entre otras cosas, Forwarding a través de SSH. Esto signi…ca que es posible ejecutar aplicaciones grá…cas de una máquina remota exportando el Display a nuestro escritorio. Es decir, la aplicación se ejecuta en el servidor remoto, pero la interfaz grá…ca la visualizamos en nuestro escritorio local. 164 Es recomendable usar VNC en conjunción con SSH, de lugar de SSH puro, ya que el consumo de red en la salida grá…ca sin VNC en la conexión SSH es excesivo para la mayoría de las infraestructuras de Internet. 165 Para generar un dispositivo USB con la imagen contenida en un archivo ISO podemos usar el Software ETCHER, descargable para Linux, Windows y Mac OS desde https://etcher.io/ [email protected] 559 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM directamente en una computadora, estos se descargan de la Web general- mente en formato ISO166, una de las listas más completas de versiones Live esta en https://livecdlist.com

En el caso de tener un CD, DVD o USB Live y se quiera ejecutar su con- tenido desde una máquina virtual con QEMU/KVM solo es necesario montar el dispositivo. Para ello, primero es necesario conocer donde es montado por el sistema operativo, mediante:

$ df

suponiendo que el dispositivo es /dev/sddx, entonces usar ese dispositivo en KVM mediante:

$ kvm -m 512 -usb /dev/sddx

en este ejemplo usamos el virtualizador con la arquitectura por omisión y memoria de 512 MB (-m 512).

18.4 Usando un Archivo ISO como una Máquina Vir- tual En el caso de tener un archivo ISO167 de algún sistema operativo (ubuntu- 11.10-desktop-i386.iso) y se quiera ejecutar su contenido desde una máquina virtual con QEMU/KVM solo es necesario usar:

$ kvm -m 512 -cdrom ubuntu-11.10-desktop-i386.iso

en este ejemplo usamos al virtualizador con la arquitectura por omisión y memoria de 512 MB (-m 512).

166 Una imagen ISO es un archivo informático donde se almacena una copia exacta de un sistema de archivos y de esta se puede generar una imagen para CDROM, DVD o USB. 167 Una imagen ISO es un archivo informático donde se almacena una copia exacta de un sistema de archivos y de esta se puede generar una imagen para CDROM, DVD o USB.

[email protected] 560 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

18.5 Creación de Máquinas Virtuales En esta sección mostraremos varios ejemplos completos para crear máquinas virtuales de Linux y Windows mediante el uso de KVM/QEMU.

Ejemplo 4 Instalación y uso de una máquina virtual para Debian GNU/Linux estable a partir del archivo ISO168, para ello, primero necesitamos: Generar el disco virtual que la contendra, por ejemplo de 10 GB con el nombre debianStable.img mediante: $ qemu-img create -f qcow2 debianStable.img 10G Después, instalar la imagen de Debian estable169 en el disco virtual genera- do en el paso anterior, solicitando a KVM que una vez terminada la insta- lación no haga el reinicio de la máquina virtual, esto mediante: $ kvm -no-reboot -boot d -cdrom debian-802-i386-netinst.iso -hda debianStable.img -m 400 n Después de la instalación, es conveniente compactar y desfragmentar la imagen usando: $ qemu-img convert -c debianStable.img -O qcow2 debian.img Ahora podemos usar la máquina virtual con la imagen desfragmentada y compactada de Debian estable solicitando que tenga 800 MB de RAM, mediante: $ kvm -hda debian.img -m 800

Observación 2 La de…nición de la toda la máquina virtual -el disco vir- tual que contiene el sistema operativo instalado y su respectiva paquetería- esta contenida en un único archivo que puede ser copiado, almacenado o dis- tribuido. En esto radica el poder de las máquinas virtuales, una vez hecha y con…gurada, se pude usar en donde se requiera y la cantidad de veces que lo necesitemos. Al ser un solo archivo la máquina virtual, es común tener múltiples archivos que conserven los distintos estados conforme se instalen o con…guren paque- tes de la misma. De esta forma se agiliza la recuperación tras algún fallo y

168 Diversas imágenes ISO del proyecto Linux Debian se pueden descargar de: https://www.debian.org/CD/ 169 Instrucciones paso a paso de como instalar, con…gurar y optimizar Linux De- bian están disponibles en múltiples lugares de la red, pero se pueden descargar de: http://132.248.182.159/Replicas/debianInstall/ [email protected] 561 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM el poder hacer modi…caciones de la máquina base o restaurar una máquina a algún punto de con…guración anterior, con tan solo usar la respectiva copia almacenada. Además, al usar KVM/QEMU se tiene la certeza de que la máquina vir- tual creada en una distribución de Linux puede ser usada en cualquier otra distribución bajo cualquier arquitectura de Hardware soportada por Linux - que tenga instalada una versión igual o superior de KVM/QEMU- sin cambio alguno.

Ejemplo 5 Instalación y uso de una máquina virtual para Windows XP, en este caso necesitamos: Crear el disco virtual, por ejemplo de 10 GB mediante: $ qemu-img create -f qcow2 WindowsXP.img 10G Hacer la instalación básica de Windows XP a partir, por ejemplo del ISO, mediante: $ kvm -no-reboot -boot d -hda WindowsXP.img -m 400 -localtime -cdrom es_winxp_pro_with_sp2.iso n Y concluir la instalación de Windows XP mediante: $ kvm -no-reboot -boot c -hda WindowsXP.img -m 400 -localtime -cdrom es_winxp_pro_with_sp2.iso n Después de la instalación, es conveniente compactar y desfragmentar la imagen usando: $ qemu-img convert -c WindowsXP.img -O qcow2 Windows.img Ahora podemos usar la máquina virtual con la imagen desfragmentada y compactada de Windows XP usando: $ kvm -boot c -hda Windows.img -m 400 -localtime

Ejemplo 6 Una vez que se cuenta con una imagen de Windows, podemos instalar por ejemplo Windows O¢ ce, donde tenemos dos opciones a saber: 1) Instalar Windows O¢ ce 2003 a partir del ISO de O¢ ce mediante: $ kvm -localtime -m 300 -boot c -hda Windows.img -cdrom O¢ ce-2003.iso n 2) Si se tiene el CD o DVD, entonces podemos usar: $ kvm -localtime -m 300 -boot c -hda Windows.img -cdrom /dev/cdrom/ n [email protected] 562 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Observación 3 En el caso de Windows hay que usar el mismo Hardware siempre, en caso contrario marca que es necesario registrar el sistema opera- tivo nuevamente al ejecutarlo en otra arquitectura, para evitar este problema, es necesario usar la bandera -cpu al momento de crearlo y usarlo, por ejem- plo: Usar máquina virtual de Windows en QEMU y KVM usando el mismo Hardware mediante alguna de estas opciones: $ kvm -localtime -m 400 -boot c -hda Windows.img -cpu qemu32 $ qemu-system-x86_64 -localtime -m 400 -boot c -hda Windows.img -cpu qemu32 n $ qemu-system-x86_64 -enable-kvm -localtime -m 400 -boot c -hda Windows.img -cpu qemu32 n Para conocer los CPUs soportados usar: $ kvm -cpu ? Para conocer las máquinas soportadas usar: $ kvm -machines ?

Ejemplo 7 Otro ejemplo completo de instalación y uso de una máquina vir- tual para Windows 7, en este caso necesitamos: Crear el disco virtual, por ejemplo de 15 GB mediante: $ qemu-img create -f qcow2 Windows7.img 15G Hacer la instalación básica de Windows 7 a partir, por ejemplo del DVD mediante: $ kvm -no-reboot -cdrom /dev/cdrom -boot d -hda Windows7.img -m 500 -localtime n Concluir la instalación de Windows 7 mediante: $ kvm -no-reboot -boot c -hda Windows7.img -cdrom /dev/cdrom -m 500 -localtime n Después de la instalación, es conveniente compactar y desfragmentar la imagen usando: $ qemu-img convert -c Windows7.img -O qcow2 Windows.img Ahora podemos usar la máquina virtual con la imagen desfragmentada y compactada de Windows 7 mediante: $ kvm -boot c -hda Windows.img -m 500 -localtime

[email protected] 563 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

18.6 Uso de Virtualización Dentro de Otra Virtual- ización Esta operación parece muy exótica y que rara vez se necesitará. Pero por las constantes vulnerabilidades descubiertas en los sistemas operativos, es muy común tener la última versión estable del sistema operativo para obtener el mejor desempeño posible del Hardware y la máxima seguridad posible en el sistema an…trión y dentro de el, ejecutar una o más versiones de sistemas ope- rativos huésped -no necesariamente actualizados- para dentro de ellos correr otras versiones de sistemas operativos obsoletos o vulnerables, permitiendo la estabilidad en entornos de producción, así como migraciones en vivo entre servidores. Esto se logra por ejemplo, para un procesador AMD al usar: $ kvm -m 128 -hda Linux.img -cpu phenom,+svm

Figura 5: Sobre un equipo AMD de gama baja y 4 GB de RAM, se muestra el uso de una virtualización sobre otra virtualización y corriendo dentro de ella, una máquina virtual con Windows XP en la cual se muestra el uso de RAM y CPU dentro de la misma.

De esta forma, los sistemas virtualizados huésped heredan la capacidad de virtualizar por Hardware del an…trión, acelerando los procesos anidados de [email protected] 564 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM las virtualizaciones, aumentando las posibilidades de uso de la virtualización al permitir explotar de forma e…ciente el gran poder computacional que día a día se desarrolla170.

18.7 Manipulación del Estado de la Máquina Virtual La virtualización permite manipular el estado de una máquina en ejecución, por ejemplo, una vez que se esta corriendo una máquina virtual:

$ kvm -boot c -hda Windows.img -m 400 -localtime

es posible manipular el estado de la misma en algún punto de su ejecución al usar la combinación de teclas:

[Ctrl] + [Alt] + [2]

ya en ella, podemos detener y grabar el estado de la máquina virtual:

(qemu) savevm test.vm (qemu) quit

para que en otro momento, podamos restaurar la máquina virtual tal como estaba cuando esta se detuvo mediante:

$ kvm -boot c -hda Windows.img -m 400 -localtime -loadvm test.vm n

18.8 Optimización de Imágenes Las imágenes de disco de KVM/QEMU después de ser generadas -al instalar algún sistema operativo o paquetes-, tienen muchos archivos internos dis- persos, para optimizar su rendimiento es recomendable convertir la imagen dispersa en una que no tenga esta propiedad, mediante:

$ qemu-img convert disk-sparse.img -O qcow2 disk.img

170 Es común que un sólo equipo de cómputo cuente con hasta 3 TB de RAM y varios procesadores por tarjeta madre, donde cada procesador tiene decenas de Cores. [email protected] 565 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

o puede ser compactada y optimizada mediante:

$ qemu-img convert -c disk-sparse.img -O qcow2 disk.img

Para descompactar una imagen se hace mediante:

$ qemu-img convert disk-compact.img -O qcow2 disk.img

18.8.1 Trabajar con una Imagen Virtual sin que se Altere En algunos casos, es deseable que al trabajar con una máquina virtual, dejar la información de la máquina virtual base intacta y guardar los cambios que se requieran en otro archivo, una forma es hacer una copia y trabajar con la copia de esta o crear un archivo que almacene por separado los cambios a la imagen, para esto último usar:

$ qemu-img create -b debianStable.img -f qcow2 debian.img

y trabajar con la imagen resultante (para este ejemplo debian.img) como con cualquier otra imagen, de esta forma, todos los cambios al trabajar serán almacenados en debian.img dejando intacta la imagen base debianStable.img.

18.8.2 Aumento de Desempeño La virtualización normalmente es rápida, pero en algunas circunstancias se hace lenta, esto es ajeno a KVM/QEMU y generalmente es por la constante grabación de pequeños paquetes de datos al disco por parte de la máquina virtual. Para optimizar el desempeño de la máquina virtual es posible pedirle a KVM/QEMU que trate de usar un Cache y baje lo menos posible a disco la información, esto aumentará notablemente el desempeño de la máquina virtual. Para aumentar el desempeño, en lugar de usar:

$ kvm -boot c -hda Win.img -m 400

Usar: [email protected] 566 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

$ kvm -drive …le=Win.img,Cache=writeback,media=disk -m 400 n

En el caso de usar un archivo ISO, usar:

$ kvm -drive …le=fedora.iso,Cache=writeback,media=cdrom

n -m 512

Ejemplo 8 Instalación y uso de una máquina virtual (por ejemplo para UBUNTU 11.10) usando el Cache, en este caso necesitamos: Generar un disco virtual, por ejemplo de 10 GB mediante: $ qemu-img create -f qcow2 disco.img 10G Instalar la imagen de UBUNTU en un disco virtual: $ kvm -no-reboot -boot d -drive …le=ubuntu-11.10-desktop- i386.iso,Cache=writeback,media=cdrom -drive …le=disco.img,n Cache=writeback,media=disk -m 500 n Después de la instalación, es conveniente compactar y desfragmentar la imagen usando: $ qemu-img convert -c disco.img -O qcow2 Ubuntu.img Ahora ya podemos utilizar la imagen y hacer uso del Cache para acelerar el desempeño mediante: $ kvm -drive …le=Ubuntu.img,Cache=writeback,media=disk -m 500

Mejorando el Desempeño del Vídeo de la Máquina Virtual Por omisión se tiene un tarjeta grá…ca de pobre desempeño en la máquina virtual, si se necesita mayor resolución en la salida grá…ca, una opción es usar la opción -VGA, donde dos de sus posibilidades es STD o VMWARE usándose como:

$ kvm -drive …le=fedora.iso,Cache=writeback,media=cdrom

n -m 512 -vga std

o [email protected] 567 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

$ kvm -drive …le=fedora.iso,Cache=writeback,media=cdrom

n -m 512 -vga vmware

hay otras opciones que permiten inclusive el uso de GPUs reales o vir- tuales. Para ver detalles, favor de revisar el manual del usuario del proyecto QEMU.

Uso de Tarjeta de Sonido Dentro de KVM/QEMU Por omisión el uso de la tarjeta de audio no esta habilitada, para habilitarla usar en la línea de comandos: -soundhw sb16, es1370, adlib, por ejemplo:

$ kvm -boot c -hda Windows.img -m 400 -localtime -soundhw sb16,es1370,adlib n

hay otras opciones, para ver estas, favor de revisar el manual del usuario del proyecto QEMU.

Algunas Otras Opciones Lanzar KVM con dos procesadores, 1536 MB de RAM, dispositivo de red e1000, MAC addres171 52:54:00:12:34:50, ini- ciando el DHCP172 en la dirección 10.0.2.40 y reenviando la salida del puerto 22 de la máquina virtual al 5555 del equipo huésped, mediante:

$ kvm -smp 2 -drive …le=debianStableTmp.img,Cache=writeback, media=disk -m 1536 -device e1000,netdev=user.0,mac= 52:54:00:12:34:50 -netdev user,id=user.0,dhcpstart=10.0.2.40, Hostfwd=tcp::5555-:22 &

171 En las redes de computadoras, la dirección MAC (siglas en inglés de Media Access Control) es un identi…cador de 48 bits (6 bloques de dos caracteres hexadecimales (4 bits)) que corresponde de forma única a una tarjeta o dispositivo de red. Se la conoce también como dirección física, y es única para cada dispositivo. 172 Protocolo de con…guración dinámica de Host (en inglés: Dynamic Host Con…guration Protocol, también conocido por sus siglas de DHCP) es un protocolo de red de tipo cliente/servidor mediante el cual un servidor DHCP asigna dinámicamente una dirección IP y otros parámetros de con…guración de red a cada dispositivo en una red para que puedan comunicarse con otras redes IP.

[email protected] 568 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

o lanzar kvm con dos procesadores, 1536 MB de RAM, dispositivo de red e1000 y reenviando la salida del puerto 22 de la máquina virtual al 5555 del equipo huésped de la siguiente forma:

$ kvm -smp 2 -drive …le=debianStableTmp.img,Cache=writeback, media=disk -m 1536 -device e1000,netdev=user.0 -netdev user,id= user.0,Hostfwd=tcp::5555-:22 &

el redireccionamiento de puerto puede ser hecho también con:

$ kvm -m 512 -cpu phenom,+svm -hda b.qcow2 -redir tcp:5555: 10.0.2.15:22 &

Si se desea usar ssh y scp en la máquina virtual usar:

# apt install openssh-server

acceder usando:

$ ssh -p 5555 root@localHost

hacer copia del equipo huésped a la máquina virtual mediante:

$ scp -P 5555 …le.txt usr@localHost:/tmp

Algunos Problemas Comunes con la Red Por lo general las máquinas virtuales detectan correctamente la red, pero en el caso de Windows esto no siempre pasa, por ello es común emular una tarjeta de red lo más genérica posible, esta puede ser RTl8139, para ello es necesario que al lanzar la máquina virtual que se indique: net nic; model = rtl8139 net user por ejemplo mediante:

$ kvm -boot c -hda WindowsXP.img -m 400 -localtime -net nic,model=rtl8139 -net user n

algunas de las otras opciones para la red son: NE2000 PCI, RTL8139, PCNET y NE2000 ISA. [email protected] 569 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Direcciones de Red Usadas en QEMU/KVM Gateway/DHCP/TFTP Server: 10:0:2:2 DNS Server: 10:0:2:3 Samba Server: 10:0:2:4 Netmask: 255:255:255:0 Guest IP: cualquier dirección superior a 10:0:2:15

18.9 Uso de Máquinas Virtuales de VirtualBox en KVM/QEMU Virtualbox es un programa desarrollado por Oracle ampliamente usado sobre todo para la plataforma Windows. Se trata de un Software multiplataforma capaz de virtualizar prácticamente la totalidad de sistemas operativos con arquitectura x86/amd64. La base de este Software dispone de una licencia GPL2 (véase 14.1.1), mientras que el pack de extensiones que añaden fun- cionalidades estan bajo licencia privativa, Virtualbox es gratuito para un uso no comercial. VirtualBox (https://www.virtualbox.org/) dispone de diversas imágenes funcionales listas para descargar y usar varias decenas de distribuciones de Linux (https://virtualboxes.org/images/ y https://www.osboxes.org).

Interacción de VirtualBox en KVM/QEMU Ya que VirtualBox es ampliamente usado, KVM/QEMU ha desarrollado formas de usar, convertir y migrar máquinas de VirtualBox y otros manejadores de máquinas virtuales con un mínimo esfuerzo, ejemplo de ello es que se puede descargar cualquier imagen VDI de VirtualBox y usarla directamente en KVM usando la misma sintaxis que con sus propias máquinas virtuales. Para mostrar esto, descargar de: https : ==virtualboxes:org=images=lubuntu= la imagen de LUBUNTU 12.10: http : ==sourceforge:net=projects=virtualboximage=files= Lubuntu=12:10=lubuntu1210:7z=download y descomprimir el archivo lubuntu1210.7z, esto dejará una imagen de Virtu- alBox de LUBUNTU cuyo nombre es lubuntu1210.vdi. Entonces esta imagen la usaremos directamente en KVM/QEMU, mediante: [email protected] 570 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

$ kvm -m 2000 -hda lubuntu1210.vdi

o

$ qemu-system-x86_64 -enable-kvm -m 2000 -hda lubuntu1210.vdi

Nota: esta imagen usa como usuario y clave de acceso: lubuntu/lubuntu

Algunas veces es necesario montar y extraer el contenido de un disco vir- tual, supongamos que tenemos una máquina virtual de VirtualBox y quere- mos ver su contenido, para ello usamos:

$ qemu-img convert diskname.vmdk -O qcow2 diskname.qcow2

o para el formato RAW:

$ qemu-img convert diskname.vmdk -O raw diskname.raw

Instalar nbd-client:

# apt install nbd-client

después:

# qemu-nbd –connect=/dev/nbd0 /mnt/kvm/diskname.qcow2 # fdisk /dev/nbd0 -l # sudo mount /dev/nbd0p1 /mnt/somepoint/ # umount /mnt/somepoint/

18.10 Conversión de Máquinas Virtuales a KVM/QEMU Es posible convertir máquinas virtuales de los proyectos de virtualización:

VMware ESXi  OVA exported from VMware  VMX from VMware  RHEL 5 Xen  [email protected] 571 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

SUSE Xen  Citrix Xen  Hyper-V  a KVM/QEMU, mediante el comando virt-v2v, este convierte un Hiper- visor de estos proyectos para ser ejecutado en KVM/QEMU. Puede leer máquinas virtuales de dichos proyectos de ambientes Linux y Windows que se ejecutan en VMware, Xen, Hyper-V y algunos otros Hipervisores, y conver- tirlos a KVM administrado por libvirt, OpenStack, oVirt, Red Hat Virtua- lization (RHV) u otros objetivos. También hay un Front-End 173 complementario llamado virt-p2v que se presenta como una imagen ISO, CD o PXE 174 que se puede iniciar en máquinas físicas para virtualizar esas máquinas (de físico a virtual o p2v).

Ejemplos:

Convertir de VMware vCenter a un servidor libvirt local si se tiene una imagen de VMware vCenter server llamada vcenter.example.com, en un centro de datos llamado Datacenter, y un ESXi175 hipervisor llamado esxi. Entonces podemos convertir el invitado llamado vmware_guest a una máquina virtual para libvirt de la siguiente manera:

$ virt-v2v -ic vpx://vcenter.example.com/Datacenter/esxi vmware_guest n

173 En diseño de Software el Front-End es la parte del Software que interactúa con los usuarios 174 Preboot eXecution Environment (PXE) (Entorno de ejecución de prearranque), es un entorno para arrancar e instalar el sistema operativo en computadoras a través de una red, de manera independiente de los dispositivos de almacenamiento de datos disponibles (como discos duros) o de los sistemas operativos instalados. 175 VMware ESXi (anteriormente VMware ESX) es una plataforma de virtualización a nivel de centro de datos producido por VMware, Inc.. Es el componente de su producto VMware Infraestructure que se encuentra al nivel inferior de la capa de virtualización, el hipervisor, aunque posee herramientas y servicios de gestión autónomos e independientes.

[email protected] 572 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

en este caso es necesario ejecutar el comando en modo root, ya que nece- sita comunicación con el demonio176 libvirt y copiar localmente en: /var/lib/libvirt/images.

Convertir de VMware a RHV177/oVirt178 este ejemplo es similar al anterior, excepto que se quiere enviar el huésped a RHV Data Domain usando RHV REST API. La interfaz de red del huésped debe ser conectada con la red del objetivo llamada ovirtmgmt, entonces:

$ virt-v2v -ic vpx://vcenter.example.com/Datacenter/esxi vmware_guest -o rhv-upload -oc https://ovirt-engine.examn ple.com/ovirt-engine/api -os ovirt-data -op /tmp/ovirt-ad n min-password -of raw -oo rhv-ca…le=/tmp/ca.pem -oo n rhv-direct –bridge ovirtmgmt n

en este caso el Host179 ejecutando virt-v2v actúa como un servidor de conversión.

Convertir de ESXi hipervisor sobre SSH a libvirt local Si se tiene un hipervisor ESXi llamado esxi.example.com con acceso habilitado con SSH, entonces se puede convertir de VMFS180 almacenamiento VMFS sobre el servidor a un archivo local de la siguiente forma:

176 En sistemas UNIX/LINUX se conoce como demonio o Daemon (Disk And Execution Monitor) a un proceso que se ejecuta en segundo plano del sistema operativo, se ejecuta en todo momento y no posee interacción directa con el usuario, también se le conoce genéricamente como servicio o proceso, del cual no percibimos su ejecución. Un demonio realiza una operación especí…ca en tiempos prede…nidos o en respuesta a ciertos eventos del sistema. 177 Red Hat Virtualization REST Application 178 oVirt is an open-source distributed Virtualization solution 179 El término Host o an…trión se usa en informática para referirse a las computadoras u otros dispositivos conectados a una red que proveen y utilizan servicios de ella. Los usuarios deben utilizar an…triones para tener acceso a la red. En general, los an…triones son máquinas monousuario o multiusuario que ofrecen servicios de transferencia de archivos, conexión remota, servidores de base de datos, servidores Web, etc. 180 VMware VMFS es el sistema de archivos en clúster de VMware, Inc. utilizado por el paquete de virtualización de servidores insignia de la compañía, vSphere. Fue desarrollado para almacenar imágenes de disco de la máquina virtual, incluidas instantáneas.

[email protected] 573 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

$ virt-v2v -i vmx -it sshn "ssh://[email protected]/vmfs/volumes/datastore1n /guest/guest.vmx" -o local -os /var/tmp n

El huésped no debe estar corriendo y virt-v2v no necesita ser ejecutado por root.

Convertir imagen de disco a OpenStack Glance181 dada una ima- gen en disco se puede convertir a otro hipervisor ejecutandose sobre Open- Stack (sólo imágenes basadas en OpenStack sobre KVM son soportadas), para ello hacemos:

$ virt-v2v -i disk disk.img -o glance

Convertir imagen de disco a imagen de disco dada una imagen de disco de otro hipervisor que se quiera convertir a KVM/QEMU tenemos dos opciones:

$ virt-v2v -i disk disk.img -o local -os /var/tmp

el otro método más complejo es escribir un libvirt XML que describa el invitado a convertir (si se puede usar el hipervisor de origen para que proporcione el libvirt XML es mejor), entonces hacemos:

$ virt-v2v -i libvirtxml guest-domain. -o local -os /var/tmp

dado que guest-domain.xml contiene la(s) ruta(s) de las imágen(es) del disco invitado, no es necesario especi…car el nombre de la imagen del disco en la línea de comandos. Para convertir una imagen de disco local e inmediatamente iniciarla en QEMU local, hacemos lo siguiente:

$ virt-v2v -i disk disk.img -o qemu -os /var/tmp –qemu-boot

181 OpenStack es un proyecto de computación en la nube para proporcionar una in- fraestructura como servicio (IaaS). [email protected] 574 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

18.11 Comunicación de las Máquinas Virtuales con el Sistema An…trión e internet Para tener comunicación de las máquinas virtuales y el sistema an…trión e internet, existen varias maneras de hacer esto, a saber: a) Mediante el uso de algún navegador Web, se puede acceder a su cuenta de correo electrónico y al almacenamiento en la nube como Google Drive, Dropbox, HubiC, pCloud, MediaFire, FlipDrive, Mega, entre otros. b) En el sistema operativo Linux, se puede acceder a cualquier servidor de internet mediante los protocolos SSH, SAMBA182 o montar un sistema de archivos mediante SSHFS183, NFS184, entre otros. 1) Por ejemplo con PCManFM, Dolphin, Nautilus, Thunar, Konqueror, entre otros, podemos acceder a una máquina que tenga un servidor:

A) Acceder a un servidor SAMBA, escribir la ruta de archivos en el manejador de archivos:

smb://[email protected]/estud/

B) Acceder a un servidor SSH, escribir la ruta de archivos en el manejador de archivos:

sftp://[email protected]/home/usuario/

2) En línea de comandos, podemos:

A) Montar con SSHFS un directorio de otra máquina con servidor SSH : 182 Samba es una implementación libre del protocolo de archivos compartidos de Microsoft Windows (antiguamente llamado SMB, renombrado recientemente a CIFS) para sistemas de tipo UNIX. De esta forma, es posible que computadoras con GNU/Linux, Mac OS X o Unix en general se vean como servidores o actúen como clientes en redes de Windows. 183 Secure SHell FileSystem (SSHFS) es un sistema de archivos para Linux (y otros sis- temas operativos con una implementación FUSE, tal como en Mac OS X), que opera sobre archivos en una computadora remota usando un entorno seguro de acceso. En la com- putadora local donde se monta SSHFS, la implementación hace uso del módulo del kernel FUSE. 184 El sistema de archivos de red (Network File System) es una aplicación cliente/servidor que permite al usuario ver y opcionalmente almacenar y actualizar archivos en un equipo remoto como si estuvieran en el propio equipo del usuario. [email protected] 575 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

$ sshfs [email protected]:/home/usuario/ /home/algun/lugar

B) Montar con mount un directorio de otra máquina con servidor NFS:

# mount 10.0.2.2:/directorio /home/algun/lugar

C) Usar SCP y SFTP de SSH para transferir archivos: para copiar un archivo, usamos:

$ scp archivo.dat [email protected]:~/Datos/

para copiar un subdirectorio, usamos:

$ scp -r Directorio [email protected]:.

para copiar un archivo de una máquina remota a nuestra máquina, usamos:

$ scp [email protected]:/home/usuario/archivo .

c) En cualquier sistema operativo podemos usar algún navegador grá…co de FTP, FTPS o SFTP como FileZilla, WinSCP, PSCP, PSFTP, FireFTP, CoreFTP, entre muchos otros, para transportar archivos y carpetas. d) Se puede usar FSDEV de KVM/QEMU que monta un recurso local mediante las siguientes indicaciones:

$kvm [...] -fsdev local,id=fs1,path=$HOME/code/Linux,security_model=none -device virtio-9p-pci,fsdev=fs1,mount_tag=Host-code

Donde $HOME/code/Linux es la ruta a compartir, y Host-code es el identi…cador para el montaje, en la MV se puede usar:

$ mkdir -p /mnt/Host

Donde /mnt/Host es el directorio de montaje (checar que se den los per- misos pertinentes), para ahora hacer:

# mount Host-code -t 9p /mnt/Host [email protected] 576 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Para desmontar usar:

# umount /mnt/Host

e) Mediante el uso de la línea de comandos (véase 15.3) usando el comando scp o rsync (véase ??) y sí así se requiere, comprimiendo archivos para su fácil traslado (véase ??) ó bien mediante programas que posean una interfaz grá…ca de usuario para SSH o SCP. f) Leer un dispositivo USB montado en el sistema an…trión desde la máquina virtual, para ello el dispositivo USB deberá estar conectado en la máquina an…trión y deberá ser accedido directamente en la máquina virtual. KVM/QEMU necesita parámetros adicionales, el parámetro -usb activa el soporte en la máquina virtual de dispositivos USB. La emulación de Intel SB82371 UHCI-Controller tiene 8-puertos en el USB hub. Si se busca tener acceso a uno de los dispositivos físicos, se requiere encontrar los parámetros Vendor-ID y Product-ID. Esta información se obtiene examinando la salida del comando:

# /sbin/lsusb

o

$ cat /proc/bus/usb/devices

Entonces es posible decirle a KVM/QEMU los datos de VendorID y Pro- ductID a través de la línea de comandos (véase 15.3):

$ qemu -usb -usbdevice Host:: ...

o iniciar KVM/QEMU con soporte para dispositivos USB activados me- diante:

$ qemu -usb ...

después de iniciar la máquina virtual, cambiar al sistema de monitoreo de la máquina virtual presionando:

[Ctrl]+[Alt]+[2] e introducir el siguiente comando: usb_add Host:: [email protected] 577 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

cuando se retorne al ambiente grá…co al teclear [Ctrl]+[Alt]+[1] se vera el mensaje de reconocimiento del dispositivo USB. Por ejemplo si se tiene una impresora HP Scanjet 3300C conectada en el puerto USB de la computadora, la salida del comando lsub es:

# lsusb Bus 003 Device 002: ID 03f0:0205 ScanJet 3300C

así, el comando en KVM/QEMU para dejar accesible el dispositivo es:

$ qemu -usb -usbdevice Host:03f0:0205 ...

g) Usar la impresora conectada en el puerto paralelo, pera ello al invocar la ejecución de la máquina virtual usar:

$ qemu -parallel /dev/parport0 ...

h) Montar el contenido de un disco virtual y poder intercambiar infor- mación entre la máquina virtual y la huésped, primero convertir el disco a formato accesible a Linux:

$ qemu-img convert disco.img -O raw tmp.img

montar la imagen en Linux como root:

# mkdir disk # mount -o loop,o¤set=32256 tmp.img disk

trabajar con la imagen montada y al terminar desmontar esta:

# umount ./disk

y puede ser regresada al formato original mediante:

$ qemu-img convert -c tmp.img -O qcow2 disco.img

[email protected] 578 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

18.12 Signi…cado de las Banderas de /proc/cpuinfo Recordemos que para revisar si hay soporte en Hardware para la virtua- lización, usamos:

$ egrep "vmx svm" /proc/cpuinfo j si soporta la virtualización por Hardware, aparecerá la bandera:

Procesadores INTEL: vmx Procesadores AMD: svm

Hay una gran variedad de banderas que informan sobre el Hardware del que se dispone y las opciones que pueden usarse en KVM/QEMU que son so- portadas por Hardware -como la virtualización dentro de una virtualización-, en esta sección veremos parte de ellas para poder usarlas si son necesarias para un proyecto en particular.

Intel Advanced Vector Extensions Programming Reference fpu: Onboard FPU (‡oating point support) vme: Virtual Mode Extensions (8086 mode) de: Debugging Extensions (CR4.DE) pse: Page Size Extensions (4MB memory pages) tsc: Time Stamp Counter (RDTSC) msr: Model-Speci…c Registers (RDMSR, WRMSR) pae: Physical Address Extensions (support for more than 4GB of RAM) mce: Machine Check Exception cx8: CMPXCHG8 instruction (64-bit compare-and-swap) apic: Onboard APIC sep: SYSENTER/SYSEXIT mtrr: Memory Type Range Registers pge: Page Global Enable (global bit in PDEs and PTEs) mca: Machine Check Architecture cmov: CMOV instructions (conditional move) (also FCMOV) pat: Page Attribute Table pse36: 36-bit PSEs (huge pages) pn: Processor serial number cl‡ush: Cache Line Flush instruction dts: Debug Store (bu¤er for debugging and pro…ling instructions) [email protected] 579 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

acpi: ACPI via MSR (temperature monitoring and clock speed modula- tion) mmx: Multimedia Extensions fxsr: FXSAVE/FXRSTOR, CR4.OSFXSR sse: Intel SSE vector instructions sse2: SSE2 ss: CPU self snoop ht: Hyper-Threading tm: Automatic clock control (Thermal Monitor) ia64: Intel Itanium Architecture 64-bit (not to be confused with Intel’s 64-bit x86 architecture with ‡ag x86-64 or AMD64 bit indicated by ‡ag lm) pbe: Pending Break Enable (PBE# pin) wakeup support

AMD-de…ned CPU features, CPUID level 0x80000001 syscall: SYSCALL (Fast System Call) and SYSRET (Return From Fast System Call) mp: Multiprocessing Capable. nx: Execute Disable mmxext: AMD MMX extensions fxsr_opt: FXSAVE/FXRSTOR optimizations pdpe1gb: One GB pages (allows hugepagesz=1G) rdtscp: Read Time-Stamp Counter and Processor ID lm: Long Mode (x86-64: amd64, also known as Intel 64, i.e. 64-bit capable) 3dnowext: AMD 3DNow! extensions 3dnow: 3DNow! (AMD vector instructions, competing with Intel’s SSE1)

Transmeta-de…ned CPU features, CPUID level 0x80860001 recovery: CPU in recovery mode longrun: Longrun power control lrti: LongRun table interface

[email protected] 580 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Other features, Linux-de…ned mapping cxmmx: Cyrix MMX extensions k6_mtrr: AMD K6 nonstandard MTRRs cyrix_arr: Cyrix ARRs (= MTRRs) centaur_mcr: Centaur MCRs (= MTRRs) constant_tsc: TSC ticks at a constant rate up: smp Kernel running on up arch_perfmon: Intel Architectural PerfMon pebs: Precise-Event Based Sampling bts: Branch Trace Store rep_good: rep microcode works well nopl: The NOPL (0F 1F) instructions xtopology: cpu topology enum extensions tsc_reliable: TSC is known to be reliable nonstop_tsc: TSC does not stop in C states extd_apicid: has extended APICID (8 bits) amd_dcm: multi-node processor aperfmperf: APERFMPERF eagerfpu: Non lazy FPU restore nonstop_tsc_s3: TSC doesn’tstop in S3 state

Intel-de…ned CPU features, CPUID level 0x00000001 (ecx) pni: SSE-3 (Prescott New Instructions) pclmulqdq: Perform a Carry-Less Multiplication of Quadword instruc- tion –accelerator for GCM) dtes64: 64-bit Debug Store monitor: Monitor/Mwait support (Intel SSE3 supplements) ds_cpl: CPL Qual. Debug Store vmx: : Intel VMX smx: Safer mode: TXT (TPM support) est: Enhanced SpeedStep tm2: Thermal Monitor 2 ssse3: Supplemental SSE-3 cid: Context ID fma: Fused multiply-add cx16: CMPXCHG16B xtpr: Send Task Priority Messages [email protected] 581 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

pdcm: Performance Capabilities pcid: Process Context Identi…ers dca: Direct Cache Access sse4_1: SSE-4.1 sse4_2: SSE-4.2 x2apic: x2APIC movbe: Move Data After Swapping Bytes instruction popcnt: Return the Count of Number of Bits Set to 1 instruction (Hamming weight, i.e. bit count) tsc_deadline_timer: Tsc deadline timer aes/aes-ni: Advanced Encryption Standard (New Instructions) xsave: Save Processor Extended States: also provides XGETBY, XRSTOR,XSETBY avx: Advanced Vector Extensions f16c: 16-bit fp conversions (CVT16) rdrand: Read Random Number from Hardware random number generator instruction hypervisor: Running on a hypervisor

VIA/Cyrix/Centaur-de…ned CPU features, CPUID level 0xC0000001 rng: Random Number Generator present (xstore) rng_en: Random Number Generator enabled : on-CPU crypto (xcrypt) ace_en: on-CPU crypto enabled ace2: Advanced Cryptography Engine v2 ace2_en: ACE v2 enabled phe: PadLock Hash Engine phe_en: PHE enabled pmm: PadLock Montgomery Multiplier pmm_en: PMM enabled

More extended AMD ‡ags: CPUID level 0x80000001, ecx lahf_lm: Load AH from Flags (LAHF) and Store AH into Flags (SAHF) in long mode cmp_legacy: If yes HyperThreading not valid svm: Secure virtual machine: AMD-V [email protected] 582 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

extapic: Extended APIC space cr8_legacy: CR8 in 32-bit mode abm: Advanced Bit Manipulation sse4a: SSE-4A misalignsse: Misaligned SSE mode 3dnowprefetch: 3DNow prefetch instructions osvw: OS Visible Workaround ibs: Instruction Based Sampling xop: extended AVX instructions skinit: SKINIT/STGI instructions wdt: Watchdog timer lwp: Light Weight Pro…ling fma4: 4 operands MAC instructions tce: translation Cache extension nodeid_msr: NodeId MSR tbm: Trailing Bit Manipulation topoext: Topology Extensions CPUID leafs perfctr_Core: Core Performance Counter Extensions perfctr_nb: NB Performance Counter Extensions perfctr_l2: L2 Performance Counter Extensions

Auxiliary ‡ags: Linux de…ned - For features scattered in various CPUID levels ida: Intel Dynamic Acceleration arat: Always Running APIC Timer cpb: AMD Core Performance Boost epb: IA32_ENERGY_PERF_BIAS support xsaveopt: Optimized Xsave pln: Intel Power Limit Noti…cation pts: Intel Package Thermal Status dts: Digital Thermal Sensor hw_pstate: AMD HW-PState proc_feedback: AMD ProcFeedbackInterface intel_pt: Intel Processor Tracing

[email protected] 583 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

Virtualization ‡ags: Linux de…ned tpr_shadow: Intel TPR Shadow vnmi: Intel Virtual NMI ‡expriority: Intel FlexPriority ept: Intel Extended Page Table vpid: Intel Virtual Processor ID npt: AMD Nested Page Table support lbrv: AMD LBR Virtualization support svm_lock: AMD SVM locking MSR nrip_save: AMD SVM next_rip save tsc_scale: AMD TSC scaling support vmcb_clean: AMD VMCB clean bits support ‡ushbyasid: AMD ‡ush-by-ASID support decodeassists: AMD Decode Assists support pause…lter: AMD …ltered pause intercept pfthreshold: AMD pause …lter threshold

Intel-de…ned CPU features, CPUID level 0x00000007:0 (ebx) fsgsbase: {RD/WR}{FS/GS}BASE instructions bmi1: 1st group bit manipulation extensions hle: Hardware Lock Elision avx2: AVX2 instructions smep: Supervisor Mode Execution Protection bmi2: 2nd group bit manipulation extensions erms: Enhanced REP MOVSB/STOSB invpcid: Invalidate Processor Context ID rtm: Restricted Transactional Memory mpx: Memory Protection Extension rdseed: The RDSEED instruction adx: The ADCX and ADOX instructions smap: Supervisor Mode Access Prevention

[email protected] 584 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

19 Bibliografía Este texto es una recopilación de múltiples fuentes, nues- tra aportación — si es que podemos llamarla así— es plasmarlo en este documento, en el que tratamos de dar coherencia a nuestra visión de los temas desarrollados. En la realización de este texto se han revisado — en la mayoría de los casos indicamos la referencia, pero pudimos omitir varias de ellas, por lo cual pedimos una disculpa— múltiples páginas Web, artículos técnicos, li- bros, entre otros materiales bibliográ…cos, los más repre- sentativos y de libre acceso los ponemos a su disposición en la siguiente liga:

Herramientas

Referencias

[1] Carreras en la Facultad de Ciencias, UNAM, http://www.fciencias.unam.mx/licenciatura/resumen/ 7

[2] Aulas y Talleres en el Tlahuizcalpan de las Carreras de Matemáticas de la Facultad de Ciencias, UNAM, http://www.matematicas.unam.mx/tlahuiz/ 14, 17, 102

[3] http://es.wikipedia.org/wiki/Microsoft_Windows 43, 399

[4] http://es.wikipedia.org/wiki/Linux 53

[5] http://es.wikipedia.org/wiki/Mac_OS 51

[6] http://es.wikipedia.org/wiki/Android 10, 62

[7] https://es.wikipedia.org/wiki/Java_(lenguaje_de_programaci%C3%B3n) 134, 191 [email protected] 585 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

[8] https://es.wikipedia.org/wiki/Python 134, 211

[9] https://es.wikipedia.org/wiki/C_(lenguaje_de_programaci%C3%B3n) 134, 199

[10] https://es.wikipedia.org/wiki/C%2B%2B 134, 203

[11] http://www.gnu.org/philosophy/free-sw.es.html 9, 408

[12] http://es.wikipedia.org/wiki/Software_libre 9, 408

[13] http://www.hispalinux.es/SoftwareLibre 9, 408

[14] http://es.wikipedia.org/wiki/Software_propietario 418

[15] Diferentes Tipos de Licencias para el Software, http://www.gnu.org/licenses/license-list.html 9, 74, 75, 77, 192, 408, 411

[16] Proyectos de Software Sourceforge, http://sourceforge.net/ 10, 11, 12

[17] Google Code, http://code.google.com 10, 11, 12

[18] Software proyecto GNU, http://www.gnu.org/Software/Software.es.html 10

[19] FSF, Free Software Fundation, http://www.fsf.org/ 9, 10, 408, 409, 411, 532

[20] GNU Operating System, http://www.gnu.org/ 9, 408, 411

[21] GCC, the GNU Compiler Collection, http://gcc.gnu.org/ 10

[22] The Linux Kernel Archives, http://www.kernel.org/ 10, 12

[23] Debian el Sistema Operativo Universal, http://www.debian.org 10, 13

[24] Microsoft O¢ ce, http://o¢ ce.microsoft.com/ 13, 108, 109, 111, 113, 115

[25] OPEN OFFICE, Apache OpenO¢ ce, http://www.openo¢ ce.org 108, 109, 116

[email protected] 586 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

[26] LibreO¢ ce the Document Foundation, http://www.libreo¢ ce.org 108, 109, 116

[27] Google Docs, http://docs.google.com/ 108, 109

[28] CALLIGRA The Integrated Work Applications Suit, http://www.calligra.org/ 108, 109, 116

[29] OnlyO¢ ce, https://www.onlyo¢ ce.com/ 108

[30] WPS O¢ ce, https://www.wps.com/ 108

[31] O¢ ce Online, https://www.o¢ ce.com/ 108

[32] Collabora, https://www.collaborao¢ ce.com/ 108

[33] Lotus Sympony, http://www-03.ibm.com/Software/lotus/symphony/ho- me.nsf/home 108

[34] LaTeX, A Document Preparation System, http://www.latex- project.org/ 104, 113

[35] MATLAB, MathWorks, http://www.mathworks.com/products/matlab/ 13, 74, 76, 102

[36] SCILAB, Scilab Open Source for Numerical Computation, http://www.scilab.org/ 75, 79

[37] Julia, The Julia Programming Language, https://julialang.org 75, 80

[38] FreeMat, FreeMat Opén Source for rapid engineering and scienti…c prototyping and data processing, http://freemat.sourceforget.net/ 75, 77, 102

[39] OCTAVE, GNU Octave, http://www.gnu.org/Software/octave/ 74, 77, 102

[40] SCIPY Open Source Library of Scienti…c Tools, http://www.scipy.org/ 75, 82, 102

[41] Python Programming Language, http://www.python.org/ 75, 82

[email protected] 587 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

[42] SAS, Business Analytics and Business Intelligence Software, http://www.sas.com/ 13, 102, 104

[43] IBM SPSS Software, http://www-01.ibm.com/Software/analytics/spss/ 13, 102, 103

[44] GNU PSPP, http://www.gnu.org/Software/pspp/ 102, 103

[45] PSPPIRE Data Editor for PSPP, http://www.softpedia.com/get/O¢ ce- tools/Other-O¢ ce-Tools/PSPP.shtml 103

[46] QEMU, http://wiki.qemu.org/Main_Page 13, 523, 550

[47] KVM, http://www.linux-kvm.org/page/Main_Page 13, 523

[48] máquinas Virtuales, http://es.wikipedia.org/wiki/M%C3%A1quina_vir- tual 13, 523

[49] Oracle MV VirtualBox, https://www.virtualbox.org 539, 550

[50] VMware, https://www.vmware.com 550

[51] Virtual PC, https://www.microsoft.com/es- mx/download/details.aspx?id=3702 550

[52] Hyper-V, https://msdn.microsoft.com/es- es/library/mt16937(v=ws.11).aspx

[53] Parallels, https://www.parallels.com 550

[54] Algunos usos de máquinas Virtuales, http://www.con…gurarequipos.com/doc747.html 13, 523

[55] LINPACK, http://www.netlib.org/linpack/ 74

[56] EISPACK, http://www.netlib.org/eispack/ 74

[57] Scicos Block Diagram Modeler/Simulator, http://www.scicos.org/ 75

[58] Simulink Simulation and Model-Based Design, http://www.mathworks.com/products/simulink/ 74, 75

[59] KOctave, http://sourceforge.net/projects/koctave/ [email protected] 588 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

[60] QTOctave, http://www.ohloh.net/p/qtoctave

[61] IDLE is the Python IDE, http://docs.python.org/2/library/idle.html 83

[62] IPython Interactive Computing, http://ipython.org/ 83

[63] Appcelerator PyDEV, http://pydev.org/ 83

[64] Eclipse, http://www.eclipse.org/ 83

[65] The Eric Python IDE, http://eric-ide.python-projects.org/ 83

[66] MATLAB to Scilab conversion tips, http://help.scilab.org/docs/5.4.0/en_-US/m2sci_doc.html 85, 102

[67] EViews, http://www.eviews.com/home.html 102

[68] Gretel, http://gretl.sourceforge.net/ 102

[69] Stata, http://www.stata.com/

[70] Statgraphics, http://statgraphics.softonic.com/ 102

[71] Statistica, http://www.statsoft.com/support/download/statistica- Software-updates/ 102

[72] Systat, http://www.systat.com/ 102

[73] Vensim, http://vensim.com/vensim-Software/ 102

[74] Maple, http://www.maplesoft.com/ 75, 90, 95, 102

[75] Mathematica, http://www.wolfram.com/mathematica/ 76, 90, 91, 102

[76] Maxima, http://maxima.sourceforge.net 76, 90, 97, 102

[77] The R Proyect for Statistical Computing, http://www.r-project.or/ 75, 102, 104

[78] RWeka, http://cran.r-project.org/Web/packages/RWeka/index.html 104 [email protected] 589 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

[79] Tinn-R Edit code and run it in R, http://www.sciviews.org/Tinn-R/ 104

[80] RStudio Software, Education, and Services for the R community, http://www.rstudio.com/ 104

[81] SAS grows analytics market share, http://www.bizjournals.com/triangle-/news/2011/06/13/sas-grows- analytics-market-share.html 104

[82] Mathtype, http://www.dessci.com/en/products/mathtype/ 113, 115

[83] Scienti…c WorkPlace, http://www.mackichan.com/ 115

[84] Gummi LaTeX Editor, http://dev.midnightcoding.org/projects/gummi 115

[85] Kile LaTeX Editor, http://kile.sourceforge.net/ 115

[86] Led LaTex Editor, http://www.latexeditor.org/ 115

[87] Lyx LaTeX Editor, http://www.lyx.org/ 115

[88] Texmaker LaTeX Editor, http://www.xm1math.net/texmaker/ 115

[89] TeXnicCenter LaTeX Editor, http://www.texniccenter.org/ 116

[90] TextPad LaTeX Editor, http://www.textpad.com/ 116

[91] TeXstudio LaTeX Editor, http://texstudio.sourceforge.net/ 116

[92] WinEdt LaTeX Editor, http://www.winedt.com/ 116

[93] LaTeX Beamer Class, https://bitbucket.org/rivanvx/beamer/wiki/Home 113

[94] Microsoft SQL Server, http://www.microsoft.com/en- us/sqlserver/default.aspx 111

[95] PostgreSQL, http://www.postgresql.org/ 111

[96] MySQL Oracle, http://www.mysql.com/ 111

[97] MongoDB, http://www.mongodb.org/ 111 [email protected] 590 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

[98] Knoppix is a Live CD/ DVD based on Debian GNU/Linux, http://knoppix.net 402

[99] Repositorio de LaTeX en la Facultad de Ciencias, UNAM, http://tezcatl.fciencias.unam.mx/tex-archive/ 116

[100] El economista, http://eleconomista.com.mx/tecnociencia/2013/01/22/ clausuraran-negocios-mexico-uso-ilegal-Software 421

[101] PCworld, http://www.pcworld.com.mx/UNAM-y-BSA-promueven-el- uso-de-software-legal/ 421

[102] https://es.wikipedia.org/wiki/SQL 280

[103] https://es.wikipedia.org/wiki/NoSQL

280

Sitios Web revisados:

https://www.ibm.com/security  https://www.welivesecurity.com/la-es/  http://blogs.eset-la.com/  http://www.criptored.upm.es/  https://www.securityfocus.com/  https://securiteam.com/  https://www.cert.unam.mx/  http://www.securitytube.net/  https://www.issa.org/  https://www.isaca.org/  https://www.sans.org/  https://www.eccouncil.org/  [email protected] 591 Antonio Carrillo Ledesma, Et alii El Cómputo en los Cursos de la Facultad de Ciencias, UNAM

https://www.isc2.org/  https://www.comptia.org/  http://oval.mitre.org/  https://www.o¤ensive-security.com/  https://www.giac.org/certi…cation/penetration-tester-gpen  https://www.isecom.org/  https://www.exploit-db.com/google-hacking-database  https://www.ccn-cert.cni.es/  https://www.securityfocus.com/  https://linuxsecurity.com/  https://www.identidadrobada.com/  https://www.ietf.org/  https://www.iso.org/home.html  https://www.bis.org/bcbs/  http://www.mit.edu/hacker/hacker.html 

[email protected] 592 Antonio Carrillo Ledesma, Et alii Declaramos terminado este trabajo sufrido, ideado y llevado a cabo entre los años 2015 al 2021, aún y a pesar de impedimentos tales como: la mala suerte, la desventura, el infortunio, la incomprensión, la gripe, el COVID-19, la migraña, las horas de frío y calor, la tristeza, la desesperanza, el cansancio, el presente, el pasado y nuestro futuro, el que dirán, la vergüenza, nuestras propias incapacidades y limitaciones, nuestras aversiones, nuestros temores, nuestras dudas y en fin, todo aquello que pudiera ser tomado por nosotros, o por cualquiera, como obstáculo en este tiempo de mentiras, verdades, de incredulidad e ignorancia o negación de la existencia real y física de la mala fe.

Atentamente

Antonio Carrillo Ledesma Karla Ivonne González Rosas