scieee AI-readable full text Open interactive document viewer

Project Cleverfit

Molina Vega, José Luis

Abstract

Cleverfit es una aplicación que genera rutinas deportivas de alta intensidad, con un objetivo de pérdida de peso, en función de las características del usuario (experiencia, tiempo disponible, dificultad deseada), con el fin de ayudarlo durante el proceso de entrenamiento, así como su propio crecimiento personal.

Full text

   PROJECT CLEVERFIT Gradoeningeniería informáticA  05/2017(MAYODE2017) JoseLuisMolinavega-Autor Beatrizcorreassuárez-tutora ÍNDICE ESTADO ACTUAL 6 Definición del proyecto 6 Motivación 6 Competidores 7 FITSTAR 7 FREELETICS 8 ¿Por qué CLEVERFIT? 9 OBJETIVOS INICIALES 9 JUSTIFICACIÓN DE COMPETENCIAS ESPECÍFICAS 10 APORTACIONES 13 Generación inteligente de rutinas deportivas de alta intensidad 13 DESARROLLO 16 Planificación inicial y ajuste a la misma 16 Metodología aplicada 19 Fases de desarrollo 20 Fase de análisis 20 Fase de especificación 21 Fase de diseño 21 Fase del desarrollo del software 22 Fase de verificación del producto 22 REQUISITOS 23 Análisis del producto 23 Descripción del producto 23 Par Producto/Mercado 24 Variables de mercado y análisis DAFO 25 Variables de mercado 25  TheCLEVERFITsolution  JoseLuisMolinaVega   Página2 Análisis DAFO 27 Business Model Canvas 28 Requisitos funcionales 29 Requisitos no funcionales 30 Tiempos de respuesta 30 Usabilidad 31 Desarrollo 31 Compatibilidad 31 DISEÑO 32 Diseño del sistema 32 Arquitectura del sistema 32 Arquitectura de la base de datos (Entidad-Relación) 34 Historias de usuario 35 Casos de uso 36 Crear una cuenta 36 Modificar datos personales 37 Ver historial de progreso 38 Ver historial de entrenamiento 39 Ver plan de entrenamiento 39 Ver ejercicio 40 Solicitar nuevo entrenamiento 41 Comenzar entrenamiento 41 Cancelar entrenamiento 42 Pasar al siguiente ejercicio durante el entrenamiento 42 Pausar entrenamiento 43 Reanudar entrenamiento 43 Diseño de interfaz de usuario 44 Estructura de la página inicial 45 Estructura de la vista de plan de entrenamiento 46 Estructura de la vista de entrenamiento 47 Estructura de la vista de historial de rutinas 48 Estructura de la vista de progreso 49  TheCLEVERFITsolution  JoseLuisMolinaVega   Página3 Estructura de la vista de crear cuenta 50 Estructura de la vista de editar datos personales 51 MANUAL DE USUARIO 53 Registro 53 Generar entrenamiento 54 Comenzar entrenamiento 55 Asistencia durante el entrenamiento 56 Comprobar historial previo 57 Comprobar progreso actual 57 Ver rutina de entrenamiento actual 58 Ver ejercicio 59 Editar mis datos 60 DOCUMENTACIÓN DE DESARROLLO 61 Instalación, requisitos y dependencias utilizadas 61 El código tras Cleverfit 64 Arquitectura de la aplicación 64 El módulo Common 65 Los controladores base 65 Comandos de la aplicación: Patrón Command 67 Gestores de la base de datos: Realm 72 Gestores de la base de datos: CSV 77 Tratamiento de cadenas de texto 77 Cronómetro de entrenamiento 80 El núcleo: La Inteligencia Artificial tras Cleverfit 83 CONCLUSIONES 91 Resultados y grado de consecución de los objetivos 91 TRABAJOS FUTUROS, PLAN DE EXPANSIÓN 95 Estrategias de expansión 95 Software 95 Hardware 96 FUENTES DE INFORMACIÓN 98  TheCLEVERFITsolution  JoseLuisMolinaVega   Página4 Conocimientos propios 98 Fuentes web externas 98 Libros 98 AGRADECIMIENTOS 99  TheCLEVERFITsolution  JoseLuisMolinaVega   Página5 PROJECTCLEVERFIT   TheCLEVERFITsolution  JoseLuisMolinaVega   Página6 ESTADOACTUAL Definicióndelproyecto Muchas personas desean iniciar un plan deportivo para bajar de peso pero no disponen del suficiente tiempo, y las aplicaciones móviles que prometen ser entrenadores personales carecen de una inteligencia propia lo suficientemente potente como para proporcionarla, prometiendo evoluciones prácticamente imposibles. La solución es simple: desarrollar una aplicación con un núcleo de inteligencia artificial que genere entrenamientos cortos y de alta intensidad desde cero, al momento, considerando determinadas características del usuario, de forma que cada persona tenga un entrenamiento propio. Por estos motivos presentamos este proyecto para el desarrollo de una aplicación para iOS que genera entrenamientos de alta intensidad (HIT) en función de las necesidades del usuario. Motivación Hoy día a muchas personas que quieren mejorar su estado de salud, y una de las formas más asequibles es el ejercicio físico. Desde nuestro punto de vista, el ejercicio físico es un derecho universal, que puede mejorar la vida de las personas de forma inimaginable y de manera incuestionable. Realizar una aplicación que ayude a las personas a mejorar su salud es algo que no sólo resulta estimulante, sino que también resulta útil. Es por ello que consideramos  TheCLEVERFITsolution  JoseLuisMolinaVega   Página7 que esta aplicación podría ayudar a muchas personas a cumplir sus objetivos deportivos y, con ello, a incrementar su crecimiento personal. Competidores FITSTAR Fitstar promete entrenamientos personalizados y adaptados. En cierto modo, esto es falso. Como el resto de aplicaciones, Fitstar depende de rutinas predefinidas, no generadas al momento. No puede existir un entrenamiento personalizado si la rutina no es adaptada al usuario.  TheCLEVERFITsolution  JoseLuisMolinaVega   Página8 ¿Lo mejor de Fitstar? Es de Fitbit, y por tanto dispone de muchísimos más recursos que nosotros. La pulsera de Fitbit monitoriza la actividad diaria y lo envía a la aplicación. Por suerte, no será un problema a la larga debido a los Kits de desarrollo de salud de Apple, que permiten monitorizar las calorías quemadas y consumidas. FREELETICS A Freeletics le sucede lo mismo que a Fitstar, y es que sus rutinas están predefinidas. No hay una IA que las genere, y por tanto no están realmente adaptadas. ¿Lo mejor? Su interfaz. Freeletics muestra el índice de efecto de los ejercicios en los músculos del usuario. Aunque, en cierto modo, puede resultar incómodo. Freeletics no se enfoca en el tiempo, sino en la motivación. Por ello, su interfaz es más compleja que la de Cleverfit, y no ayuda al ahorro de tiempo.  TheCLEVERFITsolution  JoseLuisMolinaVega   Página9 Con respecto al efecto anabólico del HIT, también hay datos sólidos que demuestran su eficacia. En primer lugar, el HIT ha demostrado que aumenta el umbral de lactato, esto es, el nivel de tolerancia de los deportistas ante la acumulación de ácido láctico en el tejido muscular. Al aumentar el umbral de lactato, los deportistas pueden entrenar con mayor intensidad y durante más tiempo, lo que promueve el crecimiento muscular. El HIT también mejora la sensibilidad a la insulina. Este efecto de optimización hormonal permite que la glucosa disponible en el organismo sea empleada rápidamente como combustible, en lugar de almacenarse en los tejidos adiposos. La optimización de la sensibilidad a la insulina también mejora la recuperación y la construcción muscular. Por último, los datos obtenidos en estudios han permitido comprobar que el HIIT, en combinación con una dieta ligeramente más calórica que lo habitual, consigue activar los procesos anabólicos del organismo, originando un efecto de construcción muscular. Asimismo, los datos sugieren el efecto contrario en el ejercicio cardiovascular de baja intensidad, que acciona el efecto catabólico del cuerpo, promoviendo la degradación de tejido muscular para ser empleado como energía.  TheCLEVERFITsolution  JoseLuisMolinaVega   Página16 DESARROLLO Planificacióninicialyajustealamisma La planificación inicial establecida fue adoptada debido a que aplicaba una metodología de desarrollo en cascada: FASES DURACIÓN ESTIMADA (horas) ACTIVIDADES  Fasedeanálisis 50 Análisis del producto Análisis de requisitos Fasede especificación 20 Especificación completa del producto Comportamiento esperado Fasedediseño 50 Diagramas que reflejen el diseño del sistema Diagramas que reflejen la interacción con el usuario Fasede desarrollodel software 145 Desarrollo del núcleo Desarrollo del software (traducción de diseño a código) Fasede verificacióndel producto. 20 Elaboración Memoria 15 TOTALHORAS 300  TheCLEVERFITsolution  JoseLuisMolinaVega   Página17 La adaptación a la misma fue casi total, pero el número de horas varió considerablemente entre las diferentes etapas, que ahora puede comprobarse que se encuentran más detalladas debido a que se añadieron nuevas subetapas: FASES DURACIÓN ESTIMADA (horas) ACTIVIDADES  Fasedeanálisis 70 Análisis del producto Análisis del mercado Análisis de requisitos Análisis de casos de uso Fasede especificación 20 Especificación completa del producto Especificación de requisitos Especificación de casos de uso Especificación de historias de usuario Fasedediseño 60 Diagramas que reflejen el diseño del sistema Diagramas que reflejen la interacción con el usuario Fasede desarrollodel software 100 Desarrollo del software Fasede verificacióndel producto. 10 Testeo del producto Elaboración Memoria 50 TOTALHORAS 300  TheCLEVERFITsolution  JoseLuisMolinaVega   Página18 La etapa de desarrollo disminuyó muy considerablemente gracias a las etapas de análisis y especificación, que facilitaron enormemene el desarrollo del producto. La fase de análisis, inicialmente planeada como análisis de producto y de requisitos, incluyó un pequeño análisis de mercado y de casos de uso. Éste último disminuyó consiguió mantener la estimación de la etapa de especificación. La etapa de especificación, inicialmente planeada como especificación del producto y de los requisitos, se extendió por tanto con la inclusión de la especificación de los casos de uso y de las historias de usuario. Estos dos últimos facilitaron la etapa de desarrollo, que disminuyó cuantiosamente las horas estimadas. Metodologíaaplicada Se ha utilizado una metodología de desarrollo en cascada en este proyecto. Si bien es cierto que no es la preferida de muchos, sí lo es el hecho de que es la más usada. Al tener conocimiento sobre el dominio, esta metodología resulta adecuada para este proyecto. En Ingeniería de software el desarrollo en cascada, también llamado modelo en cascada (denominado así por la posición de las fases en el desarrollo de esta, que parecen caer en cascada “por gravedad” hacia las siguientes fases), es el enfoque metodológico que ordena rigurosamente las etapas del proceso para el desarrollo de software, de tal forma que el inicio de cada etapa debe esperar a la  TheCLEVERFITsolution  JoseLuisMolinaVega   Página19 finalización de la etapa anterior. Al final de cada etapa, el modelo está diseñado para llevar a cabo una revisión final, que se encarga de determinar si el proyecto está listo para avanzar a la siguiente fase. Este modelo fue el primero en originarse y es la base de todos los demás modelos de ciclo de vida. Un ejemplo de una metodología de desarrollo en cascada es: 1. Análisis de requisitos. 2. Diseño del sistema. 3. Diseño del programa. 4. Codificación. 5. Pruebas. 6. Implementación del programa. 7. Mantenimiento. Esta metodología, por otro lado dispone de las siguientes ventajas: ● Realiza un buen funcionamiento en equipos débiles y productos maduros, por lo que se requiere de menos capital y herramientas para hacerlo funcionar de manera óptima. ● Es un modelo fácil de implementar y entender. ● Está orientado a documentos. ● Es un modelo conocido y utilizado con frecuencia. ● Promueve una metodología de trabajo efectiva: Definir antes que diseñar, diseñar antes que codificar  TheCLEVERFITsolution  JoseLuisMolinaVega   Página20 Fasesdedesarrollo Cabe destacar que todas las fases se encuentran detalladas en el documento. Cada una de las fases tiene su propio apartado. Fasedeanálisis En esta fase se analizan las necesidades de los usuarios finales del software para determinar qué objetivos debe cubrir. De esta fase surge una memoria llamada SRD (documento de especificación de requisitos), que contiene la especificación completa de lo que debe hacer el sistema sin entrar en detalles internos. Es importante señalar que en esta etapa se debe consensuar todo lo que se requiere del sistema y será aquello lo que seguirá en las siguientes etapas, no pudiéndose requerir nuevos resultados a mitad del proceso de elaboración del software de una manera. Esta fase se encuentra detallada en el apartado de requisitos del presente documento. Fasedeespecificación Es la tarea de describir detalladamente el software a ser escrito, de una forma rigurosa. Se describe el comportamiento esperado del software y su interacción con los usuarios y/o otros sistemas. Esta fase se encuentra detallada en el apartado de requisitos del presente documento.  TheCLEVERFITsolution  JoseLuisMolinaVega   Página21 Fasedediseño Se realiza la descripción de la estructura relacional global del sistema y la especificación de lo que debe hacer cada una de sus partes, así como la manera en que se combinan unas con otras. Es conveniente distinguir entre diseño de alto nivel o arquitectónico y diseño detallado. El primero de ellos tiene como objetivo definir la estructura de la solución (una vez que la fase de análisis ha descrito el problema) identificando grandes módulos (conjuntos de funciones que van a estar asociadas) y sus relaciones. Con ello se define la arquitectura de la solución elegida. El segundo define los algoritmos empleados y la organización del código para comenzar la implementación. También se realiza el diseño de la interfaz de usuario. Esta fase se encuentra detallada en el apartado de diseño del presente documento Fasedeldesarrollodelsoftware Es la fase en donde se implementa el código fuente, haciendo uso de prototipos así como de pruebas y ensayos para corregir errores. Dependiendo del lenguaje de programación y su versión se crean las bibliotecas y componentes reutilizables dentro del mismo proyecto para hacer que la programación sea un proceso mucho más rápido.  TheCLEVERFITsolution  JoseLuisMolinaVega   Página22 Esta fase se encuentra detallada en el apartado de manual de usuario y software del presente documento. Fasedeverificacióndelproducto En esta fase, se realizan diversas pruebas para comprobar que todo funciona correctamente. REQUISITOS Análisisdelproducto Descripcióndelproducto Antes de definir los requisitos, debemos analizar las necesidades del productos y de los clientes potenciales. Es por ellos que realizaremos un pequeño análisis del mismo, así como del mercado en el que nos sumergimos. A continuación se describirá ligeramente el producto y el mercado objetivo, así como las posibles ventajas competitivas. DescripcióndelPRODUCTOenunalínea App multiplataforma de entrenamiento personalizado para personas con poco tiempo disponible.  TheCLEVERFITsolution  JoseLuisMolinaVega   Página23 Mercadoobjetivo–actividaddelnegocio Consumidores de aplicaciones de ejercicio físico para iOS, que dispongan de poco tiempo tiempo para realizar ejercicio físico. Tecnología–ventajasdelproducto/servicio Nuestra aplicación carece de rutinas predefinidas. Es nuestra Inteligencia Artificial la que se encargará de generar planes deportivos de alta intensidad conforme a las necesidades del usuario. Las rutinas dependerán de su historial de entrenamiento previo, su experiencia deportiva, su objetivo (que en esta iteración del proyecto se centrará exclusivamente en la pérdida de peso) y el tiempo que disponga para entrenar, desde 5 hasta 30 minutos. Clientesclave Personas de clase media-alta, residentes en ciudades, de entre 27-49 años, preferentemente trabajadores, que no puedan realizar actividad física de forma habitual (menos de 3 veces por semana) por falta de tiempo y que deseen mejorar su salud a través del ejercicio físico. Alianzas/acuerdosPOSIBLESdecooperaciónclave Federaciones deportivas, grandes superficies y deportistas de élite. Niveldecompetenciaesperado Competidores clave: Freeletics, Fitstar, 8fit. Esperamos un incremento considerable de nuestra competencia en los meses siguientes al lanzamiento. Ésto se debe a que el mercado de Fitness se encuentra totalmente en auge.  TheCLEVERFITsolution  JoseLuisMolinaVega   Página24 ParProducto/Mercado Cabe destacar que todo análisis de producto, por mínimo que sea, debería tener un ligero análisis del par producto/mercado. Antes de poder desarrollar este proyecto, se debía comprobar su viabilidad. Es por ello que se decidió realizar este análisis. No sólo nos permitía poder ir comprobando si el producto era viable o no, sino también si tenía un hueco en el mercado. Gracias a este análisis logramos describir a nuestro público objetivo presente y futuro: ParProducto /Mercado Posicionamiento Competitivo Presente Futuro Ámbitodel Producto Aplicaciones del cuidado de la salud y la forma física Aplicaciones del cuidado de la salud y la forma física y redes sociales Segmentación delMercado porClientes Personas de clase media-alta, residentes en ciudades, de entre 27-49 años, trabajadores, que no realicen actividad física de forma habitual (menos de 3 veces por semana) por falta de tiempo y que deseen mejorar su salud a través del ejercicio físico. Personas de clase media, residentes en ciudades, de entre 21-49 años, trabajadores o estudiantes, que no realicen actividad física de forma habitual (menos de 3 veces por semana) por falta de tiempo y que deseen mejorar su salud a través del ejercicio físico.  TheCLEVERFITsolution  JoseLuisMolinaVega   Página25 Usabilidad Código requisito CFNFU01 El usuario debería tardar, como máximo, 30 minutos en comprender la interfaz del sistema CFNFU02 El sistema debe tener una interfaz simple y minimalista  Desarrollo Código requisito CFNFD01 La aplicación debe cumplir los principios SOLID CFNFD02 La aplicación debe disponer del mínimo acoplamiento entre módulos CFNFD03 El código de la aplicación debe respetar los estándares de Clean Code.  Compatibilidad Código requisito CFNFC01 El sistema deberá ser compatible con iOS 9.0 o mayor CFNCF02 La aplicación no puede ocupar más de 10 megabytes de espacio en disco CFNCF03 La aplicación puede traducirse fácilmente a cualquier idioma  TheCLEVERFITsolution  JoseLuisMolinaVega   Página32 DISEÑO Diseñodelsistema Arquitecturadelsistema (Siguiente página)  TheCLEVERFITsolution  JoseLuisMolinaVega   Página33  TheCLEVERFITsolution  JoseLuisMolinaVega   Página34 Arquitecturadelabasededatos(Entidad-Relación) A continuación se encuentra el modelo Entidad Relación correspondiente a la base de datos:E  TheCLEVERFITsolution  JoseLuisMolinaVega   Página35  Historiasdeusuario Las historias de usuario se muestra en la siguiente tabla: ID Nombre Rol Descripción Validación HU01 Crear usuario Como usuario quiero poder crear una cuenta con mis datos Se completa el registro HU02 Editar datos Como usuario quiero poder editar mis datos personales o de entrenamiento Se editan los datos HU03 Ver progreso Como usuario quiero poder ver mi progreso actual, con la evolución de mi peso y mi Índice de Masa Corporal se muestra correctamente el progreso. HU04 Ver historial Como usuario quiero poder ver mi historial de entrenamiento, con todas mis rutinas pasadas se muestra correctamente el historial. HU05 Ver entrenamiento actual Como usuario quiero poder ver mi entrenamiento actual Se muestra el entrenamiento actual HU07 Ver plan de entrenamiento Como usuario quiero poder ver cualquier plan de entrenamiento de mi historial Se muestra correctamente el plan de entrenamiento HU08 Ver ejercicio Como usuario quiero poder la información de un ejercicio de mi rutina El ejercicio se muestra correctamente. HU09 Solicitar nuevo entrenamiento Como usuario quiero poder solicitar un nuevo entrenamiento para poder continuar con mi plan general Se genera un nuevo entrenamiento y se muestra.  TheCLEVERFITsolution  JoseLuisMolinaVega   Página36 HU10 Comenzar entrenamiento Como usuario quiero poder comenzar el entrenamiento actual Comienza el entrenamiento asistido HU11 Tener un entrenamiento asistido Como usuario quiero que mi entrenamiento sea asistido El entrenamiento que se está realizando indica al usuario qué ejercicio debe hacer en cada momento HU12 Pausar entrenamiento Como usuario quiero poder pausar el entrenamiento en cualquier momento El entrenamiento de pausa HU13 Reanudar entrenamiento Como usuario quiero poder reanudar mi entrenamiento siempre que esté pausado El entrenamiento asistido se reanuda HU14 Cancelar entrenamiento Como usuario quiero poder cancelar fácilmente el entrenamiento que estoy realizando Se cancela el entrenamiento y se vuelve a la vista donde se muestra el plan actual. Casosdeuso Los casos de uso aplicables a la aplicación se encuentran especificados a continuación: Crearunacuenta CASO DE USO R001 CREAR CUENTA Descripción El sistema deberá comportarse tal como se describe en el siguiente caso de uso concreto cuando alguna persona pretenda crear una cuenta. Actores Usuario Precondiciones No haber ejecutado antes el sistema  TheCLEVERFITsolution  JoseLuisMolinaVega   Página37 Flujo normal Paso Acción 1 El usuario especifica su nombre 2 El usuario especifica su edad 3 El usuario especifica su género 4 El usuario especifica su peso 5 El usuario especifica su altura 6 El usuario indica su experiencia 7 El usuario indica su objetivo 8 El usuario indica el máximo de tiempo disponible para entrenar 9 El usuario pulsa sobre el botón hecho Postcondiciones El sistema crea un usuario local con los datos introducidos Excepciones Paso Condición Acción 9 Los datos introducidos no son correctos Se muestra un área roja en los campos del formulario con los datos incorrectos Observaciones Modificardatospersonales CASO DE USO R002 MODIFICAR DATOS PERSONALES Descripción El sistema deberá comportarse tal como se describe en el siguiente caso de uso concreto cuando alguna persona pretenda modificar sus datos personales. Actores Usuario Precondiciones Haber creado previamente una cuenta local Flujo normal Paso Acción 1 El usuario especifica su nombre 2 El usuario especifica su edad 3 El usuario especifica su género  TheCLEVERFITsolution  JoseLuisMolinaVega   Página38 4 El usuario especifica su peso 5 El usuario especifica su altura 6 El usuario indica su experiencia 7 El usuario indica su objetivo 8 El usuario indica el máximo de tiempo disponible para entrenar 9 El usuario pulsa sobre el botón hecho Postcondiciones El sistema crea un usuario local con los datos introducidos El sistema añade un registro en el historial de progreso con los nuevos datos introducidos Variaciones Paso Acción Extensiones Paso Condición Caso de Uso 9 Excepciones Paso Condición Acción 9 Los datos introducidos no son correctos Se muestra un área roja en los campos del formulario con los datos incorrectos Observaciones Verhistorialdeprogreso CASO DE USO R003 VER HISTORIAL DE PROGRESO Descripción El sistema deberá comportarse tal como se describe en el siguiente caso de uso concreto cuando alguna persona pretenda ver su historial de progreso. Actores Usuario Precondiciones Haber creado previamente una cuenta local Encontrarse en el menú inicial Flujo normal Paso Acción  TheCLEVERFITsolution  JoseLuisMolinaVega   Página39 1 El usuario pulsa sobre la imagen que representa el historial de progreso Postcondiciones El sistema debe mostrar la vista de progreso, con el progreso actual del usuario Observaciones Verhistorialdeentrenamiento CASO DE USO R004 VER HISTORIAL DE ENTRENAMIENTO Descripción El sistema deberá comportarse tal como se describe en el siguiente caso de uso concreto cuando alguna persona pretenda ver su historial de entrenamiento. Actores Usuario Precondiciones Haber creado previamente una cuenta local Haberse generado un entrenamiento previamente Encontrarse en la vista del menú inicial Flujo normal Paso Acción 1 El usuario pulsa sobre la imagen que representa el historial de entrenamiento del usuario Postcondiciones El sistema debe mostrar la vista de entrenamiento, con todos los entrenamientos realizados por el usuario hasta día de hoy Observaciones Verplandeentrenamiento CASO DE USO R006 VER PLAN DE ENTRENAMIENTO Descripción El sistema deberá comportarse tal como se describe en el siguiente caso de uso concreto cuando alguna persona pretenda ver su plan de entrenamiento. Actores Usuario Precondiciones Haber creado previamente una cuenta local  TheCLEVERFITsolution  JoseLuisMolinaVega   Página40 Haberse generado previamente una rutina de ejercicios Encontrarse en la vista inicial o en el historial de entrenamiento Flujo normal Paso Acción 1 El usuario selecciona un plan de entrenamiento desde el historial de entrenamiento, o pulsa sobre el botón “empezar entrenamiento” de la vista principal Postcondiciones El sistema debe mostrar el plan de entrenamiento actual del usuario Observaciones Verejercicio CASO DE USO R007 VER EJERCICIO Descripción El sistema deberá comportarse tal como se describe en el siguiente caso de uso concreto cuando alguna persona pretenda ver un ejercicio de su rutina. Actores Usuario Precondiciones Haber creado previamente una cuenta local Haberse generado previamente una rutina de ejercicios Encontrase en la vista de visualización de rutina Flujo normal Paso Acción 1 El usuario pulsa sobre el ejercicio del cuál desea obtener información Postcondiciones El sistema debe mostrar el ejercicio deseado Observaciones   TheCLEVERFITsolution  JoseLuisMolinaVega   Página41 Estructuradelavistadeentrenamiento En esta vista se destaca la sencillez también. Está formada por un indicador de progreso del ejercicio actual, un botón para saltarse el ejercicio, y otro para cancelar el entrenamiento.,  TheCLEVERFITsolution  JoseLuisMolinaVega   Página48 Estructuradelavistadehistorialderutinas Esta vista es mucho más simple que las anteriores. No es la más relevante, y es por ello por lo que no se ha hecho tanto énfasis.  TheCLEVERFITsolution  JoseLuisMolinaVega   Página49 Estructuradelavistadeprogreso Esta vista refleja el proceso del usuario. Cada vez que el usuario modifique sus ajustes, se generará una nueva entrada en el historial de progreso personal, y se representará aquí. Mediante una calculadora interna, por cada registro se calcula el IMC a partir del peso y la altura del usuario, y se representa en una segunda tanda de estadísticas. Esta vista es modular, en el sentido que se pueden añadir gráficas muy fácilmente y mejorar la calculadora interna, con el fin de calcular más parámetros.  TheCLEVERFITsolution  JoseLuisMolinaVega   Página50 Estructuradelavistadecrearcuenta Crear una cuenta debe ser un proceso sencillo. En este caso, no pedimos datos que no necesitamos, y establecemos un formulario simple, dividido en dos intuitivas secciones para el usuario. La primera equivale a los datos personales. La segunda, a la personalización del entrenamiento. Esta última sección contiene los datos que usará la IA para generar entrenamientos.  TheCLEVERFITsolution  JoseLuisMolinaVega   Página51 Estructuradelavistadeeditardatospersonales La explicación de la vista anterior se aplica a esta, y es que se decidió realizar una vista muy similar con el fin de aprovechar el aprendizaje de uso del usuario durante el registro.  TheCLEVERFITsolution  JoseLuisMolinaVega   Página52   TheCLEVERFITsolution  JoseLuisMolinaVega   Página53 MANUALDEUSUARIO Registro Para registrarte, simplemente abre la aplicación por primera vez, y aparecerá la pantalla de registro. Deberás introducir los siguientes campos: ●Nombre: Indica tu nombre de usuario o nombre real ●Fecha de nacimiento: Indica cuándo naciste. Esto nos ayudará a calcular tu Índice de Masa corporal ●Peso: Indica tu peso para que puedas conocer el progreso del mismo. ●Altura: Indica tu altura  TheCLEVERFITsolution  JoseLuisMolinaVega   Página54 ●Género: ¿Eres hombre o mujer? ●Objetivo: Por ahora, el único objetivo disponible es la pérdida de peso ●Experiencia: Tu experiencia influye en la selección de ejercicios, cuya dificultad variará en función de la misma. ●Duración de entrenamiento: Indica la duración máxima aproximada de tu entrenamiento Generarentrenamiento Para generar un entrenamiento pulsa sobre el botón “Empezar entrenamiento” de la imagen de la izquierda. Después, pulsa sobre generar entrenamiento. Se generará una rutina para ti en función de tu experiencia, historial previo de entrenamiento y, por supuesto, objetivo.  TheCLEVERFITsolution  JoseLuisMolinaVega   Página55 Comenzarentrenamiento Para comenzar un entrenamiento, simplemente pulsa sobre el botón “Empezar entrenamiento” de la pantalla principal, tal como se muestra en la imagen izquierda. Accederás a la vista de resumen de entrenamiento, donde podrás ver la lista de ejercicios a realizar. Posteriormente, pulsa nuevamente sobre comenzar entrenamiento (imagen derecha) para empezar con el mismo.  TheCLEVERFITsolution  JoseLuisMolinaVega   Página56 Asistenciaduranteelentrenamiento El asistente o ayudante de entrenamiento te echara una mano durante el mismo. Te indicará, en todo momento cuánto te falta para finalizar el ejercicio. Al finalizar un ejercicio, el asistente también te indicará cuánto tiempo de descanso tienes. El asistente de entrenamiento estará contigo durante todas tus rutinas, ayudándote a realizar todo de forma más amena, mostrándote en todo momento el ejercicio actual, indicando su nombre en la zona superior de la pantalla, y mostrando una imagen en la zona media. Si quieres saltar un ejercicio, puedes hacerlo pulsando el botón “pasar al siguiente”. Si deseas cancelar el entrenamiento actual, simplemente pulsa sobre el botón rojo ubicado en la zona inferior derecha de la pantalla.  TheCLEVERFITsolution  JoseLuisMolinaVega   Página57 Las librerías utilizadas, por tanto, son las siguientes ○XLForm: Permite un mejor manejo de formularios que la librería nativa de iOS ○Realm: El gestor de base de datos que hemos utilizado por defecto. Es bastante sencillo de usar, permite tener una base local controlada, y se trata de una de las librerías más importantes en el mundo del desarrollo. La explicaremos más adelante. ○SCAlertViewSwift: Permite mostrar alertas de una forma muy, muy sencilla en la aplicación, respetando los estándares establecidos por Clean Code. ○UICircularProgressRing: Permite crear una barra de progreso circular. ¿Lo mejor? Es invisible al código. Su declaración se efectúa directamente en la vista de la aplicación. Lo explicaré más adelante. ○SwiftyTimer: Como su nombre indica, se trata de un Timer, y realmente se ha usado como una simple base para un cronómetro propio.  TheCLEVERFITsolution  JoseLuisMolinaVega   Página64 ElcódigotrasCleverfit Con el fin de incrementar el conocimiento sobre la aplicación, así como explicar lo que realmente es más relevante para este proyecto, su arquitectura, se ha decidido incluir extractos del código con el fin de explicar el funcionamiento tras Cleverfit. Arquitecturadelaaplicación Al desarrollar Cleverfit, quería hacer relucir su arquitectura, creando módulos independientes entre sí, aumentando así la coherencia del proyecto y disminuyendo drásticamente su acoplamiento. Podemos apreciar en la imagen adjunta, que Cleverfit dispone de varios módulos independientes, correspondientes a cada una de las vistas del proyecto. Cada uno de los módulos no conoce la existencia de los otros, excepto de uno: El módulo Common. El módulo Common se trata, sencillamente, de un módulo común a la mayoría de módulos. Es un recurso a usar por cada uno de ellos cuando se necesite. Eso sí, si bien es cierto que el módulo Common tiene conocimiento sobre la existencia de los módulos independientes, bajo ningún concepto puede utilizar recursos de los mismos y generar una referencia circular. En este proyecto, las referencias circulares están estrictamente prohibidas. De hecho, y debido a la facilidad de la arquitectura, se ha decidido  TheCLEVERFITsolution  JoseLuisMolinaVega   Página65 establecer una arquitectura MVC. En un comienzo se pensó en incluir una arquitectura MVVM, pero no fue necesario debido a las facilidades que otorga iOS a la hora de gestionar vistas y definir las clases. Procedo a detallar los módulos, de modo que se puedan apreciar algunos de los patrones de diseño utilizados. Eso sí, también se detallarán más abajo ElmóduloCommon Loscontroladoresbase Una de las partes más relevantes del módulo común son los controladores base. No porque sea el código más importante, ni mucho menos. De estas clases heredan todos los controladores de la aplicación, y disponen de métodos útiles que posibilitan la escritura de código limpio. Hay que ver estas clases como una capa de nivel medio, ya que no llega a hacer gestiones a bajo nivel, pero tampoco a alto. Simplemente definen métodos para que sus clases hijas no tengan que realizar tanto esfuerzo a la hora de realizar operaciones básicas de gestión de vista  TheCLEVERFITsolution  JoseLuisMolinaVega   Página66 Si observamos, por ejemplo, la clase CleverFitFormViewController, podemos ver que dispone de dos métodos básicos, aparte de los métodos de esconder o mostrar la barra de navegación. Estos dos métodos permiten añadir los descriptores de los formularios de forma simple, de tal forma que sus hijos sólamente tengan que llamar al método, sin necesidad de realizar comprobaciones cada vez que desean añadir un descriptor. Cabe destacar que un descriptores se trata de un campo del formulario en la librería XLForm. De hecho, se puede apreciar cómo esta clase base precisamente se ha realizado para facilitar la realización de formularios. El primer método addDescriptor, como se puede observar, se diferencia con respecto al segundso en el hecho de que no dispone del parámetro options. ¿Por qué? Sencillo, el método superior permite crear campos sin opciones, mientras que el inferior necesita de opciones  TheCLEVERFITsolution  JoseLuisMolinaVega   Página67 para poder trabajar correctamente, creando un campo que despliega un selector de opciones de cara al usuario. Simple, ¿verdad? ¡Clean Code! Por otro lado, también se ha definido una base para los controladores que no desean implementar formularios en las vistas. Realmente dispone de métodos simples, pero considero que es una API más agradable que la nativa de Swift. Comandosdelaaplicación:PatrónCommand ¿Cómo hacemos que los controladores no sean responsables de decidir el comportamiento de las interacciones del usuario? Utilizando el patrón Command, que nos ayudará a aislar este tipo de decisiones, permitiendo evitar interacciones entre distintos módulos, y evitando dotar a controladores y vistas de decisiones que carecen de relevancia para ellos. Se han definido dos tipos de protocolos (equivalente a una interfaz en Java) principales en la App:  TheCLEVERFITsolution  JoseLuisMolinaVega   Página68 ●FeedbackCommand: Permite definir comandos que indiquen si su ejecución ha sido correcta o no. Genial cuando se trata de ejecutar operaciones sobre la base de datos o cuando se intenta acceder a otra vista. ●NoFeedbackCommand: Comandos sin retroalimentación. No es necesario que indiquen nada, aunque se podría incluir un delegado para operaciones asíncronas. Con esta base de definición, sae pueden crear comandos que permitan, como indicamos anteriormente, abrir/cerrar vistas, ejecutar operaciones sobre la base de datos, etc. Aislando, de este modo, la responsabilidad que inicialmente cae, en este caso sin sentido, sobre los controladores de la aplicación. Pongamos algún ejemplo: ●Actualizar la información de un usuario registrado: Si un usuario desea modificar sus datos, pulsando sobre el botón actualizar, automáticamente el módulo que controle esa vista llamará al comando UpdateUserCommand, inyectándole el  TheCLEVERFITsolution  JoseLuisMolinaVega   Página69 controlador de navegación y los datos del usuario a actualizar. Al ejecutar el comando mediante el método execute(), se ejecutará el comandoEl método execute() intentará actualizar el usuario en la base de datos, y si lo consigue, intentará volver atrás y cerrar la vista de ajustes. Simple, ¿verdad? Imagináos todo esto realizado por el controlador, no quedaría nada limpio. ●Abrir/cerrar vistas: Se estuvo pensando en incluir el patrón de diseño FlowController para controlar el flujko de las vistas, aislándolo así del controlador principal. Pero lo cierto es que iOS facilita mucho la navegación entre las mismas, definiendo la navegación automáticamente desde la gestión del diseño de la app  TheCLEVERFITsolution  JoseLuisMolinaVega   Página70 Como se puede observar, Xcode permite conectar los botones directamente con la siguiente vista a ejecutar, por lo que los FlowControllers fueron descartados. Sin embargo, el patrón Command podría ayudar en esos aislados casos en los que se necesite ejecutar una vista de forma manual. De este modo, y haciendo uso del FeedbackCommand, se creó la siguiente clase:  TheCLEVERFITsolution  JoseLuisMolinaVega   Página71 A este comando se le debe inyectar tanto el controlador de navegación como el controlador a ejecutar. Pero, espera… si tenemos que ejecutar un comando para abrir una desde un módulo, de forma que se acceda a otro… ¡ese módulo conocería de la existencia del otro! Toda la independencia entre módulos se iría al traste. ¿Cómo solucionarlo? Creando extensiones propias del módulo que permitan ejecutar cada vista. Por ejemplo: Esa comando, que hereda de OpenViewCommand, y que por cierto, ha sido declarado como clase final (no admite hijos), será encargado de abrir la vista del plan de entrenamiento actual. ¿Lo mejor? Puede llamarla cualquier módulo, y para nada tienen que conocer el controlador de un módulo no común. Por cierto, como curiosidad, y con el fin de facilitar la realización del código, se ha creado una clase Config que contiene todos los nombres de las vistas:  TheCLEVERFITsolution  JoseLuisMolinaVega   Página72 De este modo, para ejecutar cualquier vista, sólo habría que escoger su nombre desde esta clase. Swift requiere que, para abrir una vista declarada en el panel de vistas, se utilice su identificador único. Sería muy engorroso escribir la cadena de texto constantemente. Por eso, cada vez que se añada una vista nueva, se debe registrar en este fichero su identificador único, facilitando luego su llamada: Algo que facilita bastante la legibilidad del código. Gestoresdelabasededatos:Realm Se ha incluido un gestor de la base de datos sobre el módulo común, de modo que cualquier módulo puede hacer uso del mismo para realizar operaciones de carga, actualización eliminación y adición. Este gestor funciona sobre Realm.  TheCLEVERFITsolution  JoseLuisMolinaVega   Página73 Bien, conocido esto, debemos saber que todas las cadenas de texto están definidas en un fichero de localización que puede tener diferentes lenguajes, y cada cadena de texto dispone de un par Código-Valor. De este modo: Cada vez que queramos utilizar una cadena de texto para representarla en la vista, deberíamos realizar la operación NombreDeString.localized. La extensión que hemos definido se encargará de buscar la cadena de texto en el proyecto. Por ejemplo: “USER_OBJECTIVE_LOSE_WEIGHT”.localized devolvería la cadena de texto “Perder peso”.  TheCLEVERFITsolution  JoseLuisMolinaVega   Página80 Simple, ¿verdad? Conseguimos tratar las cadenas de texto inteligentemente y, además, de forma intuitiva, de forma que admiten multilenguaje sin ningún tipo de problema. Cronómetrodeentrenamiento Puede que a nivel de código, esto no parezca tan relevante. Pero creedme, lo es. La definición de esta clase y su arquitectura ha sido más compleja de definir. El proceso de abstracción ha tenido que ser más preciso, ya que para conseguir que el usuario pueda realizar un entrenamiento mediante la aplicación, y que la aplicación pueda cronometrar los tiempos:  TheCLEVERFITsolution  JoseLuisMolinaVega   Página81 (Ambas imágenes corresponden al ayudante de entrenamiento, que ayuda a realizar la rutina generada, cronometrando cada ejercicio y descanso de la rutina de ejercicios, de principio a fin. La primera imagen corresponde a un ejercicio. La segunda, al periodo de descanso tras realizarlo) El responsable principal del ayudante de entrenamiento es el controlador de la vista se trata de un módulo independiente. Sinceramente, no creía que ese módulo tenga que encargarse de cronometrar tiempos, así que se ha creado una clase específica que permite controlarlo, y que pueda usarse fácilmente por otro módulo en caso de necesidad. Esta clase, WorkoutExerciseTimer de forma transparente, realiza todas las operaciones, e informa a sus delegados (en este caso, el controlador principal de la vista), sobre el estado del entrenamiento. Las operaciones que sus delegados deben implementar son: De esta forma, aquellos que quieran hacer uso del ayudante de entrenamiento, deberán implementar su delegado, y serán informados de los cambios de estado en todo momento. Por ejemplo, el módulo Train, que se encarga de gestionar la vista de entrenamiento, implementará el delegado de la siguiente manera que su comportamiento sea:  TheCLEVERFITsolution  JoseLuisMolinaVega   Página82  ●Al actualizarse el timer (timeUpdated orestTimeUpdated): El controlador de entrenamiento actualizará el indicador circular ●Al cambiar de ejercicio o comenzar un tiempo de descanso (restTimeStarted o exerciseChanged): El controlador de entrenamiento reiniciará el indicador circular ●Al finalizar el entrenamiento (workoutFionished): Se abrirá la vista de “Entrenamiento completado”  TheCLEVERFITsolution  JoseLuisMolinaVega   Página83  Elnúcleo:LaInteligenciaArtificialtrasCleverfit A pesar de que generamos rutinas deportivas en función del usuario, este proyecto se centra más en la arquitectura de la aplicación que en la propia IA debido a la especialización de Ingeniería del Software que he seleccionado. Por supuesto, eso no le resta importancia a la Inteligencia Artificial. Disponemos de una clase WorkoutGenerator, que se encarga de todas las operaciones relacionadas con la generación inteligente de ejercicios. A esta clase se le deben inyectar, por defecto, el usuario actual y la lista completa de ejercicios. Además, también debe disponer del historial de ejercicios del usuario.  TheCLEVERFITsolution  JoseLuisMolinaVega   Página84 La función GenerateRoutine se encarga de generar una lista mediante la clase CleverFitExerciseList, cuyo inicializador es: Esta lista dispondrá de todos los ejercicios contenidos en una serie de nodos con valor heurístico. Realmente no es nada complejo, una lista simple sobre la que se aplica un cálculo heurístico. De hecho, el valor heurístico es una propiedad de Swift sobre la que se aplica una función matemática que considera varios parámetros: La función previa quedaría definida de la siguiente manera:  TheCLEVERFITsolution  JoseLuisMolinaVega   Página85 ●Experiencia del usuario: Se incrementará el valor heurístico de un nodo en función de si la experiencia del usuario encaja con la dificultad del ejercicio. Si una persona tiene una experiencia mínima, se premiarán los ejercicios básicos, teniendo mayor valor heurístico que los ejercicios medios, y más que los ejercicios complejos. ●Ejercicio previamente entrenado: Debido a que nuestra IA genera rutinas de alta intensidad, y en estas destaca sobretodo el dinamismo, se intentará, en la medida de lo posible, que no se repitan los ejercicios previos. De este modo, tal vez en algún momento logre repetirse alguno debido al peso de las otras variantes del valor  TheCLEVERFITsolution  JoseLuisMolinaVega   Página86 heurístico final, pero si es así, será el menor número de veces posible. ●Ejercicio entrenado en rutinas anteriores: Si el ejercicio ha sido entrenado en la rutina anterior a la actual, entonces se disminuirá su valor heurístico tantas veces como la posición de la rutina se encuentre en la base de datos, por orden de fecha. Esto quiere decir que, si el usuario ha realizado varias rutinas, los ejercicios de la rutina más antigua tienen mayor posibilidad de aparecer que los ejercicios de la rutina anterior. De este modo se evita la repetición de ejercicios de las rutinas más recientes, lo cual evitaría que los músculos se adapten a los ejericios y que, por tanto, el  TheCLEVERFITsolution  JoseLuisMolinaVega   Página87 progreso no se adecuado. ●Si el ejercicio ya existe en la rutina actual: Por defecto, si el ejercicio existe en la rutina actual, y con el fin de incentivar que no se repita, su valor heurístico disminuirá en 3. ●Grupos musculares previamente entrenados: Si el ejercicio actual afecta a grupos musculares previamente entrenados, tendrá mejor valor heurístico. Cabe destacar que en la base de datos de ejercicios se encuentra, por cada ejercicio, los grupos musculares afectados. Es más, están ordenador de forma que los primeros son los más afectados por el mismo. Y los últimos, los menos. Es por ello que el valor  TheCLEVERFITsolution  JoseLuisMolinaVega   Página88 heurístico disminuirá en función de esto, de tal modo que si un ejercicio que se encuentra en la rutina influye en un grupo muscular mínimamente, otro ejercicio que afecte a ese mismo grupo muscular tendrá más posibilidades, que si se tratara de un ejercicio que influyera de forma drástica. De esta forma, se garantizan rutinas dinámicas, con mínima repetición, adaptadas a la experiencia del usuario. Aquellas clases que quieran usar el generador deberán implementar su delegado. Es conveniente saber cuándo la rutina ha comenzado, cuándo está siendo procesada, y cuándo ha terminado. Es por ello que el módulo encargado de hacer uso de esta misma clase, el CurrentPlanViewController, implementa el delegado de la siguiente forma:  TheCLEVERFITsolution  JoseLuisMolinaVega   Página89 TRABAJOSFUTUROS,PLANDEEXPANSIÓN Estrategiasdeexpansión Software ●Mejora de la Inteligencia Artificial: Para la aplicación actual, pretendemos incluir en un futuro técnicas de aprendizaje automático y mejoras en la inteligencia artificial. De este modo, podremos recopilar datos de los mejores entrenamientos para cada tipo de persona, y mediante análisis Big Data, podríamos conseguir los mejores resultados posibles en cuanto a generación de rutinas deportivas. Todos los usuarios se verían altamente beneficiados. ●Aplicación para Android: Incluir la versión de Android incrementaría el Target del producto considerablemente. ●Red social interna: Es inevitable pensar que la unión hace la fuerza. Cuando los usuarios podemos compartir nuestros progresos y compararlos con otros, logramos vernos más motivados. Realizar una red social deportiva interna sería extremadamente beneficiosos para ellos, tanto a nivel físico como a nivel mental. ●Servidores dedicados: Por ahora, realizar toda la base de datos en local no ha sido un problema. De hecho, es extremadamente posible que alojarla en un servidor tenga un considerable coste si se lanza al mercado. sin embargo, para cumplir este plan de expansión, es inevitable un servidor dedicado. No sólo para hacer que la Inteligencia artificial pùeda  TheCLEVERFITsolution  JoseLuisMolinaVega   Página96 tomar muchos más datos a la hora de generar rutinas, sino también para facilitar al usuario poder cambiar de dispositivo fácilmente. ●Sistema de recompensas: Añadir un sistema de logros le aportará al usuario el beneficio de cumplir objetivos acordes a su estado. Y si lo sincronizamos con las redes sociales, podría ser un gran aliciente para acercarse a ese estado saludable que tanto desea. El software que desarrollaremos en un futuro estará enfocada a las siguientes áreas: ●Cleverfit como sistema de administración y gestión de centros deportivos. ●Cleverfit como herramienta de inclusión del deporte para los más pequeños. De este modo, se comenzaría a conocer nuestro sistema desde edades jóvenes, y estos jóvenes influyen en sus padres. ●Cleverfit para personas con Diabetes yEnfermedades Crónicas del Sistema Esquelético. Hardware Pretendemos que nuestro sistema inicial de Inteligencia Artificial no se quede simplemente en una herramienta deportiva vía móvil/Web, sino que avance hasta convertirse en un completo sistema global interconectado. Para ello, crearemos Hardware específico que nos permita una mayor adaptación de nuestros sistemas a los entornos de entrenamiento que utilice el usuario, así como a su forma de entrenar.  TheCLEVERFITsolution  JoseLuisMolinaVega   Página97 ●Pulseras de corrección postural que faciliten al usuario el desarrollo funcional de los ejercicios y de su vida cotidiana. ●Dispositivos electrónicos conectados a las diversas máquinas de los centros deportivos, para conocer su usabilidad y disponibilidad en cada momento. De este modo, los usuarios que usen nuestra aplicación recibirán sugerencias de ejercicios alternativos si el lugar de realización del mismo está ocupado, y nuestro sistema podrá registrar directamente qué ejercicio ha hecho y está realizando qué usuario, sin necesidad de que toque la pantalla de su dispositivo móvil.  TheCLEVERFITsolution  JoseLuisMolinaVega   Página98 FUENTESDEINFORMACIÓN Conocimientospropios ●Apuntes y conocimientos adquiridos a lo largo de la carrera ●Apuntes de cursos de entrenamiento personal Fuenteswebexternas ●HIT, entrenamiento de alta intensidad: https://www.vitonica.com/entrenamiento/entrenamiento-de-alta-intensidad-o-hit-i ●Los principios SOLID: https://es.wikipedia.org/wiki/SOLID Libros ●Clean Code; Robert Cecil Martel ●The Pargmatic Programmer; Handy Hunt & David Thomas  TheCLEVERFITsolution  JoseLuisMolinaVega   Página99 AGRADECIMIENTOS La Inteligencia Artificial no fue mi única compañera durante este proceso. Por suerte, mucha gente ha aportado su grano de arena en este proyecto. Cuando comenzamos un proyecto profesional, laboral o académico, también iniciamos un proceso de crecimiento personal bastante intenso. Al final de un proyecto, no somos iguales que al comienzo, y eso es fascinante. Todo proyecto tiene una cara que lo representa, pero detrás de ello, detrás de todo el proceso de desarrollo siempre ha varias personas que apoyan de forma indiscutible cada pequeño paso durante el trayecto. Por ello, quiero agradecer a Margarita de la Iglesia, mi terapeuta, por asesorarme, y ayudar a que mi vida mejore hasta límites que jamás vi posibles en el pasado. Sin ella, es muy posible que nunca hubiera podido saber que tenía Asperger, y jamás hubiera evolucionado como persona. Cada día, en silencio, me recuerdo que es muy importante para mi, y todo, absolutamente todo, hubiera sido extremadamente más complejo sin ella. Margarita, muchas gracias, porque jamás hubiera conseguido presentar este proyecto sin tu ayuda. Jamás hubiera conseguido mirar a los ojos, ni tan siquiera hubiera logrado verme como alguien capaz de conseguir lo que me propongo. A su vez, quiero agradecer a Beatriz, mi tutora, toda la ayuda durante estos años. He evolucionado muchísimo durante estos últimos años. Yo no soy la misma persona que  TheCLEVERFITsolution  JoseLuisMolinaVega   Página100 comenzó, hace 5, el GII. He crecido y evolucionado muchísimo, y debo agradecerle la confianza depositada en mí, y la ayuda que me ha otorgado. Muchas gracias, Bea, porque jamás me olvidaré de ti. Gracias a mis abuelos por parte de madre, personas absolutamente asombrosas. No sé ni cuantas veces me han ayudado a lo largo de mi vida, pero estoy seguro que jamás podré agradecerlo lo suficiente. No es que tengan un hueco en mi corazón, es que son parte de él. A mi pareja, por soportar, sin tener que hacerlo, todos los fines de semana que no pude dedicarle tiempo por el proyecto, y pòr comprenderme de forma tan clara y sincera. Un proyecto no es sencillo si no tienes a alguien a tu lado que te apoya tanto. Y, por supuesto, y para nada menos importante, quiero agradecer especialmente amis padres, que son el pilar fundamental de mi vida. He tenido mucha suerte con ellos, y su apoyo es incuestionablemente abismal. Sin ellos, no sólo éste proyecto no sería posible, sino que jamás hubiera conseguido aspirar siquiera a esta carrera. Me han extendido su mano cuando he caído, y me han sostenido antes de derrumbarme. Son una enorme parte de la esencia de mi existencia. Por ello, muchas gracias. Gracias por ser como sois, por aguantar mi mal humor constante, mi extraña forma de ser… gracias por hacer de mi vida algo maravilloso. Este proyecto no es mío, también es vuestro. También habéis sufrido la carrera conmigo, y jamás podré tener las palabras adecuada para deciros cuánto me habéis apoyado.  TheCLEVERFITsolution  JoseLuisMolinaVega   Página101