{$page}
++
string
con el HTML necesario para presentar los campos del formulario. Es necesario asegurarse que como parte del envío se envía un parámetro con nombre (i.e. utilizado como valor del atributo name del botón de envío del formulario).
+ */
+ protected function generaCamposFormulario ($datos) {
+ return '';
+ }
+
+ /**
+ * Procesa los datos del formulario.
+ */
+ protected function procesaFormulario($datos) {
+
+ }
+
+ /**
+ * Función que verifica si el usuario ha enviado el formulario. Comprueba si existe el parámetro $formId
en $params
.
+ *
+ * @param array $params Array que contiene los datos recibidos en el envío formulario.
+ *
+ * @return boolean Devuelve TRUE
si $formId
existe como clave en $params
+ */
+ private function formularioEnviado(&$params) {
+ return isset($params['action']) && $params['action'] == $this->formId;
+ }
+
+ /**
+ * Función que genera el HTML necesario para el formulario.
+ *
+ *
+ * @param array $errores (opcional) Array con los mensajes de error de validación y/o procesamiento del formulario.
+ *
+ * @param array $datos (opcional) Array con los valores por defecto de los campos del formulario.
+ */
+ private function generaFormulario($errores = array(), &$datos = array()) {
+
+ $html= $this->generaListaErrores($errores);
+
+ $html .= '';
+ return $html;
+ }
+
+ private function generaListaErrores($errores) {
+ $html='';
+ $numErrores = count($errores);
+ if ( $numErrores == 1 ) {
+ $html .= "- ".$errores[0]."
";
+ } else if ( $numErrores > 1 ) {
+ $html .= "- ";
+ $html .= implode("
- ", $errores);
+ $html .= "
";
+ }
+ return $html;
+ }
+
+ private function csrfguard_GenerateToken($formId) {
+ if ( ! isset($_SESSION) ) {
+ throw new Exception('La sesión del usuario no está definida.');
+ }
+
+ if ( function_exists('hash_algos') && in_array('sha512', hash_algos()) ) {
+ $token = hash('sha512', mt_rand(0, mt_getrandmax()));
+ } else {
+ $token=' ';
+ for ($i=0;$i<128;++$i) {
+ $r=mt_rand(0,35);
+ if ($r<26){
+ $c=chr(ord('a')+$r);
+ } else{
+ $c=chr(ord('0')+$r-26);
+ }
+ $token.=$c;
+ }
+ }
+
+ $_SESSION[$formId.'_'.self::CSRF_PARAM]=$token;
+
+ return $token;
+ }
+
+ private function csrfguard_ValidateToken($formId, $tokenRecibido) {
+ if ( ! isset($_SESSION) ) {
+ throw new Exception('La sesión del usuario no está definida.');
+ }
+
+ $result = TRUE;
+
+ if ( isset($_SESSION[$formId.'_'.self::CSRF_PARAM]) ) {
+ if ( $_SESSION[$formId.'_'.self::CSRF_PARAM] !== $tokenRecibido ) {
+ $result = array();
+ $result[] = 'Has enviado el formulario dos veces';
+ }
+ $_SESSION[$formId.'_'.self::CSRF_PARAM] = ' ';
+ unset($_SESSION[$formId.'_'.self::CSRF_PARAM]);
+ } else {
+ $result = array();
+ $result[] = 'Formulario no válido';
+ }
+ return $result;
+ }
+}
+
+/*
+class Formulario {
+
+ private $formId;
+ private $action;
+ private $classAtt;
+ private $enctype;
+
+ public function __construct($formId, $opciones = array() ) {
+ $this->formId = $formId;
+ $opcionesPorDefecto = array( 'ajax' => false, 'action' => null, 'class' => null,
+ 'enctype' => null );
+ $opciones = array_merge($opcionesPorDefecto, $opciones);
+
+ $this->ajax = $opciones['ajax'];
+ $this->action = $opciones['action'];
+ $this->classAtt = $opciones['class'];
+ $this->enctype = $opciones['enctype'];
+
+ if (!$this->action) {
+ $app = Aplicacion::getSingleton();
+ $this->action = htmlspecialchars($_SERVER['REQUEST_URI']);
+ $this->action = $app->resuelve($this->action);
+ }
+ }
+}
+*/
+?>
\ No newline at end of file
diff --git a/assets/php/template.php b/assets/php/template.php
new file mode 100644
index 0000000..cd0a7b4
--- /dev/null
+++ b/assets/php/template.php
@@ -0,0 +1,185 @@
+page = $_SERVER['PHP_SELF']; //Page that instantiates the template.
+ $this->prefix = '../'; //Default prefix.
+
+ $this->set_page_prefix(); //Assigns the name and prefix of the page.
+
+ $this->session = 'Iniciar Sesión'; //Default, the session has not started.
+ $this->session_route = 'login/'; //Default, the session has not started.
+ $this->panel = ''; //Default, the session has not started.
+ $this->user_route = 'panel_user/'; //Default, the type of client is user.
+ }
+
+ //Methods:
+
+ //Assigns the name and prefix of the page:
+ private function set_page_prefix() {
+ switch(true){
+ case strpos($this->page, 'panel_user'): $this->page = 'Panel de Usuario'; break;
+ case strpos($this->page, 'panel_manager'): $this->page = 'Panel de Gerente'; break;
+ case strpos($this->page, 'panel_admin'): $this->page = 'Panel de Administrador'; break;
+ case strpos($this->page, 'login'): $this->page = 'Acceso'; break;
+ case strpos($this->page, 'logout'): $this->page = 'Cerrar Sesión'; break;
+ case strpos($this->page, 'register'): $this->page = 'Registro de Usuario'; break;
+ case strpos($this->page, 'showtimes'): $this->page = 'Cartelera'; break;
+ case strpos($this->page, 'cinemas'): $this->page = 'Nuestros Cines'; break;
+ case strpos($this->page, 'about_us'): $this->page = 'Sobre FDI-Cines'; $this->prefix = '../../'; break;
+ case strpos($this->page, 'terms'): $this->page = 'Términos y Condiciones'; $this->prefix = '../../'; break;
+ case strpos($this->page, 'detalles'): $this->page = 'Detalles'; $this->prefix = '../../'; break;
+ case strpos($this->page, 'bocetos'): $this->page = 'Bocetos'; $this->prefix = '../../'; break;
+ case strpos($this->page, 'miembros'): $this->page = 'Miembros'; $this->prefix = '../../'; break;
+ case strpos($this->page, 'planificacion'): $this->page = 'Planificación'; $this->prefix = '../../'; break;
+ case strpos($this->page, 'contacto'): $this->page = 'Contacto'; break;
+ default: $this->page = 'FDI-Cines'; $this->prefix = './'; break;
+ }
+ }
+
+ //Returns page name:
+ function get_page(){
+ return $this->page;
+ }
+
+ //Returns page prefix:
+ function get_prefix(){
+ return $this->prefix;
+ }
+
+ //Print generic Head:
+ function print_head(){
+ $page = $this->page;
+ $prefix = $this->prefix;
+
+ echo"
+ CompluCine | {$page}
+
+
+
+
+ \n";
+ }
+
+ //Print generic Header:
+ function print_header(){
+ $page = $this->page;
+ $prefix = $this->prefix;
+ $session = $this->session;
+ $session_route =$this->session_route;
+ $user_route = $this->user_route;
+ $panel =$this->panel;
+
+ if(isset($_SESSION["nombre"])){
+ if($_SESSION["rol"] == "admin") $user_route = 'panel_admin/';
+ else if($_SESSION["rol"] == "manager") $user_route = 'panel_manager/';
+ $panel = "Mi Panel ";
+ $session = 'Cerrar Sesión';
+ $session_route = 'logout/';
+ }
+
+ echo"
+ CompluCine | {$page}
+
+ \n";
+ }
+
+ //Print generic subHeader:
+ function print_subheader(){
+ //$page = $this->page;
+ $prefix = $this->prefix;
+
+ echo"
+ \n";
+ }
+
+ //Print generic Main:
+ function print_main(){
+ $page = $this->page;
+ $prefix = $this->prefix;
+
+ /* SubHeader on Main */
+ $sub_header = '';
+ if(strpos($_SERVER['PHP_SELF'], 'fdicines')){
+ $sub_header = "
+
+
+ \n";
+ }
+
+ /* MAIN */
+ echo"
+ \n";
+ }
+
+ //Print session MSG:
+ function print_msg() {
+ if(isset($_SESSION['message'])){
+ echo "".$_SESSION['message']."";
+ unset($_SESSION['message']);
+ }
+ }
+
+ //Print generic Footer:
+ function print_footer(){
+ //$page = $this->page;
+ $prefix = $this->prefix;
+
+ echo"\n";
+ }
+
+ }
+?>
\ No newline at end of file
diff --git a/cinemas/index.php b/cinemas/index.php
new file mode 100644
index 0000000..bbbd8f0
--- /dev/null
+++ b/cinemas/index.php
@@ -0,0 +1,32 @@
+
+
+
+
+
+ print_head();
+ ?>
+
+
+ print_header();
+ ?>
+
+
+ print_main();
+ ?>
+
+
+ print_footer();
+ ?>
+
+
+
\ No newline at end of file
diff --git a/contacto/index.php b/contacto/index.php
new file mode 100644
index 0000000..adc2676
--- /dev/null
+++ b/contacto/index.php
@@ -0,0 +1,77 @@
+
+
+
+
+
+ print_head();
+ ?>
+
+
+ print_header();
+ ?>
+
+
+ print_main();
+ ?>
+
+
+
+ Formulario
+
+
+
+
+ print_footer();
+ ?>
+
+
+
+
diff --git a/fdicines/about_us/index.php b/fdicines/about_us/index.php
new file mode 100644
index 0000000..07a3dd4
--- /dev/null
+++ b/fdicines/about_us/index.php
@@ -0,0 +1,75 @@
+
+
+
+
+
+ print_head();
+ ?>
+
+
+ print_header();
+ ?>
+
+
+
+
+
+
+
+ Descripción
+
+
+
+ CompluCine es un proyecto para la creación y desarrollo de una plataforma web que permita la compra de entradas
+ de cine, por fecha y hora, para cualquiera de los cines del grupo FDI-Cines
+ mostrar la cartelera disponible e incluya ofertas y promociones para los clientes.
+
+
+ Con este proyecto buscamos la creación de una aplicación web que
+ gestione la cartelera de un grupo de cines con una lista de películas variable,
+ unos horarios propios de cada cine por sesión y película, y con unos precios determinados.
+
+
+ Los usuarios podrán registrarse, comprar sus entradas para una
+ sesión, elegir asientos, precomprar sus snacks y ver ofertas y promociones.
+
+
+
+
+ FDI-Cines
+
+
+
+ Somos un grupo de estudiantes de la asignatura de Sistemas Web
+ de la Facultad de Informática de la Universidad Complutense de Madrid.
+
+
+ CompluCine es un proyecto web universitario y en ningún momento pretende ofrecer una funcionalidad real.
+ Para más información acerca del proyecto, haz click aquí.
+
+
+
+
+
+
+ print_footer();
+ ?>
+
+
+
+
diff --git a/fdicines/bocetos/index.php b/fdicines/bocetos/index.php
new file mode 100644
index 0000000..c08b4b0
--- /dev/null
+++ b/fdicines/bocetos/index.php
@@ -0,0 +1,306 @@
+
+
+
+
+
+ print_head();
+ ?>
+
+
+ print_header();
+ ?>
+
+
+ print_main();
+ ?>
+
+
+
+
+ FLUJO DE NAVEGACIÓN
+
+
+
+ Usuario
+
+ El Usuario puede tomar dos caminos a la hora de seleccionar la película, el cine, y la sesión a la que quiere asistir. La diferencia es puramente
+ de orden entre la elección de cine y de la película, a conveniencia del usuario; se procede a explicar ambos:
+
+
+ 1. Selección de Cine -> Selección de Película -> Selección de Sesión -> Reserva de Butacas -> Checkout: Primero se selecciona el cine en la vista de selección
+ de cines en la que se encuentra un mapa y una lista con los cines de la cadena. Una vez seleccionado el cine se redirigirá al usuario a la vista de selección
+ de película, con el filtro del cine correspondiente activado, de forma que solo se muestren las películas disponibles en el cine seleccionado. En esa vista se
+ eligirá la película y la versión a ver (VO, 3D, 4DX, etc).
+
+
+ Una vez elegida la película, se redirigirá al usuario a la elección de sesión. Se mostrarán todas las sesiones disponibles y el usuario podrá elegir la sesión y
+ el número de entradas que quiere reservar, pudiendo ver el precio final de las mismas. Se le llevará a la vista de butacas en donde podrá elegir qué butacas reservar.
+
+
+ Una vez elegidas las butacas, el usuario procede a la página de pago, en donde rellenará los datos necesarios para pagar online. Terminada la compra con éxito, se
+ mostrará una pantalla de "Compra Realizada", dando al usuario la seguridad de que su reserva se ha registrado correctamente. Luego se le redirigirá a la pantalla de
+ inicio.
+
+
+ 2. Selección de Película -> Selección de Cine -> Selección de Sesión -> Reserva de Butacas -> Checkout: Es idéntico al flujo anterior pero el usuario empieza eligiendo
+ la película, de forma que se le redirige a la vista de selección de cine, esta vez con un filtro, de forma que solo se muestran los cines que tengan sesiones activas
+ con la película seleccionada.
+
+
+ Una vez elegidos película y cine, el flujo es idéntico al anterior.
+
+
+
+
+ Gerente
+
+ El Gerente es el encargado de gestionar las sesiones y salas de cada cine. La forma de proceder es la misma que el administrador, con vistas equivalentes.
+ En el caso de la gestión de salas, se administrarán los asientos disponibles (por temas de Covid-19) y si está o no habilitada para su uso.
+
+
+
+
+ Administrador
+ El Administrador es el encargado de gestionar las: películas, cines, promociones, otros administradores y gerentes de cada cine.
+ Para cada categoría tiene un panel en el que puede seleccionar, a partir de una lista, el elemento que quiere modificar, también hay otro panel al lado, en donde
+ puede modificar los datos de un elemento ya existente o crear uno nuevo introduciendo datos que no existan en la BD. También hay una opción de Eliminar en caso de que
+ quiera eliminar un elemento.
+ También cuenta con un botón de "Vista de Usuario", con el que puede navegar por la página con la vista que tendrá el usuario final.
+
+
+
+
+
+
+
+
+
+ Pantallas Genéricas
+
+
+
+
+
+
+ Pantalla de inicio
+ Pantalla de bienvenida al entrar en la web.
+
+
+
+
+
+
+
+ Pantalla de Registro / Inicio de sesión
+ Pantalla para que un usuario nuevo se registre o, en caso de ya tener una cuenta de usuario, inicie sesión.
+
+
+
+
+
+
+
+
+
+ Menú de usuario registrado
+ Pantalla con todas las opciones disponibles, propias de un usuario registrado.
+
+
+
+
+
+
+
+ Cartelera
+ Pantalla con información sobre todas las películas disponibles en ese momento.
+
+
+
+
+
+
+
+
+
+ Cines
+ Pantalla con un mapa que indica la geolocalización de todos los cines de FDI-Cines.
+
+
+
+
+
+
+
+ Selección de Horario
+ Pantalla que muestra los horarios disponibles por salas para un cine y película elegidos.
+
+
+
+
+
+
+
+
+
+ Mapa de los Asientos
+ Pantalla con un mapa para selccionar los asientos que se quieren escoger. Los asientos ocupados no pondrán ser seleccionados.
+
+
+
+
+
+
+
+ Pagar
+ Pantalla para realizar el pago, después de haber selecionado película, cine, sala, horario y butacas.
+
+
+
+
+
+
+
+
+
+ Compra Realizada
+ Pantalla de confirmación con los datos de compra.
+
+
+
+
+
+
+
+ Sobre nosotros
+ Pantalla con información sobre FDI-Cines.
+
+
+
+
+
+
+
+
+
+ Formulario de Contacto
+ Pantalla con un formulario para realizar una consulta a los administradores.
+
+
+
+
+
+
+
+ Términos y Condiciones
+ Pantalla con todos los términos y condiciones de uso del servicio.
+
+
+
+
+
+
+
+ Pantallas de Gerentes
+
+
+
+
+
+
+ Panel de Incio Gerente
+ Pantalla con las funciones exclusivas a las que puede acceder un Gerente.
+
+
+
+
+
+
+
+ Gestionar salas
+ Pantalla en la que los Gerentes pueden interactuar para añadir, modificar o eliminar la sala de un cine.
+
+
+
+
+
+
+
+ Gestionar Sesiones
+ Pantalla en la que los Gerentes pueden interactuar para añadir, modificar o eliminar las sesiones de una película.
+
+
+
+
+
+
+
+ Pantallas de Administradores
+
+
+
+
+
+
+ Panel Inicio Administrador
+ Pantalla con las funciones exclusivas a las que puede acceder un Administrador.
+
+
+
+
+
+
+
+ Gestionar Películas
+ Pantalla en la que los Administradores pueden interactuar para añadir, modificar o eliminar las películas de la cartelera.
+
+
+
+
+
+
+
+
+
+ Gestionar Cines
+ Pantalla en la que los Administradores pueden interactuar para añadir, modificar o eliminar los cines.
+
+
+
+
+
+
+
+ Gestionar Promociones
+ Pantalla en la que los Administradores pueden interactuar para añadir, modificar o eliminar las promociones existentes.
+
+
+
+
+
+
+
+ Gestionar Administradores y Gerentes
+ Pantalla en la que los Administradores pueden interactuar para añadir, modificar o eliminar tanto otros Administradores como Gerentes.
+
+
+
+
+
+
+
+ print_footer();
+ ?>
+
+
+
+
diff --git a/fdicines/detalles/index.php b/fdicines/detalles/index.php
new file mode 100644
index 0000000..d45df64
--- /dev/null
+++ b/fdicines/detalles/index.php
@@ -0,0 +1,120 @@
+
+
+
+
+
+ print_head();
+ ?>
+
+
+ print_header();
+ ?>
+
+
+
+
+
+
+
+ Detalles
+
+
+
+ Con este proyecto buscamos la creación de una aplicación web que
+ gestione la cartelera de un grupo de cines con una cartelera de películas variable, unos horarios propios de cada cine por sesión y película
+ y unos precios determinados.
+
+ Los usuarios podrán registrarse, comprar sus entradas para una
+ sesión, elegir asientos, precomprar sus snacks y ver ofertas y promociones.
+
+
+
+
+
+
+
+
+
+ Tipos de usuario
+
+
+ Usuario No Registrado
+
+ Este tipo de usuario, puede interactuar con la web sin necesidad de estar registrado. Podrá realizar compras, ver horarios y cartelera, sin necesidad de realizar ningún registro.
+ No podrá usar ninguna de las promociones, pues estas estarán únicamente destinadas a los usuarios registrados.
+
+
+
+ Usuario Registrado
+
+ Estos usuarios son aquellos que previamente han realizado un registro en la base de datos del sistema. Tendrán las mismas funcionalidades básicas
+ que un usuario no registrado y además, podrán acceder a ofertas y aplicar promociones y descuentos y ver el historial de sus compras.
+ Además, estos usuarios podrán cancelar una compra previamente hecha, pues estas se asociarían a su cuenta, algo que sería imposible
+ con un usuario no registrado.
+
+
+
+ Gerente de Cine
+
+ Un administrador de rango bajo capaz de acceder a la vista de administradores, puede ver las peliculas que hay en la base de datos.
+ Este usuario está asociado a un cine, sobre el cual puede añadir sesiones con peliculas existentes y modificar la disposicion de butacas.
+
+
+
+ Administrador
+
+ El administrador es capaz de ascender cuentas de usuario registradas a cuentas de gerente de cine. Ademas es el encargado de añadir nuevos cines y peliculas.
+ Para comprobar el correcto funcionamiento de la pagina podrá cambiar entre distintas vistas de usuario.
+ Las cuales le permitirán comprobar que cada usuario tiene acceso únicamente a sus funcionalidades y no a funcionalidades de otro rango superior.
+
+
+
+
+
+
+ Funcionalidad
+
+
+ La aplicación debe permitir la compra online de entradas para sesiones de cine, mostrando los cines y
+ horarios en los que se encuentra disponible la película seleccionada por el usuario dentro del catálogo disponible en ese momento (la cartelera).
+ Los usuarios podrán acceder a la compra de entradas buscando la película que desean ver y luego escogiendo un cine y horario determinado.
+ Además de una búsqueda específica, también se ofrecerá la posibilidad de visionar toda la cartelera, y escoger una película, horario y cine, de entre todas las posibilidades.
+
+ Una vez escogido todo, se mostrará una página en la que el usuario decidirá la o las butacas en las que se sentará. Se mostrarán butacas disponibles y butacas ocupadas (en caso de que las haya).
+ Antes de realizar la compra, los usuarios podrán aplicar promociones especificas que le permitan obtener algun snack en el cine o descuentos disponibles en la aplicación.
+
+
+ Por otro lado la aplicacion debe permitir a los gerentes y administradores visionar la lista y contenido de todas las peliculas que hay en cartelera,
+ siendo los administradores los encargados de modificarlas y añadir nuevas.
+ De igual forma, ambos podran ver todos los cines activos de la aplicacion, pero solo los administradores serán capaces de añadir o modificar cines existentes.
+
+ Cada cine tiene una cantidad de salas y sesiones con horarios específicos pora cada una de las películas.
+ Aunque ambos roles (administrador y gerente) pueden ver estas salas y horarios, es el gerente de cine el encargado de modificar las salas,
+ su disposición de butacas, modificar el horario de las sesiones y añadir nuevas sesiones, y crear promociones específicas para una sesión concreta o para el cine completo.
+ Todo esto unicamente para el cine con el cual esta relacionado.
+
+
+
+
+
+
+ print_footer();
+ ?>
+
+
+
diff --git a/fdicines/index.php b/fdicines/index.php
new file mode 100644
index 0000000..10f3c9f
--- /dev/null
+++ b/fdicines/index.php
@@ -0,0 +1,3 @@
+
\ No newline at end of file
diff --git a/fdicines/miembros/index.php b/fdicines/miembros/index.php
new file mode 100644
index 0000000..3e08109
--- /dev/null
+++ b/fdicines/miembros/index.php
@@ -0,0 +1,177 @@
+
+
+
+
+
+ print_head();
+ ?>
+
+
+ print_header();
+ ?>
+
+
+
+
+
+ print_subheader();
+ ?>
+
+ Miembros
+
+
+
+
+ Nombre
+ Email
+
+
+
+
+ Marco Expósito Pérez
+ marcoexp@ucm.es
+
+
+ Fernando Méndez Torrubiano
+ fernmend@ucm.es
+
+
+ Daniel Muñoz García
+ danimu03@ucm.es
+
+
+ Ioan Marian Tulai
+ ioantula@ucm.es
+
+
+ Óscar Ruiz de Pedro
+ oscarrui@ucm.es
+
+
+ Adrian Real del Noval
+ adrireal@ucm.es
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ~ Marco Expósito Pérez (marcoexp@ucm.es)
+
+ Aficionado a todo tipo de videojuegos, principalmente la saga Zelda. Tambien me gusta leer tanto literatura fantastica como mangas y veo anime asiduamente.
+ En verano suelo participar en campeonatos de pesca subacuatica y tambien me gusta bastante jugar al futbol federado, aunque hace un tiempillo ya que no hago.
+
+
+
+
+
+
+
+
+
+
+
+ ~ Fernando Méndez (fernmend@ucm.es)
+
+ Estudiante de Ingeniería de Computadores en la Universidad Complutense de Madrid.
+ Presidente de la asociación Diskobolo. Colaborador de la Oficina de Sotfware Libre de la UCM y coordinador del grupo de Hacking Ético de la FDI.
+
+
+
+
+
+
+
+
+
+
+
+ ~ Daniel Muñoz García (danimu03@ucm.es)
+
+ Estudiante del grado en ingeniería informática en la Universidad Complutense de Madrid. Aficionado a la ciberseguridad y las nuevas tecnologías.
+ Especializado en el diseño y gestión de bases de datos, tanto SQL como noSQL, y su desarrollo con distintos lenguajes como MongoDB o MySQL.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ~ Ioan Marian Tulai (ioantula@ucm.es)
+
+ Estudiante con mucha ilusion y ganas de trabajar especialista en hardware.
+ Alta experiencia programando en C, gran interés en aprender nuevos lenguajes de programación y aficionado a dibujar.
+
+
+
+
+
+
+
+
+
+
+
+ ~ Óscar Ruiz de Pedro (oscarrui@ucm.es)
+
+ Estudiante de ingeniería de computadores en la Universidad Complutense de Madrid.
+ Altas capacidades de programación en bajo nivel, me gustaría aprender más sobre el ámbito de la robótica.
+ Aficionado a todo tipo de videojuegos, impresión 3D, teatro y airsoft.
+
+
+
+
+
+
+
+
+
+
+
+ ~ Adrian Real del Noval (adrireal@ucm.es)
+
+ Estudiante de 3er año de Ingeniería de Computadores en la Universidad Complutense de Madrid.
+ Las áreas en las que tiene mayor interés son la electrónica, las GPUs, y los sistemas empotrados.
+
+
+
+
+
+
+
+
+
+
+ print_footer();
+ ?>
+
+
+
+
+
+