Skip to content
Snippets Groups Projects
Commit 53383e8e authored by Cesar Llamas-Bello's avatar Cesar Llamas-Bello
Browse files

Plantilla LaTeX sencilla para TFG Genérico

parents
No related branches found
No related tags found
No related merge requests found
# Plantilla TFG - EI Informática
| Nombre del archivo: | `README.md` |
| ------------------- | ---------------------------------------------------- |
| Título : | Plantilla TFG - EI Informática |
| Autor: | César Llamas - Dpt. Informática - UVa |
| Versión: | 1.0<br />1.1 Cambiado `svgnames` al `\documentclass` |
| Fecha: | 09/06/2023-15/05/2024 |
### Contenido
Este documento describe los contenidos de la presente carpeta, que contiene un documento ejemplo LaTeX que puede ser utilizado como plantilla para redactar la memoria del Trabajo de Fin de Grado de la Escuela de Ingeniería Informática de Valladolid.
### Resumen
La reglamentación data de hace ya varios años y remite a la necesidad de crear documentos impresos que ya no son necesarios (véase [Reglamentación](https://www.inf.uva.es/wp-content/uploads/2013/01/00-GuiaAlumnoTFG_2017.pdf)) pues se deposita mediante una plataforma telemática. Sin embargo, el grueso de normas sigue vigente y puedes ser útil.
* Se ha mantenido una impresión en formato A4, pero con unos márgenes generosos que puedan facilitar la lectura.
* Los tipos de letra se adhieren a los estándar PostScript que resultan más sencillos y rápidos de manejar en caso de migrar de editor el documento PDF que se entrega.
## Recomendaciones:
#### Gráficos:
Los gráficos deben ser ***legibles***, sus líneas, elementos visuales y textuales deberán poder leerse sin equívoco. Para ello se recomienda incluir los gráficos en formato vectorial (SVG, PNG vectorial PDF re-escalable) para que el tribunal y el futuro lector sean capaces de apreciar todo lo que se incluye en el ampliándolo en la pantalla de un ordenador o tableta.
Las capturas de pantalla o fotografías necesarias tendrán que ser siempre legibles.
## Archivos que contiene la plantilla
Estos archivos y carpetas sirven de ayuda para organizar el trabajo. Se puede cambiar, pero hay que tener en cuenta los cambios en los nombres de las carpetas en el documento maestro.
* `README.md`: Este preciso documento de ayuda.
* `maestro.tex`: documento principal donde se enlaza el resto de capítulos. Contiene en este orden:
* Material inicial (__front matter_): numerado en números romanos
* Información de la cabecera de presentación: Título del trabajo, Autor, Tutor(es), Titulación, etc.
* Resumen/Abstract: en español e inglés.
* Dedicatoria (si es que hay)
* Órdenes de creación de las tablas de contenido y gráficos.
* Presentación.
* Material principal (_main matter_): numerado de nuevo desde `1` en numerales arábigos.
* Capítulos y cabeceras de partes si así se considera.
* Material posterior: sigue la numeración anterior.
* Apéndices numerados por Letras mayúsculas.
* Referencias Bibliográficas.
* Índice de palabras: con acrónimos y aquellos términos que se considere necesario.
* `maestro.pdf`: documento generado a partir de la plantilla por el procesador LaTeX en modo local o remoto en procesadores online como Overleaf
* `capitulos`: carpeta que contiene secciones del documento de rango de capítulo excepto la bibliografía:
* Prologo,
* Capitulos (1, 2, 3)
* Anexos (A, B, C)
* `bibliografia`: carpeta que contiene los archivos relativos a la bibliografia, fuente `bib` y auxiliares.
* `imagenes`: carpeta que contiene los archivos que alimentan el procesador LaTeX.
* `fuentes-imagenes`: carpeta que contiene los archivos en los formatos originales de los archivos que usa LaTeX. Por ejemplo: DWG (Autocad) para SVG, draw.io para SVG o PDF. Inkscape para SVG, etc.
*
\appendix\setcounter{chapter}{1}
\chapter{Anexo}
\section{Repositorio para el código}\label{apendix:anex1}
El código de este proyecto se encuentra en
\url{https://github.com/samuel-bassols/Comunicacion-distribuida-de-procesos}.
Se ponen a disposición dos proyectos, el proyecto R del paquete distR y el proyecto de la aplicación \textit{Elixir} DistR. Cada uno se encuentra en la carpeta llamada Elixir y R respectivamente.
Los códigos fuente del paquete R se encuentran en la carpeta \texttt{/R/distR/R} y los de la aplicación \textit{Elixir} en \texttt{/Elixir/dist\_r/lib}
En la guía que se presenta en el Anexo~\ref{guia} se muestra cómo instalar y poner en funcionamiento el sistema.
\section{Manual de instalación}\label{guia}
En este Anexo se describen los pasos necesarios para poner en marcha el sistema implementado en este proyecto. Esta instalación se ha probado en una máquina con el sistema operativo Ubuntu 22.04.2 LTS por lo que la instalación de algunas partes puede variar si se utiliza una distribución diferente de Linux.
\subsection{Instalación de Elixir}
En esta sección se muestra como instalar la versión 1.14.5 de \textit{Elixir}. Para el manejo de las instalaciones se usa el \textit{version manager} \texttt{asdf}.
\begin{enumerate}
\item Instalar git para poder descargar repositorios.
\mintinline{shell}{sudo apt install curl git}
\item Descargar \texttt{asdf}.
\mintinline{shell}{git clone https://github.com/asdf-vm/asdf.git ~/.asdf}.
\item Añadir el comando \texttt{asdf} al archivo .bashrc. Este archivo se encuentra en el directorio HOME y se le debe añadir la siguiente linea:
\mintinline{shell}{. $HOME/.asdf/asdf.sh}.
\item Instalar el plugin de \textit{Erlang}.
\mintinline{shell}{asdf plugin add erlang}.
\item Instalar \textit{Erlang} 25.3.2.3. Es posible que en el sistema falten algunas dependencias para compilar los archivos de \textit{Erlang}. En este caso, se muestran los paquetes que es necesario instalar en la terminal.
\mintinline{shell}{asdf install erlang 25.3.2.3}.
\item Instalar el plugin de \textit{Elixir}.
\mintinline{shell}{asdf plugin add elixir}.
\item Instalar \textit{Elixir} 1.14.5-opt-25.
\mintinline{shell}{asdf install elixir 1.14.5-otp-25}.
\item Establecer las versiones instaladas como globales.
\mintinline{shell}{asdf global elixir 1.14.5-otp-25}.
\mintinline{shell}{asdf global erlang 25.3.2.3}.
\item Comprobar que las versiones de Elixir y Erlang coinciden. La versión de OTP debería de ser la misma cuando se ejecuta la siguiente linea.
\mintinline{shell}{elixir -v}.
\end{enumerate}
\subsection{Instalación y configuración de NGINX y el servidor sftp}
En esta sección se muestra como instalar y configurar el servidor web NGINX.
Para instalar NGINX se utiliza el siguiente comando: \mintinline{shell}{sudo apt install nginx}. Una vez instalado se debe configurar el \textit{LoadBalancer}. El archivo de configuración se encuentra en \mintinline{shell}{etc/nginx/sites-available/conf}. En este archivo se debe copiar el texto mostrado en el fragmento de código \ref{nginx}. Para añadir nuevos nodos basta con incluir nuevos servidores en el \textit{Loadbalancer}.
\\
Para el servidor sftp se puede usar cualquier configuración de servidor que se desee, mientras permita conexiones desde las máquinas que se vayan a usar para el sistema.
\subsection{Instalación de R}
Para instalar R en los nodos de cómputo basta con ejecutar el siguiente comando
\mintinline{shell}{sudo apt -y install r-base}. Una vez se ha instalado R hay que instalar las dependencias. Primero se debe abrir una terminal R mediante el comando \mintinline{shell}{sudo R} y ejecutar las siguientes lineas:
\mintinline{shell}{install.packages("httr")}
\mintinline{shell}{install.packages("RCurl")}
\mintinline{shell}{install.packages("Rcpp")}
\mintinline{shell}{install.packages("RInside")}
\subsection{Puesta en marcha del sistema}
Una vez se han instalado todos los componentes explicados anteriormente se puede poner en funcionamiento el sistema. Para ello se debe abrir una terminal y colocarse en el directorio raíz del proyecto \textit{Elixir} y ejecutar la siguiente linea para descargar las dependencias del proyecto.
\mintinline{shell}{mix deps.get}
Y ya, para poner en marcha el sistema se ejecuta la siguiente linea:
\mintinline{shell}{PORT=PORT MAXP=MAXP elixir --name NAME@ADRESS }
\mintinline{shell}{--cookie COOKIE -S mix phx.server}
Se deben rellenar los campos como se indica a continuación:
\begin{itemize}
\item PORT: Puerto por el que el nodo recibe peticiones.
\item MAXP: Número máximo de ejecuciones simultáneas que se permiten en el nodo.
\item NAME: Escoger un nombre del nodo.
\item ADRESS: Dirección IP del nodo.
\item COOKIE: Cookie que debe ser igual en todos los nodos para que se puedan comunicar.
\end{itemize}
Para indicar los miembros del \textit{pool} de nodos, se deben añadir manualmente al archivo
\mintinline{shell}{./lib/dist_r/application} en la función de topología como se muestra en el fragmento de código~\ref{topo}. El nombre y dirección de los nodos debe coincidir con el que se declara en la linea de arranque de la aplicación.
Se debe además indicar la configuración correcta del servidor sftp en el archivo \mintinline{shell}{./execute_command} y cuando este se haya modificado, se debe ejecutar el comando \mintinline{shell}{make execute_command}. En este mismo directorio también se encuentra un archivo \texttt{r\_libraries.R} donde se especifican los paquetes que son solicitados por los usuarios del sistema. Se deben previamente instalar estos paquetes antes de incluirlos.
\\
Una vez se han establecido las distintas configuraciones, se pueden arrancar los nodos definidos en cualquier orden y momento y la conexión entre ellos es automática.
\subsection{Paquete R DistR}
Debido a que el paquete se encuentra en estado de desarrollo, este debe ser cargado como un proyecto en RStudio abriendo desde este programa el archivo \texttt{distR.Rproj}. Una vez se ha abierto el proyecto, se ejecuta las linea \texttt{devtools::load\_all()} en un programa R y queda cargado el paquete DistR. Con el paquete cargado se puede consultar la ayuda de las funciones del paquete de manera idéntica a la que se utiliza con otras funciones. Se incluye además un archivo de configuración llamado \texttt{configuration.txt} en el que se puede ver un ejemplo de la configuración del entorno del paquete.
\
\vskip 2cm
{\noindent\bfseries\Huge Resumen}
\vskip 1cm
El aumento de las necesidades de cómputo de la comunidad científica y comercial tienen su solución natural en la utilización de plataformas de cómputo distribuido. Uno de los desafíos principales en este tipo de sistemas es garantizar la tolerancia frente a fallos y el relanzamiento de sus componentes frente a caídas. En este trabajo, se pretende reflejar el análisis, diseño y construcción de una plataforma práctica de este tipo, donde el programador-usuario podrá dividir su tarea en partes donde cada una de estas partes se asigna a un nodo de cómputo por el sistema. De esta manera se puede obtener el grado de paralelismo deseado por el usuario.
\\
En concreto se ha creado un sistema distribuido de cómputo que permite que el usuario paralelice y ejecute código escrito en el lenguaje R. El sistema ofrece una asignación transparente y flexible sobre un \emph{pool de cómputo}. Para este sistema se han realizado pruebas sobre una plataforma física frente a varios tipos de cargas de trabajo. Se ha comprobado la tolerancia y robustez del sistema frente a diversas situaciones de rotura-caída y la mejora consistente en el rendimiento con un modelo de varios nodos de cómputo.
\\
\textbf{Palabras clave:} Sistema Distribuido, Elixir, R, resiliencia, tolerancia frente a fallos, pool de cómputo.
\newpage
{\bfseries\Huge Abstract}
\vskip 1cm
The increasing computing needs of the scientific and commercial community have their natural solution in the use of distributed computing platforms. One of the main challenges in this type of systems is to guarantee the tolerance to failures and the restart of its components in case of crashes. In this work, we intend to reflect the analysis, design and construction of a practical platform of this type, where the user-programmer could divide his task into parts where each of these parts is assigned to a compute node by the system. In this way, the degree of parallelism desired by the user can be obtained.
\\
Specifically, a distributed computation system has been created that allows the user to parallelize and execute code written in the R language. The system provides a transparent and flexible allocation over a computation pool. For this system, tests have been performed on a physical platform against various types of workloads. The system has been tested for tolerance and robustness to various break-crash situations and for consistent performance improvement with a multi-node compute model.
\\
\textbf{Key words:} Distributed computing, Elixir, R, fault-tolerant system, computing pool.
\ No newline at end of file
\begin{titlepage}
\centering
\includegraphics[width=0.4\textwidth]{images/uva_logo.pdf}
\par
\vspace{2cm}
{\fontfamily{phv}\Huge Escuela de Ingeniería Informática}
\par
\vspace{1cm}
{\fontfamily{phv}\LARGE Grado en Ingeniería Informática \linebreak
Mención De Computación}
\par
\vspace{2cm}
\textbf{\Large T\large RABAJO \Large F\large IN DE \Large G\large RADO}
\par
\vfill
\textbf{\fontfamily{phv}\Huge\strut Comunicación distribuida de procesos en R mediante un modelo basado en actores}
\par
\vfill
\begin{flushright}
{\Large Autor:}
\linebreak
\textbf{\Large Samuel Sjur Bassols Citores}
\linebreak
\par
{\Large Tutor:}
\linebreak
\textbf{\Large Dr. César Llamas Bello}
\vspace{0.5cm}
\end{flushright}
\end{titlepage}
\chapter{Introducción}\label{cap1}
\section{Introducción}
Durante los últimos años, el campo del análisis de datos no ha dejado de crecer y no se prevé que deje de hacerlo en un futuro. El análisis de estos datos, conocidos como \textit{Big Data}, cada vez tiene más importancia, ya que se trata de grandes volúmenes de información que se recopilan en una gran variedad de entornos. Con la llegada de internet se ha comenzado a almacenar una gran cantidad de datos sobre los internautas, cuyo análisis ha pasado a ser inabarcable con metodologías estadísticas tradicionales. Además, en todo tipo de procesos industriales, trabajos de investigación o análisis sociológicos, cada vez se recogen volúmenes mayores de información que necesita ser analizada. Todo esto requiere de tecnologías adecuadas para la captura, almacenamiento, distribución y análisis de la información.
\\
El auge de servicios como \textit{Google Cloud}, \textit{Amazon Web Services} o \textit{Micosoft Azure} pone de manifiesto la increíble demanda que hay para almacenar toda esta información. En la Figura~\ref{data_evloution} se puede ver el crecimiento del volumen de datos producidos a diario a nivel mundial y cómo se espera que crezca en el próximo año.
\begin{figure}[H]
\centering
\includegraphics[width=0.6\linewidth]{Tex_files/MainMatter/cap_1/images/data-volume-2022-2024.png}
\caption{Evolución de la cantidad de datos generados a diario en \textit{zettabytes}\cite{Andre_2023}}
\label{data_evloution}
\end{figure}
Esta gran cantidad de datos ha llevado no solo a la necesidad de tener cada vez servidores más extensos, sino que se han desarrollado nuevas tecnologías para poder analizar estos datos. Uno de los campos con mayor interés en este aspecto es la computación paralela \cite{grama2003introduction}. Una de las ramas principales de la computación paralela es el desarrollo de nuevos algoritmos que puedan beneficiarse de tareas que se pueden ejecutar en paralelo. Una vez se ha encontrado una manera de paralelizar las tareas, es necesario desarrollar un sistema que las pueda llevar a cabo. Un ejemplo de un sistema que realiza computaciones paralelas es un procesador multinúcleo, en el que cada uno de estos núcleos puede realizar una operación independiente. Sin embargo, cuando se trabaja con volúmenes de datos como los ilustrados anteriormente, cobra interés la idea de realizar estas computaciones en varias máquinas, de tal manera que cada una realice una tarea pequeña y sencilla que posteriormente se combine en el resultado final.
\\
La computación distribuida es el campo de la ingeniería informática que estudia los sistemas distribuidos. Un sistema distribuido es un sistema en el que los distintos componentes se encuentran en distintos puntos de la red. Estos componentes o nodos se comunican entre ellos mediante mensajes. Por tanto, se puede dividir una computación entre los varios nodos de una red de tal manera que cada uno realice una operación abarcable a sus capacidades de computación \cite{coulouris2005distributed}.
\\
Uno de los lenguajes con más relevancia en el campo de los sistemas distribuidos es \textit{Erlang} \cite{erlang}. \textit{Erlang} es un lenguaje funcional que se usa para construir sistemas cuyas principales propiedades son:
\begin{itemize}
\item \textbf{Distribuido y Escalable}: El código Erlang se ejecuta en procesos ligeros que están aislados y se comunican mediante mensajes, lo que permite añadir nuevos procesos sin afectar el funcionamiento del resto de procesos. Estos procesos se ejecutan en una máquina virtual {\textit{Erlang VM}} y representan actores en un sistema.
\item \textbf{Tolerante a los fallos}: Si algún componente del sistema falla, es posible recuperarse de este fallo sin poner en riesgo el funcionamiento del sistema completo.
\item \textbf{\textbf{Hot Swapping}} (Actualización de código en caliente): Aplicaciones que pueden ser modificadas sin detener el sistema, lo que permite realizar modificaciones en el código o en la arquitectura sin necesidad de detener por completo el sistema.
\end{itemize}
Para lograr estás propiedades, \textit{Erlang} suele ir acompañado de OTP (\textit{Open Telecom Platform }), una serie de librerías y principios de diseño que permiten desarrollar estos sistemas. Por ejemplo OTP incluye bases de datos distribuidas como ETS (\textit{Erlang Term Storage}) o comportamientos para servidores como puede ser \textit{GenServer}, un servidor génerico, o \textit{Supervisor}, para un supervisor. Hoy en día \textit{Erlang} se usa a nivel profesional especialemente en servicios distribuidos para dar soporte a aplicaciones de mensajería instantánea, como \textit{WhatsApp}.
\\
\textit{Elixir}\cite{Elixir} es un lenguaje de programación que se ejecuta sobre la VM de \textit{Erlang} y por tanto integra las funcionalidades y propiedades de \textit{Erlang} y aporta nuevas herramientas para realizar aplicaciones distribuidas.
\\
Un sistema de computación distribuida tiene que permitir además realizar análisis mediante las herramientas habituales para un experto. En general existen dos lenguajes principales con los que se trabaja en el análisis de datos, R y \textit{Python}:
\begin{itemize}
\item \textbf{R} es un lenguaje de programación interpretado diseñado para trabajar con distintas estructuras de datos. R está diseñado desde un punto de vista estadístico y por tanto se especializa en trabajar con tablas e implementar operaciones eficientes sobre estas.
\item \textbf{\textit{Python}} es un lenguaje orientado a objetos utilizado en una gran variedad de campos. En los últimos años ha ganado relevancia en el aspecto del análisis de datos y especialmente en el campo de la redes neuronales.
\end{itemize}
En este proyecto se propone y se implementa un sistema distribuido tolerante al fallo funcionando sobre \textit{Elixir} que permite distribuir una computación paralela en R entre una serie de nodos que calculan los resultados parciales y finalmente se reconstruye el resultado final. La principal característica del sistema distribuido que se quiere desarrollar en este proyecto es que cada uno de los nodos del sistema debe tener el mismo funcionamiento, y por tanto, el mismo código. Esto permite que se puedan añadir nodos nuevos a la red sin necesidad de modificar el código.
\section{Motivación}
La motivación principal de este proyecto es adentrarme en el conocimiento de nuevos lenguajes funcionales y tecnologías no estudiadas a lo largo del grado y ser capaz de utilizarlos para resolver problemas actuales como el análisis masivo de datos, mediante la computación distribuida.
\\
Este proyecto implica aprender los lenguajes de programación \textit{Elixir y Erlang}, aprender a utilizarlos para crear un sistema distribuido resiliente al fallo y la manera de integrarlos con otros lenguajes. Se aborda también el tema de cómo realizar comunicaciones a través de la red para las distintas partes del sistema y de cómo desarrollar un proyecto software en R. Además, la puesta en marcha del sistema en \textbf{Linux} supone aprender sobre cómo establecer un servidor web y un servidor SFTP.
\\
Además, la mayoría de lenguajes utilizados a lo largo del grado siguen el paradigma \textit{Object Oriented Programming}, lo que hace que se desconozca y resulte difícil cambiar a otros paradigmas. Realizar proyectos fuera de este paradigma permite obtener una nueva perspectiva de cómo afrontar distintos problemas.
\\
Otra importante motivación, es la relevancia que han ido adquiriendo estas tecnologías poco exploradas en el grado y la importancia que puede tener para el futuro laboral conocerlas.
\\
Y por último, siempre existe la motivación de obtener un sistema que sea útil para profesionales del sector, y que puedan, a partir de este, crear sistemas que se ajusten a sus cargas de trabajo.
\\
\section{Objetivos y etapas del proyecto}
\subsection{Objetivos}
El objetivo general de este proyecto es el desarrollo de un sistema distribuido resiliente y tolerante al fallo que permita dividir una operación computacionalmente costosa en R y repartir la carga entre cada uno de los diferentes nodos del sistema. Además, este sistema debe informar al usuario de la carga en cada nodo y los distintos eventos que ocurren en estos. Los objetivos específicos son:
\begin{itemize}
\item Obtener los conocimientos necesarios para poder utilizar el lenguaje de programación \textit{Elixir} y usar sus prestaciones para desarrollar un sistema distribuido.
\item Desarrollar un paquete R que ofrezca al usuario una serie de operaciones, fraccione estas operaciones, las envié, y, una vez realizadas, reconstruya los resultados y se los muestre al usuario.
\item Diseñar y desarrollar un sistema distribuido en \textit{Elixir} en el que cada nodo pueda realizar una computación y que en caso de fallar, esta sea retomada por otro nodo de manera transparente al usuario del sistema.
\item Desarrollar un servidor web que ofrezca una web al usuario en la que se muestre información del funcionamiento del sistema.
\item Validar la eficiencia del sistema sobre distintos cálculos intensivos.
\item Estudiar la intuitividad del uso del paquete R para un usuario frecuente de R.
\end{itemize}
Por tanto, este proyecto se va a dividir en varias etapas en las que en cada una se van a abordar unas tareas específicas.
\subsection{Etapas}\label{etapas}
Las etapas de desarrollo y resolución de los mencionados objetivos son las siguientes:
\subsubsection{Primera Etapa: Estudio del lenguaje Elixir}
Antes de poder abordar el diseño e implementación del sistema distribuido se deben adquirir los conocimientos de programación necesarios. Para esta etapa se usan varios libros y tutoriales\cite{elixirschool}\cite{introelixir}\cite{hebert2013learn}.
\\
\textit{Tareas a realizar:}
\begin{itemize}
\item Estudio del funcionamiento básico del lenguaje \textit{Elixir}.
\item Estudio de las prestaciones que ofrece el lenguaje para sistemas distribuidos.
\item Estudio de las distintas formas que se plantean para realizar un sistema tolerante al fallo.
\item Estudio del \textit{Framework} usado para el servidor web.
\end{itemize}
\subsubsection{Segunda etapa: Paquete R (RPack)}
Se debe diseñar e implementar un paquete software en el que se ofrezcan unas operaciones, procese los datos que le proporciona el usuario, se conecte con el sistema distribuido, y muestre al usuario los resultados de la operación.
\\
\textit{Tareas a realizar:}
\begin{itemize}
\item Estudio de los requisitos software.
\item Estudio de paquetes en R equivalentes.
\item Diseño del paquete.
\item Preparación e instalación del entorno de programación y carga del software.
\item Implementación de la aplicación a partir del diseño establecido.
\end{itemize}
\subsubsection{Tercera etapa: Sistema distribuido (\textbf{RNodePool}): lógica de la aplicación}
Se debe diseñar e implementar un sistema distribuido que sea capaz de recuperase ante los fallos y que ejecute una computación en el lenguaje R. Por tanto, se debe desarrollar tanto el sistema distribuido como la integración de este con el lenguaje R.
\\
\textit{Tareas a realizar:}
\begin{itemize}
\item Estudio de los requisitos software.
\item Estudio de aplicaciones equivalentes.
\item Diseño del sistema distribuido de manera acorde a los requisitos.
\item Preparación e instalación del entorno de programación y carga del software.
\item Integración del sistema distribuido con el lenguaje R.
\item Implementación del sistema distribuido a partir del diseño establecido.
\end{itemize}
\subsubsection{Cuarta etapa: Servidor Web (\textbf{RHub}), Sistema distribuido (\textbf{RNodePool}), vistas y controladores}
Se debe diseñar e implementar un Servidor Web, la vista y los controladores que permita recibir las peticiones que le llegan desde el paquete R y poner en funcionamiento el sistema distribuido en función de lo que se solicite. Además, este debe ofrecer una web en la que muestre el funcionamiento del sistema.
\\
\textit{Tareas a realizar:}
\begin{itemize}
\item Estudio de los requisitos software.
\item Estudio de aplicaciones equivalentes.
\item Diseño del servidor de manera acorde a los requisitos.
\item Preparación e instalación del entorno de programación y carga del software.
\item Implementación del servidor a partir del diseño establecido.
\item Implementación de la web para mostrar el funcionamiento.
\end{itemize}
\subsubsection{Quinta etapa: Integración y pruebas}
Por último, se integran las tres partes desarrolladas y se pone en funcionamiento el sistema. Se realizan pruebas para comprobar que el sistema funciona de manera cohesiva. Además se realizan pruebas para comprobar el rendimiento del sistema y su intuitividad para un programador usual de R.
\\
\textit{Tareas a realizar:}
\begin{itemize}
\item Pruebas y comprobación del correcto funcionamiento del sistema.
\item Estudios sobre el rendimiento del sistema completo ante varias cargas de trabajo.
\item Estudio de la usabilidad del paquete R para un programador.
\end{itemize}
\section{Recursos utilizados}
Para el desarrollo de este proyecto y la puesta en marcha del sistema se han usado los siguientes recursos físicos:
\begin{itemize}
\item Ordenador Personal con instalación de Ubuntu 22.04.2.
\item Tres Ordenadores \textit{minipc}.
\item Tres fuentes de alimentación.
\item Switch Gigabit.
\item KVM Switch.
\item Teclado.
\item Ratón.
\item Cinco cables de red.
\item Regleta eléctrica.
\item Monitor.
\item Memoria USB.
\end{itemize}
\section{Caso de Negocio}
\subsection{Agentes implicados en el proyecto}
Los siguientes actores están implicados en el proyecto:
\begin{itemize}
\item \textbf{Cliente}: Usuario del sistema distribuido y administrador del sistema.
\item \textbf{Beneficiario}: Los usuarios del sistema.
\item \textbf{Usuario del proyecto}: Programador que ejecuta una instancia de R con el paquete desarrollado y administrador del sistema distribuido.
\end{itemize}
\subsection{Presupuesto}
En una primera aproximación al coste estimado de este proyecto, se han de tener en cuenta tanto factores de costes de los materiales físicos usados en el proyecto, como las horas de trabajo del desarrollador. El desglose y detalle de estos costes se puede consultar en el capítulo 3.
\subsection{Impacto}
Las prestaciones que ofrece este sistema de computación distribuida permiten realizar análisis de datos que no son posibles con un solo dispositivo.
El principal impacto de este sistema es económico. Además, con este sistema las organizaciones pueden llevar a cabo análisis de datos que hasta el momento no se podían realizar sin contratar un servicio externo o comprando un dispositivo más potente. Este sistema permite combinar la potencia de dispositivos de bajo rendimiento, que de otra manera no tendrían utilidad analizando datos.
Tex_files/MainMatter/cap_1/images/data-volume-2022-2024.png

75.4 KiB

\chapter*{Presentación}
\addcontentsline{toc}{chapter}{Presentacion}
Un sistema distribuido es un sistema en el que varios componentes se encuentran repartidos a lo largo de una red. Los sistemas distribuidos se caracterizan por la necesidad que tienen de ser resilientes al fallo, ya que distintos componentes pueden dejar de estar disponibles por motivos de conexión. Un uso para los sistemas distribuidos es la computación distribuida, en la que una tarea es divida en partes y cada una de estas partes es computada por un componente del sistema. De esta manera se puede obtener un grado de paralelismo mucho mayor.
El objetivo principal de este Trabajo de Fin de Grado es construir un sistema que pueda aprovechar la potencia y la base de usuarios de la plataforma de cálculo estadístico R en un contexto distribuido donde se puede desglosar el cómputo de algunas tareas especialmente onerosas en el aspecto de tiempo o almacenamiento, en otros nodos que utilizaremos como \emph{nodos de cómputo}.
Al mismo tiempo, este trabajo tiene como finalidad importante, explorar las capacidades de los lenguajes basados en un modelo de actores, para proporcionar robustez y resiliencia a la plataforma de cómputo. Al respecto se ha decidido utilizar Elixir (un lenguaje de programación basado en Erlang OTP), lo que ha ofrecido insospechadas posibilidades al proyecto original.
\section*{Estructura de la Memoria}
\addcontentsline{toc}{section}{Estructura de la Memoria}
La creación de este documento sigue las pautas establecidas para un documento de un proyecto de Ingeniería Software. La estructura es la siguiente:\par
En el Capítulo~\ref{cap1} se introduce el proyecto que se va a realizar, explicando con más detalle los aspectos mencionados en el resumen. También se plantean los objetivos del proyecto, así como las tareas y recursos que forman parte del proyecto. \par
En el Capítulo~\ref{cap2} se realiza la planificación del proyecto, la división de las tareas, la gestión del tiempo, de los recursos y de los riesgos.\par
En el Capítulo~\ref{fundamentos} se explica la fundamentación teórica necesaria para entender el resto del proyecto y se plantean los antecedentes tecnológicos que pueden ayudar a la toma de decisiones a lo largo del proyecto, así como paquetes de Software que pueden ser de interés.
El Capítulo~\ref{cap4} corresponde al Análisis Software: Casos de uso, requisitos de diferentes tipos y la explicación en detalle de los casos de uso y sus diagramas de secuencia.\par
En el Capítulo~\ref{cap5} se realiza el Diseño Software del sistema.\par
En el Capítulo~\ref{cap6} se describen los resultados de la implementación, explicando algunas de las partes del código del sistema que tienen especial interés en cuanto a su implementación.\par
En el Capítulo~\ref{cap7} se muestran las pruebas que se han realizado para validar el funcionamiento del sistema, además de las pruebas de rendimiento con distintas cargas y las pruebas de usabilidad del paquete R.\par
En el Capítulo~\ref{cap8} se plantean las conclusiones extraídas del proyecto y se discuten los resultados, así como las posibles lineas futuras que podrían existir.\par
En la parte final del documento se muestra la guía de instalación del sistema.
\section*{Agradecimientos}
\addcontentsline{toc}{section}{Agradecimientos}
Quisiera dar las gracias a mi tutor César Llamas Bello por proponerme un tema para el TFG que ha resultado ser muy interesante. También quiero agradecerle lo mucho que me ha enseñado durante estos meses, su inestimable ayuda y su infinita paciencia.
\\
Agradecer también a mis compañeros de INDAT por su amistad, apoyo y por las fructíferas discusiones que han hecho que todo este tiempo sea mucho más agradable.
\\
También, quisiera dar las gracias a mi familia, por sus ánimos y apoyo incondicional durante toda mi vida.
\chapter{Planificación del Proyecto}\label{cap2}
En este capítulo se lleva a cabo la planificación del proyecto siguiendo la guía de PMBOK\cite{guide2001project}. La elaboración del sistema definido en los objetivos se realiza mediante un proceso iterativo, ya que se puede dividir fácilmente en etapas bien definidas.
\\
En primer lugar, se realiza una planificación inicial con el diseño de las tareas a partir de las etapas del proyecto definidas en la sección~\ref{etapas}, en la que además se definen los hitos y por tanto los entregables. Posteriormente, mediante un cronograma se muestra la gestión del tiempo. También se realiza la gestión de los riesgos que pueden aparecer a lo largo del proyecto y por último se realiza una estimación de los costes materiales y laborales.
\section{Planificación inicial}
En este proyecto, debido a la clara división de las tareas en etapas bien diferenciadas, el desarrollo más adecuado para este tipo de proyecto es un \textbf{desarrollo en cascada}, donde al final de cada etapa se finaliza un entregable. Esto facilita la división del trabajo en cuanto al análisis y diseño, en partes independientes. El proceso es lineal, no se avanza a otra etapa hasta que se completa la etapa anterior, por lo tanto, se debe definir un entregable que sea la integración de esas etapas independientes.
\subsubsection{Diseño de tareas}
Se definen estas tareas a partir de las etapas descritas en la sección~\ref{etapas}. Estas etapas son inferidas de los objetivos propuestos, por lo que se deben concretar un conjunto de tareas que engloben estas etapas y el entregable que produce cada una de ellas.
Se definen las siguientes tareas a partir de las etapas del proyecto:
\begin{itemize}
\item \textbf{Preparación}. En esta fase inicial se concentran todas las subtareas relacionadas con la preparación del proyecto. Debido a la naturaleza de este proyecto, en el que se utilizan tecnologías de las que se tienen pocos conocimientos previos, se prevé que esta etapa sea más extensa de lo habitual en un proyecto software.
\item \textbf{Desarrollo del componente Rpack}: Se analizan los requisitos de este componente y se realiza un diseño apropiado. Para esto, se estudian otros paquetes que puedan ser similares al que se prevé desarrollar. Una vez se ha realizado el diseño del componente, este es implementado produciendo el \textbf{entregable 1}.
\item \textbf{Desarrollo de la lógica de la aplicación de RNodePool}: En esta tarea se analizan los requisitos pertinentes al funcionamiento de la lógica de la aplicación distribuida. Para definir estos requisitos se deben primero estudiar diseños similares para poder entender qué se espera de este tipo de sistemas. Al igual que en la tarea anterior, se realiza el diseño del componente y posteriormente su implementación. Esta tarea es la que más aspectos técnicos presenta, por lo que supone un riesgo para el resto del desarrollo si no se lleva a cabo correctamente. Esta tarea produce el \textbf{entregable 2}.
\item \textbf{Desarrollo de las vistas y controladores de RNodePool}: De manera equivalente a las tareas anteriores, se realiza un análisis de los requisitos de este componente y se realiza el desarrollo. Esta tarea produce el \textbf{entregable 3}.
\item \textbf{Desarrollo del servidor web RHub}: En esta tarea se analiza, diseña e implementa el componente \textbf{RHub}. Esta tarea produce el \textbf{entregable 4}.
\item \textbf{Integración de las tres partes desarrolladas}: Esta tarea produce el \textbf{entregable 5}, que contiene una versión funcional de la aplicación y las distintas baterías de pruebas de funcionamiento y rendimiento a la que se somete a la aplicación completa.
\item \textbf{Documentación}: en esta tarea se documentan las distintas partes del proyecto, creando manuales y guias de uso para los componentes cuando sea necesario. Esta tarea es global a lo largo del proyecto ya que cada una de las tareas incluye la creación de la documentación. Esta tarea incluye también el desarrollo de la memoria. Una vez se han finalizado el resto de tareas, termina esta tarea y se produce el entregable final del proyecto.
\end{itemize}
En la Tabla~\ref{tab:hitos} aparecen fijados los hitos del proyecto. En cada uno de ellos, se debe generar el entregable correspondiente.
\begin{table}[H]
\centering
{\sffamily\small
\begin{tabular}{|l|l|}
\hline
Entregable & Fecha \\ \hline
1 & 31/03/2023 \\ \hline
2 & 30/04/2023 \\ \hline
3 & 15/05/2023 \\ \hline
4 & 31/05/2023 \\ \hline
5 & 15/06/2023 \\ \hline
Finalización del proyecto & 15/06/2023 \\ \hline
\end{tabular}
}
\caption{Fechas en las que se deben producir los entregables}
\label{tab:hitos}
\end{table}
\section{Gestión del tiempo}
Para llevar a cabo la gestión del tiempo se ha utilizado el programa gratuito Gantt-Project. En la Figura~\ref{fig:Gannt} se muestra el diagrama de Gantt de las actividades que se han realizado en este proyecto.
\begin{figure}[H]
\centering
\includegraphics[width=1\linewidth]{Tex_files/MainMatter/cap_2/images/gannt.png}
\caption{Diagrama de Gannt de actividades}
\label{fig:Gannt}
\end{figure}
\section{Gestión de riesgos}
Como en todo proyecto se debe realizar una identificación de los principales riesgos que se pueden producir durante el desarrollo de este proyecto. Se debe además, llevar a cabo un análisis cuantitativo de estos y plantear los posibles planes de actuación en caso de que se den los riesgos.
\\
Los riesgos identificados comprenden aquellos que son comunes a las distintas partes del desarrollo, así como los que son más específicos de un estudiante con otras cargas de trabajo simultáneas al desarrollo del proyecto. En la Tabla~\ref{tab:risk} se identifican los riesgos y a continuación se destacan algunos de estos por el problema que pueden suponer para el desarrollo del proyecto.
\begin{table}[b]
\centering
{\sffamily\small
\begin{tabular}{|l|l|}
\hline
& Riesgo \\ \hline
1 & Planificación poco precisa \\ \hline
2 & Uso de tecnologías desconocidas \\ \hline
3 & \begin{tabular}[c]{@{}l@{}}Problemas para llevar a cabo la implementación\\ a partir del diseño realizado\end{tabular} \\ \hline
4 & \begin{tabular}[c]{@{}l@{}}Problemas de análisis de requisitos que no se detectan\\ hasta que se pone el sistema completo en funcionamiento\end{tabular} \\ \hline
5 & \begin{tabular}[c]{@{}l@{}}Problemas para realizar la instalación del sistema\\ y probar su funcionamiento\end{tabular} \\ \hline
6 & Menor disponibilidad de la que se había propuesto \\ \hline
7 & Fecha de finalización posterior a la prevista \\ \hline
\end{tabular}
}
\caption{Riesgos del proyecto}
\label{tab:risk}
\end{table}
\begin{itemize}
\item \textit{Planificación}: en este proyecto se usan tecnologías poco exploradas anteriormente en el grado, por lo que las estimaciones que se hagan acerca de las duraciones y los costes de algunas partes pueden ser imprecisas.
\item \textit{Problemas para llevar a cabo la implementación a partir del diseño realizado}: Es posible que al realizar el diseño de alto nivel del sistema, por falta de conocimientos del funcionamiento e implementación posterior, se diseñe un sistema que sea más complicado de los esperado.
\item \textit{Problemas para realizar la instalación del sistema y probar su funcionamiento}: En las partes finales del proyecto se debe recopilar todo lo desarrollado en una única maquina y poner en funcionamiento un sistema en el que los componentes se comunican a través de la red y esto puede suponer dificultades no previstas.
\end{itemize}
Para analizar cuantitativamente los riesgos y estudiar su impacto, se utiliza una matriz de probabilidad e impacto, en la que se representan las probabilidades de que ocurra un riesgo y la amenaza que supone para la finalización exitosa del proyecto. En la Tabla~\ref{tab:riskMatrix} se muestra esta matriz. Se han definido 3 categorías de riesgo: bajo, medio y alto.
\begin{table}[H]
\centering
{\sffamily\small
\begin{tabular}{|c|ccccc|}
\hline
Probabilidad & \multicolumn{5}{c|}{Amenazas} \\ \hline
0.90 & \multicolumn{1}{c|}{\cellcolor[HTML]{34FF34}0.05} & \multicolumn{1}{c|}{\cellcolor[HTML]{F8FF00}0.09} & \multicolumn{1}{c|}{\cellcolor[HTML]{F8FF00}0.18} & \multicolumn{1}{c|}{\cellcolor[HTML]{FF0000}0.36} & \cellcolor[HTML]{FF0000}0.72 \\ \hline
0.70 & \multicolumn{1}{c|}{\cellcolor[HTML]{34FF34}0.04} & \multicolumn{1}{c|}{\cellcolor[HTML]{F8FF00}0.07} & \multicolumn{1}{c|}{\cellcolor[HTML]{F8FF00}0.15} & \multicolumn{1}{c|}{\cellcolor[HTML]{FF0000}0.28} & \cellcolor[HTML]{FF0000}0.56 \\ \hline
0.50 & \multicolumn{1}{c|}{\cellcolor[HTML]{34FF34}0.03} & \multicolumn{1}{c|}{\cellcolor[HTML]{34FF34}0.05} & \multicolumn{1}{c|}{\cellcolor[HTML]{F8FF00}0.1} & \multicolumn{1}{c|}{\cellcolor[HTML]{F8FF00}0.2} & \cellcolor[HTML]{FF0000}0.4 \\ \hline
0.30 & \multicolumn{1}{c|}{\cellcolor[HTML]{34FF34}0.02} & \multicolumn{1}{c|}{\cellcolor[HTML]{34FF34}0.03} & \multicolumn{1}{c|}{\cellcolor[HTML]{34FF34}0.06} & \multicolumn{1}{c|}{\cellcolor[HTML]{F8FF00}0.12} & \cellcolor[HTML]{FF0000}0.28 \\ \hline
0.10 & \multicolumn{1}{c|}{\cellcolor[HTML]{34FF34}0.005} & \multicolumn{1}{c|}{\cellcolor[HTML]{34FF34}0.01} & \multicolumn{1}{c|}{\cellcolor[HTML]{34FF34}0.02} & \multicolumn{1}{c|}{\cellcolor[HTML]{34FF34}0.04} & \cellcolor[HTML]{F8FF00}0.08 \\ \hline
& \multicolumn{1}{c|}{\begin{tabular}[c]{@{}c@{}}Muy Baja\\ 0.05\end{tabular}} & \multicolumn{1}{c|}{\begin{tabular}[c]{@{}c@{}}Baja\\ 0.1\end{tabular}} & \multicolumn{1}{c|}{\begin{tabular}[c]{@{}c@{}}Moderada\\ 0.2\end{tabular}} & \multicolumn{1}{c|}{\begin{tabular}[c]{@{}c@{}}Alta\\ 0.4\end{tabular}} & \begin{tabular}[c]{@{}c@{}}Muy Alta\\ 0.8\end{tabular} \\ \hline
\end{tabular}
}
\caption{Matriz de probabilidades e Impacto}Los colores indican la categoría de riesgo. Verde (bajo), amarillo (medio) y rojo (alto).
\label{tab:riskMatrix}
\end{table}
Los riesgos del proyecto y sus calificaciones se muestran en la Tabla~\ref{tab:riskScore}. Como se puede observar los riesgos 3 y 5 pueden suponer una amenaza alta para el proyecto, por lo que habrá que prestarles especial atención.
\begin{table}[H]
\centering
{\sffamily\small
\begin{tabular}{|c|c|c|c|}
\hline
Riesgo & Probabilidad & Impacto & Calificación \\ \hline
1 & 0.8 & 0.3 & \cellcolor[HTML]{F8FF00}0.24 \\ \hline
2 & 0.7 & 0.2 & \cellcolor[HTML]{F8FF00}0.14 \\ \hline
3 & 0.5 & 0.7 & \cellcolor[HTML]{FF0000}0.35 \\ \hline
4 & 0.8 & 0.3 & \cellcolor[HTML]{F8FF00}0.24 \\ \hline
5 & 0.5 & 0.9 & \cellcolor[HTML]{FF0000}0.45 \\ \hline
6 & 0.8 & 0.1 & \cellcolor[HTML]{34FF34}0.08 \\ \hline
7 & 0.5 & 0.5 & \cellcolor[HTML]{34FF34}0.25 \\ \hline
\end{tabular}
}
\caption{Calificación de los riesgos}
\label{tab:riskScore}
\end{table}
A continuación se muestra el plan de actuación para cada riesgo en caso de que ocurra.
\begin{enumerate}
\item Realizar una replanificación del proyecto teniendo en cuenta los errores que hubiera en la primera planificación.
\item Asignar más tiempo al estudio de estas tecnologías a lo largo de todo el proyecto.
\item Asignar mayores recursos y realizar de nuevo el diseño con los conocimientos adquiridos en la implementación.
\item Realizar modificaciones en el sistema en la medida de lo posible para acomodar estos requisitos y si no es posible, descartar los requisitos o plantearlos de otra manera.
\item Asignar más tiempo a trabajar en la configuración del sistema, probando varias posibilidades hasta que este esté en funcionamiento. En caso de que esto no sea posible, desplegar la aplicación solo en un dispositivo.
\item Aumentar el tiempo asignado al proyecto en la medida de lo posible.
\item Incrementar la fecha de entrega hasta su máximo y en caso de que no sea posible, retrasar la fecha de entrega a la convocatoria extraordinaria.
\end{enumerate}
\section{Gestión de costes}
\begin{itemize}
\item Costes de Componentes Físicos:
Se ha realizado el proyecto en un ordenador personal con un coste aproximado de 1000€. Además se deben considerar los costes de los componentes que se usan para el despliegue. Los costes son aproximaciones al coste de un componente con prestaciones similares en el caso de que no esté en producción.
\begin{itemize}
\item Cada \textit{miniPC} tiene un coste aproximado de 100€
\item El coste del \textit{switch Gigabit} es de 30€
\item El coste del \textit{KVM switch} es de 20€
\item El coste del resto de componentes como cables, teclado y ratón se estima en 30€.
\end{itemize}
Por tanto el coste material del proyecto se eleva a 1380€ en total, si consideramos que se amortiza completamente durante este proyecto. Si tenemos en cuenta un prorrateo de este costo con un plazo de amortización de materiales de 4 años, bastante habitual, el coste de los materiales supone un gasto de 345€ al año.
\item Costes Laborales:
Este proyecto que presento como Trabajo Fin de Grado supone 12 ECTS (European Credit Transfer System) de la formación académica del Grado en Ingeniería Informática. Estos ECTS traducidos a horas de trabajo implican una dedicación aproximada de 300 h. El proyecto estaba previsto desarrollarlo en unas 17 semanas, trabajando unas 18 h semanales. El sueldo medio de un ingeniero informático junior es de alrededor de 23150€\cite{sueldo} por lo que para un proyecto de 300 horas el coste estimado es aproximadamente de 3620€ en costes laborales.
\end{itemize}
Tex_files/MainMatter/cap_2/images/gannt.png

92.2 KiB

File added
main.tex 0 → 100644
\documentclass[a4paper,12pt,twoside,onecolumn,openright,svgnames]{book}
%%%%%%%%%%%%%%%%%%%%%%%%%% PAQUETES IMPORTANTES
\usepackage[a4paper,left=2cm,top=2.5cm,right=1.5cm,bottom=2.5cm]{geometry}
\usepackage[utf8]{inputenc} % códificación de símbolos
\usepackage{amsmath}
\usepackage[spanish,es-tabla,es-nodecimaldot]{babel}
\unaccentedoperators % babel acentúa operadores math. por defecto
\usepackage{times} % (times roman, helvetica, courier)
\usepackage[official]{eurosym} % €€€
\usepackage{graphicx} % Imprescindible para gráficos
\usepackage{svg} % para incluír gráficos svg
% \usepackage{svg-inkscape} % útil con inkscape
\usepackage{xurl} % para que latex pueda partir URLs
\usepackage{xcolor} % Texto en color diferente
%%%%%%%%%%%%%%%%%% ANTES DE AÑADIR UN PAQUETE COMPRUEBA SI ESTÁ EN ESTA
%%%%%%%%%%%%%%%%%% LISTA Y BUSCA LA DOCUMENTACIÓN PUES SI AÑADES UNO
%%%%%%%%%%%%%%%%%% PUEDE COLISIONAR CON UNO DE ESTOS.
%%%%%%%%%%%% PACKAGES PARA CODIGO Y LISTADOS
% minted para listados:
% https://www.overleaf.com/learn/latex/Code_Highlighting_with_minted
\usepackage[newfloat]{minted}
\usepackage{listings} % es compatible con minted (para otros listados)
\renewcommand{\lstlistingname}{Código}
\renewcommand{\lstlistlistingname}{Índice de \lstlistingname s}
\newenvironment{code}{\captionsetup{type=listing}}{}
\SetupFloatingEnvironment{listing}{name=Código Fuente}
%%%%%%%%%%%%% UTILIDADES
\usepackage{pdfpages} % Incluir pdfs como paginas del documento (para anexos)
\usepackage[hidelinks]{hyperref} % para incluir links intra/extra documento
\usepackage{colortbl} % tablas con colores
%%% Tablas, arrays, etc.
\usepackage{tabularx} % Nuevo tipo de columna en tabla X, se ajusta al tamaño
\usepackage{multirow} % Para tablas con multifilas
\usepackage{array} % Para los nuevos tipos de columnas en tabla
%%%%%%%%%%%%% PACKAGES QUE DAN CONTROL EXTRA A VARIAS ORDENES
% caption para gestionar los listados en floats -como figuras o tablas-
\usepackage{caption} % con mejor control de captions
\usepackage{setspace} % facilita la gestión de distancias
\usepackage{cite} % mejora aspecto bibliografía numérica
\usepackage[toc,page]{appendix} % control extra para apéndices.
\usepackage{subfig} % para figuras dentro de figuras
\usepackage{float} % mejor control de posiciones en float
\usepackage{xspace} % busca pequeños errores en nombres latex
\usepackage{enumitem} % http://ctan.org/pkg/enumitem
\usepackage[nottoc,notlot,notlof]{tocbibind} % bibliografía a tabla Contenidos
%%%%%%%%%%%%% TUNEO DE DISTANCIAS Y PEQUEÑOS DETALLES
\renewcommand{\baselinestretch}{1.2} % (latex neutro) esponja el texto.
\setlength{\parindent}{0.5cm} % sangrado de primera línea de párrafo.
\usepackage{microtype} % Soluciona algunos problemas de Overfullness
\usepackage[section]{placeins} % Fuerza a que los floats se queden en su section
%%%%%%%%%%%%%%% FIN DE PAQUETES (no deberías incluír ninguno fuera de aquí)
%%% Se puede sobre-escribir más adelante en la página de título.
% quí sólo es testimonial.
\title{TFG informatica}
\author{Pedro Pérez Pérez}
\date{2023-05-30}
\begin{document}
\raggedbottom
\addtolength{\headsep}{4mm}
% Material inicial del documento.
% Esta sección va en número romanos en minúscula.
\frontmatter
% He organizado los archivos como me gusta. Siéntete libre
% de crear las carpetas que creas necesario.
\include{Tex_files/FrontMatter/title}
\include{Tex_files/FrontMatter/Agradecimientos}
\include{Tex_files/FrontMatter/Resumen}
\tableofcontents
\listoffigures
\listoftables
\lstlistoflistings
% Material principal del documento
% Esta sección va en números arábicos desde el 1
% Los títulos y tipos de capítulos sólo son para muestra
% y tu memoria puede tener otros distintos.
\mainmatter
% Este capítulo es especial porque va sin numeración.
% Sirve de Introducción de la memoria.
\include{Tex_files/MainMatter/cap_0/presentacion}
\include{Tex_files/MainMatter/cap_1/Introduccion}
\include{Tex_files/MainMatter/cap_2/Planificacion}
\include{Tex_files/MainMatter/cap_3/Fundamentacion}
\include{Tex_files/MainMatter/cap_4/Análisis}
\include{Tex_files/MainMatter/cap_5/Diseño}
\include{Tex_files/MainMatter/cap_6/Implementación}
\include{Tex_files/MainMatter/cap_7/Pruebas}
\include{Tex_files/MainMatter/cap_8/Conclusiones}
% La bibliografía se genera automágicamente
% Yo prefiero incluírla en el "mainmatter"
\bibliographystyle{unsrt}
\bibliography{refs}
% Material final del documento (glosarios, índice y contraportada)
% Aquí pueden ir los apéndices aunque pueden subirse.
\backmatter
\appendix\setcounter{chapter}{1} % para que empiece en la A.
%\include{Tex_files/BackMatter/Manual/Manual}
\chapter{Anexo}
\section{Repositorio para el código}\label{apendix:anex1}
El código de este proyecto se encuentra en .......
\end{document}
refs.bib 0 → 100644
@misc{Andre_2023, title={53 important statistics about how much data is created every day},
howpublished = "\url{https://financesonline.com/how-much-data-is-created-every-day/}",
journal={Financesonline.com},
publisher={FinancesOnline.com},
author={Andre, Louie},
year={2023},
month={May}}
@misc{ erlang,
title = "Erlang",
year = "2023",
author= "{Ericsson}",
howpublished = "\url{https://www.erlang.org/}",
note = "[Online; accessed 2-July-2023]"
}
@misc{ Elixir,
title = "Elixir",
year = "2023",
author = "{The Elixir Team}",
howpublished = "\url{https://elixir-lang.org/}",
note = "[Online; accessed 2-July-2023]"
}
@misc{ devtools,
title = "devtools",
year = "2023",
author = "{Hadley Wickham, Jim Hester, Winston Chang, Jennifer Bryan}",
howpublished = "\url{https://www.r-project.org/nosvn/pandoc/devtools.html}",
note = "[Online; accessed 2-July-2023]"
}
@misc{ ROxygen2,
title = "ROxygen2",
year = "2023",
author = "{Hadley Wickham, Jim Hester, Winston Chang, Jennifer Bryan}",
howpublished = "\url{https://cran.r-project.org/web/packages/roxygen2/vignettes/roxygen2.html}",
note = "[Online; accessed 2-July-2023]"
}
@misc{ uuid,
title = "uuid",
year = "2023",
author = "{Simon Urbanek}",
howpublished = "\url{https://cran.r-project.org/web/packages/uuid/index.html}",
note = "[Online; accessed 2-July-2023]"
}
@misc{ httr,
title = "httr",
year = "2023",
author = "{Hadley Wickham}",
howpublished = "\url{https://cran.r-project.org/web/packages/httr/index.html}",
note = "[Online; accessed 2-July-2023]"
}
@misc{ RCurl,
title = "RCurl",
author = "{Jeroen Ooms }",
year = "2023",
howpublished = "\url{https://cran.r-project.org/web/packages/uuid/index.html}",
note = "[Online; accessed 2-July-2023]"
}
@misc{ abind,
title = "abind",
author = "{Tony Plate, Richard Heiberger}",
year = "2023",
howpublished = "\url{https://cran.r-project.org/web/packages/abind/index.html}",
note = "[Online; accessed 2-July-2023]"
}
@misc{ rinside,
title = "RInside",
author = "{Dirk Eddelbuettel}",
year = "2023",
howpublished = "\url{https://cran.r-project.org/web/packages/RInside/index.html}",
note = "[Online; accessed 2-July-2023]"
}
@misc{ rcpp,
title = "Rcpp",
author = "{Dirk Eddelbuettel}",
year = "2023",
howpublished = "\url{https://cran.r-project.org/web/packages/Rcpp/index.html}",
note = "[Online; accessed 2-July-2023]"
}
@misc{ CRAN,
title = "CRAN",
year = "2023",
howpublished = "\url{https://cran.r-project.org/}",
note = "[Online; accessed 2-July-2023]"
}
@misc{ curl,
title = "curl",
year = "2023",
author = "{Daniel Stenberg}",
howpublished = "\url{https://curl.se/}",
note = "[Online; accessed 2-July-2023]"
}
@misc{ NGINX,
title = "NGINX",
author = "{Igor Sysoev}",
year = "2023",
howpublished = "\url{http://nginx.org/}",
note = "[Online; accessed 2-July-2023]"
}
@misc{ Hex,
title = "Hex",
year = "2023",
author = "{Six Colors AB}",
howpublished = "\url{https://hex.pm/}",
note = "[Online; accessed 2-July-2023]"
}
@misc{ Mix,
title = "Mix",
year = "2023",
author = "{Anthony Grimes}",
howpublished = "\url{https://hexdocs.pm/mix/1.14/Mix.html}",
note = "[Online; accessed 2-July-2023]"
}
@misc{ Application,
title = "Application",
year = "2023",
author = "{The Elixir Team}",
howpublished = "\url{https://hexdocs.pm/elixir/1.14.5/Application.html}",
note = "[Online; accessed 2-July-2023]"
}
@misc{ Nebulex,
title = "Nebulex",
author = "{Carlos Andres Bolaños}",
year = "2023",
howpublished = "\url{https://hexdocs.pm/nebulex/Nebulex.html}",
note = "[Online; accessed 2-July-2023]"
}
@misc{Category,
title ="Category Theory",
author = {"The Editors of Encyclopaedia Britannica"},
year = "2023",
howpublished = "\url{https://www.britannica.com/science/foundations-of-mathematics/Category-theory}",
note = "[Online; accessed 2-July-2023]"
}
@misc{ parallel,
title = "Parallel",
author = "{R-core}",
year = "2023",
howpublished = "\url{https://www.rdocumentation.org/packages/parallel/versions/3.6.2}",
note = "[Online; accessed 2-July-2023]"
}
@inproceedings{guide2001project,
title={Project management body of knowledge (pmbok{\textregistered} guide)},
author={Guide, A},
booktitle={Project Management Institute},
volume={11},
pages={7--8},
year={2001}
}
@misc{ sueldo,
title = "Sueldos para el puesto de Ingeniero De Software Junior en España",
author = "{Glassdoor}",
year = "2023",
howpublished = "\url{https://www.glassdoor.es/Sueldos/ingeniero-de-software-junior-sueldo-SRCH_KO0,28.htm}",
note = "[Online; accessed 2-July-2023]"
}
@book{coulouris2005distributed,
title={Distributed systems: concepts and design},
author={Coulouris, George F and Dollimore, Jean and Kindberg, Tim},
year={2005},
publisher={pearson education}
}
@article{kurose2007computer,
title={Computer networking: A top-down approach edition},
author={Kurose, James F and Ross, Keith W},
journal={Addision Wesley},
year={2007}
}
@book{delligatti2013sysml,
title={SysML distilled: A brief guide to the systems modeling language},
author={Delligatti, Lenny},
year={2013},
publisher={Addison-Wesley}
}
@book{grama2003introduction,
title={Introduction to parallel computing},
author={Grama, Ananth},
year={2003},
publisher={Pearson Education}
}
@misc{ elixirschool,
title = "Elixir School",
year = "2023",
author= "{Sean Callan}",
howpublished = "\url{https://elixirschool.com/en}",
note = "[Online; accessed 2-July-2023]"
}
@misc{ introelixir,
title = "Introduction to elixir",
year = "2023",
author= "{The Elixir Team}",
howpublished = "\url{https://elixir-lang.org/getting-started/introduction.html}",
note = "[Online; accessed 2-July-2023]"
}
@book{hebert2013learn,
title={Learn you some Erlang for great good!: a beginner's guide},
author={Hebert, Fred},
year={2013},
publisher={No Starch Press}
}
@inproceedings{de201643,
title={43 years of actors: a taxonomy of actor models and their key properties},
author={De Koster, Joeri and Van Cutsem, Tom and De Meuter, Wolfgang},
booktitle={Proceedings of the 6th International Workshop on Programming Based on Actors, Agents, and Decentralized Control},
pages={31--40},
year={2016}
}
@misc{ libcluster,
title = "Libcluster",
author = "{Paul Schoenfelder}",
year = "2023",
howpublished = "\url{https://hexdocs.pm/libcluster/}",
note = "[Online; accessed 2-July-2023]"
}
@misc{ horde,
title = "Horde",
author = "{Derek Kraan}",
year = "2023",
howpublished = "\url{https://hexdocs.pm/horde/}",
note = "[Online; accessed 2-July-2023]"
}
@misc{ phoenix,
title = "Phoenix",
author = "{Chris McCord}",
year = "2023",
howpublished = "\url{https://hexdocs.pm/phoenix}",
note = "[Online; accessed 2-July-2023]"
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment