% Arquitectura Web
% Adolfo Sanz De Diego
% Enero 2014
# Acerca de
## Índice
- Contenidos:
- Acerca de
- Introducción
- Historia evolutiva de la Web
- Arquitectura web
- Entorno de ejecución en servidor
- Tecnologías de servidor
- Entorno de ejecución en cliente
- Tecnologías de cliente
## Adolfo Sanz De Diego
- **Antiguo programador web JEE**
- Hoy en día:
- **Profesor de FP de informática**:
- Hardware, Sistemas Operativos
- Redes, Programación
- **Formador Freelance**:
- Java, Android
- JavaScript, jQuery
- JSF, Spring, Hibernate
- Groovy & Grails
- **Me gusta programar**
## Hackalover
![](../img/hackathon-lovers-logo.png)
- **Para los amantes de los hackathones**.
- **Meetup**: [http://www.meetup.com/Hackathon-Lovers/](http://www.meetup.com/Hackathon-Lovers/)
- **LinkedIn**: [http://www.linkedin.com/groups/Hackathon-Lovers-6510465](http://www.linkedin.com/groups/Hackathon-Lovers-6510465)
- **Tumblr**: [http://hackathonlovers.tumblr.com/](http://hackathonlovers.tumblr.com/)
- **Twitter**: [http://twitter.com/HackathonLovers](http://twitter.com/HackathonLovers)
- **YouTube**: [http://www.youtube.com/channel/UCRwSe7jK-y62BMvIiNBV1qw](http://www.youtube.com/channel/UCRwSe7jK-y62BMvIiNBV1qw)
## Tweets Sentiment
![](../img/tweets-sentiment-logo.png)
- Es un **analizador de tweets** que extrae información semántica para conocer
si el sentimiento general de los tweets de un determinado tema
es positivo o negativo.
- **Web**: [http://tweetssentiment.com/](http://tweetssentiment.com/)
- **Twitter**: [http://twitter.com/TweetsSentiment](http://twitter.com/TweetsSentiment)
## ¿Donde encontrarme?
- Mi nick: **asanzdiego**
- AboutMe: [http://about.me/asanzdiego](http://about.me/asanzdiego)
- Blog: [http://asanzdiego.blogspot.com.es](http://asanzdiego.blogspot.com.es)
- GitHub: [http://github.com/asanzdiego](http://github.com/asanzdiego)
- Google+: [http://plus.google.com/+AdolfoSanzDeDiego](http://plus.google.com/+AdolfoSanzDeDiego)
- LinkedIn: [http://www.linkedin.com/in/asanzdiego](http://www.linkedin.com/in/asanzdiego)
- SlideShare: [http://www.slideshare.net/asanzdiego](http://www.slideshare.net/asanzdiego)
- Twitter: [http://twitter.com/asanzdiego](http://twitter.com/asanzdiego)
## Créditos
- Agradecimientos a **Micael Gallego** [http://twitter.com/micael_gallego](http://twitter.com/micael_gallego)
- Introducción a las aplicaciones web [http://www.slideshare.net/micaelgallego/qu-es-la-web-30036167](http://www.slideshare.net/micaelgallego/qu-es-la-web-30036167)
- Tecnologías de desarrollo de aplicaciones web [http://www.slideshare.net/micaelgallego/tema2-tecnologas-de-desarrollo-de-aplicaciones-web](http://www.slideshare.net/micaelgallego/tema2-tecnologas-de-desarrollo-de-aplicaciones-web)
- Estas **transparencias** están hechas con:
- [https://github.com/asanzdiego/marckdownslides](https://github.com/asanzdiego/marckdownslides)
## Licencia
- Estas **transparencias** están bajo una licencia:
- [Creative Commons Reconocimiento-CompartirIgual 3.0](http://creativecommons.org/licenses/by-sa/3.0/es/)
- El **código** de los programas están bajo una licencia:
- [GPL 3.0](http://www.viti.es/gnu/licenses/gpl.html)
## Fuentes
- Otros formatos:
- SlideShare [http://www.slideshare.net/asanzdiego/arquitectura-web-30984535](http://www.slideshare.net/asanzdiego/arquitectura-web-30984535)
- Deck Slides [http://asanzdiego.github.io/arquitectura-web/export/arquitectura-web-deck-slides.html](http://asanzdiego.github.io/arquitectura-web/export/arquitectura-web-deck-slides.html)
- Reveal Slides [http://asanzdiego.github.io/arquitectura-web/export/arquitectura-web-reveal-slides.html](http://asanzdiego.github.io/arquitectura-web/export/arquitectura-web-reveal-slides.html)
- Plain HTML [http://asanzdiego.github.io/arquitectura-web/export/arquitectura-web.html](http://asanzdiego.github.io/arquitectura-web/export/arquitectura-web.html)
- Markdown [http://raw.github.com/asanzdiego/arquitectura-web/master/md/arquitectura-web.md](http://raw.github.com/asanzdiego/arquitectura-web/master/md/arquitectura-web.md)
# Introducción
## ¿Qué es Internet?
- Internet es un conjunto descentralizado de **redes de comunicación interconectadas** que utilizan la familia de protocolos TCP/IP.
- Funciona como una **red lógica única**, de alcance **mundial**, aunque esté formada por multitud de redes físicas **heterogéneas**.
- Uno de los servicios que más éxito ha tenido en Internet ha sido la **World Wide Web** (WWW, o "la Web"), aunque es habitual la confusión entre ambos términos por gente no experta.
## ¿Qué es La Web?
- La Web es un conjunto de protocolos, estándares y tecnologías, basadas en Internet, diseñado originalmente para la consulta remota de información en **archivos de hipertexto**.
## Otros servicios
- Existen muchos otros servicios y protocolos en Internet:
- Envío y recepción de correo electrónico (POP3, IMAP, SMTP)
- Transmisión de archivos (SSH, FTP, P2P, HTTP)
- Mensajería instantánea (IRC, XMPP)
- Transmisión de contenido multimedia (VoIP, IPTV, RTP)
- Conexión remota por consola (SSH, Telnet)
- Conexión remota gráfica (VNC)
## La Web 1.0
- Al principio, el **usuario sólo leía contenido** publicado por otros. Era un contenido muy estático, y muy difícil de editar por el propio usuario.
- El navegador web era la única aplicación "conectada", y hay que reconocerlo... la web era sobre todo para Frikis.
## Las cosas empiezan a cambiar
- Poco a poco las tecnologías se desarrollan y los **usuarios empiezan a tener más facilidades para editar el propio contenido**.
- Google se empieza a popularizar, nace Blogger, WordPress, la Wikipedia, LinkedIn...
## Nace la Web 2.0
- En 2004 Dale Dougherty (O'Reilly) acuña el término Web 2.0 para referirse a La Web como una plataforma con aplicaciones ligeras, dinámicas y en constante evolución.
- Con la Web 2.0, las páginas web dejan de ser simples documentos online para convertirse en aplicaciones web, y es entonces cuando los **usuarios toman el control de los contenidos**.
## Web 1.0 VS Web 2.0
![](../img/web1-vs-web2.png)
# Historia evolutiva de la Web
## Los orígenes de Internet
- En **1962**, a causa de la guerra fría con la URSS, las Fuerzas Aéreas de Estados Unidos pidieron a un reducido grupo de investigadores que creara una **red de comunicaciones militares que pudiera resistir un ataque nuclear**.
- En **1964**, **Paul Baran** tuvo la idea de crear una **red en forma de telaraña**. El concepto de esta red se basaba en un sistema descentralizado, de manera que la red pudiera seguir funcionando aunque se destruyeran uno o varios equipos.
## Arpanet (1969)
![](../img/arpanet.png)
- En **1969**, el proyecto militar ARPA (Agencia de Proyectos de Investigación Avanzados, una división del Ministerio de Defensa de Estados Unidos) creó la red experimental **ARPANET** cuyo fin era conectar las principales universidades de EEUU.
## Nace La Web (1989)
![](../img/inventores.png)
- En **1989**, **Tim Berners-Lee junto a Robert Cailliau crean la World Wide Web**. Habilitaron los dominios o direcciones con letras (en vez de los complejos códigos IP). También inventaron los enlaces. Esto marcó el nacimiento de La Web como lo conocemos hoy en día.
## Yahoo (1994)
![](../img/yahoo.png)
- En **1994**, **Jerry Yang y David Filo**, estudiantes de Stanford, crean **Yahoo!** un directorio de sitios según la categoría de su contenido, para así intentar poner orden dentro del bazar, cada día más extenso, que se estaba convirtiendo Internet.
## Hotmail (1996)
![](../img/hotmail.png)
- En **1996**, se lanzó **Hotmail** el correo electrónico gratuito de **Microsoft**.
## Google (1997)
![](../img/google.png)
- En **1997**, **Larry Page y Sergey Brin**, dos estudiantes de Stanford, crean **Google**, un sistema que analiza los enlaces que conectan los sitios de Internet para hallar información de manera efectiva.
## Las '.com' (1998)
![](../img/punto-com.png)
- En **1998**, bancos e inversionistas volcaron miles de millones de dólares al financiamiento de todo tipo de empresas basadas en la Red, conocidas como **las 'punto-com'**.
## Napster (1998)
![](../img/napster.png)
- En **1998**, **Sean Parker y Shawn Fanning** crean **Napster** uno de los primeros programas **P2P**.
## XMPP (1999)
![](../img/xmpp.png)
- En **1999**, nace **XMPP**, un protocolo abierto ideado para la **mensajería instantánea**.
## Blogger (1999)
![](../img/blogger.png)
- En **1999**, también nace **Blogger**, un servicio web para gestionar blogs.
## La burbuja (2001)
![](../img/estalla-burbuja.png)
- En **2001**, **estalla la burbuja de las 'punto-com'** que llevó a la quiebra a la mayoría.
## Wikipedia (2001)
![](../img/wikipedia.png)
- En **2001**, salió a la luz **Wikipedia**, una enciclopedia virtual que a diario se alimenta y se corrige por sus propios usuarios.
## The Pirate Bay (2003)
![](../img/the-pirate-bay.png)
- En **2003**, nace en Suecia el portal de búsqueda de torrents **The Pirate Bay**.
## LinkedIn (2003)
![](../img/linkedin.png)
- En **2003**, se lanza la red social de contactos profesionales **LinkedIn**.
## WordPress (2003)
![](../img/wordpress.png)
En **2003**, se lanza la plataforma de gestión de blogs **WordPress**.
## GMail (2004)
![](../img/gmail.png)
- En **2004**, nace **GMail** el correo electrónico gratuito de **Google**.
## Facebook (2004)
![](../img/facebook.png)
- En **2004**, **Mark Zuckerberg**, estudiante de la Universidad de Harvard, crea **Facebook**, una de las redes sociales más conocidas.
## Youtube (2005)
![](../img/youtube.png)
- En **2005**, con el auge de la banda ancha, el vídeo en línea deja de ser una utopía y ve la luz el famoso portal de **Youtube**.
## Twitter (2006)
![](../img/twitter.png)
- En **2006**, **Jack Dorsey** lanza la famosa red social de microblogging **Twitter**.
## Hoy
- En **2009**, Internet supera los **180 millones de sitios web**.
- En **2012**, **Facebook supera los 1000 millones de usuarios**, y está traducido a 70 idiomas.
- En **2013**, **LinkedIn supera los 225 millones de usuarios** en más 200 países y territorios.
- En **2013**, **Twitter supera los 280 millones de usuarios activos**, y los 480 millones de perfiles.
- En **2013**, se superan los **1000 millones de dispositivos Android** en el mundo.
# Arquitectura web
## Cliente-servidor
- La arquitectura web es una arquitectura cliente-servidor formada por los siguientes elementos:
- **Un navegador**: Hace de cliente y realiza peticiones solicitando recursos a los servidores web.
- **Un servidor web**: Recibe peticiones de clientes y responde a esas peticiones enviado un recurso o notificando un error.
- **El protocolo http**: Es el protocolo basado en TCP/IP que se utiliza para que el navegador realice las peticiones al servidor web y este responda.
## Páginas estáticas
- En los comienzos de la web, todos los sitios web eran conjuntos de páginas web en forma de ficheros HTML.
- Los sitios web **eran como libros** pero con navegación mediante enlaces en vez de navegación secuencial.
- La edición de sitios web se realizaba con herramientas similares a la edición de documentos (p.e. Microsoft FrontPage)
- A estas páginas se las denominaba **páginas web estáticas**.
## Páginas dinámicas
- Poco a poco las páginas **empezaron a ser más dinámicas**.
- En vez de ser ficheros HTML en el disco, empezaban a ser pequeños programas que se ejecutaban cada vez que un usuario pedía una página.
- Inicialmente eran cambios mínimos (contador de visitas, fecha actual, cambiar la imagen de cabecera,...) con lenguajes de script como PERL y PHP.
## Aplicaciones web
- Los cambios serían cada vez más profundos y las páginas web se convertirían en completas aplicaciones web.
- Una aplicación web es aquella que los usuarios utilizan **accediendo a un servidor web** a través de Internet mediante un navegador.
- Tienen la ventaja de ser independientes del Sistema Operativo, y de que son fáciles de actualizar y mantener.
# Entorno de ejecución en servidor
## Servidores web estáticos
- Al principio, la forma de trabajar con los serivoderes web era de la siguiente forma:
- Primero, el navegador hace una petición al servidor mediante http.
- Seguidamente, el servidor transforma la URL en una ruta el sistema de archivos y devuelve el archivo al navegador.
- En este caso, para **una misma URL el servidor siempre va a devolver el mismo recurso**, siendo normalmente estos recursos ficheros HTML, CSS, JavaScript, imágenes...
## Servidores web dinámicos (I)
- Pero hoy en día, la mayoría de los servidores web permiten que en cada petición se ejecute un programa que genera dinámicamente el recurso que se envía al usuario (server-side scripting).
- Ahora para **una misma URL el servidor puede devolver un recurso distinto**.
- A este contenido generado "al vuelo" se le denomina **contenido dinámico**, en contraposición al contenido estático obtenido del sistema de archivos.
## Servidores web dinámicos (II)
- Es bastante habitual que el contenido dinámico se genere con la información de una **base de datos**.
- Los servidores web con contenido dinámico no sólo envían recursos al navegador, **también pueden procesar información que les llega** del mismo:
- Datos contenidos en formularios web.
- Ficheros enviados desde el navegador.
- Información codificada en los enlaces que pulsan los usuarios.
- Esta funcionalidad permite el desarrollo de completas **aplicaciones web**.
## Historia de los servidores web
- Los principales servidores web son o han sido:
- CERN httpd (1990)
- Apache (1995)
- IIS (1995)
- NginX (2004)
### CERN httpd (1990)
- Creado por Tim Berners-Lee y otros, fué **el primer servidor web**.
- Al principio sólo corría en ordenadores NeXTSTEP, pero más adelante fue portado a otros sistemas.
- En agosto de 1991, Tim Berners-Lee anunció la disponibilidad del código fuente y del software World Wide Web desde el sitio FTP CERN.
- El desarrollo del CERN httpd fue adquirido por W3C y la última versión es 1996, y hoy está totalmente en desuso.
### Apache (1995)
![](../img/apache.png)
- Lanzado en **1995** y desarrollado por la Apache Software Fundation, hoy en día es el **servidor más popular** (Enero de 2014 con 42% cuota)
- Es un servidor web multiplataforma y con una licencia de Software Libre (Apache License)
- Su nombre completo es Apache HTTP Server Project.
### IIS (1995)
![](../img/iis-8.png)
- Lanzado también en **1995** y desarrollado por Microsoft, hoy en día es el **segundo servidor más usado** (Enero de 2014 con 30% cuota)
- Está integrado en Windows Server, y se compagina bien con la base de datos MS SQL Server.
- Su nombre completo es Microsoft Internet Information Services.
### NginX (2004)
![](../img/nginx.png)
- Lanzado en **2004** y desarrollado por el ruso Igor Sysoev, hoy en día es el **tercer servidor más usado** a (Enero de 2014 con 14% cuota)
- Es un servidor multiplataforma y con una licencia de Software Libre (tipo BSD)
- Es muy rápido y se suele usar como balanceador de carga.
## Cuota servidores web
![](../img/cuota-servidores-web.png)
[http://news.netcraft.com](http://news.netcraft.com)
# Tecnologías de servidor
## Introducción
- Los estándares son muy importantes en los navegadores web (HTML, CSS, JavaScript) porque la web tiene
que ser compatible con cualquier dispositivo.
- En cambio los estándares no son tan necesarios en el servidor, y **cada organización desarrolla su servidor con la tecnología de su elección**.
## Cuotas tecnologías
![](../img/cuota-tecnologias-servidores-web.png)
[http://w3techs.com](http://w3techs.com)
- Existen multitud de tecnologías de construcción de aplicaciones web en el servidor, siendo **las más usadas**:
- PHP, ASP.NET, Java EE.
## Otras tecnologías
![](../img/otras-tecnologias-servidores-web.png)
- Existen otros menos usadas, pero con un **gran crecimiento** de pupularidad:
- Ruby on Rails, Grails (Groovy), Django (Python), Node (JavaScript), etc.
## PHP (I)
![](../img/php.png)
- PHP (acrónimo recursivo que significa PHP Hypertext Pre-processor) es un lenguaje de programación originalmente **diseñado para el desarrollo web de contenido dinámico**.
- Fue uno de los primeros en permitir combinarse con el HTML del propio documento.
## PHP (II)
- Fue creado originalmente por Rasmus Lerdorf en 1994 y actualmente el lenguaje sigue siendo desarrollado con una licencia libre (PHP license) por la comunidad en PHP Group, pues **no existe un organismo de estandarización**.
- Puede ser usado en la mayoría de los servidores web y en casi todos los sistemas operativos sin **ningún costo**.
## PHP (III)
- Ejemplos como **Facebook o Wordpress** son sin duda una muestra importante de la popularidad de PHP.
![](../img/php-exito.png)
## PHP (IV)
- Es la tecnología de programación del lado del servidor **más usada** en el pasado y en el presente.
- Se integra normalmente con Apache y MySQL en entornos Linux en un paquete llamado **LAMP**
![](../img/lamp.png)
## PHP (V)
- Existen **multitud de frameworks** para el desarrollo de aplicaciones PHP: CakePHP, CodeIgniter, Symfony, YiiZend, etc.
![](../img/php-frameworks.png)
## ASP.NET (I)
![](../img/asp-net.png)
- ASP.NET es un framework para aplicaciones web **desarrollado por Microsoft** y usado para construir páginas web dinámicas.
- Es sucesora de la tecnología Active Server Pages (ASP), tiene una licencia propietaria y está pensada para ser usada en plataformas Windows.
- Está pensada para ser programado en el lenguaje C#, aunque permite cualquier lenguaje de la plataforma .NET.
## ASP.NET (II)
- La mayoría de las librerías para ASP.NET son las oficiales proporcionadas por Microsoft: (I)
- **Web Pages**: permite combinar HTML con código ASP (similar a JSP y PHP)
- **Web Forms**: permite construir aplicaciones web basadas en componentes (similar a JSF)
- **MVC Framework**: permite desarrollar aplicaciones web usando el patrón modelo-vista-controlador
## ASP.NET (III)
- La mayoría de las librerías para ASP.NET son las oficiales proporcionadas por Microsoft: (II)
- **AJAX**: permite la actualización de datos sin la recarga completa de una página web.
- **Entity Framework**: permite mapear objetos al paradigma relacional (similar a JPA)
- **Dynamic Data**: permite crear aplicaciones web orientadas a datos (similar a Ruby on Rails)
## Java EE (I)
![](../img/java.png)
- Java es un lenguaje de programación de **propósito general**, concurrente, orientado a objetos y basado en clases creado por James Gosling de Sun Microsystems y publicado en 1995.
- Sus componentes son generalmente compiladas a bytecode para que puedan ejecutarse en cualquier máquina virtual Java (**JVM**) sin importar la arquitectura de la computadora subyacente.
## Java EE (II)
- Java junto con C es el **lenguaje más popular** en el índice TIOBE.
![](../img/indice-tiobe.png)
[http://www.tiobe.com/](http://www.tiobe.com/)
## Java EE (III)
- Java EE es la **edición empresarial** de la plataforma Java (lenguaje + JVM + bibliotecas), y está desarrollada por una coalición de empresas lideradas por Oracle, IBM, Red Hat, etc.
- Es una tecnología muy usada a nivel empresarial, y **bastante estandarizada** pues tiene una organización de estandarización propia llamada Java Community Process (**JCP**) que define los estándares de la plataforma.
## Java EE (IV)
![](../img/javaee.png)
## Java EE (V)
- Estándares más importantes en Java EE: (I)
- **Servlets**: permite ejecutar de código Java ante una petición web en un servidor Java EE.
- **Applets**: permite ejecutar de código Java dentro de un navegador web.
- **JSP (Java Server Pages)**: permite combinar HTML con código Java para generar páginas web dinámicas.
- **JDBC (Java Database Conectivity)**: permite la conexión a bases de datos relacionales desde Java.
## Java EE (VI)
- Estándares más importantes en Java EE: (II)
- **JPA (Java Persistence API)**: permite mapear objetos al paradigma relacional (ORM, Object Relational Mapping)
- **JSF (Java Server Faces)**: permite construir aplicaciones web basadas en componentes reutilizables.
- **JMS (Java Messege Service)**: permite la creación y gestión de colas de mensajes entre aplicaciones.
## Java EE (VII)
- Toda aplicación web Java EE tiene que ejecutarse en una **servidor de aplicaciones Java EE** (aunque luego se
integre en Apache, NginX o IIS)
- Existen muchos tipos de servidores, dependiendo de sus funcionalidades/rendimiento y de su licencia/coste.
![](../img/servidores-jee.png)
## Java EE (VIII)
- Para desarrollar aplicaciones Java EE se utilizan IDEs y plugins:
- **Eclipse**: Fundación. Mucha diversidad, falta de integración. Software libre.
- **Netbeans**: Oracle. Muy integrado. Software libre.
- **IntelliJ**: Jetbrains. Muy integrado. Propietario.
![](../img/ides.png)
## Bases de Datos
- Las bases de datos tienen un papel muy importante en el desarrollo de aplicaciones web.
- Las más populares han sido las bases de datos **relacionales**, pero cada vez más se usan las bases de datos **NoSQL**.
### BBDD relacionales
![](../img/bd-relacionales.png)
- Son las bases de datos **más populares** en el desarrollo de aplicaciones.
- En el lado del **software libre** las más usadas son: Postgre SQL y MySQL,
- Y en lado del **software privativo** las más usadas son: Oracle y Microsoft SQL Server.
### BBDD NoSQL
![](../img/bd-nosql.png)
- Como las aplicaciones web tienen muchas **necesidades de escalabilidad y tolerancia a fallos**, hay una nueva familia
de bases de datos que se denominan genéricamente NoSQL, que se puede interpretar como: 'No SQL' o como 'Not Only SQL'
#### Teorema CAP (I)
- El teorema CAP o teorema Brewer, dice que en **sistemas distribuidos** es imposible garantizar a la vez: consistencia, disponibilidad y tolerancia a particiones.
#### Teorema CAP (II)
![](../img/teorema-cap.png)
#### Teorema CAP (III)
- Definiciones:
- **Consistencia**: al realizar una consulta o inserción siempre se tiene que recibir la misma información, con independencia del nodo o servidor que procese la petición.
- **Disponibilidad**: que todos los clientes puedan leer y escribir, aunque se haya caído uno de los nodos.
- **Tolerancia a fallos**: implica que el sistema tiene que seguir funcionando aunque existan fallos o caídas parciales que dividan el sistema.
#### Teorema CAP (IV)
- Según las condiciones que cumplan:
- **AP**: garantizan disponibilidad y tolerancia a fallos, pero no la consistencia. Algunas consiguen una consistencia parcial a través de la replicación y la verificación.
- **CP**: garantizan consistencia y tolerancia a fallos. Para lograr la consistencia a través de los nodos, sacrifican la disponibilidad.
- **CA**: garantizan consistencia y disponibilidad, pero tienen problemas con la tolerancia a fallos. Este problema lo suelen gestionar replicando los datos.
#### Tipos de BD NoSQL
- Existen 4 tipos de bases de datos NoSQL:
- **Orientadas a documentos**
- **Orientadas a columnas**
- **De clave valor**
- **En grafo**
##### Orientadas a documentos
- **Gestionan datos semi estructurados** almacenados en algún formato estándar como XML o JSON. Son las más versátiles y se pueden utilizar en muchos proyectos, incluso aquellos que tradicionalmente funcionarían sobre bases de datos relacionales.
- En esta categoría encontramos:
- **MongoDB**: probablemente la más famosa del momento. Algunas compañías la utilizan son Foursquare o eBay.
- **CouchDB**: es de Apache y sus datos son accesibles vía una API REST. Es utilizada por compañías como Credit Suisse y la BBC.
##### Orientadas a columnas
- Están pensadas para realizar consultas y agregaciones sobre grandes cantidades de datos. Funcionan de forma parecida a las bases de datos relacionales, pero almacenando **columnas de datos en lugar de registros**.
- En esta categoría encontramos:
- **Cassandra**: incluida en esta sección, aunque en realidad sigue un modelo híbrido entre orientada a columnas y clave-valor. Es utilizada por Facebook y Twitter.
- **HBase**: Escrita en Java y mantenida por el Projecto Hadoop de Apache, se utiliza para procesar grandes cantidades de datos. La utilizan Facebook, Twitter o Yahoo.
##### De clave valor
- Son las más sencillas de entender. Simplemente **guardan tuplas que contienen una clave y su valor**. Cuándo se quiere recuperar un dato, simplemente se busca por su clave y se recupera el valor.
- En esta categoría encontramos:
- **DynamoDB**: desarrollada por Amazon, es una opción de almacenaje que podemos usar desde los Amazon Web Services. La utilizan el Washington Post y Scopely.
- **Redis**: desarrollada en C y de código abierto, es utilizada por Craiglist y Stack Overflow (a modo de caché).
##### En grafo
- Basadas en la teoría de grafos **utilizan nodos y aristas** para representar los datos almacenados. Son muy útiles para guardar información en modelos con muchas relaciones, como redes y conexiones sociales.
- En esta categoría encontramos:
- **Infinite Graph**: escrita en Java y C++ por la compañía Objectivity. Tiene dos modelos de licenciamiento: uno gratuito y otro de pago.
- **Neo4j**: base de datos de código abierto, escrita en Java por la compañía Neo Technology. Utilizada por compañías como HP, Infojobs o Cisco.
# Entorno de ejecución en cliente
## Páginas web estáticas
- Son páginas en las que el navegador renderiza el **HTML con estilos CSS e imágenes pero sin JavaScript**.
- En estas páginas, cada vez que el usuario hace clic en un enlace, el navegador recarga por completo la página web.
- Las primeras páginas web eran así, y hoy **todavía se siguen utilizando bastante**: en páginas personales, en 'landings pages', en 'home pages', en páginas de documentación, etc.
## Páginas web dinámicas
- El cliente es dinámico porque las páginas **incluyen código JavaScript** que se ejecuta en el navegador.
- Dependiendo de cómo se use el JavaScript en el cliente, las aplicaciones se pueden dividir en tres tipos:
- JavaScript para efectos gráficos.
- JavaScript con peticiones en segundo plano (AJAX)
- Single Page Application.
### JavaScript para efectos gráficos
- JavaScript se diseñó, entre otras cosas, para **añadir efectos gráficos** básicos a las páginas cuando el CSS era muy limitado.
- La gran mayoría de las aplicaciones web que existen en Internet utilizan JavaScript al menos con este propósito.
### JavaScript peticiones en segundo plano
![](../img/ajax.png)
- JavaScript se usa también para no tener que recargar la página completa, realizando **peticiones en segundo plano** que actualizan sólo aquellas partes de la página necesarias.
- A esta técnica se la conoce como AJAX (Asynchronous JavaScript And XML), y la gran mayoría de las aplicaciones de hoy en día lo usan para **mejorar la experiencia del usuario**.
### Single Page Application
- En este caso, la aplicación web es un conjunto de recursos HTML y CSS estáticos que se cargan en el navegador, y el contenido dinámico se carga en segundo plano con JavaScript.
- Una SPA es **una única página cuyo contenido va cambiando según el usuario interactúa** con botones, pestañas, etc.
## Historia de los clientes web
- Los principales clientes web son o han sido:
- Mosaic (1993)
- Netscape Navigator (1994)
- Internet Explorer (1995)
- Opera (1996)
- Mozilla Firefox (2002)
- iPhone (2007)
- Android (2008)
- Google Chrome (2008)
- Firefox OS (2013)
### Mosaic (1993)
![](../img/mosaic.png)
- En **1993**, salió a la luz **Mosaic** el primer navegador que permitía ver gráficamente los documentos escritos en HTML y seguir los enlaces entre distintos sitios web.
### Netscape Navigator (1994)
![](../img/netscape.png)
- En **1994**, nació **Netscape Navigator**, como evolución de Mosaic.
### Internet Explorer (1995)
![](../img/internet-explorer.png)
- En **1995**, **Microsoft** lanza el navegador **Internet Explorer**.
- Llegó a tener una cuota del 70%, pero hoy en día, aunque es el **segundo navegador más usado**, está en declive de sobre todo por el impulso de Google Chrome.
### Opera (1996)
![](../img/opera.png)
- En **1996**, nació **Opera** un navegador que nunca ha tenido una gran cuota de mercado.
### Safari (2003)
![](../img/safari.png)
- En **2003**, Apple lanza **Safari**, un navegador basado en WebKit (libre).
- Hoy en día es el **cuarto navegador más usado**.
### Mozilla Firefox (2002)
![](../img/firefox.png)
- En **2002**, nace el el navegador libre **Mozilla Firefox**.
- Hoy en día es el **tercer navegador más usado**.
### iPhone (2007)
![](../img/iphone.png)
- En **2007**, **Steve Jobs**, cofundador de Appel, lanza el **iPhone**.
### Android (2008)
![](../img/android.png)
- En **2008**, se vende el primer smartphone con el sistema operativo **Android**.
### Google Chrome (2008)
![](../img/chrome.png)
- En **2008**, el gigante **Google** lanza al mercardo su propio navegador: el **Google Chrome**.
- Hoy en día es el **navegador más utilizado** con más de un 40% de cuota.
### Firefox OS (2013)
![](../img/firefox-os.png)
- En **2013**, la fundación Mozilla lanza el sistema operativo **Firefox OS**.
## Cuota Navegadores
![](../img/cuota-navegadores.png)
[http://gs.statcounter.com/](http://gs.statcounter.com/)
# Tecnologías de cliente
## Introducción
- El cliente web por excelencia es el **navegador web**, aunque ahora existen otros clientes como pueden ser **las aplicaciones nativas de los dispositivos móviles**, ahora bien la tendencia es la de utilizar los **estándares web** en dichas aplicaciones.
- Aunque la tendencia es usar cada vez más tecnologías estándares, **aún se usan otras tecnologías no estándar**.
## Estándares web
![](../img/w3c.png)
- El **W3C** (World Wide Web Consortium) es una comunidad internacional que desarrolla estándares abiertos que aseguran el crecimiento de la Web a largo plazo.
- **HTML** (Hypertext Markup Language) and **CSS** (Cascading Style Sheets) son dos de las tecnologías principales para la construcción de páginas web.
### HTML (I)
![](../img/html5.png)
- HTML proporciona la **información estructurada** en secciones, párrafos, título, imágenes, etc.
### HTML (II)
- La versión actual es **HTML5**, que aunque todavía no está finalizada, la mayoría de los navegadores implementan gran parte de la especificación.
- Ha supuesto una revolución en el cliente pues ofrece muchas tecnologías avanzadas:
- **Multimedia**: audio, vídeo, canvas, webgl, etc.
- **Comunicaciones**: websockets
- **Concurrencia**: webworkers
- **Almacenamiento**: storage
- **Otros**: geoposicionamiento, drag&drop, acceso a la cámara, al micrófono, etc.
### CSS (I)
![](../img/css3.png)
- CSS proporciona la **distribución de los elementos y su estilo** (colores, tipos de letra, fondos, efectos...)
### CSS (II)
- CSS es un lenguaje usado para definir la presentación de un documento estructurado escrito en HTML, XML, SVG o incluso interfaces de usuario de otras tecnologías (JavaFX)
- Su versión actual es **CSS3**, que aunque todavía no está finalizada, la mayoría de los navegadores implementan gran parte de la especificación.
#### Preprocesadores (I)
- Procesan código escrito en un lenguaje “A+” (HAML, Coffeescritp, SCSS o LESS) y generan archivos escritos en otro lenguaje “A” (HTML, Javascript y CSS, respectivamente). Los lenguajes fuente son similares a los que producen, pero más sencillos de escribir (y de leer y mantener).
- En el caso de CSS los preprocesadores **suplen ciertas carencias que tiene el propio lenguaje** como puede ser: variables, herencias, funciones, imports, ...
#### Preprocesadores (II)
- Los preprocesadores CSS más importantes son: **Sass** y **less**.
![](../img/preprocesadores-css.png)
#### Frameworks CSS (I)
- Facilitan la tarea de crear sitios **Responsive Web Design** (diseño que se adapta a los distintos clientes: móvil, tablet, ordenador) mediante el uso de diseño con rejillas, uso de clases, componentes, etc.
![](../img/responsive-web-design.png)
#### Frameworks CSS (II)
- Los frameworks CSS mas importantes son: **Zurb Foundation** y **Twitter Bootstrap**.
![](../img/frameworks-css.png)
### JavaScript (I)
![](../img/javascript.png)
- Con JavaScript se **puede modificar la página y ejecutar código cuando se interactúa con ella** (a través del modelo de objetos del documento DOM)
### JavaScript (II)
- Aunque algunos elementos de la sintaxis recuerden a Java, **no tiene nada que ver con Java**, se eligió ese nombre por razones de marketing, pues cuando se publicó Java estaba en auge.
- Es un lenguaje de programación basado en el estándar **ECMAScript** de ECMA (otra organización diferente al W3C)
- Hay ligeras diferencias en la implementación de JS de los navegadores, aunque actualmente todos son bastante compatibles entre sí (en el pasado no fue así)
### JavaScript (III)
- Inicialmente era un lenguaje interpretado, pero actualmente se ejecuta con máquinas virtuales en los navegadores (velocidad de ejecución y eficiencia de memoria)
- Características:
- **Tipado dinámico** (habitual en los lenguajes de script)
- **Funcional y orientado a objetos** (basado en prototipos)
#### Librerías JavaScript
![](../img/librerias-js.png)
- Existen multitud de librerías JavaScript, aunque las más utilizadas son:
- **jQuery**: aporta facilidad de uso y compatibilidad entre navegadores. Se usa para gestionar el interfaz y peticiones ajax.
- **underscore.js**: permite trabajar con un enfoque más funcional y permite gestionar plantillas para generar HTML.
#### Frameworks Javascript
![](../img/frameworks-js.png)
- Además de librerías, también existen frameworks de alto nivel que estructuran una aplicación de forma completa, siendo los más populares: **Angular.js, Backbone.js y Ember**.
## Tecnologías no estándar en la web
- La web ha avanzado y evolucionado gracias a tecnologías no estándar incluidas en los navegadores mediante plugins.
- Algunas llegaron a convertirse en estándares “de facto”, como es el caso de **Adobe Flash**.
- La llegada de los dispositivos móviles, consolas y televisiones conectadas (SmartTVs) y **la estandarización de HTML5 han hecho que estas tecnologías no estándar estén en desuso**.
### Adobe Flash (I)
![](../img/flash.png)
- Es una tecnología **usada principalmente para incrustar contenido multimedia interactivo** en páginas web.
- Durante muchos años fue la única forma de tener interactividad, animaciones, vídeos, juegos... en la web.
### Adobe Flash (II)
- Es una tecnología **propietaria y cerrada**, y aunque es gratuita para los usuarios, no lo es para los desarrolladores y servidores.
- Ha sido acusada de de que no es eficiente, no es abierta y por tanto, no es el futuro de la web (Abril 2010 - Steve Jobs por el iPhone y iPad)
- Adobe lo ha acabado reconociendo y no seguirá apostando por Flash como la herramienta básica de la web interactiva (Nov 2011)
### Java Applets
![](../img/java.png)
- Los applets de Java fueron **los precursores de Flash**, aunque hoy están en desuso.
### Microsoft Silverlight
![](../img/silverlight.png)
- La **apuesta de Microsoft para competir con Flash**, aunque hoy están en desuso.