jueves, 27 de octubre de 2016

IMPLEMENTACIÓN DE MODELOS MATEMÁTICOS SIMPLES EN EL DESARROLLO DE SOFTWARE

Autor:

Rafael Fuentealba


Competencia:

Aplicar ciencias de la ingeniería (Nivel 1)


Asignatura:

Programación I


Palabras Claves:

Python, IDE, Spyder, Modelos Matemáticos, Programación, Funciones.



Descripción de la Actividad:

Desarrollar algunos ejercicios orientados a la aplicación de algunos modelos matemáticos en la programación y el desarrollo de software. Dichos ejercicios serán solucionados tomando en cuenta las necesidades que requeridas en la vida real, utilizando para ello la creación y uso de programas en python.


Solución:


Problema #1: 

Se pide diseñar un programa que sea capaz de calcular la distancia entre dos puntos dados, mediante el uso del teorema del pitágoras. Un ejemplo de esto sería:



Explicación del código:

Línea 1: usamos la codificación "utf-8" que entre otras cosas, acepta el uso de caracteres como la "ñ" o las tildes.

Línea 2: consiste principalmente en la importación de la librería "math" la cual almacena una serie de funciones y módulos matemáticos que nos permitirán calcular la distancia entre ambos puntos; como si fuese hecho en papel.

Línea 3 - 6: se define una función en python que recibe como parámetro cuatro valores y los cuales corresponden a las coordenadas (x,y) de ambos puntos. Luego de haber sido recibidos se les aplica la fórmula matemática para calcular la distancia entre ambos puntos, esto mediante el uso de una función llamada "sqrt" de la librería "math" que nos ayuda a determinar la raíz cuadrada. Y finalmente se muestra por pantalla el valor que nos devuelve la función.

Línea 8 - 14: se pide ingresar los valores coordenados de ambos puntos para posteriormente entregarlos a la función "distancia" que nos determinará la distancia entre ellos.








Problema #2:

Crear un programa que al entregarle un arreglo "b"(cantidad) de enteros, retorne el mayor valor entre los contenidos en este (retornaría un entero), probando además su funcionamiento consultando al usuario los valores por teclado.


Explicación del código:

Línea 1: usamos la codificación "utf-8" que entre otras cosas, acepta el uso de caracteres como la "ñ" o las tildes.

Línea 2: se importa "string" de los módulos de python y que nos servirá para manejar el contenido del arreglo como caracteres.

Línea 3 - 10: se define una función llamada "max" la cual recibe un parámetro que será el arreglo con los valores ingresados por teclado. Esta misma función es la que determinará cuál de todos los elementos de dicho arreglo es el mayor, es decir, el número mayor.

Línea 12 - 20: se comienza por inicializar un arreglo que contendrá los números que se ingresen posteriormente por teclado. Luego se pide al usuario señalar cuantos elementos tendrá este arreglo (su dimensión) y los valores que se almacenarán en él. Seguidamente se traspasan todos estos valores al arreglo "b" para luego entregárselo a la función "max", la cual determinará cuál es la cantidad mayor entre las que fueron ingresadas por el usuario.








Problema #3:


Crear un programa que al entregarle un número entero "n", devuelva una matriz de dimensión "n" por "n" con números enteros ordenados. Probar su funcionamiento preguntando por teclado el parámetro a ingresar. Note que si se ingresa un 0 como valor para "n" debería mostrar un mensaje de error, y si se designa 1 como valor para este mismo dato debería crear una matriz con un solo elemento.

Ejemplo para una matriz de 4 por 4 sería:


Ejemplo para una matriz de 10 por 10 sería:




Explicación del código:

Línea 1: usamos la codificación "utf-8" que entre otras cosas, acepta el uso de caracteres como la "ñ" o las tildes.

Línea 2 - 18: se crea una función de python llamada "matriz" que recibe como parámetro el valor que determinará su dimensión, siendo además la que contiene la parte densa del programa puesto que genera los números ordenados de acuerdo al valor que sea ingresado por el usuario. 
Lo primero que se pregunta es si el valor recibido es distinto de 0, puesto que de ser así la matriz no se creará y se mostrará un mensaje de error. En caso de que dicho valor sea 1, se creará la matriz corresponde con un único elemento que será "1". Si no se cumple lo anterior y el valor recibido es cualquier otro, se diseñará la matriz correspondiente con los elementos partiendo desde el 1 hasta el valor por valor. 

Línea 20 - 24: se pide al usuario que señale la dimensión de la matriz que se quiere crear, para luego entregar dicho valor a la función "matriz". 





Reflexión:

La actividad me ha permitido implementar algunos modelos matemáticos y darles una solución simple mediante el uso de la programación. Esta herramienta es muy potente puesto que permite encontrar una salida a problemáticas bastante comunes y de distinta índole.

Durante el proceso en que he estado trabajando con el tema de la programación me he dado cuenta que es demasiado útil para desarrollar distintas tareas. Hace poco, por ejemplo, me han instruido en cómo manejar distintos tipos de elementos ya sea imágenes, vídeos, documentos, etcétera, e insertarlos dentro del conocido archivo excel. En lo  particular esta actividad ha sentado algunas bases tanto matemáticas como tecnológicas para poder continuar entregando soluciones firmes y concretas a los variados problemas del día a día, con exigencias cada vez mayores. En fin, la programación es un método de desarrollo enormemente grande e interactivo puesto que cualquier persona puede aprenderlo, y al igual que yo, puede contribuir entregando sus propias ideas y conocimiento al extenso mundo del desarrollo de la informática.


miércoles, 26 de octubre de 2016

INNER JOIN

Autor:

Rafael Fuentealba

Competencia:

Trabajo en Equipo (Nivel 1)

Asignatura:

Introducción a los Sistemas de Base de Datos



Palabras Claves:

MySql, Capítulo 8, Inner Join, Croos Join, Natural Join, Consultas base de datos, Trabajo en Equipo.




Descripción de la Actividad:

Crear una presentación grupal del capítulo 8 "Inner Join" de acuerdo a los contenidos vistos en clases y en relación a la base de datos de sus propias empresas. Respecto a ello se deberán crear las tablas con las estructuras y datos adecuados, lo que claramente requerirá de tiempo por parte de los alumnos para su ejecución. Por otro lado se deberá estudiar el tema muy a fondo ya que su complejidad y la ocasión lo requieren.



Solución:

Nuestra empresa llamada "Cultoteca" cumple con el rol de ser prestamista de libros de forma gratuita dentro de la región de la Aracucanía.


1.   Inicialmente tenemos la presentación de nuestra empresa y de sus colaboradores, que para la ocasión expondrá información y características acerca del capítulo 8 de MySql denominado "Inner Join".






2.   Se señala una introducción con los puntos claves a tratar a lo largo de la presentación.






3.   Estas son las tablas que se usaron para dar solución al problema planteado.

3.1.   La primera de ellas es la tabla llamada "clientes" que contiene información acerca de nuestros clientes y la cual contiene los siguientes campos:

-  id_cliente que es tipo INTEGER NOT NULL AUTOINCREMENT PRIMARY KEY (clave primaria), lo que quiere decir que es un dato de tipo entero que será el identificador de la información guardada para cada uno de los posibles clientes que se inserten en la tabla (filas). Además este campo tiene la particularidad de no admitir valores nulos (not null), por lo que automáticamente comenzará en 1 si no ingresa ningún dato, continuando así el llenando en la medida en que se añada nueva información.
-  Nombre_cliente es un campo de tipo varchar o cadena que contendrá el nombre de cada uno de los clientes de nuestra empresa.
-  Apellido_cliente también es un campo de tipo varchar que contiene el apellido de los clientes.
-  Ciudad es un campo de tipo varchar que claramente almacena la ciudad en la que viven nuestros clientes
-  Calle de igual forma es de tipo varchar y almacena la calle en donde vive cada uno de los clientes.


3.2.   La segunda tabla la denominamos "libros" y contiene la información acerca de los libros que tenemos para prestar el servicio. Esta tabla posee la siguiente estructura:

-  ISBN_libro que es un campo de tipo INTEGER NOT NULL AUTOINCREMENT PRIMARY KEY (clave primaria de esta tabla) siendo este el identificador de cada libro que se tiene en el registro. Este campo posee exactamente las mismas cualidades que la Primary Key de la tabla  "clientes".
-  Nombre_libro es un campo de tipo varchar o cadena que contiene el nombre de los libros presentes en nuestra empresa
-  Editorial es un campo de tipo varchar que almacena la editorial de la que proviene cada libro que está en nuestros registros.
-  Area también es un campo de tipo varchar y que hace relación al área a la que pertenece cada uno de los libros, ya sea de ciencias, humanidades, infantiles, artes, investigación, etcétera. 



3.3.   En tercer lugar tenemos la tabla llamada "personal" que almacena información más privada de nuestros clientes y la cual posee la siguiente estructura:

-  id_c es un campo de tipo INTEGER NOT NULL AUTOINCREMENT PRIMARY KEY, el cual es el identificador de todos y cada uno de nuestros clientes y que está estrechamente relacionada con la tabla #1 "clientes".
-  MesNacimiento es de tipo integer y contiene el mes de nacimiento de cada cliente.
-  AñoNacimiento también es de tipo integer y almacena el año en que nació el cliente.
-  Sexo es un campo de ENUM lo que quiere decir que posee un número limitado de opciones asemejándose a una lista. En este caso, el campo sexo permite escoger una de dos opciones y que son: masculino o femenino.


3.4.   Por último tenemos la tabla "prestamos" que única y exclusivamente contiene dos campos:

-  El primer campo es id_cliente el cual contiene el identificador de la tabla "clientes".
-  Y el segundo campo es ISBN_libro que hace relación con el identificador o primary key de la tabla "libros".






4.   Aquí abordaremos el primero de nuestros objetivos de la presentación y el cual corresponde al "CROOS JOIN". Para ello utilizaremos la tabla "clientes" y la tabla "libros".



Realizamos la consulta en MySql y en donde selecciono las tablas a relacionar que son "clientes" y "libros". Posterior a esto podemos entender que Croos Join hace una relación del nombre de todos los clientes con el nombre de todos los libros, es decir aquí no existe una relación directa entre ellos, sino que se realiza una mezcla con todas las posibilidades y combinaciones de los datos datos seleccionados de ambas tablas.






5.   Ahora pasamos a revisar el "Inner Join". 
Posterior a hacer la consulta en MySql en donde selecciono relacionar las tablas "clientes" y "libros", podemos ver que este método realiza una unión muy estrecha entre estas mismas, puesto que como condición hemos decidido que solo seleccione aquellos datos en donde el valor id_cliente sea exactamente el mismo que ISBN_libro, sino cumple esta condición entonces no serán listados en la consulta.






6.   Pasamos a revisaron la utilidad de "Inner Join y On".
Como ya revisamos anteriormente la sentencia INNER JOIN lista solo aquellos datos de ambas tablas en donde únicamente se presente la condición de nuestra consulta, a diferencia de CROSS JOIN que lista una mezcla de todos los registros de las tablas relacionadas. 

Lo que ahora veremos es la funcionalidad y la forma en que se utilizan INNER JOIN y ON.

Primero debemos realizar la consulta en la base de datos de nuestra empresa recordando usar el comando "ON". Posterior a esto podemos darnos cuenta de que INNER JOIN + ON nos entrega un listado de todos los datos que seleccionamos al unir las dos tablas en cuestión, que son "clientes" y "personal". 

Debido a esto es posible entender que ON nos entrega el resultado mediante la unión de las 2 claves primarias que son llamadas de manera distinta en una y otra tabla. En "clientes" la primary key se llama "id_cliente" y en la tabla "personas" se llama "id_c", pero hacen relación a exactamente la misma información.






7.   Lo que sigue es la relación entre INNER JOIN y USING.
Primero realizaremos la debida consulta a la base de datos así como se muestra más abajo. 

Con INNER JOIN hacemos la relación entre las tablas que queremos trabajar, que este caso son "clientes" y "prestamos". Utilizo USING para poder señalar el campo mediante el cual quiero unir ambas tablas y que es "id_cliente". Este campo (que es igual en una y en la otra tabla) se llama de la misma forma y hace referencia a la misma información, por lo que la consulta se realizará con éxito.



7.1.   Realizaremos otro ejemplo con INNER JOIN y USING pero esta vez agregaremos una nueva condición:

Uniremos las tablas "clientes" y "prestamos" mediante INNER JOIN y utilizaremos USING para unirlas por medio del campo "id_cliente" que se llama igual y hace relación a la misma información en ambas tablas. Por último, sólo listaremos aquellos clientes que cumplan con lo propuesto anteriormente y cuyo nombre sea "Juanito" (que es lo que impone la condición WHERE).






8.   Continuamos revisando ahora el NATURAL JOIN.

Este es uno de los métodos de unión más sencillos puesto que sólo lista la información de las tablas en juego que tengan campos del mismo nombre.

Para este caso nosotros utilizamos las tablas "clientes" y "prestamos" que tienen en común el campo llamado "id_cliente". En consecuencia unificará la información que contengan ambas tablas en una sola.






9.   Por último nos queda el uso de más de un JOIN.

Tenemos que realizar la consulta seleccionando las tablas que vamos a unir y que son "prestamos", "clientes" y "libros".

Primero unificaremos la tabla "prestamos" con la tabla "clientes" mediante un USING que tomará como referencia el campo "id_cliente" (en ambas tablas se llama id_cliente por eso utilizo using). Posteriormente ejecuto la otra unión con la tabla "libros" mediante otro USING que tomará como base el campo "ISBN_libro". Y por último utilizaré ORDER BY para ordenar la consulta utilizando el campo "Nombre_libro" (ordenará la tabla en orden alfabético con respecto al nombre del libro).






10.   Finalmente cerramos el tema destacando algunos de los puntos más importantes con respecto a la presentación del capítulo 8 "INNER JOIN".







Reflexión:

Inicialmente en el curso se nos pidió formar grupos donde debíamos crear una empresa propia que cumpliera con la funcionalidad de prestar algún servicio a la comunidad. Por ello mismo es como nace el grupo de "Engineers Pro" quienes dan inicio a "Cultoteca", una empresa que hace distribución de libros de forma gratuita dentro de la región de la Araucanía.

Uno de los principales logros que ha dejado la actividad es el desarrollo de la habilidad de trabajo en equipo. Esta fue una de las últimas que se presentó y la cual contempla la refinación de todos aquellos detalles y dificultades que como grupo de trabajo tuvimos a lo largo del proceso. 

La forma en que comenzó desarrollándose este tipo de actividades no fue la más correctas. Si bien la distribución del trabajo era equitativa, nos fuimos percatando de que aplicar las ideas en conjunto era mucho más simple y eficiente, además de que traía consigo una serie de otros beneficios como ahorrar tiempo en opinar, implementar dichas opiniones, decidir qué es lo que realmente se presentaría, revisar y corregir errores, y por sobretodo aprender en conjunto de todas aquellas dudas que fuesen surgiendo con el trabajo para poder obtener un buen resultado.


viernes, 7 de octubre de 2016

JUEGO DEL GATO

Autor:

Rafael Fuentealba

Competencia:

Desarrollo de Software (Nivel 1)

Asignatura:

Desarrollo de Aplicaciones Cliente Servidor



Palabras Claves:

Gato, html, CSS, JavaScript, Funciones, Validaciones



Descripción de la Actividad:

Elaborar un juego de libre disposición utilizando lenguaje web como HTML y JavaScript, con el objetivo de poner énfasis en la funcionalidad de estos mismos y aplicar el desarrollo de software de estructura sencilla. 


Para la ocasión he realizado el juego conocido como "Gato" que posiblemente conozcas y con el cual hayas interactuado en algún momento. Este consiste en una matriz (cuadrado) que se subdivide en 9 casillas, generalmente del mismo tamaño, en donde debes de ir seleccionando una posición para tu figura correspondiente que puede ser "O" o "X". 

La idea del juego es que completes un total de tres figuras iguales en la misma dirección, ya sea de forma horizontal, vertical o diagonal.
El sistema del juego va en turnos, lo que quiere decir que si tú escogiste una posición para tu figura en una determinada casilla, la siguiente figura la pondrá tu oponente en la casilla que él quiera. Quien complete primero sus tres figuras continuas en las direcciones ya mencionadas será el ganador.

Respecto al juego creado mediante el uso de las herramientas mencionadas se puede decir que es interactivo porque dos personas juegan a la vez dentro de la misma computadora. Además necesariamente requiere de una conexión a la internet puesto que es un página web como cualquier otra. 
Por otro lado, te debo mencionar que aún cumplido esto anterior no te será posible ejecutar el juego en su totalidad porque existen archivos extras que debes tener en tu directorio de trabajo, y que corresponden a las imágenes que yo voy a usar dentro del código html. Para dar solución al problema sólo debes descargar desde tu navegador dos imágenes: 


1.- La primera será una imagen que posea una figura de "X",como la de aquí abajo, y la cual deberás guardar en la misma carpeta o directorio donde dejes el archivo html. El nombre que debes colocar al guardar la imagen tiene que ser: "x.png" (x minúscula). Importante es el formato; tiene que ser una imagen png. 






2.- La segunda será una imagen con la figura "O", la que deberás guardar en el misma carpeta o directorio donde se encuentre la imagen anterior y el archivo html. Al guardar tendrá que ser así: "0.png", con el mismo formato que la imagen de arriba.



Solución:

Diseñar el juego conocido como "Gato", donde interactuan dos jugadores (X y O)

CÓDIGO HTML:

<html>
<head>        
<meta charset="UTF-8"> 
<title>Juego del Gato</title>
  <style>
.cuadro {
width:70px;
height:70px;
border:solid 10px;
float:left;
font-size:25px;
text-align:center;
}

#div_contenedor {
width:240px;
margin:auto;
}

</style>


<script>
var turno1 = "X";
var turno2 = "O";
var flag = 1;
var ban = false;
var casilla = [1,2,3,4,5,6,7,8,9];

function marcar(id){
var celda = document.getElementById(id);
if(flag%2!=0 && casilla[id]!=0){
celda.value = turno1;
document.getElementById("div_turno").innerHTML="Turno del jugador : "+turno2;celda.style.background="lightblue";
casilla[id] = 1;
}else if(flag%2==0 && casilla[id]!=1){
celda.value = turno2;
document.getElementById("div_turno").innerHTML="Turno del jugador : "+turno1;celda.style.background="lightgreen";
casilla[id] = 0;
}
flag++;
jugadorX();
jugadorO();
}

function jugadorX()
{

if(casilla[1]==1 && casilla[2]==1 && casilla[3]==1)
{
alert("Jugador " +turno1+ " Gana");
}
else if(casilla[4]==1 && casilla[5]==1 && casilla[6]==1)
{
alert("Jugador " +turno1+ " Gana");
}
else if(casilla[7]==1 && casilla[8]==1 && casilla[9]==1)
{
alert("Jugador " +turno1+ " Gana");
}
else if(casilla[1]==1 && casilla[5]==1 && casilla[9]==1)
{
alert("Jugador " +turno1+ " Gana");
}
else if(casilla[3]==1 && casilla[5]==1 && casilla[7]==1)
{
alert("Jugador " +turno1+ " Gana");
}
else if(casilla[1]==1 && casilla[4]==1 && casilla[7]==1)
{
alert("Jugador " +turno1+ " Gana");
}
else if(casilla[2]==1 && casilla[5]==1 && casilla[8]==1)
{
alert("Jugador " +turno1+ " Gana");
}
else if(casilla[3]==1 && casilla[6]==1 && casilla[9]==1)
{
alert("Jugador " +turno1+ " Gana");
}
      }
             
        function jugadorO()
        {
if(casilla[1]==0 && casilla[2]==0 && casilla[3]==0)
{
alert("Jugador " +turno2+ " Gana");
}
else if(casilla[4]==0 && casilla[5]==0 && casilla[6]==0)
{
alert("Jugador " +turno2+ " Gana");
}
else if(casilla[7]==0 && casilla[8]==0 && casilla[9]==0)
{
alert("Jugador " +turno2+ " Gana");
}
else if(casilla[1]==0 && casilla[5]==0 && casilla[9]==0)
{
alert("Jugador " +turno2+ " Gana");
}
else if(casilla[3]==0 && casilla[5]==0 && casilla[7]==0)
{
alert("Jugador " +turno2+ " Gana");
}
else if(casilla[1]==0 && casilla[4]==0 && casilla[7]==0)
{
alert("Jugador " +turno2+ " Gana");
}
else if(casilla[2]==0 && casilla[5]==0 && casilla[8]==0)
{
alert("Jugador " +turno2+ " Gana");
}
else if(casilla[3]==0 && casilla[6]==0 && casilla[9]==0)
{
alert("Jugador " +turno2+ " Gana");
}
        }
                
      function reiniciaJuego()
      {
          location.reload();
  }

</script>

</head>    
<body bgcolor="yellow">
<h1 id="div_instructions">Instrucciones de juego:</h1>
<ul>
<li>Para iniciar el juego solo se admiten dos jugadores:</li>
<li>Cuando el primer jugador realice el primer click se iniciará el juego</li>
<li>Para poder ganar el jugador deberá completar de manera secuencial 3 cuadros con su figura correspondiente (X ó O)</li>
<li>Si el jugador realiza un movimiento y no ha logrado ganar la partida, se cede el turno al otro jugador</li>
<li>Una vez que un jugador complete las 3 figuras de forma secuencial, se mostrará un mensaje indicando esto</li>
<li>Si el tablero se ha completado sin haber un ganador, se enviará un mensaje indicando esta situación</li>
<li>Para volver a jugar solo debe hacer click sobre el botón <strong>"Reiniciar juego"</strong></li>
</ul>

<!-- Tablero -->
<div id="div_contenedor">
<input type="text" class="cuadro" id="1" readonly onclick="marcar(id)">
<input type="text" class="cuadro" id="2" readonly onclick="marcar(id)">
<input type="text" class="cuadro" id="3" readonly onclick="marcar(id)">
<input type="text" class="cuadro" id="4" readonly onclick="marcar(id)">
<input type="text" class="cuadro" id="5" readonly onclick="marcar(id)">
<input type="text" class="cuadro" id="6" readonly onclick="marcar(id)">
<input type="text" class="cuadro" id="7" readonly onclick="marcar(id)">
<input type="text" class="cuadro" id="8" readonly onclick="marcar(id)">
<input type="text" class="cuadro" id="9" readonly onclick="marcar(id)">

<div id="div_turno">Turno del jugador: X</div>
<button onclick="reiniciaJuego()">Reiniciar Juego</button>
</div>

</body>

</html>


Reflexión:

Esta actividad me ha permitido desarrollar los conocimientos instruidos por el profesor en las horas de cátedra, y en específico me ha permitido avanzar para lograr concluir con la competencia de Desarrollo de Software. Esto porque se implementan herramientas que configuran la relación entre el ser humano y la máquina, que puede ser el programa o el archivo que se esté trabajando. Importante es lo último que menciono porque hoy en la actualidad la mayoría de las actividades, por no decir todas, se basan en la comunicación existente entre lo tecnológico y el hombre quien prácticamente utiliza al máximo las herramientas que se le disponen para trabajar en su entorno.

Así como esta actividad, hay algunas otras que me han instruido en el uso de nuevos lenguajes como los que he presentado aquí, siendo html o JavaScript. Estos métodos son realmente útiles para crear servicios que correspondan y satisfagan a las necesidades del usuario, y las cuales son cada día más exigentes debido a la enorme competencia entre quienes los proporcionan. Por ello es tan necesaria la práctica y la adaptación a los recursos que se nos proporcionan, aprovechándolos al máximo con la finalidad de crear algo nuevo que supere a lo ya establecido y que no nos deje en la obsolescencia.



COMANDOS TERMINAL DE GNU/Linux

Autor:

Rafael Fuentealba

Competencia:

Gestión en Tecnologías de Información (Nivel 1)

Asignatura:

Mantención y Administración de Sistemas



Palabras Claves:

GNU/Linux, comandos, terminal, servidor pillan.



Descripción de la Actividad:

Desarrollar una serie de instrucciones dadas por el profesor y trabajarlos en una terminal de Linux. Para ello se debe implementar todos los conocimientos adquiridos en las sesiones de cátedra y los ejemplos citados en dichas instancias.


La actividad envuelve la ejecución de algunas instrucciones, para ello hay que abrir un intérprete de comandos en GNU/Linux y realizar lo siguiente: 

1. Ingresar por ssh a su cuenta del pillan.inf.uct.cl
2. Copiar los usuarios conectados al sistema en un archivo llamado "usuarios.txt"
3. Salir de la cuenta pillan
4. Comprobar que este en su directorio de usuario ($HOME)
5. Copiar con scp el archivo "usuarios.txt" de su cuenta pillan en su directorio de usuario
6. Crear un directorio "pruebas"
7. Mover al directorio pruebas el archivo "usuarios.txt"
8. Cambiarse al directorio "pruebas"
9. Crear un archivo que contenga un resumen de los módulos o drivers que están instalados en el Ubuntu Linux
10. Crear un archivo que contenga una lista de los dispositivos PCI del computador con        ubuntu
11. Juntar los dos archivos anteriores en uno solo llamado "modulosypci.txt"
12. Crea un archivo vacío "mipasswd"
13. Copia el contenido de /etc/passwd en el archivo vacío con cat
14. Denegar atributos de lectura, escritura, y ejecución al grupo y los otros en el directorio "pruebas"
15. Crear un archivo que contenga todas las variables del entorno
16. Renombrar el directorio "pruebas" como "tareas"
17. Ingresar al directorio tareas y copiar la hora del sistema en un archivo llamando "fecha.txt"
18. Renombrar el archivo "fecha.txt" como "fechayhora.txt"
19. Agregar al archivo "fechayhora.txt" la lista de archivos del directorio /etc con sus tamaños y atributos
20. Otorgar permisos de lectura solo al usuario y rechazar todos los permisos al grupo y otros al archivo "fechayhora.txt"
21. Crear un archivo con todos los comandos realizados secuencialmente con el nombre "comandos.txt"
22. Retroceder al directorio $HOME, concatenar y comprimir el contenido del directorio tareas con el comando: tar czfv 'whoami'.tar.gz tareas/
23. Enviar al moodle el archivo creado con el comando tar



Solución:

1.- Ingresar por ssh a su cuenta del pillan.inf.uct.cl:
ssh rfuentealba@pillan.inf.uct.cl 
Te pedirá una password que es el rut sin puntos, sin guión ni dígito verificador.

2.- Copiar los usuarios conectados al sistema en un archivo llamado "usuarios.txt":
touch usuarios.txt (crea el archivo de texto)
who > usuarios.txt (envía lista de usuarios al archivo)

3.- Salir de la cuenta pillan:
exit

4.- Comprobar que este en su directorio de usuario ($HOME):
cd home

5.- Copiar con scp el archivo "usuarios.txt" de su cuenta pillan en su directorio de usuario:
scp rfuentealba@pillan.inf.uct.cl:~/usuarios.txt . (importante el punto al final)

6.- Crear un directorio "pruebas":
mkdir pruebas

7.- Mover al directorio pruebas el archivo "usuarios.txt":
mv usuarios.txt pruebas

8.- Cambiarse al directorio "pruebas":
cd pruebas

9.- Crear un archivo que contenga un resumen de los módulos o drivers que están instalados en el Ubuntu Linux:
lsmod > modulosydrivers.txt

10.- Crear un archivo que contenga una lista de los dispositivos PCI del computador con        ubuntu:
lspci > dispositivosPci.txt

11.- Juntar los dos archivos anteriores en uno solo llamado "modulosypci.txt":
cat modulosdrivers.txt dispositivosPci.txt >> modulosypci.txt

12.- Crea un archivo vacío "mipasswd":
touch mipasswd

13.- Copia el contenido de /etc/passwd en el archivo vacío con cat:
cat /etc/passwd > mipasswd

14.- Denegar atributos de lectura, escritura, y ejecución al grupo y los otros en el directorio "pruebas":
chmod g-wrx-o-wrx pruebas

15.- Crear un archivo que contenga todas las variables del entorno:
touch variables
history > variables

16.- Renombrar el directorio "pruebas" como "tareas":
mv pruebas tareas

17.- Ingresar al directorio tareas y copiar la hora del sistema en un archivo llamando "fecha.txt":
cd tareas 
touch fecha.txt
date > fecha.txt

18.- Renombrar el archivo "fecha.txt" como "fechayhora.txt":
mv fecha.txt fechayhora.txt

19.- Agregar al archivo "fechayhora.txt" la lista de archivos del directorio /etc con sus tamaños y atributos:
ls -lh /etc >> fechayhora.txt

20.- Otorgar permisos de lectura solo al usuario y rechazar todos los permisos al grupo y otros al archivo "fechayhora.txt":
u+r-g-rwx-o-rwx fechayhora.txt

21.- Crear un archivo con todos los comandos realizados secuencialmente con el nombre "comandos.txt":
touch comandos.txt
history > comandos.txt

22.- Retroceder al directorio $HOME, concatenar y comprimir el contenido del directorio tareas con el comando: tar czfv 'whoami'.tar.gz tareas/
cd .. 
tar czfv 'whoami'.tar.gz tareas/

23.- Enviar al moodle el archivo creado con el comando tar
El moodle es la plataforma educa, donde debes enviar el archivo comprimido que se ha creado con el último comando ingresado




ARCHIVOS GENERADOS POSTERIOR AL PROCESO:

Este es el directorio $HOME en donde se encuentra el archivo comprimido whoami.tar.gz que se generó una vez terminada la actividad:



Dentro de este archivo comprimido se encuentra la carpeta "tareas" que en un inicio se llamaba "pruebas":




Al revisar lo que contiene el archivo "tareas" se puede apreciar que dentro están todos los archivos .txt que se crearon, modificaron, y movieron durante el proceso:




Si revisamos el archivo de texto "comandos.txt" podemos darnos cuenta de que dentro están todas las sentencias que se utilizaron para continuar avanzando en el proceso, ya sean sentencias asertivas o aquellas en las que se cometieron errores al digitarlas:




Este es otro de los archivos de texto creado, al que nombramos como "dispositivosPci.txt" y el cual contiene la información acerca de los dispositivos presentes en nuestra computadora:




Aquí tenemos el archivo de texto "modulosDrivers.txt" que también fue creado durante el desarrollo de la actividad:




Este es el archivo "modulosypci.txt" que también fue creado durante el proceso y el cual contiene la información tanto del archivo "modulosydrivers.txt" como del archivo "dispositivosPci.txt":




Aquí tenemos el archivo "passwd":




Y finalmente tenemos el archivo "usuarios.txt" que contiene la información de todos aquellos usuarios que estaban conectados al servidor de pillan al momento en que ingresamos a este:





Reflexión:

Esta actividad ha sido de gran utilidad para continuar avanzando y estudiando la extensa variedad de comandos que incluyen las distintas distribuciones de GNU/Linux. Mencionar además que es de enorme utilidad poseer conocimiento del uso de esta herramienta (terminal), ya que con esta se puede hacer prácticamente las mismas acciones que las que de manera usual se realizan en el entorno gráfico, que es más sofisticado y elegante para el usuario.

Otro de los nuevos aprendizajes que me deja el desarrollo de la actividad es la conexión al servidor pillan mediante el terminal; pese a que anteriormente lo había hecho de una forma más tradicional. Causa gran impresión el saber que existe esta herramienta y más aún el poder trabajar en ella. Puedo decir que usar la terminal es mucho más organizado, estructurado y correcto ya que te da señales de alerta sobre los errores que estés cometiendo al actuar sobre un archivo, o bien realizar alguna acción que puede ser peligrosa y dañe tu fuente de trabajo (computadora).