# Plataforma informativa de tareas

## Normas para la entrega de tareas

Las tareas serán entregadas vía git usando el repositorio que facilita los servidores de informática (vea como crear un repositorio y configurarlo). Para saber los criterios de evaluación, lea la página Criterios de Evaluación.

Si el enunciado de la tarea no indica qué entregar, entonces los archivos que deben venir en tu entrega incluyen: readme.txt, una documentación simple, makefile, y archivos fuente.

- readme.txt Este archivo explica los archivos de que se compone la tarea, cómo compilarlo (si requiere algo especial, como bibliotecas aparte por ejemplo), y cómo ejecutarlo, de tal forma que un usuario que no tenga conocimientos avanzados de programación pueda observar el funcionamiento de su código. De ser necesario, otras cosas pueden ser agregadas para dar completitud a la tarea.
- Documentación Ésta debe incluir un diagrama de alto nivel explicando los módulos e interacción entre ellos. Debes incluir la información que estimes importante para entender tu solución. Normalmente la documentación tiene un alto peso en la nota de la tarea. Por favor no omitir este ítem.
- Makefile Este archivo nos permitirá compilar todos los módulos de la tarea, de modo que al ejecutar el comando make en la carpeta de la tarea entregada, todos los archivos sean compilados y la tarea se encuentre lista para ser ejecutada.
- Archivos fuente (.c .cpp .java), de encabezado (.h) y otros El código debe encontrarse agradable estéticamente (espacios bien puestos y bien identado) Además, se hace hincapié en que en el código, el nombre de cada variable y función den suficientes pistas como para saber qué hacen. También se debe comentar para clarificar mejor su funcionamiento.
- ¡No incluir ningún archivo ejecutable! Todos los ejecutables necesarios serán compilados usando el Makefile.

Norma de atrasos: Se efectuará un descuento de 5 puntos por día (incluyendo sábados, domingos y feriados)

## Procedimiento para entregar tareas

Las credenciales para ingresar al sitio les han sido entregadas vía e-mail. Cuando entren por primera vez, deben generar una contraseña usando un enlace proporcionado en el mismo correo. Procuren anotarla en un lugar seguro, será necesaria para crear y administrar sus repositorios!

Una vez allí, se debe crear un repositorio en los servidores de Electrónica con nombre alusivo al número de tarea y al ramo.

El repositorio debe tener como colaborador a los ayudantes del ramo (Paralelo N°1 : jesus.marquez.12 - Paralelo N°2 : nicolas.olivos).

El título del repositorio creado para cada tarea debe cumplir con el siguiente formato:
apellido_alumno_1.nombre_alumno1 - apellido_alumno_2.nombre_alumno2 - apellido_alumno_3.nombre_alumno3 - Tarea N°X.
Esto permitirá al ayudante corregir de forma más expedita sus tareas.

Los archivos de la tarea deben estar subidos en el branch principal ("master"). Al realizar la ultima publicación, agregar tag "Final" al commit y realizar push con opción de tags habilitada:

$ git commit -m "This is a Final commit"
$ git tag Final
$ git push origin master --tags

La revisión de la hora/fecha de entrega se realizará con respecto al último commit del tag "Final".

Si tienen problemas usando GIT, pueden ver una pequeña referencia en el apartado Ayuda GIT.

### Importante

Los repositorios deben ser privados, ver ultima sección de Crear repositorio GIT

## Criterios de evaluación de tareas

Las tareas serán evaluadas siguiendo los siguientes criterios:

- 10% Si los programas compilan sin errores ni warnings. En caso de que compile con errores pequeños se aclarará con el o los alumnos para encontrar alguna solución, siendo éstos responsables de responder oportunamente. Si los errores son difíciles de corregir, la parte de programación se evaluará con un cero.
- 60% Que el programa cumpla plenamente con la tarea solicitada.
- 30% Documentación

### ¿Qué poner en la documentación?

- Un diagrama de alto nivel explicando los módulos e interacción entre ellos.
- Incluir la información que usted estime importante para entender su solución.
- Además el código debe estar medianamente comentado.
- Indicar qué uso tiene cada variable importante de su solución (simples enteros para controlar una iteración no requieren explicación, pero un arreglo de descriptores de archivo debería estar documentado).

Un código bien comentado, identado y autoexplicativo puede ahorrar escribir mucha documentación aparte. Se recomienda nombrar las variables de forma inteligente para hacer el código mucho más entendible tanto para ti como para el ayudante.

Ojo: El buen cumplimiento del procedimiento de entrega también es evaluado como parte de la documentación.

## Crear y configurar un repositorio en servidores de Electrónica.

### ¿Por qué GIT?

La razón por la que se pide usar GIT es que permite tener un control de versiones. Es decir, si tienes un grupo de trabajo trabajando en distintos computadores, y quizás en muchas partes del mundo, como ocurre en muchísimos proyectos de código abierto se necesita tener control sobre el código de los proyectos.

- Algún desarrollador haga algún aporte, y el resto del grupo decida si este aporte se convertirá en código definitivo para el programa.
- Si alguien modifica una parte sensible del código, haciendo que el resto no funcione, se pueda volver atrás fácilmente.
- Se lleve un comentario aparte sobre qué modificaciones necesita cada archivo (un TODO: to-do, "por hacer")
- Algún no-desarrollador quiera obtener la última versión del código fuente para compilarlo y usarlo en su propio computador; colaborando en probar el programa.

### Instalando GIT

#### En Linux:

$ apt-get install git

Las instrucciones asumen que tienes instalada una distribución tipo Debian (como Ubuntu o Linux Mint). Dependiendo de cuál sea tu distribución de Linux el manejador de paquetes puede variar. Por ejemplo, en el caso de que uses Arch Linux, debes cambiar apt-get install por pacman -S

#### En Windows:

Descarga e instala el programa: http://git-scm.com/download/win

En Linux simplemente debes abrir la consola. En Windows debes abrir la consola GIT que puedes encontrar en Start > All Programs > Git > Git Bash. El resto de operaciones son idénticas entre las versiones de GIT de ambos sistemas operativos.

Primero debes indicarle a GIT tu nombre y correo. Eso se hace con los siguientes comandos (omitir signo $):

$ git config --global user.name "FIRST_NAME LAST_NAME"
$ git config --global user.email "MY_NAME@example.com"

### Creando un repositorio el servidor de electrónica.

Todo alumno del ramo posee un usuario y contraseña en los servidores GIT de electrónica. Cada alumno debe tener en su poder, en su correo institucional, las credenciales para entrar al sitio. Lo primero que se necesita para manejar los repositorios es crear una contraseña de usuario, para lo cual se proporcionó en el mismo correo un link que permite hacerlo.

Para crear un repositorio se debe primero configurar una conexión segura con el servidor de electrónica. Para eso debe generarse un par de llaves RSA (una llave privada y una llave pública) que asegurará que la comunicación con el servidor será confiable. Para curiosidades, se pueden encontrar mayores detalles sobre el cifrado RSA aquí.

$ ssh-keygen -t rsa -C "correo_institucional@[...].usm.cl"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa): deje en blanco
Enter passphrase (empty for no passphrase): deje en blanco
Enter same passphrase again: deje en blanco
Your identification has been saved in /home/user/.ssh/id_rsa
Your public key has been saved in /home/user/.ssh/id_rsa.pub.
The key fingerprint is:
XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX
Luego, en el servidor se debe debe conocer tu llave pública que se encuentra en el archivo .pub generado en la carpeta /home/user/.ssh/id_rsa si dejaste todo en blanco.
$ cat ~/.ssh/id_rsa.pubm
[Copiar todo el resultado]
Entrar al servidor de electrónica, logearse e ir a "Profile Settings" (Parte superior derecha de tu dashboard), luego "Manage SSH keys" (menu parte izquierda), click en "add key", debes pegar el contenido del archivo público generado (el resultado de dicho comando cat) y apretar "Add Key". Ahora sí se puede crear el repositorio. En el terminal, si es primera vez que usa GIT, será necesario que proporcione información que lo pueda identificar. En el terminal, si es primera vez que usa GIT, será necesario que proporcione información que lo pueda identificar.
git config --global user.name "Nombre de usted"
git config --global user.email "cuenta de correo electronico suyo"

### Creando un repositorio

En la plataforma web de electrónica dirigirse al dashboard y elegir la opción "Create a new project" y llenar la información que se requiere.

### Configurando el repositorio

Una vez listo el paso anterior se le presentará información para configurar el git. Cree localmente una carpeta en donde contendrá el proyecto, un archivo README, y en ella ejecute los siguientes comandos:

$ git init
$ git remote add origin git@git.elo.utfsm.cl:[Nombre_cuenta]/[Nombre_repositorio].git
$ git add .
$ git commit -m "Primer commit"
$ git push origin master

### Ejemplo ilustrativo

Suponga usted que recién ha creado un repositorio llamado tareaElo vacío aún, entonces usted desea subir su avance. Su terminal se encuentra en la carpeta donde tiene los archivos a subir. Los pasos a seguir son: inicializar git en su carpeta local, agregar todos los archivos de interés a su repositorio git local y agregar el git remoto a su git local para posteriormente poder subir los datos allí.

#### Inicializar repositorio git en su carpeta local

$ git init

#### Agregar todos los archivos de interés a su repositorio git local. Note que

$ git add .
$ git commit -m "commit inicial."

#### Agregar el git remoto a su git local

$ git add origin master

#### Subir los datos al repositorio correspondiente en Electrónica (al cual se le realizó el git remote add origin)

$ git push

Observación: dependiendo de su versión de git puede ser que requiera hacer mas configuraciones a su git, pero en ese caso al intentar hacer el push el mismo software le indicará qué debe configurar y le explicará correctamente, usted es capaz con esa información de tomar las decisiones que desee.

Si tienes dudas, puedes consultar una referencia ilustrada del proceso de creación de cuentas y repositorios en este archivo.

## Privatizar repositorio [Obligatorio]

Usted debe privatizar su repositorio, en caso de que exista copia todos los grupos involucrados serán culpables de la copia dado que o permitieron o copiaron siendo que no debería darse la oportunidad. para hacer su repositorio privado usted debe ir a dashboard elegir el repositorio dentro del menu your projects y finalmente en el menu de la derecha entrar a "manage access" y apretar en make private. Ahí mismo usted debe agregar las ids de sus compañeros de grupo para que puedan trabajar en equipo y la del ayudante (oscar.tapiab) para que pueda calificarlos.

## Operaciones comunes para usar en GIT

La secuencia que debemos seguir en GIT es el siguiente:

1. Clonar o crear un repositorio localmente.

- Para Crear un repositorio localmente, debes ir al directorio principal de la tarea, y ejecutar ahí los comandos git init y git add .
cd carpeta/de/la/tarea
git init
git add .

Con init, inicializas la carpeta para que GIT pueda reconocer la información del proyecto. Con add . agregas todos los archivos que tiene la carpeta actual al repositorio. (debes usar git add cada vez que crees un nuevo archivo para indicarle a GIT que estás incluyendo un nuevo archivo al repositorio)

- Para clonar un repositorio, debes copiar un link que se proporciona en el sitio web del proyecto. Con eso puedes descargar todo el código fuente del proyecto. Por ejemplo, para descargar OpenCV debes usar:
git clone https://github.com/Itseez/opencv.git

2. Asociar la carpeta recién creada a tu repositorio creado en GitHub.

- En el sitio de GitHub de tu repositorio debe contener el link de tu proyecto. Debes asociarlo al branch principal del proyecto.
git remote add origin https://github.com/VirusRushTheater/elo330_tarea2.git

3. Realizar los cambios necesarios a los archivos necesarios.

- Agregas archivos al repositorio usando el comando:
git add [archivo]
Puedes usar un punto (.) en lugar de [archivo] para incluir todos los archivos del directorio actual.
- Borras archivos del repositorio usando el comando:
git rm [archivo]

4. Hacer un commit: guardar los últimos cambios hechos al código en tu repositorio. Si quieres puedes agregar un comentario detallando los cambios generales que le hiciste a los archivos.
git commit -m [Comentario]
5. Enviar los cambios al servidor. Debes detallar a qué branch los quieres enviar. En este caso, lo haremos al branch origin.
git push -u origin master

Una Cheat Sheet con las operaciones principales en GIT.

## Trabajo remoto con Aragorn

Se explicará cómo conectarse a Aragorn desde un computador con sistema operativo Windows o con sistema opertaivo Linux. Además se explicárá como visualizar en pantalla las ejecuciones de aragorn a través de un servidor X.

Aragorn es el nombre del servidor para los alumnos de electrónica/telemática. Para trabajar en Aragorn, deben utilizarse programas de conexión SSH / SFTP. El método de conexión con Aragorn depende del sistema operativo que tengas instalado en tu computador.

El Kernel y versión instalada de Linux en Aragorn son:
Linux Aragorn 3.2.0-4-amd64 #1 SMP Debian 3.2.60-1+deb7u3 x86_64 GNU/Linux

### Windows

En caso de Windows el cliente SSH como el servidor X no vienen instalados por defecto, por lo cual es necesario instalar software externo. El software que se explicará para los usuarios Windows es el mobaxterm que es de muy fácil uso y además tiene una versión portable.

Primero debes descargar la versión probada desde aquí.
Puedes encontrar la ultima versión del software a través de su página web.

Debes ejecutar el ejecutable que esta dentro del .zip, al ejecutarlo se abrirá una pantalla en la que por un lado se verá una consola de comandos, en la cual podrás ejecutar el comando ssh con la siguiente sintaxis:

$ ssh nombre.apellido@aragorn.elo.utfsm.cl
Mobaxterm incluye tanto el cliente ssh como el servidor X por defecto. Puedes probar abrir un editor gráfico de texto llamado gedit, usando el siguiente comando (una vez logeado dentro de Aragorn).
$ gedit

Con las instrucciones anteriores debería aparecer una pantalla con gedit abierto listo para usar, ejecutándose remotamente desde Aragorn y simplemente la ves a través de una "ventana": su servidor X.

### Linux

La mayoría de las distribuciones de Linux incluyen un cliente SSH preinstalado, de modo que no se hace necesario instalar software extra. Para conectarse a Aragorn vía SSH basta simplemente ejecutar el comando ssh en consola con la siguente estructura:
$ ssh nombre.apellido@aragorn.elo.utfsm.cl

Para activar el servidor X en la conexión SSH y así poder visualizar, por ejemplo, un editor de texto como gedit debes agregar el flag -X a la ejecución del comando ssh, como se muestra a continuación.

$ ssh -X nombre.apellido@aragorn.elo.utfsm.cl
$ gedit

Con las instrucciones anteriores debería aparecer una pantalla con el gedit abierto listo para usar pero que realmente está siendo ejecutada desde aragorn y usted la ve a través de su servidor X.

### Copiar archivos desde y hacia Aragorn usando SCP

En el caso de que prefieras editar los archivos en tu propio computador y luego transferirlos a Aragorn, esto también se puede realizar. Para ello, se emplea el comando scp, la cual funciona como una versión SSH del comando cp. (para mayor información de este comando, ingresar en terminal man scp).

#### Copiar a un servidor remoto

Se debe incluir el nombre de archivo local (desde_local.txt), el servidor, nombre de usuario y la carpeta remota o nombre a la cual quieres enviar el archivo. (hacia_remoto.txt)

$ scp desde_local.txt nombre.apellido@aragorn.elo.utfsm.cl:hacia_remoto.txt

#### Copiar desde un servidor remoto

Igualmente puedes transferir un archivo remoto hacia tu computador. Simplemente debes poner el nombre del archivo remoto primero y luego el nombre de la carpeta local en la cual quieres dejar tu archivo.

$ scp nombre.apellido@aragorn.elo.utfsm.cl:desde_remoto.txt hacia_local.txt

#### Copia recursiva (carpetas enteras)

Para copiar carpetas enteras (en ambos casos), basta con añadir la opción -r (recursiva).

$ scp -r desde_carpeta nombre.apellido@aragorn.elo.utfsm.cl:hacia_carpeta

## Consultas a Ayudante

Ante consultas, inquietudes o consejos con respecto a las tareas, contactar a los ayudantes mediante el correo oficial del ramo elo329.utfsm@gmail.com ó a sus correos personales.

Jesus Marquez: jesus.marquez.12@sansano.usm.cl

Nicolas Olivos: nicolas.olivos@alumnos.usm.cl