PageRenderTime 28ms CodeModel.GetById 40ms RepoModel.GetById 0ms app.codeStats 0ms

/doc/entorno.tex

https://github.com/laparca/dhc
LaTeX | 291 lines | 167 code | 117 blank | 7 comment | 0 complexity | 4d87a45f5d859533db4908bc766a0a11 MD5 | raw file
  1. \chapter{Entorno de desarrollo}\label{chap:entorno}
  2. Para el desarrollo del proyecto se ha hecho uso de una gran cantidad de herramientas y tecnologías que es importante ver para poder comprender mejor el modo de desarrollo.
  3. \section{CMake}
  4. CMake es una herramienta para la construcción de ficheros Makefile. El mayor inconveniente que hay a la hora de utilizar ficheros Makefile es que resulta complicado mantenerlos y aún más crear versiones para diferentes sistemas operativos. Este último punto se debe a que pueden variar sutilmente algunas de las reglas para crear el fichero y que dependiendo del sistema operativo se puedan necesitar unas u otras librerías. Además, utilizando ficheros Makefile es complicado realizar comprobaciones sobre el sistema, como pueden ser comprobar si está o no instalada una biblioteca en concreto.
  5. Existen varias soluciones para la generación de ficheros Makefile, entre ellas destaca GNU Autotools. Ésta es probablemente una de las herramientas más famosas en el mundo del software libre por ser la que se utiliza dentro del proyecto GNU. Desgraciadamente Autotools es una herramienta complicada de utilizar lo que nos hizo decantarnos por CMake.
  6. CMake utiliza una sintaxis sencilla para definir las reglas de comprobación, asignación de dependencias y cualquier cosa que tenga que ver con el proceso de generación del proyecto.
  7. Para instalar CMake en el sistema se ejecutará el siguiente comando:
  8. \begin{verbatim}
  9. $ sudo apt-get install cmake
  10. \end{verbatim}
  11. \section{Git}
  12. Una parte muy importante de todo proyecto es la gestión de los ficheros que se están utilizando. En el caso de un proyecto software el control de los cambios es fundamental para evitar problemas.
  13. Git es un sistema de control de versiones desarrollado por Linus Torvalds para el núcleo Linux. Sus principales características son:
  14. \begin{itemize}
  15. \item Es un sistema distribuido, lo que evita la necesidad de disponer siempre de un servidor central al que enviar los cambios, como sucede con otros sistemas como CVS o Subversion.
  16. \item Facilita la creación de ramas (\emph{branch}) de desarrollo y la fusión de éstas (\emph{merge}) cuando es necesario de forma rápida y sencilla.
  17. \item Facilita disponer de copias de seguridad distribuyéndolas entre varios equipos, al menos en el uso que se ha dado para este proyecto final de carrera.
  18. \end{itemize}
  19. Para poder utilizar git solo hace falta instalarlo ejecutando el siguiente comando:
  20. \begin{verbatim}
  21. $ sudo apt-get install git-core
  22. \end{verbatim}
  23. Durante el desarrollo del proyecto se han utilizado varias ramas para controlar las distintas partes. Concretamente se ha utilizado:
  24. \begin{description}
  25. \item[master] Mantiene el código que se ha comprobado que funciona correctamente. No se puede incorporar nada a esta rama directamente, sino que hay que desarrollar primero en otra rama, comprobar correcto funcionamiento de los cambios y luego se realiza la mezcla de los cambios con \emph{master}s.
  26. \item[ldopen] En esta rama se realizaron los cambios para soportar \emph{plugins}. La nomenclatura de ldopen proviene de la llamada a sistema utilizada para poder desarrollar esta funcionalidad.
  27. \item[nuevaweb] Aquí se encuentra todo el código de pruebas del nuevo controlador desarrollado así como cambios sobre los agentes para soportar la nueva arquitectura.
  28. \item[fixcompiling] Cambios realizados para que la compilación en el sistema operativo Mac OS X funcionara correctamente.
  29. \end{description}
  30. \section{Apache}
  31. Para poder hacer uso del controlador es necesario disponer de un servidor web con soporte de PHP. En este caso se ha utilizado el servidor web Apache en su versión 2 por ser el más popular, disponer de una abundante documentación y ser software libre.
  32. Cualquier distribución de GNU/Linux puede instalar este servidor web con unos pocos \emph{clicks} de ratón o en su defecto un único comando. En el caso de las distribuciones basadas en Debian solo hace falta ejecutar el siguiente comando:
  33. \begin{verbatim}
  34. $ sudo apt-get install apache2
  35. \end{verbatim}
  36. \section{Redmine}
  37. Redmine es un gestor de proyectos realizado en Ruby on Rails. Permite la asignación de tareas, calendarios, documentación y otras muchas funcionalidades más a través de plugins. Como la mayoría de las herramientas utilizadas es software libre.
  38. Esta herramienta ha sido de utilidad para poder controlar los problemas que han ido surgiendo y que no quedarán pendientes.
  39. La instalación de Redmine es probablemente de las más complicadas de todas las herramientas utilizadas en este proyecto. Para instalar esta herramienta se ha tenido que seguir los siguientes pasos:
  40. \begin{itemize}
  41. \item Instalación de ruby, rails y rake:
  42. \begin{verbatim}
  43. $ sudo apt-get install ruby rails rake
  44. \end{verbatim}
  45. \item Instalación del módulo \emph{passenger} para apache\footnote{Passenger dispone de paquetes para algunas distribuciones. Por desgracia, la distribución que utilizaba el servidor de Redmine no disponía de dichos paquetes}:
  46. \begin{verbatim}
  47. $ sudo gem install passenger
  48. $ sudo passenger-install-apache2-module
  49. \end{verbatim}
  50. \end{itemize}
  51. \section{CUDA}
  52. Como no, se ha hecho uso de las herramientas de NVIDIA para compilar el proyecto. El \emph{framework} CUDA trae las bibliotecas básicas necesarias para poder comunicarse con la tarjeta gráfica y las herramientas de compilación.
  53. Para poder utilizar CUDA hay que instalar previamente los controladores de la tarjeta gráfica adecuados ya que los controladores que vienen por defecto solo permiten funciones gráficas.
  54. Para desarrollar el proyecto se ha hecho uso de la versión 2.3 de CUDA que puede encontrarse en \url{http://developer.nvidia.com/object/cuda_3_2_downloads.html}. Desde esta página se pueden descargar tanto los controladores para el sistema operativo como las herramientas necesarias para desarrollar en CUDA.
  55. Es importante comprobar antes de utilizar CUDA si la tarjeta gráfica que tiene el equipo es compatible.
  56. Para instalar CUDA en linux se necesita instalar primero el controlador de la tarjeta gráfica. Este controlador requiere las cabeceras del núcleo Linux para poder compilarse. Por este motivo hay que asegurarse de que ya se encuentren instaladas y en caso contrario se pueden instalar con el siguiente comando:
  57. \begin{verbatim}
  58. $ sudo apt-get install linux-headers-generic
  59. \end{verbatim}
  60. Por desgracia no se ofrecen paquetes adaptados a cada distribución por lo que hay que utilizar el instalador que ofrece NVIDIA:
  61. \begin{verbatim}
  62. $ wget http://developer.download.nvidia.com/compute/cuda/
  63. 3_2_prod/drivers/devdriver_3.2_linux_32_260.19.26.run
  64. $ sudo sh ./devdriver_3.2_linux_32_260.19.26.run
  65. \end{verbatim}
  66. Tras este paso solo hay que seguir las indicaciones del instalador.
  67. Hay ocasiones en las que el instalador de los controladores de NVIDIA fallan y no crean los dispositivos necesarios en \emph{/dev}, por lo que hay que crearlos a mano. Para ello se puede utilizar las siguiente llamadas en línea de comando:
  68. \begin{verbatim}
  69. $ for i in $(seq 0 9); do sudo mknod /dev/nvidia${i} c 195 ${i}; done
  70. $ sudo mknod /dev/nvidiactl c 195 255
  71. \end{verbatim}
  72. Una vez instalado el controlador de CUDA se puede proceder a instalar las herramientas. Éstas utilizan su propio instalador, pero está adaptado a distintas distribuciones, por lo que hay que elegir el más adecuado:
  73. \begin{verbatim}
  74. $ wget http://developer.download.nvidia.com/compute/cuda/
  75. 3_2_prod/toolkit/cudatoolkit_3.2.16_linux_64_ubuntu10.04.run
  76. $ sudo sh ./cudatoolkit_3.2.16_linux_64_ubuntu10.04.run
  77. \end{verbatim}
  78. Es recomendable instalar las herramientas en los directorios que nos indique como predeterminados (generalmente \emph{/usr/local/cuda}).
  79. \section{Compilador de C y C++ de GNU}
  80. El compilador de GNU es probablemente uno de los más utilizados hoy día en el mundo del software libre. Este compilador dispone de herramientas para compilar una gran cantidad de lenguajes distintos como C, C++, Objective-C, Pascal y muchos más. Es el compilador que traen todas las distribuciones GNU/Linux en la actualidad y hasta sistemas operativos como Mac OS X lo utilizan.
  81. La mayor parte del código empleado en el proyecto está escrito en C++ por lo que se ha necesitado hacer uso del compilador de C++ de GNU, principalmente por ser el más sencillo de instalar en Linux.
  82. Para asegurarnos que al instalar el compilador de GNU se instalen todas las dependencias que necesitamos podemos ejecutar la siguiente orden:
  83. \begin{verbatim}
  84. $ sudo apt-get install build-essential g++
  85. \end{verbatim}
  86. El paquete \emph{build-essential} se encarga de instalar todas las herramientas y bibliotecas de compilación básicas. Luego le indicamos que se asegure de instalar g++ (nombre que tiene el compilador de C++ suministrado por GNU).
  87. \section{NASM}
  88. NASM es un ensamblador multiplataforma que se necesita para poder generar la versión de CPU de MD5. Es importante asegurarse de utilizar la última versión de la herramienta ya que, por ejemplo, la versión que trae Mac OS X no está actualizada y no permite realizar compilaciones de 64 bits.
  89. Para instalarlo solo hay que ejecutar:
  90. \begin{verbatim}
  91. $ sudo apt-get install nasm
  92. \end{verbatim}
  93. \section{PHP}
  94. PHP es un lenguaje de programación web muy extendido gracias a que es gratuito y libre. Tiene una sintaxis sencilla fuertemente basada en C y es muy fácil de aprender.
  95. Es muy habitual hablar de instalaciones LAMP, que son aquellas que hacen uso de Linux, Apache, MySQL y PHP y que son ampliamente utilizadas en internet por gran número de servicios de alojamiento por su bajo coste y facilidad de instalación y configuración.
  96. Al ser un lenguaje muy extendido se ha utilizado para la creación del nuevo controlador de DHC. El anterior controlador también hacía uso de PHP pero cuando se planteó crear uno nuevo se barajaron soluciones basadas en Ruby y Groovy. Estas soluciones fueron descartadas por ser algo más complicadas de configurar. Para ser más precisos, Ruby requiere que se instalen módulos especiales para Apache y hay que revisar muy bien la configuración. En el caso de Groovy se necesita un servidor Apache Tomcat basado en java que puede suponer una gran sobrecarga para el sistema.
  97. Para instalar PHP e integrar éste con Apache solo hace falta ejecutar el siguiente comando en cualquier distribución basada en Debian:
  98. \begin{verbatim}
  99. $ sudo apt-get install php5
  100. \end{verbatim}
  101. \section{CakePHP}
  102. CakePHP es un \emph{framework} de desarrollo web que hace uso del lenguaje de programación PHP y el patrón arquitectónico MVC. Con CakePHP se pueden hacer aplicaciones fácilmente sin tener que preocuparse de cosas como el acceso a base de datos o el control de flujo a través de la aplicación.
  103. Gracias al uso de CakePHP se ha podido centrar la atención del controlador más en las tareas propias del mismo. De este modo ahora no hay que preocuparse de como hacer el acceso a la base de datos o incluso el tipo de base de datos que se está utilizando.
  104. Para utilizar CakePHP solo hace falta descargarlo y descromprimirlo en un directorio. Éste ya dispone de una estructura básica de directorios para utilizar directamente en un proyecto. Para este proyecto los directorios más importantes son:
  105. \begin{description}
  106. \item[app/controllers] Almacena los controladores de la aplicación. Estos controladores se encargan de la lógica de negocio.
  107. \item[app/views] Representan las salidas que producirá la aplicación.
  108. \item[app/models] Describe la estructura de la base de datos (las tablas y sus relaciones).
  109. \item[app/config] Tiene la configuración del motor de base de datos que hay que utilizar y la configuración de la misma. Por otra parte se ha almacenado aquí el script para generar las tablas en esta base de datos.
  110. \end{description}
  111. \section{MySQL}
  112. MySQL es uno de los motores de base de datos libres más extendidos de internet. La principal razón de esto es que es fácil de administrar y que históricamente siempre ha sido una base de datos muy rápida, lo que suponía una ventaja para las aplicaciones web con una alta carga de peticiones.
  113. El controlador de DHC hace uso de bases de datos para almacenar la información de las tareas que se están ejecutando y las estadísticas de las mismas.
  114. Su instalación es tan sencilla como ejecutar:
  115. \begin{verbatim}
  116. $ sudo apt-get install mysql-server
  117. \end{verbatim}
  118. \section{Gimp}
  119. Gimp es una herramienta de retoque fotográfico de una gran calidad y que desde hace muchos años se la considera el Photoshop del software libre.
  120. Para las imágenes utilizadas en la web se ha utilizado Gimp por ser una herramienta potente y relativamente sencilla de utilizar.
  121. Para su instalación se ha utilizado:
  122. \begin{verbatim}
  123. $ sudo apt-get intall gimp
  124. \end{verbatim}
  125. \section{\LaTeX}
  126. Es una de las herramientas más extendidas para la creación de textos científicos. \LaTeX{} son un conjunto de reglas para la herramienta \TeX{} creada por Donald E. Knuth. Su diseño está pensado centrarse en el contenido de los documentos en lugar de en su diseño. Es muy parecido a lo que ahora se hace en web con HTML+CSS.
  127. La memoria de este proyecto final de carrera ha sido escrito utilizando \LaTeX{} por las ventajas que ofrece frente a otros sistemas como Microsoft Word o LibreOffice. Entre estas ventajas podemos destacar que al almacenar solo ficheros de texto es más sencillo realizar un control de versiones sobre las modificaciones, lo que resulta más complicado utilizando ficheros binarios.
  128. Para instalar el compilador de \LaTeX{} en el sistema hay que ejecutar:
  129. \begin{verbatim}
  130. $ sudo apt-get install texlive-latex-extra
  131. \end{verbatim}
  132. \section{GnuPlot}
  133. GnuPlot es una herramienta para la generación de gráficas de funciones. Ha sido utilizada para la gráfica de la distribución de la paradoja del cumpleaños.
  134. Esta herramienta es muy útil cuando se necesita hacer gráficas de datos y no se tiene un sistema muy potente ya que requiere de poca memoria. Un ejemplo de ello es cuando se tienen grandes tablas de datos en MS Office lo que hace que tarde en generar gráficas o incluso manejar los datos.
  135. En este caso se ha creado un script de GnuPlot que ha sido integrado dentro del sistema de compilación automático de CMake para generar un PDF y poder ser incrustado en el documento \LaTeX.
  136. Para instalar GnuPlot sólo hace falta utilizar la siguiente orden en el sistema:
  137. \begin{verbatim}
  138. $ sudo apt-get install gnuplot
  139. \end{verbatim}
  140. \section{LibreOffice}
  141. LibreOffice es una herramienta que ha nacido a partir del código de OpenOffice.org. Su creación se motivo en el descontento de los desarrolladores por la falta de una estrategia por parte de Oracle tras la compra de Sun (y con ello de OpenOffice.org). Aparentemente, Oracle no tiene mucho interés en apoyar el software libre adquirido por la compra de Sun Microsystems.
  142. Todas los diagramas que aparecen en la memoria ha sido realizadas con la aplicación de dibujo de LibreOffice.
  143. LibreOffice puede ser descargado desde su página web en \url{http://www.libreoffice.org/download/}.
  144. \section{UML}
  145. UML, siglas de \emph{Unified Modeling Language}, es un lenguaje gráfico para modelar software ampliamente utilizando en el mundo de la programación orientada a objetos.
  146. Algunos de los diagramas expuestos en la memoria hacen uso de dicho lenguaje. Concretamente se ha hecho uso de diagramas de clases y de secuencia. El primero permite expresar de forma gráfica los elementos que forman todo, o una parte, de un programa, pero sin entrar al detalle de como deben comportarse. Los diagramas de secuencia representan un caso de funcionamiento concreto y son útiles para poder mostrar cómo actúa una parte del proyecto.
  147. \section{Debian y Ubuntu}
  148. Debian es una de las distribuciones de Linux más antiguas y su filosofía es utilizar sólo software libre. Uno de los puntos más importantes a destacar sobre esta distribución es que está mantenida enteramente por voluntarios y que tiene uno de los mayores repositorios de aplicaciones de todas las distribuciones existentes.
  149. Debian posee muchas distribuciones derivadas que sobre ésta añaden paquetes y/o hacen cambios de configuración. Una de estas distribuciones, y probablemente la distribución más famosa actualmente, es Ubuntu.
  150. Para descargar Debian se puede ir a \url{http://www.debian.org/distrib/} y Ubuntu se puede obtener de \url{http://www.ubuntu.com/desktop/get-ubuntu/download}.
  151. %\section{SLOCCount}
  152. %SLOCCount es una herramienta para contar número de líneas de código de proyectos software. Tras una ejecución de esta herramienta sobre un directorio con software ofrece estadísticas del número de líneas total y cómo se distribuyen entre los distintos lenguajes de programación utilizados.
  153. %Además de lo anterior, SLOCCount trata de hacer una estimación del coste del código comprobado utilizando el modelo COCOMO.
  154. %Para poder utilizar esta herramienta hay que instalarla previamente con el siguiente comando:
  155. %\begin{verbatim}
  156. %$ sudo apt-get install sloccount
  157. %\end{verbatim}
  158. \section{Organización del entorno de trabajo}
  159. Para realizar el proyecto se ha utilizado, a parte de las herramientas anteriormente mencionadas, una serie de equipos organizados del siguiente modo:
  160. \begin{description}
  161. \item[Servidor web] Se dispone de un servidor privado virtual que tiene instalado Apache, Git, Redmine, PHP y la versión de pruebas del controlador de DHC.
  162. Este servidor ha sido subcontratado para garantizar un buen funcionamiento del servicio ya que la red de la universidad no ofrece garantías suficientes de estabilidad. Además, el uso de un servidor privado virtual ofrece la posibilidad de instalar todas aquellas herramientas que sean necesarias.
  163. \item[Equipos de desarrollo] Puede ser cualquier equipo desde el que puede escribirse código fuente. Se han utilizado dos ordenadores para este propósito uno con Mac OS X y el otro con Kubuntu 10.10.
  164. Desde estos equipos se realizan constantes peticiones de \emph{pull} y \emph{push} a git para mantener siempre una copia actualizada de los cambios.
  165. \item[Equipo de ejecución] Este equipo se encuentra instalado en el laboratorio de Evalues en el Parque Cientifico-Tecnológico de Leganés. Dispone de 2 microprocesadores AMD Opteron de 4 núcleos cada uno, 8 GB de RAM y una NVIDIA Tesla S1070.
  166. Tanto la unidad Tesla como el equipo que la controla pueden montarse en un \emph{rack} de ordenadores.
  167. Para ejecutar las pruebas este ordenador hace peticiones de \emph{pull} al git para obtener las versiones más actuales del código.
  168. \end{description}
  169. Para comprender mejor como interactúan entre los distintos se puede consultar la figura~\ref{fig:entorno_trabajo}.
  170. \begin{figure}
  171. \centering
  172. \includegraphics[width=0.7\textwidth]{images/entorno_trabajo.pdf}
  173. \caption{Diagrama del entorno de trabajo}\label{fig:entorno_trabajo}
  174. \end{figure}