\chapter{Herramientas y tecnologías utilizadas}

\section{Full-stack frameworks}


Un \emph{full-stack framework\footnote{Framework en Castellano es traducido como marco de trabajo}}, es una solución que incluye seguridad, enrutamiento de URIs, caché, hooks y muchas otras características. Cuando se usa un framework de estas características el desarrollador se adhiere a los estándares y guías que el framework marca para escribir e implementar el código. Además este tipo de frameworks ofrecen todas las librerías y herramientas que el programador necesita para (en este caso que nos ocupa) desarrollar páginas y servicios Web. Ejemplos de estos frameworks en PHP son:

\begin{itemize}
    \item CakePHP.
    \item Symfony.
\end{itemize}



\section{Glue frameworks}

Como contra parte a \emph{full-stack frameworks} encontramos los \emph{glue frameworks} donde se da más libertad al programador para implementar su propio código, clases, helpers, o librerías. Un \emph{glue framework} no te ata ni hace que el código siga unos estándares determinados. Usualmente estos tipos de frameworks requieren de más código y más diseño y desarrollo en el lado de los desarrolladores; sin embargo, el desarrollador no está limitado a ningún tipo de funcionalidad o estándares. Unos pocos ejemplos de \emph{glue frameworks} son:

\begin{itemize}
    \item Zend.
    \item Codeigniter.
\end{itemize}


\section{Symfony}

Symfony es un marco de trabajo para el desarrollo de aplicaciones Web escrito en PHP que sigue el paradigma del modelo vista controlador (MVC) Su objetivo es incrementar la velocidad y la eficiencia del desarrollo web. Symfony trae muchas características muy útiles que ayudan a que el desarrollador se concentre en la lógica del negocio de la aplicación en lugar de en la implementación o en los objetos paginadores Web o en las abstracciones con la capada de base de datos. Sin embargo, todo tiene un coste, y es el aprendizaje de cómo usar todas las características que hacen de Symfony un marco de trabajo muy útil~\cite{C3:SymfonyBook14}.

El objetivo de Symfony es acelerar la creación y mantenimiento de aplicaciones web y remplazar tareas de codificación repetitivas. Está diseñado para optimizar el desarrollo de aplicaciones web a través de varias características clave. Así, Symfony separa las reglas de negocio de la aplicación web, de la lógica del servidor y de las vistas o presentación al usuario. Contiene numerosas herramientas y clases que permiten acortar el tiempo de desarrollo y aplicaciones web compleja. También automatiza tareas comunes así que el desarrollador puede enfocar su actividad enteramente en las tareas relacionadas con casos específicos de la aplicación. Como resultado final de estas características, con Symfony no hay necesidad de reinventar la rueda cada vez que una nueva aplicación web es construida.

Está escrito completamente en PHP y actualmente se usa en sitios web con alta demanda de páginas. Es compatible con la mayoría de servidores de bases de datos disponibles a la fecha como MySQL, PostgreSQL, Oracle y Microsoft SQL Server. Se ejecuta en entornos *NIX y Windows.

\subsection{Características de Symfony}

Symfony ha sido diseñado para alcanzar los siguiente requisitos:

\begin{itemize}
    \item Fácil instalación y configuración en la mayoría de plataformas.
    \item Independiente del tipo de servidor de base de datos.
    \item Simple de usar en la mayoría de casos, pero flexible para adaptarse a casos complejos.
    \item Cumple con la mayoría de prácticas recomendadas para el desarrollo Web así como con muchos patrones de diseño también recomendado para este tipo de desarrollos.
    \item Código leíble, con phpDocumentor para fácil mantenimiento.
    \item Fácil de extender y permite la integración con librerías de otros vendedores.
\end{itemize}

\subsection{Características de proyectos Web automatizados}

A continuación se enumeran la mayoría de las características comunes que existen entre proyectos web y que pueden ser automatizadas:

\begin{itemize}
    \item Capa de internacionalización ya construida dentro de Symfony para datos, traducción de interfaces y localización del contenido.
    \item La capa presentación usa plantillas y layouts que pueden ser construidos por diseñadores HTML sin necesidad de ningún conocimiento del framework. Los helpers recuden la cantidad de código de presentación que hay que escribir.
    \item Los formularios soportan validación automatizada, asegurando una buena calidad de los datos almacenados en la base de datos y un experiencia de usuario más agradable.
    \item Existe una cache de gestión que reduce el uso de ancho de bando y la carga del servidor.
    \item Las listas son más fáciles de usar gracias a la paginación, clasificación y filtrado automatizados.
\end{itemize}

\subsection{Object-Relational Mapping, ORM}

Las bases de datos son relacionales. PHP y Symfony por otro lado están orientados a objetos. Para acceder a una base de datos en la forma en la que se haría si estuvieran orientadas a objetos se necesita un interfaz de traducción de la lógica de objetos a la relacional. Este interfaz es el ORM.

Un ORM está constituido de objetos que dan acceso a datos y de reglas de negocio. Un beneficio de una capa de abstracción objeto-relacional es que previene de usar una sintaxis que es específica a una base de datos determinada. Esto significa que migrando de un sistema de base de datos en el medio de un proyecto debería ser fácil.

En el ORM, la capa de abstracción, encapsula la lógica de los datos. El resto de la aplicación no necesita saber las queries SQL y usando los objetos en lugar de las records de la base de datos y clases en lugar de tablas tiene otro beneficio: se pueden añadir nuevos métodos de acceso a las tablas. Por ejemplo si se tiene una tabla llamada Cliente con dos campos, Nombre y Apellido, se puede añadir un nuevo campo NombreCompleto que se componga de los dos sin necesidad de hacer ninguna modificación en la tabla o en la base de datos, simplemente añadiendo un nuevo método al objeto que representa la tabla de la base de datos que devuelva el Nombre y el Apellido concatenados como NombreCompleto.

Symfony soporta dos ORMs escritos en PHP que son open source: Propel y Doctrine. Integra ambos y cuando se crea un nuevo proyecto se elige qué ORM usar.

\subsection{El patrón MVC}

Symfony se basa en el patrón de diseño web clásico conocido como arquitectura MVC, la cual consiste de tres niveles:

\begin{itemize}
\renewcommand{\labelitemi}{$-$}
    \item El \textbf{Modelo} representa la información con la cual la lógica de negocio de la aplicación opera.
    \item La \textbf{Vista} renderiza el modelo en una página web adecuada para interactuar con el usuario.
    \item El \textbf{Controlador} responde a acciones del usuario e invoca cambios en el modelo o en la vista según corresponda.
\end{itemize}

Además de dividir la aplicación en esos tres niveles arriba citados, el diseño MVC define las interacciones entre cada uno de ellos. En la Figura~\ref{fig:MVC}) se representa el patrón MVC.  
\begin{figure}[H]
    \centering
        \includegraphics[width=0.8\textwidth]{fig/MVC}
    \caption{\emph{El patrón MVC}}
    \label{fig:MVC}
\end{figure}

\subsubsection{El Modelo}

Representa la estructura subyacente de una aplicación Web. Los modelos a menudo son compartidos entre diferentes subaplicaciones de una aplicación Web. Por ejemplo, un modelo LoginForm puede ser usado tanto en el front end como en el back end de una aplicación, también pueden hacer uso del model APIs Web, etc. El modelo debería contener propiedades para representar datos específicos, lógica de negocio como reglas de validación para asegurar que los datos representado se adecuan a los requerimientos de diseño y puede contener código para la manipulación de los datos. En ocasiones, el modelo puede alcanzar proporciones demasiado grandes conteniendo mucho código en una única clase. También puede ser duro de mantener si el código que contiene sirve a diferentes propósitos~\cite{C3:YiiFramework}. De este modo para grandes aplicaciones es conveniente generar una clase base que represente parte del modelo que sea compartido por todas las diferentes subaplicaciones y en cada subapliación se extiende dicha clase base con el código específico para esa subaplicación.

\subsubsection{La Vista}

Representa el modelo en el formato que el usuario final desea. Las vistas, en general deberían cumplir estos puntos:

\begin{itemize}
    \item Principalmente deben contener código de la capa de presentación, como HTML y código PHP simple para formatear y renderizar daros.
    \item Debería evitar contener código que realiza queries explícitas a la base de datos. Este código debe estar situado en el modelo.
    \item La vista puede acceder a propiedades y métodos de controladores y modelos directamente. Sin embargo, esto debería ser realizado solo para presentación.
\end{itemize}

\subsubsection{El Controlador}

Los controladores enlazan el modelo, la vista y otros componentes de la aplicación. Tratan directamente con peticiones del usuario. 

\begin{itemize}
    \item Se debe evitar el uso de sentencias SQL directamente en esta capa. Éstas deben ser mantenidas preferiblemente en el modelo.
    \item No debería contener código HTML o cualquier otro código relacionado con la capa de presentación. Este código es mejor mantenerlo siempre en las vistas.
\end{itemize}

En una aplicación MVC diseñada correctamente los controladores no contienen mucho código mientras que los modelos sí lo hacen y contienen la mayor parte del código responsable para la representación y manipulación de los datos. Esto se debe a que la estructura de datos y la lógica de negocio representada por los modelos suele ser muy específica para una determinada aplicación, y necesita grandes cambios para lograr los requerimientos de dicho programa; mientras que la lógica del controlador a menudo sigue un modo de funcionamiento similar a través de diferentes aplicaciones y por tanto puede ser simplificado por el framework subyacente o por las clases base~\cite{C3:YiiFramework}.


\section{Bases de datos relacionales}

Una base de datos relacional es una colección de datos organizados en forma de tablas desde las cuales los datos pueden ser accedidos fácilmente. Las bases de datos relacionales son creadas usando el modelo relacional\footnote{Para más información acerca del modelo relacional ver: \url{http://en.wikipedia.org/wiki/Relational_model}} y el software usado para la utilización de estas bases de datos se conoce como Sistema de Gestión de Bases de Datos Relacionales (RDBMS por sus siglas en Inglés) Por ejemplo en el mundo open source,  MySQL y PostgreSQL son unos de los más extendidos RDBMS pero no los únicos.

\section{PostgreSQL}

PostgreSQL (o de forma abreviada Postgres) es un Sistema de Gestión de Bases de Datos Relacionales y de Objetos (ORDBMS por sus siglas en Inglés) Un ORDBMS es un sistema similar a una base de datos relacional pero con un modelo orientado a objetos. Clases y herencia son soportados directamente en los esquemas de la base de datos y en el lenguaje para realizar queries. Los ORDBMS se encuentran a medio camino entre los Sistemas de Bases de Datos Orientados a Objetos (OODBMS) y los Relacionales (RDBMS)

PostgreSQL evolucionó desde un proyecto de la Universidad de California en el Departamento de Ciencias Computacionales de Berkeley. El primer sistema operacional basado en Postgres fue liberado en 1987 y no disponía de motor SQL si no de uno propio conocido como PostQUEL. En 1994 se añadió el interpretador SQL a Postgres y desde entonces y hasta ahora el proyecto ha crecido enormemente. Además, se libera con una licencia similar a las licencias MIT o BSD\footnote{\url{http://www.postgresql.org/about/licence/}}

PostgreSQL es considerado el más avanzado sistema de base de datos open source en el mundo. Proporciona muchas características que tradicionalmente solo pueden ser encontradas en productos comerciales para grandes empresas.

PostgreSQL es un proyecto open source. Open source por definición significa que se puede obtener el código fuente, usar el programa, y modificarlo libremente sin ningún límite por parte del propietario del software. Ahora bien, NO confundir software open source con software libre de coste. Es cierto que se puede descargar sin ningún coste, pero siempre habrá costes asociados con el tiempo y energía que una compañía pone en el soporte y mantenimiento de la aplicación. Si una empresa no tiene esos recursos para gastar siempre existen vendedores y consultores especializados en productos relacionados con PostgreSQL.

\subsection{Características de PostgreSQL}

El siguiente es un breve listado de algunas de las características que PostgreSQL implementa~\cite{C3:PPostgreSQL}:

\begin{itemize}
    \item \textbf{ORDBMS}: un ORDBMS es una Base de Datos Relacional y de Objetos; esto significa que PostgreSQL permite acceso a datos mediante un modelo relacional y de objetos, y es capaz de manejar rutinas y reglas complejas. Ejemplos de su avanzada funcionalidad son las queries SQL declarativas, el soporte multi usuario, la optimiazación de queries, herencia y arrays.
    \item \textbf{Altamente extensible}: PostgreSQL permite que el usuario pueda definir sus propios operadores, funciones, métodos de acceso y tipos de datos.
    \item \textbf{Integridad referencial}: soporte de integridad referencial, el cual es usado para asegurar la validez de los datos el base de datos.
    \item \textbf{API flexible}: la flexibilidad de la API de PostgreSQL ha permitido a múltiples vendedores proporcionar fácilmente soporte de desarrollo. Estos interfaces incluyen Python, Perl, PHP, ODBC, Java/JDBC, Ruby, C/C++, Object Pascal, etc.
    \item \textbf{Cliente/Servidor}: PostgreSQL usa una arquitectura cliente/servidor de un proceso por usuario. Existe un proceso master que realiza \emph{forks} para proporcionar conexiones adicionales en cada intento de conexión por parte del cliente al servidor PostgreSQL.
    \item \textbf{MVCC}: Control de Concurrencia de Versión Múltiple, es la tecnología que PostgeSQL usa para evitar innecesario \emph{locking}. En servidores tales como MySQL o Access, existen momentos en los que el lector tiene que esperar para acceder a la información en la base de datos. La espera es causada por otros usuarios que están escribiendo a la base de datos. Dicho a groso modo, el lector es bloqueado por escritores que están actualizando \emph{records} en tablas de la base de datos.
    \item \textbf{WAL}: \emph{Write Ahead Logging} consiste en escribir el histórico de las acciones realizadas por una base de datos antes de que incluso estas acciones se hayan producido. Llevando el diario (la historia) de los cambios antes de que estos sean escritos a la base de datos incrementa la fiabilidad de PostgreSQL respecto a otros competidores. Incluso en caso de un \emph{crash} de la base datos existirá un histórico de las transacciones desde el cual podremos recuperar seguramente los datos.
\end{itemize}

\section{PostGIS}

PostGIS es un software open source que añade soporte de objetos geográficos a la base de datos PostgreSQL. Se libera bajo la licencia \emph{GNU General Public License} (GPL-2.0) Se trata de una base de datos espacial, es decir, una base de datos que define tipos de datos especiales para objetos geométricos y permite almacenar datos geométricos (usualmente de naturaleza geográfica) en tablas de bases de datos convencionales. Proporciona funciones e índices especiales para realizar consultas y manipular los datos geométricos usando SQL (\emph{Structured Query Language}) Una base de datos espacial es a menudo usada solo como un contenedor para almacenar datos espaciales, pero puede hacer mucho más que eso. Aunque una base de datos espacial no necesita ser relacional, la mayoría de las bases de datos espaciales conocidas lo son.

Una base de datos espacial proporciona herramientas de almacenaje y de análisis. La presentación de datos visualmente no es una meta de las bases de datos espaciales.

\subsection{Consultas, análisis y procesado espacial}

Una \emph{query} espacial es una consulta a la base de datos que usa funciones geométricas para responder cuestiones acerca del espacio y de objetos en el espacio. Bases de datos espaciales como PostGIS añaden un conjunto de funciones al lenguaje estándar SQL que trabajan con objetos geométricos en una base de datos de forma similar a funciones que trabajan con datos. Por ejemplo, con una fecha, hay funciones que cuentan cuantas horas/días/minutos/años/semanas hay entre dos fechas o si esta fecha se encuentra en el futuro o en el pasado.

Además de ser capaz de responder cuestiones acerca del uso del espacio, las funciones espaciales permite crear y modificar objetos en el espacio. Esta porción del análisis espacial es a menudo referida como procesado geométrico o espacial~\cite{C3:PostGIS}.

\section{Android}
