• No se han encontrado resultados

Mangaapp

N/A
N/A
Protected

Academic year: 2020

Share "Mangaapp"

Copied!
63
0
0

Texto completo

(1)Escuela Universitaria de Informática Grado en ingeniería del software Curso 2014-2015. Autor: Francisco Burgos Valdés. A N G A P P.

(2) Francisco Burgos Valdés. Índice. Resumen ................................................................................... 3 Abstract ................................................................................... 3 Introducción ............................................................................. 4 Situación Actual ........................................................................ 5 Objetivos .................................................................................. 8 Tecnologías utilizadas ............................................................... 10 JAVA ................................................................................... 10 Android SDK ......................................................................... 11 Ruby .................................................................................... 12 Ruby on Rails ........................................................................ 13 MongoDB .............................................................................. 14 Propósito ................................................................................. 16 Alcance del producto ................................................................. 16 Stakeholders ............................................................................ 16 Estudio de Mercado ................................................................... 19 Estado General del mercado móvil.......................................... 19 Sistemas operativos móviles .................................................. 20 Uso y actividades ................................................................ 21 Segmentación de la oferta ..................................................... 22 Público Objetivo ................................................................. 23 Conclusiones ...................................................................... 23 Perspectiva del producto ............................................................ 24 Casos de Uso............................................................................ 24 Requisitos ............................................................................... 26 Requisitos Funcionales............................................................ 26 Requisitos No-Funcionales ...................................................... 27 Arquitectura ............................................................................. 29 Topología ............................................................................. 29 Aplicación móvil .................................................................... 30 Diseño ............................................................................... 30 1.

(3) Francisco Burgos Valdés Interfaces ........................................................................... 34 Crawler ................................................................................ 40 Diseño ............................................................................... 40 Interfaces ........................................................................... 46 Servidor Rails API REST......................................................... 47 Base de Datos ........................................................................ 49 Pruebas Aplicación Móvil .......................................................... 52 Pruebas Crawler ....................................................................... 53 Pruebas Unitarias ................................................................... 53 Pruebas de Integración ............................................................ 53 Pruebas de Rendimiento .......................................................... 53 Punto de Vista .......................................................................... 55 F u t u r o s p r o ye c t o s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 7 Bibliografía ............................................................................. 58 Glosario .................................................................................. 61. 2.

(4) Francisco Burgos Valdés. Resu men E s t e p r o ye c t o c o n s i s t e e n e l a n á l i s i s , d i s e ñ o e i m p l e m e n t a c i ó n d e u n sistema completo, que a través de una aplicación móvil para teléfonos inteligentes con sistema operativo Android, permitirá la organización y lectura de comics digitales.. Abstract T h i s p r o j e c t c o n s i s t s i n a n a l ys i s , d e s i g n a n d i m p l e m e n t a t i o n o f a c o m p l e t e s ys t e m , w h i c h u s i n g a n d A n d r o i d s m a r t p h o n e a p p l i c a t i o n , i t allows to manage and to read digital comics.. 3.

(5) Francisco Burgos Valdés. In trodu cción Internet se ha convertido en una fuente de información inmensa, tanto es así, que se volvió imprescindible desde un primer momento encontrar mecanismos de filtrado y búsqueda rápida de datos entre el volumen creciente información. Google, Yahoo, Bing, son ejemplos directos de tecnologías que permiten esto mismo a través de sus buscadores. Por otro lado, móviles, tablets, phablets, ebooks, smartwatches y demás dispositivos portátiles han supuesto un entorno de ubicuidad de acceso a internet, y por extensión de todos estos servicios de búsqueda generales. Los esfuerzos actuales de estos grandes buscadores, se han orientado precisamente en aprovechar las características intrínsecas de estos aparatos (posición, acelerómetro, etc.) para ofrecer información útil al usuario según donde se encuentre o de sus hábitos de consumo de información. Sin embargo, el espectro de variedad informativa con el que trabajan es muy amplio y la calidad de los resultados que ofrecen está sujeta a algoritmos que determinan la relevancia de los documentos indexados respecto a la cadena de búsqueda utilizada (PageRank de Google).. Mangapp es un lector de comics japoneses que existe en la ubicuidad de los dispositivos móviles en forma de aplicación para sistemas operativos Android y que cuenta con su propio motor de indexación de recursos que alimentan de contenido a la aplicación. Este contenido proviene de internet, de fuentes públicas, abiertas y accesibles desde cualquier navegador. La idea de esta app es que sirva de interfaz sencilla para el usuario donde puede descubrir, buscar y por supuesto leer mangas (cómic japonés) haciendo para él completamente transparente la recuperación de estos recursos, que de otra forma tendría que buscar en Google, Yahoo, etc, a través de su navegador habitual (también de carácter genérico) y luego filtrar manualmente hasta encontrar el manga deseado.. Mangapp se puede descargar desde Google Play en el siguiente enlace: h t t p s : / / p l a y. g o o g l e . c o m / s t o r e / a p p s / d e t a i l s ? i d = c o m . e m a n g a . e m a n g a . a p p. Y todo el código está disponible en formato opensource en el repositorio de Github: https://github.com/Vrael/eManga/ 4.

(6) Francisco Burgos Valdés. Situ ación Actual Para entender la necesidad de crear esta aplicación, es necesario comprender primero la oferta que existe actualmente en el mercado. En este caso y ya que Mangapp es una aplicación destinada a la plataforma A n d r o i d s e h a a n a l i z a d o l a t i e n d a d e a p l i c a c i o n e s G o o g l e P l a y, p a r a aquellas apps que pueden llevar a cabo la tarea de leer comics. A continuación, se detalla una lista con el nombre de la aplicación y sus fortalezas y debilidades:. Manga Reader: + Sencilla + Lectura offline. - Solo está en inglés - Poca variedad - Se producen muchos fallos (a veces no descarga las páginas, o no se encuentra disponible un capítulo) - Hay que esperar a descargar el capítulo entero para poder empezar a leer. (Esperar para leer) - No hay gestión de fuentes de recursos no disponibles. Manga Rock: + Muy completa (favoritos, historial, copia de seguridad, etc) + Muchos idiomas + Lectura offline + Ajustes de personalización. - Esperar para leer - Devora la batería - Android >= 4.0.3 - Historial por capítulo, no por página - No hay gestión de fuentes de recursos no disponibles 5.

(7) Francisco Burgos Valdés Manga Cloud: + Notificaciones (suscribirse a un manga) + Lectura offline + Favoritos, historial, ficha detalle de un comic. - Solo está en inglés - Esperar para leer - No hay gestión de fuentes de recursos no disponibles. Submanga Reader: + Gran variedad de mangas + Sencilla + Selección de servidores + Lectura offline. - No hay gestión de fuentes de recursos no disponibles - Esperar para leer - Descarga muy lenta. Tras probar a fondo esta muestra de las aplicaciones más relevantes dentro de este campo e identificar sus puntos fuertes y debilidades, se puede apreciar tres carencias fundamentales en todas ellas que son: 1. Esperar para leer: Para poder acceder al capítulo de un manga, es necesario descargárselo por completo primero. Además para avanzar de capítulo, se repite esta operación, por lo que las interrupciones son constantes según se avanza en la lectura. 2. No gestión de recursos no disponibles: Todas estas aplicaciones recuperan los recursos de sitios web y fuentes públicas de internet, pero la calidad de servicio de estos sitios deja mucho que desear, por lo que las interrupciones ocurren con frecuencia. Entonces, el usuario debe esperar a que vuelva a 6.

(8) Francisco Burgos Valdés estar disponible o ir a buscarlo a otra fuente si es que da la opción la aplicación. 3. Velocidad de descarga: Además de las esperas y los cortes, a menudo los métodos de descarga son lentos y las interrupciones en la cobertura hacen que se tenga que repetir el proceso de descarga desde el principio.. 7.

(9) Francisco Burgos Valdés. Ob jetiv os A continuación se mencionan los objetivos que este proyecto pretende cubrir:. •. Organizar los mangas dentro de una biblioteca virtual.. •. Mostrar información detallada de cada manga (ficha): o Título, Autor, Descripción, Género o Progreso, Fecha de la última lectura. •. Capacidad de búsqueda a partir de cualquiera de los campos anteriores.. •. Leer los mangas (Navegar a través de los capítulos y sus páginas).. •. Mostrar una lista con los números).. •. Marcar el punto de lectura y dar la posibilidad de reanudar la lectura desde ese punto en el futuro (marca páginas). •. Mostrar siempre contenido actualizado.. capítulos. 8. más. recientes (últimos.

(10) Francisco Burgos Valdés. TECNOLOGÍAS. 9.

(11) Francisco Burgos Valdés. Tecn olo gías u tilizadas Este capítulo pretende exponer las principales tecnologías que hacen posible el funcionamiento de Mangapp y justificar la decisión que se tomó para decantarse por estas y no otras alternativas que podrían haberse escogido.. JAVA El lenguaje de programación JAVA fue creado en 1990 por la empresa S u n M i c r o s ys t e m I n c . E l p r o ye c t o f u e l i d e r a d o p o r J a m e s G o s l i n g y l a idea era desarrollar un sistema que fuse común independientemente del h a r d w a r e s o b r e e l q u e s e e j e c u t a s e . F u e u n f i a s c o . E l p r o ye c t o t e r m i n ó en 1992 con el lenguaje llamado Oak, que no consiguió establecer como una alternativa clara a los lenguajes, C y C++ que principalmente se usaban en ese momento. Sin embargo, en aquél momento de incipiente crecimiento de la World Wide Web, Sun tomó la acertada decisión de liberar el lenguaje. Esto propició lo que Oak por sí solo no había conseguido, una gran aceptación y popularidad por parte de la comunidad de desarrolladores, gracias principalmente al esfuerzo del equipo de Gosling por crear un lenguaje moderno, con una sintaxis sencilla en oposición a la complejidad que suponía C y C++. Finalmente, y tras incorporar soporte para redes TCP/IP y numerosas clase que añadían funcionalidad al lenguaje, Oak fue rebautizado por la comunidad con el nombre de JAVA.. El paradigma de este lenguaje es intrínsecamente Orientado a Objetos. Si bien es cierto que existen frameworks que permiten programar usando otros paradigmas diferentes (por ejemplo: Groovy, que permite desarrollar en términos de Programación Funcional) y que se ejecutan igualmente en la JVM (Java Virtual Machine). El uso de JAVA como parte del compendio de tecnologías de este p r o ye c t o , s e d e b e p r i n c i p a l m e n t e a t r e s f a c t o r e s :. •. Portabilidad entre sistemas Windows y Linux.. •. Concurrencia, soporte multithread.. •. Simple, syntantic sugar y paradigma orientado a objetos.. 10.

(12) Francisco Burgos Valdés. Android SDK Es un conjunto de bibliotecas, que establecen estructuras y flujos de trabajo que facilitan la programación de aplicaciones para un sistema operativo Android. Este sistema, fue pensado principalmente para smartphones y más tarde para tablets y otros dispositivos móviles con un hardware muy ajustado. Andy Rubin, Rich Miner, Nick Sears y Chris White lo desarrollaron en 2003, y más tarde, en 2005, fue adquirido por Google. Sin embargo, no sería hasta 2007 cuando se liberó la primera versión del SDK. Finalmente el primer teléfono inteligente con Android, se puso a la venta en 2008, se trató del HTC Dream G1 que funcionaba con la versión 1.0 de Android.. Android es en realidad una distribución de Linux modificada específicamente para dispositivos móviles. Las aplicaciones se ejecutan sobre una JVM modificada llamada Dalvik que aplica modificaciones importantes a fin de garantizar que una aplicación Android se ejecutará igual en cualquier dispositivo independientemente del hardware que tenga o la versión de Android de la que disponga. Por tanto, es el uso de JAVA más las librerías que aporta el SDK, lo que permite programar aplicaciones para Android. Sin embargo, Dalvik no ejecuta el bytecode como lo haría la JVM, sino que este es traducido y almacenado en dos formatos .dex (Dalvik EXecutable) y .odex (Optimized Dalvik Executable). De esto se encarga un compilador creado exclusivamente l l a m a d o J I T ( J u s t I n T i m e ) . E s t a c o n v e r s i ó n e s n e c e s a r i a ya q u e D a l v i k tiene una arquitectura diferente a la JVM, en concreto utiliza una arquitectura basada en registros en oposición a la arquitectura basada e n p i l a s d e e j e c u c i ó n d e J V M . P e r o D a l v i k e s l e n t a , ya q u e e s c ó d i g o interpretado. Es por eso que a partir de la versión Android 4.4 Google ha estado trabajando para reemplazar Dalvik por ART (Android RunTime), esto permitiría que la primera vez que se instala una aplicación en el sistema, se compile su código fuente a código nativo. Esto supone un fuerte impacto en el aumento de velocidad de ejecución de la aplicación, ya que se descarta la fase de interpretación por instrucción.. P a r a M a n g a p p s e e l i g i ó u s a r A n d r o i d q u e ya s o l o s e d i s p o n í a d e u n dispositivo móvil y con este sistema operativo. Además el carácter O p e n - S o u r c e , c o i n c i d e c o n l a f i l o s o f í a a b i e r t a d e e s t e p r o ye c t o . P o r supuesto otra razón obvia es que Android se encuentra en el 78,1% de los dispositivos del mercado móvil, según los datos del IDC (International Data Corporation) a fecha de 4Q2013.. 11.

(13) Francisco Burgos Valdés. Ruby Es un lenguaje de programación creado por el japonés Yukihiro Matsumoto en 1993. Es dinámico y multiparadigma, ya que soporta Orientación a Objetos, Programación Funcional e Imperativa. Ruby se basa en la idea de liberar al programador de muchas de las tareas que tendría que hacer en otro tipo de lenguajes (gestionar la memoria, definir tipos para variables, etc) de manera que se consiga mejorar su productividad. También tiene una sintaxis clara en la que se intenta omitir el uso de llaves y paréntesis en favor de la identación de las líneas de código y el uso espacios en lugar en paréntesis. El objetivo es mejorar la legibilidad del código, con lo que se reducen los potenciales errores de codificación y mejora la velocidad del programador descargándole de verborrea sintáctica. Esto es lo que se llama: The principle of least surprise. Se cita a continuación las palabras del p r o p i o M a t s u m o t o , q u e i l u s t r a n p e r f e c t a m e n t e s u i n t e n c i ó n c o n R u b y:. “Often people, especially computer engineers, focus on the machines. They think, "By doing this, the machine will run faster. By doing this, the machine will run more effectively. By doing this, the machine will something something something." They are focusing on machines. But in fact we need to focus on humans, on how humans care about doing programming or operating the application of the machines. We are the masters. They are the slaves.”. Conversación entre Bill Vanners y Yukihiro Matsumoto Septiembre de 2003. Una de las principales críticas que tiene este lenguaje es que es bastante más lento que sus homólogos (PHP, Perl, Java, etc) y esto se debe principalmente a que funciona sobre un intérprete MRI. Si bien, existen versiones alternativas a MRI que incluso pueden hacer funcionar Ruby sobre la J VM. En el caso concreto de MRI, escanea el código fuente en busca del código que necesita ejecutar, lo compila a bytecode en tiempo de ejecución, y lo almacena en memoria de esta forma, para futuras ejecuciones.. E l i n t e r é s d e u s a r R u b y e n e s t e p r o ye c t o , e s a p r o v e c h a r l a s v e n t a j a s d e productividad que ofrece, pero más allá de eso, es utilizar el framework Ruby on Rails diseñado para programar aplicaciones web en este lenguaje.. 12.

(14) Francisco Burgos Valdés. Ruby on Rails RoR es un framework open-source sobre Ruby que está optimizado y especialmente pensado programar aplicaciones web. Surgió en 2004 gracias a David Heinemeir Hansson como resultado de su trabajo en B a s e c a m p , u n a d e l a s h e r r a m i e n t a s d e g e s t i ó n d e p r o ye c t o s m á s f a m o s a s actualmente.. El principio fundamental de Rails, es convención sobre configuración, es decir, que la configuración se reduce al mínimo, en favor de decisiones que se tomaron en el diseño del framework y valores y flujos de trabajo predefinidos. Esto produce que las aplicaciones que usan RoR sean prácticamente idénticas estructuralmente y mejora el aprendizaje e interoperabilidad de los programadores entre aplicaciones de este tipo.. La arquitectura que Rails utiliza es modelo-vista-controlador (MVC) donde la vista es a través del navegador web lo que se muestra al usuario de la aplicación en un momento concreto (página web), el controlador, las acciones que desencadena el usuario al interactuar con la vista, y el modelo de los datos en memoria a usar en las distintas operaciones. Además, ofrece una capa de persistencia en una base de datos por medio de Active Records que abstrae al programador de trabajar directamente con los modelos y relaciones de una base de datos relacional.. La elección de RoR sobre otros frameworks para Mangapp, es que la convención sobre configuración y que esté basado en Ruby, resulta una manera rápida de crear un servidor web con una API REST.. 13.

(15) Francisco Burgos Valdés. MongoDB Es un motor de bases de datos, multiplataforma, y orientado a documentos. Empezó a desarrollarse en 2007 por la empresa 10gen con la idea de explotarlo como PaaS (Platform as a Service). Sin embargo, en 2009 se liberó con licencia Open-Source y la compañía pasó a llamarse MongoDB Inc para ofrecer soporte y servicios extendidos para este producto.. MongoDB está clasificada como un sistema NoSQL. Este nuevo tipo de arquitectura de bases de datos, ha sido el resultado de la necesidad surgida en las grandes compañías de internet, como eBay, Foursquare, SAP, The New York Times, … por sistemas que soportasen entornos de estrés concurrente, redundancia y balanceo de carga, sin que el rendimiento general del sistema se viese afectado. Son estos tres puntos que diferencian principalmente a los sistemas NoSQL del tradicional sistema relacional de base de datos. En contraposición a los esquemas tradicionales basados en tablas y relaciones, MongoDB basa su estructura en documentos con notación JSON y esquemas dinámicos que pueden cambiar en cualquier momento y que no están sujetos a la normalización algebraica de los sistemas relacionales. Además, está orientado a instalaciones en topologías distribuidas, de manera que balancea la carga según el número de conexiones al sistema en cada momento, e incluso puede llevar a cabo operaciones de lectura concurrentes de un mismo documento en nodos redundantes (como supondría un instalación de discos RAID 0, pero a nivel lógico, no de hardware) con lo que se mejora la velocidad de acceso a los datos. Esto se hace por medio de readers-write locks, aunque solo mejora la concurrencia de lectura, no de escritura, y a través del sharding, que es una técnica de segmentación y partición horizontal de los datos.. La razón de usar MongoDB como base de datos del backend para Mangapp, se debe principalmente a que es una aplicación móvil donde los usuarios solicitarán en muchos casos los mismos recursos. La integridad de los datos, no será una característica fundamental, pero sí la velocidad de acceso a la información.. 14.

(16) Francisco Burgos Valdés. ANÁLISIS. 15.

(17) Francisco Burgos Valdés. Propósito El cometido de este capítulo es detallar la funcionalidad y requisitos identificados para el sistema de Mangapp.. Alcan ce d el prod ucto Mangapp es una aplicación para móvil que intenta cubrir o mejorar los puntos débiles detectados en las aplicaciones existentes del mercado y c u yo c o m e t i d o e s t a m b i é n l a l e c t u r a d i g i t a l d e c o m i c s . L a i d e a e s q u e e s t e p r o ye c t o p r o v e a s e n c i l l e z , v e l o c i d a d y t o l e r a n c i a a f a l l o s , d o n d e las otras aplicaciones no lo hacen.. Stak eho ld ers A continuación se definen tres grupos de stakeholders, según su grado d e r e l a c i ó n e i n t e r e s e s c r e a d o s c o n e s t e p r o ye c t o . E s d e c i r , s e g ú n e s t é n directamente, indirectamente o sean clave para el sistema.. Primarios Usuarios Se identifica un primer grupo de personas conformado por los usuarios que actualmente consumen comics japoneses a través de internet, usando sus navegadores o aplicaciones existentes y que cuenten con un smartphone. Este grupo, que es el target de Mangapp, suele estar comprendido por personas de edades entre 14 – 26 años, de clase adquisitiva media – baja y que suelen tener habilidades suficientes para desenvolverse con soltura en las nuevas tecnologías.. Tiendas físicas Las tiendas de comics que venden este producto en formato físico. Llegados a este punto hay dos tendencias de pensamiento que valoran positiva o negativamente proyectos como este. La primera es, que al ofrecer gratuitamente para el usuario estos productos s u p o n e u n a c o m p e t e n c i a d e s l e a l p a r a l a s t i e n d a s c u ya s u b s i s t e n c i a es precisamente la venta de estos comics, y por tanto, es negativo para su negocio. Por otro lado, existe el argumento contrario. Al 16.

(18) Francisco Burgos Valdés ser un producto importado (se genera en japón), este tipo de aplicaciones aportan promoción y marketing gratuito para las tiendas dando a conocer nuevos mangas a sus potenciales clientes, además les puede servir para estimar la demanda y por tanto el s t o c k , ya q u e m u c h o s u s u a r i o s q u e c o n s u m e n p o r m e d i o s d i g i t a l e s también lo hacen por el canal físico, e incluso, a menudo sirve de “gancho” para que los clientes potenciales pasen a ser clientes.. Secundarios App Market Mangapp es una aplicación para smartphones y el canal de distribución para teléfonos Android es el market de Google, por tanto, a Google le interesa vender licencias de desarrollo que es requisito para poder subir cualquier aplicación a su sistema. Al m i s m o t i e m p o , u n m a yo r n ú m e r o d e a p l i c a c i o n e s s u p o n e u n m a yo r atractivo para su plataforma, lo que se traduce en más ventas de teléfonos con sistema Android.. Proveedor de Servicios Cloud La parte servidor de la aplicación se encuentra externalizada en un proveedor de servicios, por tanto, la existencia de esta aplicación les supone un ingreso económico.. Proveedores ISP D e c a r a a l o s c l i e n t e s m ó v i l e s , ya q u e e s u n a a p l i c a c i ó n q u e h a c e uso de internet. Para las operadoras móviles significa justificar mejor su oferta de internet en el móvil. De cara al desarrollo, es imprescindible para poder trabajar con los distintos servicios externos (app market, servicios cloud, etc.). Universidad UPM Y a q u e e s t e p r o ye c t o s e e n c u e n t r a b a j o e l m a r c o d e s e r u n T r a b a j o Final de Grado, para la universidad significa un alumno más g r a d u a d o . E s t o , a a p a r t e d e l i n g r e s o p o r m a t r í c u l a e n e l p r o ye c t o , también supone una herramienta de venta de la universidad a n u e v o s a l u m n o s y a d i c i o n a l m e n t e d e c a r a a c o n s e g u i r m a yo r financiación por parte del estado.. 17.

(19) Francisco Burgos Valdés Clave Legisladores de la Propiedad Intelectual Los comics, su creación, difusión y explotación, como cualquier otra obra están regulados bajo el derecho de la propiedad i n t e l e c t u a l . P o r t a n t o , d e p e n d e r á d e l a s l e ye s y n o r m a s d e l e s t a d o que la aplicación, este o no dentro del marco de la legalidad. I n c l u s o e s d e r e l e v a n c i a , q u e ya q u e l o s s e r v i c i o s q u e s o p o r t a n e l p r o ye c t o p u e d e n n o e n c o n t r a r s e e n e l m i s m o p a í s q u e d o n d e s e ofrece el servicio final (app market, servidor cloud, etc.), cada una de las partes estarán sujetas a la legislación local.. 18.

(20) Francisco Burgos Valdés. Estud io d e Mercado C o n e l o b j e t i v o d e d e t e r m i n a r l a v i a b i l i d a d o n o d e e s t e p r o ye c t o e n l a situación del mercado actual, se han buscado datos relevantes que a p o ye n l a j u s t i f i c a c i ó n d e s u d e s a r r o l l o . E l e n f o q u e e n e s t e p u n t o , e s doble, por un lado intentar inferir si realmente existe un público objetivo interesado y por otro si el mercado es lo suficientemente grande como para absorber sin saturar este nicho. Fuera del alcance de este estudio quedan los diferentes modelos de negocio aplicables para su monetización si es que llegase ese momento. Este estudio se centra exclusivamente en el valor añadido que puede aportar esta aplicación sobre el mercado existente.. Estado General del mercado móvil. 19.

(21) Francisco Burgos Valdés. Esta infografía publicada por la empresa Super Monitoring en Octubre del 2013 refleja claramente el incremento de smartphones respecto otros tipos de teléfonos, que prácticamente hay un móvil por persona en el mundo y que la edad de acceso a un primer móvil, se ha reducido hasta los trece años.. Sistemas operativos móviles. Otro factor importante es tener en cuenta la fragmentación del mercado e n c u a n t o a l o s d i f e r e n t e s s i s t e m a s o p e r a t i v o s q u e e x i s t e n , ya q u e supone un esfuerzo considerable, liberar una aplicación, para más de un sistema. Por tanto, aquí podemos ver como la penetración de Android. 20.

(22) Francisco Burgos Valdés como sistema operativo dominante ha ido ganando terreno hasta posicionarse como el más utilizado en 2014.. Uso y actividades. En este mismo estudio, se muestra en qué invierten su tiempo los usuarios de sistemas iOS y Android. La lectura de comics podría venir clasificada dentro del tiempo que el usuario invierte en la navegación w e b ( 1 8 % , ya q u e e x i s t e n s i t i o s w e b d e s t i n a d o s a e s t e f i n ) o q u i z á s e n e n t r e t e n i m i e n t o ( 8 % , ya q u e e s u n a a c t i v i d a d d e l e c t u r a ) .. 21.

(23) Francisco Burgos Valdés Segmentación de la oferta. Según este gráfico elaborado por Appbrain.com con fecha de 17 de Junio de 2014, muestra la segmentación de aplicaciones del mercado de aplicaciones de Google para Android. De las categorías que aparecen, t a l v e z e s t a r í a d e n t r o d e E n t e r t a i n m e n t , p e r o ya q u e t a m b i é n a p a r e c e l a c a t e g o r í a d e B o o k s & R e f e r e n c i a l p a r e c e q u e e s t a t i e n e u n a m a yo r coincidencia con la funcionalidad de leer comics. Así que como se puede observar, en comparación con otras categorías, hay menos competencia (aplicaciones que tengan la misma funcionalidad).. (Los tres puntos entre registros representan subcategorías omitidas). 22.

(24) Francisco Burgos Valdés. En este mismo estudio, nos muestra una clasificación por subcategorías. El tipo “comic” aparece en los últimos puestos si ordenamos por el número de apps. En línea con lo anteriormente expuesto, el número de aplicaciones que están relacionadas con los comics es de “solo” 6332 en comparación con las 99517 de entretenimiento (primera) o 29069 de comunicación (mitad de tabla). Otro dato significativo es que el 24% de las apps de esta categoría, están consideradas de baja calidad. Ya que lo que se pretende con Mangapp es que aporte calidad en los puntos débiles de otras aplicaciones, entonces estaría a la par con el 76% restante.. Público Objetivo La edad estimada del público de potenciales usuarios, es de personas de 14 a 26 años con un nivel adquisitivo medio – bajo. Se ha estimado esta edad a partir de la observación de eventos relacionados con el manga y que se celebran anualmente en distintos países (Expomanga, Manga Weekend, etc.) En estos eventos, el perfil coincide con el de adolescente o varón joven, que se desenvuelve con soltura en las nuevas tecnologías, generalmente estudiante y dada esta condición de edad y situación laboral, medio – bajo nivel adquisitivo.. Conclusiones • • • •. El 56% de la población mundial tiene un Smartphone. La edad de acceso a un primer móvil es de 13 años. L o s u s u a r i o s p a s a n e n t r e u n 8 % y u n 1 8 % d e l t i e m p o l e ye n d o . Dentro de la oferta de 768.802 apps (aprox), el 0,82% son de comics (6332) y de estas el 24% son de baja calidad (1498).. Analizando los datos, es relevante la poca oferta de apps dedicadas a los comics en comparación con la oferta global. Por lo tanto, y reseñando también el alto número de aplicaciones de baja calidad para e s t a c a t e g o r í a , s e v e l a n e c e s i d a d d e u n p r o ye c t o c o m o M a n g a p p d o n d e s e c u b r a n e s p e c í f i c a m e n t e e s t a s d e f i c i e n c i a s q u e m u e s t r a n l a m a yo r í a de las otras alternativas.. 23.

(25) Francisco Burgos Valdés. Persp ectiv a d el p rodu cto Aplicación para smartphones con sistema operativo Android para leer comics japoneses. Dispondrá de una biblioteca sobre la que elegir el manga que leer, una lista de capítulos actualizados y un historial de lectura. Además se hará especial énfasis en la velocidad de carga, reducción de los tiempos de espera al mínimo y con tolerancia a fallos.. Casos d e Uso Para los casos de uso, se ha seguido la práctica recomendada por Alistair Cockburn en la modalidad casual structure. De arriba a abajo, los campos son: título, actor, objetivo, nivel, descripción.. Leer un manga Usuario Iniciar la lectura de un manga En la ventana principal se muestran tres opciones. El usuario se mueve hasta la que pone “biblioteca”. Hace scroll sobre la lista de títulos y selecciona el manga que desee leer. Se le abrirá la ficha de detalle del comic donde parecen datos como el autor, n ú m e r o d e c a p í t u l o s e t c . A p a r e c e r á u n b o t ó n d e “ p l a y” , pulsándolo se inicia la lectura desde el primer capítulo.. Reanudar una lectura Usuario Continuar con una lectura En la ventana principal se muestran tres opciones. El usuario se mueve hasta la que pone “Historial”. Por orden de más reciente a más antiguo, aparecen los comics que ha empezado a leer. Al seleccionar el que desee continuar, automáticamente se abre el lector con el comic por la última página leída. Otra opción es hacerlo desde la vista de Ficha de Detalle del m a n g a . S i s e p u l s a e l b o t ó n “ p l a y” y e l m a n g a ya h a b í a s i d o empezado, se continúa la lectura desde el último punto.. 24.

(26) Francisco Burgos Valdés. Buscar un manga Usuario Busca rápida de un manga concreto En la ventana principal se muestran tres opciones. El usuario se mueve hasta la que pone “Biblioteca”. Hay un cuadro de búsqueda donde puede introducir el título del comic o el género con el que está clasificado. Automáticamente se filtra la lista de la biblioteca con los comics coincidentes con la cadena de búsqueda. Si no hay resultados, se muestra un mensaje avisando de que no hay resultados coincidentes.. Reempezar una manga Usuario Releer un comic En la Ficha de Detalle del manga, hay un botón “reiniciar”. Al pulsarlo, se inicia la lectura desde el primer capítulo.. Avanzar hasta un capítulo n Usuario Empezar a leer desde un capítulo concreto En la Ficha de Detalle del manga, hay un botón “adelantar”. Al pulsarlo, se abre un cuadro de diálogo donde poder introducir el número de capítulo al que se quiere ir. Si el capítulo existe y es inferior al último capítulo, se abre el lector desde ese punto. En caso contrario, se muestra un mensaje de error.. Leer un capítulo Usuario Avanzar de página Con el lector abierto y tras seleccionar el capítulo/manga que se desea leer, hacer scroll horizontal de derecha-izquierda para avanzar a la siguiente página. Automáticamente se carga el capítulo siguiente si se llega al final del actual y si lo hubiese.. 25.

(27) Francisco Burgos Valdés A partir de la especificación de los casos de uso anteriores, se define el diagrama de casos de uso correspondiente usando la notación de UML2.. Requ isitos Requisitos Funcionales 1. Mostrar una lista con el catálogo de todos los comics disponibles para leer. 2. Mostrar una ficha con los datos de cada manga (autor, género, sinopsis, número de capítulos) 3. Mostrar una ficha con los datos de las acciones del usuario sobre un comic (fecha de la última lectura, progreso) 4. Proveer un histórico donde almacenar los comics que se han empezado a leer, ordenado por fecha de más reciente a más antiguo. 5 . M o s t r a r u n c a t á l o g o c o n l o s c a p í t u l o s m á s r e c i e n t e s ( c o m i c s c u yo desarrollo no se ha concluido aún) ordenado por fecha de más reciente a más antiguo. 6. Persistir la fecha en que un usuario empieza a leer un manga. 7. Reanudar una lectura desde el punto en que se dejó la última vez. 8. Proveer un mecanismo de búsqueda o filtro dentro de la biblioteca de comics. 9. Al leer un manga simular el paso de página como ser haría en un libro físico. 26.

(28) Francisco Burgos Valdés 10. Implementar gestos para hacer zoom en las páginas (pellizco). 11. Al leer un comic, si se llega al final del capítulo y hay más capítulos posteriores disponibles, cargar el siguiente automáticamente. 12. Acceso inmediato a un manga (no se necesita esperar a descargar el manga completamente pare empezar a leerlo) 13. Las páginas y toda la información de los mangas, se recupera de servidores de terceros que ofrecen este servicio gratuitamente y que son accesibles a través de internet. 14. Capacidad de abrir para lectura un capítulo concreto por su número dentro de la numeración de capítulos del comic. 15. Capacidad para reiniciar una lectura.. Requisitos No-Funcionales 1. 2. 3. 4.. Mecanismo de caché para todas las imágenes de la aplicación. Mecanismo de caché para las peticiones http de recursos. Mecanismo de caché para la información de la ficha de los comics. Tolerancia a fallos. Si una página no está disponible en un servidor, se buscará en una fuente alternativa. Todo esto, completamente transparente al usuario. 5. Preservación de la batería del móvil. 6. La descarga de una página no puede exceder los 40 segundos. 7. Adaptación de las interfaces para tablets y Smartphones de acuerdo a las diferencias de tamaños. 8. Garantizar compatibilidad con versiones antiguas de Android 2.1+ 9. Interfaces sencillas y fluidas. 10. Mostrar avisos informativos y de error si no hay conexión a internet o si se produce cualquier otro factor que susceptible de aviso.. 27.

(29) Francisco Burgos Valdés. DISEÑO. 28.

(30) Francisco Burgos Valdés. Arqu itectu ra Se ha optado por un arquitectura cliente-servidor para proporcionar la funcionalidad detallada en el análisis. La razón de no implementar todo directamente dentro de la aplicación móvil es que las tareas de búsqueda de recursos en la web, su correspondiente parseo y almacenamiento, son tareas computacionalmente costosas, lo que va en contra del requisito no funcional (5) Preservación de la batería y pueden afectar negativamente al rendimiento y velocidad de la aplicación, por lo que se ha decidido separarlo en sistemas distintos. En concreto:. 1. Aplicación móvil para Android 2.1+ 2. Crawler 3. Servidor API REST. Topología. El diagrama describe la topología de la arquitectura. La parte servidor se despliega en una instancia de Amazón EC2 (AWS) de tipo IaaS (Infraestructure as a Service) sobre una imagen AMI, que es una distribución Linux propia de Amazon y especialmente optimizada para su sistema. La elección de Amazon como infraestructura para el servidor, se ha debido principalmente a dos razones. La primera es la. 29.

(31) Francisco Burgos Valdés disponibilidad de 24h/365d de sus sistemas, y la segunda es el precio gratuito de las instancias micro durante el primer año de uso. Dentro de la instancia está el programa crawler, encargado de explorar los recursos y descubrir las direcciones que más tarde se servirán en el cliente, (comics, información relacionada, páginas y portadas). Toda esta información se persiste en una base de datos No-SQL con motor MongoDB e instalada en la misma máquina. Se podía haber optado por una arquitectura más compleja donde la base de datos hubiese estado en una instancia diferente y bajo un sistema de alta disponibilidad s h a r d i n g , p e r o d a d o e l á m b i t o d e l p r o ye c t o y l a e s t i m a c i ó n i n i c i a l d e usuarios concurrentes (30 – 40 aprox) se ha llegado a la conclusión, que las ventajas de una arquitectura más compleja no serían notables en estas circunstancias. Para servir toda esta información en forma de servicios, un aplicación servidor Rails que ofrece una API REST que será atacada por la aplicación móvil. Está montada sobre un servidor de aplicaciones Phusion Passenger y este a su vez sobre un servidor de peticiones http Nginx. Los parámetros de configuración de todos estos programas, están dimensionados para el hardware disponible. Por último, dado el carácter dinámico de las direcciones públicas que ofrece Amazon, se ha tenido que configurar un servidor DNS estático e n u n s e r v i c i o e x t e r n o ( d yn u . c o m ) d e m a n e r a q u e l a i n s t a n c i a a c t u a l i c e su dirección dentro del servidor DNS cada vez que Amazon la cambia (al reiniciar la instancia). Es a este servidor DNS hacia donde apunta la aplicación móvil.. Aplicación móvil Implementada con el SDK de Android, ofrece la funcionalidad final al usuario: biblioteca de comics, catálogo de últimos capítulos, lector de mangas, marca páginas e historial.. Diseño Ya que el diagrama de clases de la aplicación es bastante grande y no es objeto explicar cada una de las clases en detalle, se mostrará a continuación una vista general del diagrama y se desarrollará los aspectos más significativos.. 30.

(32) DIAGRAMA DE CLASES.

(33) Interfaces y ciclos de vida La aplicación cuenta con dos activities, la primera es sobre la que se montan las tres pestañas: Novedades, Biblioteca e Historial. Cada una de estas pestañas es un fragment con su propio ciclo de vida. La Ficha también es un fragment. Al lanzarse los eventos para cambiar de pestaña o ir a la ficha de un ítem, lo que se produce es una sustitución del fragment actual por el nuevo, de manera que se repinta la pantalla y evitando así tener que lanzar actividades diferentes. La justificación de esta forma de implementación es que el usuario recibe una fluidez de navegación, que no puede obtenerse cambiando simplemente de una activity a otra.. Recursos Todos los recursos de la aplicación (imágenes, descripciones, textos) que son de valor para el usuario, se encuentran almacenados el servidor de aplicaciones. Por eso, siempre que se pide un recurso, se ataca al servidor REST solicitándolo. Una característica importante a destacar es que todas las imágenes de los comics (portada y páginas) se encuentran almacenadas en servidores de terceros. Lo que el servidor REST proporciona a la aplicación son las direcciones url de estos recursos que en NINGÚN CASO están en el servidor de Mangapp. Es decir, que la aplicación, actúa simplemente como interfaz para el motor de indexación de recursos que se encuentra en el servidor tras la API REST.. Caché Hay tres niveles de persistencia o caché que persiguen el objetivo de mejorar la percepción de velocidad que tiene el usuario sobre la aplicación: 1. Base de Datos (SQLite) Su función es almacenar en local los datos de los comics que se han consultado en algún momento, y la información de las acciones del usuario sobre ellos (almacenar la fecha de guardado, la ficha de un manga consultado, etc). Android viene con una base SQLite y un framework que ofrece el SDK gestionarla. Sin embargo, se ha optado por usar la biblioteca ORMLite que hace de ORM entre la base de datos y la aplicación, aunque también se ha usado el framework para casos puntuales, como por ejemplo, el.

(34) Francisco Burgos Valdés soporte de consultas de texto rápidas sobre tablas fts3 y fts4 (estas tablas y sus consultas están fuera del soporte de ORMLite) 2. Caché de imágenes Para las gridviews y listviews que trabajan sobre cursores y que no pueden tener cargadas la totalidad de los objetos que contienen, las imágenes se recuperan de disco según se avanza de posición. Como la lectura de disco no es una operación inmediata, esto puede causar que el scroll no sea fluido. Por eso se utiliza una caché de memoria LRU donde se almacenan los bitmaps de las imágenes que se han utilizado recientemente. Además existe una caché de disco, donde se almacenan las imágenes que se han obtenido por medio de peticiones http, de manera que no es necesario volver a pedirlas.. 3. Caché de peticiones http Todas las peticiones de este tipo que se realizan en la aplicación se hacen usando la biblioteca Volley que ha sido recientemente desarrollada por el equipo de desarrollo de Android de Google. Esta biblioteca aporta la funcionalidad de una caché en las peticiones http de acuerdo a su cabecera. De esta forma, si la petición se ha realizado con anterioridad y se tiene cacheada, es de ahí de donde se recupera la respuesta sin necesidad de volver a ejecutarla. Esto ahora datos e incrementa la velocidad de respuesta.. Tolerancia a Fallos Se entiende por tolerancia a fallos, que cuando se intenta recuperar la página de un comic, si por cualquier motivo no está disponible, automáticamente se busca en un sitio alternativo y se le muestra al usuario de manera completamente transparente a él. Todas las peticiones http cuentan con listeners que se ejecutan al finalizar las peticiones. Cuando un recurso no está disponible, se lanza una petición al servidor R E S T p a r a o b t e n e r u n a u r l a l t e r n a t i v a . S i l a h a y, e n t o n c e s s e v o l v e r á a tratar de recuperar el recurso con la nueva url, sino se muestra una advertencia al usuario sobre la página, capítulo o portada no recuperable.. 33.

(35) Francisco Burgos Valdés Interfaces Biblioteca de comics En esta pantalla se muestra la lista de todos los comics disponibles. Si el usuario selecciona un uno de ellos, accede a la ficha detallada del manga. Para mover los elementos de la lista, se usa el scroll vertical, y para aplicar un filtro, el cuadro de texto donde se introduce el título o género interesado.. Barra de estado. Pestañas. Filtro de búsqueda Comic Portada Título del cómic Géneros. Marcador del comic seleccionado. 34.

(36) Francisco Burgos Valdés Ficha de detalle Muestra todos los datos disponibles sobre un comic: portada, título, autor, géneros, sinopsis, número de capítulos; y también información de las acciones del usuario sobre el manga: fecha de la última lectura y progreso.. Portada Título Número de capítulos. Progreso Géneros. Sinopsis. Empezar y Avanzar a un capítulo concreto.. Esta es la interfaz para un comic que aún no se ha empezado a leer. En otro caso, aparecería un tercer botón justo al lado de Empezar y Avanazar con la función de Reempezar. Además debajo del porcentaje de Progreso aparecería la fecha de la última lectura.. 35.

(37) Francisco Burgos Valdés Variante: Biblioteca y Ficha Si la aplicación está instalada en una tablet, entonces existe una variante de las dos interfaces anteriores que unifica en una misma pantalla la biblioteca y la ficha.. Este patrón de diseño se le conoce por el nombre Master-Slave y consiste en una lista (izquierda) donde al seleccionar uno de los ítems se muestra una ficha con información detallada (derecha). Esto se implementa con dos fragments independientes que tienen sus propios ciclos de vida. Se captura el evento de selección sobre el fragment lista y se pasa el #id del elemento al fragment ficha para que busque y muestre la información de ese ítem.. 36.

(38) Francisco Burgos Valdés Novedades Muestra los capítulos más recientes de los diferentes mangas de la biblioteca. Esta vista los muestra en forma de gridview (matriz de ítems) y ordenados de más reciente a más antiguo dentro de la última semana natural.. Barra de progreso (línea negra) Capítulo Fecha de salida Portada del comic Número. En la versión para tablet, el número de filas y de columnas se adapta automáticamente. Además, el tamaño de cada ítem también crece si la r e s o l u c i ó n d e l a p a n t a l l a e s m a yo r , p a r a h a c e r l o m á s a g r a d a b l e a l a vista. 37.

(39) Francisco Burgos Valdés Histórico Listado en forma de gridview de los mangas que se han leído. Ofrece información sobre la fecha de la última lectura. Al seleccionar un comic, automáticamente se abre el lector cargando el capítulo correspondiente y moviéndolo hasta la última página leída.. Comic Número Fecha. Igual que con la interfaz de Novedades la gridview se adapta al tamaño de la tablet, modificando el número de filas, columnas y tamaño de cada ítem. 38.

(40) Francisco Burgos Valdés Lector Las páginas (imágenes) de un capítulo se muestran dentro de un viewpage de manera que al hacer el gesto de scroll de derecha a izquierda (como pasar una página) se pasa a la siguiente imagen. Si se llega al final del capítulo y existen más capítulos, se carga el siguiente automáticamente.. Esta vista soporta el gesto pinch, un patrón conocido para hacer zoom sobre las imágenes haciendo pellizcando con dos dedos la pantalla. 39.

(41) Francisco Burgos Valdés. Crawler Es un indexador de contenidos que explora direcciones concretas de la web y analiza y parsea su contenido si es interesante para la aplicación, añadiéndolo posteriormente a una base de datos.. Diseño DIAGRAMA DE CLASES. 40.

(42) Francisco Burgos Valdés Funcionamiento general La araña web tiene dos modos de funcionamiento:. •. Escáner en profundidad Consiste en recorrer una lista de sitios web que contienen los r e c u r s o s c u ya s d i r e c c i o n e s s e b u s c a i n d e x a r e n l a b a s e d e d a t o s . En este modo, el crawler recorre un índice general que suelen tener todas estas páginas con los comics que ofrecen. Por cada uno de los comics, se extrae la información de su ficha si la hubiese (título, autor, descripción, etc) y la direcciones a cada uno de sus capítulos. En un nivel más de profundidad se obtienen las direcciones de las páginas y por último por cada página su imagen. Por tanto, como se puede apreciar, es un problema exponencial que requiere una cantidad de tiempo nada desdeñable hasta que el crawler termina de analizar y extraer la información de todos los sitios. Este modo de funcionamiento solo se utiliza para poblar la base de datos. Posteriormente se hace uso del modo de operación 2.. •. Escáner de actualización Una vez poblada la base de datos, no es necesario volver a pasar por todas los recursos de la fuente para una actualización selectiva. El funcionamiento habitual de estos sitios, es que ofrecen una página donde se listan las actualizaciones más recientes por fecha. Este modo de actualización está pensado para recorrer estas páginas que contienen las actualizaciones del sitio, cada 6 u 8 horas. De esta manera, se puede mantener la base de datos actualizada con el crawler ejecutándose unos pocos minutos. Además, antes de proceder a analizar el código HTML de la página, se hace un HASH de su contenido, y se almacena en un archivo de texto, de manera que antes de ninguna acción, se comprueba si coinciden las marcas. Si son diferentes, es que se ha añadido contenido nuevo respecto la última vez y se pasa a actualizar, sino, se omite la actualización. Sin embargo, este mecanismo presenta un problema frente a las p á g i n a s c u yo s c o n t e n i d o s s e g e n e r a n u s a n d o J A V A S C R I P T y h a c i e n d o l l a m a d a s a l s e r v i d o r , ya q u e h a b r í a q u e e l H A S H s i e m p r e es el mismo porque el código J AVASCRIPT es siempre igual y toma como que no se han producido cambios. En la misma línea, páginas que añaden anuncios que cambian entre visitas y cuyo enlace viene incrustado en el HTML, producen que el HASH sea siempre diferente, y que se recorra el sitio aunque realmente no h a ya s i d o a c t u a l i z a d o . 41.

(43) Francisco Burgos Valdés Concurrencia Dado el carácter exponencial del problema a resolver, se ha hecho especial énfasis en conseguir un buen funcionamiento concurrente, a fin de obtener mejores tiempos de ejecución. Se usan ThreadPoolExecutor que ofrece JAVA, para mantener la gestión de hilos concurrentes. En concreto, cada sitio que se analiza, se lanza en un thread diferente. Posteriormente, si el crawler está funcionando en el modo Escáner en profundidad, entonces se utiliza también el framework Fork/Join de JAVA SE 7. Este framework aplicado a la tarea de descargar cada manga con sus respectivos capítulos y páginas permite que las tareas se ejecuten paralelamente en un entorno con procesadores multicore. Es decir, a diferencia del ThreadPoolExecutor tradicional, los threads se ejecutan en cores diferentes de manera concurrente. La razón por la cual no usar solo Fork/Join en sustitución también del ThreadPoolExecutor es que se ha visto que para tareas de poca duración Fork/Join ofrece mejores tiempos, mientras que en el caso contrario, lo hace ThreadPoolExecutor por eso se ha llegado a una solución híbrida donde aprovechar el “divide y vencerás” de Fork/Join con tareas de larga duración en Threads normales.. También se ha implementado un mecanismo de inferencia de direcciones url a fin de reducir el tiempo de ejecución. Este sistema consiste en coger la lista de páginas que tiene un capítulo y analizar la expresión regular de la dirección de la imagen que contiene. En un alto número de casos, el final del nombre del archivo consiste en una secuencia numérica que determina su posición natural dentro de un capítulo. Así que en vez de realizar las peticiones a cada una de las direcciones de las páginas para obtener esta dirección de la imagen, lo que se hace es generar a partir del patrón las direcciones restantes. De esta manera se simplifica en un nivel (el más extenso), el anidamiento. Como la aplicación cuenta con el requisito de Tolerancia a fallos, si en algún momento, la dirección generada fuese ficción y realmente no existiese la imagen, se buscaría de manera transparente al usuario en otro sitio. Ya que el porcentaje de acierto a la hora de generar estas direcciones ronda el 85%, la probabilidad de que para un recurso que se encuentra en más de un sitio, falle la misma página consecutivamente, sería de un 2%. Por eso siempre que un recurso tenga más de una fuente, se considera una buena práctica para mejorar el tiempo de ejecución del crawler.. 42.

(44) Francisco Burgos Valdés Persistencia Para interactuar con la base de datos de MongoDB, se usa la biblioteca Morphia, que proporciona una abstracción ORM. Podría haberse usado directamente el connector que existe para JAVA, sin embargo, MongoDB tiene la característica de que el lenguaje que proporciona para interactuar con su motor es JAVASCRIPT, con una sintaxis Orientada a Objetos (OO) por lo que Morphia es simplemente sugar para poder usar la sintaxis de JAVA en lugar de la de J AVASCRIPT.. En el modo de Escáner en profundidad, una vez que se ha recuperado toda la información, capítulos y páginas para un manga, este se a l m a c e n a e n l a b a s e d e d a t o s . S i n e m b a r g o , ya q u e e s u n r e q u i s i t o e l que un mismo comic pueda provenir de más de una fuente, entonces p u e d e p r o d u c i r s e e l c a s o d e q u e e s e m a n g a ya e s t é g u a r d a d o d e u n a ejecución previa en otro sitio. Es por eso indispensable, una labor de merge entre los objetos, de manera que la información nueva se añada al objeto preexistente. No obstante es necesario resolver problemas relacionados con la calidad de la información de la ficha de los comics q u e p r e s e n t a n u n a m a yo r c o m p l e j i d a d , c o m o e l e g i r l a m e j o r s i n o p s i s entre dos sitios distintos, o variaciones que pueden existir entre dos títulos escritos ligeramente diferente, pero que en definitiva apuntan al mismo comic.. En un primer momento se pretendió mantener una lista en memoria sobre la que ir aplicando los merge hasta llegar a un estado final donde persistir el resultado. Esta aproximación, pretendía retrasar al máximo las operaciones de escritura y lectura de disco (operaciones costosas en comparación con las operaciones que se producen en memoria). Sin embargo, dado el gran número de objetos de esta lista, que disparaba el consumo de memoria RAM, y los bloqueos que se producían constantemente por la concurrencia, se descartó esta implementación en favor de interactuar con la base de datos. Esta implementación puede parecer un sacrificio demasiado importante de en cuanto a rendimiento, pero lo cierto es que hay varias características de MongoDB, que hacen que no lo sea tanto. Primero, se simplifica el código, puesto que es la base de datos la que, por su diseño nativo, gestiona la concurrencia a los datos (uno de los puntos fuertes de los sistemas No-SQL). Segundo, MongoDB intenta mantener siempre que puede en memoria el máximo número de datos, de manera el acceso sea menos costoso, que es precisamente lo que se pretendía con la aproximación inicial. Por tanto, tiene sentido delegar a la base de datos estas tareas. 43.

(45) Francisco Burgos Valdés Logs Como la ejecución del crawler se dilata bastante en el tiempo, y su tarea p r i n c i p a l e s r e c o p i l a r y a n a l i z a r d a t o s p r o d u c i d o s p o r t e r c e r o s c u yo formato no siempre se ajusta al esperado, es muy sencillo que se produzcan errores de ejecución en las fases de parseo. Si a esto le unimos que no es práctico tener a una persona enfrente del ordenador durante el tiempo que dure la ejecución para estar simplemente pendiente de la salida por consola de las posibles incidencias, se hace imprescindible un mecanismo alternativo para registrar todos estos errores. C o n l a a yu d a d e l a b i b l i o t e c a L o g 4 j , s e h a e s t a b l e c i d o u n s i s t e m a d e ficheros de log donde almacenar toda esta información para posteriormente ser capaces de revisarla. Se han establecido tres niveles: info, warning y error. El primero sirve simplemente para saber en qué punto se encuentra el programa mientras se está ejecutando. No se guarda ningún fichero y en definitiva, es simplemente una salida por consola. El segundo y el tercero, sí que escriben fichero. Warning hace referencia a los errores no-críticos, como por ejemplo: no ser capaz de machear una fecha, o algún campo concreto para un comic. Por otro lado, Error, se refiere a las situaciones críticas que provocan el cierre de un thread, por ejemplo: Null Pointer Exception, o similar.. Política de reintentos Cuando se intenta obtener un recurso de un tercero, puede ocurrir con frecuencia que lo que tratamos de conseguir, no exista o simplemente no se encuentre disponible momentáneamente. Para intentar paliar esta casuística, todas las descargas (peticiones http) tienen tres intentos para conseguir un determinado recurso. En los intentos previos al tercero, si se produce este caso, la tarea de descarga se vuelve a encolar al final de la cola de descargas. De esta manera proporcionamos también un tiempo adicional en el que el acceso al recurso del tercero podría volver a estar disponible. Si finalmente la tarea excede el límite impuesto, entonces se anota en el log y se descarta.. 44.

(46) Francisco Burgos Valdés Arquitectura Visto el comportamiento concurrente del crawler, el objetivo de analizar el máximo número de sitios posibles y que no dispone “aún” de una inteligencia que le permita aprender o explorar por sí solo nuevos sitios, se ha intentado crear una arquitectura modular. La idea es que añadir un sitio nuevo al crawler, suponga un trabajo trivial para el programador.. Todos los sitios analizados comparten la misma distribución: • • • • •. Un directorio con un índice de todos los comics. Una ficha por comic. Un listado de capítulos. Un listado de páginas por capítulos. Una imagen por cada página.. L a t a r e a d e d e s c a r g a e s s i e m p r e l a m i s m a p a r a t o d o s , ya q u e l o q u e h a c e es obtener el código HTML de la página donde aparecen los datos anteriores. Sin embargo, cómo se parsea o analiza el código, cambia en función del tipo anterior. Por tanto, se usa la herencia para crear un objeto de descarga según cada tipo, donde asignar la tarea de parseo correspondiente. T o d o s l o s p a r s e r s t i e n e n l o s m i s m o s m é t o d o s p ú b l i c o s , ya q u e l a información que tratan de obtener es la misma. Lo que cambia de unos a otros es la implementación de dichos métodos según el código HTML de cada sitio. Las direcciones url iniciales desde las que arranca el programa (el directorio de cada sitio) se encuentran en un XML. Este archivo cuenta con la característica de que se instancia automáticamente en forma de objeto cuando se lanza el programa. Esto se consigue usando la tecnología JAXB de JAVA, que permite persistir y recuperar el estado de objetos en memoria. Por consiguiente, cuando se quiera añadir un sitio nuevo, hay dos acciones que tiene que hacer el programador:. 1. Añadir la dirección url del directorio al archivo XML. 2. Crear una clase que implemente la interfaz Parse.. 45.

(47) Francisco Burgos Valdés Portabilidad P u e s t o q u e e l e n t o r n o d e d e s a r r o l l o ( U b u n t u y/ o W i n d o w s ) e s d i f e r e n t e al entorno de producción (AWS AMI EC2), las rutas donde se almacenan los logs y algunas configuraciones, difieren de uno a otro entorno. Para agilizar el deploy de desarrollo a producción, se ha usado MAVEN para gestionar el ciclo de vida. Esta herramienta se usa para la gestión de dependencias y compilación de la aplicación, y se encarga de lanzar los test unitarios y de integración cada vez automáticamente. Para que un p r o ye c t o f u n c i o n e b a j o M A V E N , t i e n e q u e t e n e r u n a e s t r u c t u r a d e carpetas concreta y además un fichero llamado POM (Project Object Model) para configurar su comportamiento. Es en este fichero es donde ofrece también la posibilidad de crear perfiles diferentes de compilación. Así que se ha usado esta opción para crear dos perfiles distintos, uno para el entorno de desarrollo y otro para el entorno de producción.. Interfaces Cuenta con una interfaz básica de consola y que acepta los comandos definidos en un menú de texto.. 46.

(48) Francisco Burgos Valdés. Servidor Rails API REST Está programado con el framework Ruby on Rails. Ofrece las direcciones web de los servicios a los que atacará la aplicación móvil. Estos servicios contienen consultas a la base de datos para recuperar la información necesaria en cada caso. La arquitectura es siempre la misma para todas las aplicaciones Rails, ya que así viene determinado por el propio framework. En resumen, es una arquitectura MVC con un archivo Routes.rb donde se mapean las direcciones url de los servicios con la correspondiente acción en su controlador. Además cuenta con otro archivo Mongoid.yml donde se especifican los datos de configuración de la capa de persistencia y los diferentes perfiles según se esté en desarrollo, test o producción.. Servicios:. manga_cover. GET /manga/:manga_id/cover. manga_chapter_page. GET /manga/:manga_id/chapter/:chapter_id/page/:id. manga_chapter_index. GET /manga/:manga_id/chapter. manga_chapter_number. GET /manga/:manga_id/chapter/:number. manga_index. GET /manga. manga. GET /manga/:id. chapters_newest. GET /chapters/newest. mangas_newest. GET /mangas/newest. Las urls son bastante autoexplicativas. Como apunte, existen dos tipos de servicios, los que devuelven información sobre un recurso concreto (aquellos que tienen el parámetro :xxx_id o :id) y los que devuelven una listado con todos los objetos en un intervalo de fechas concreto (xxx/newest). El funcionamiento general de estos últimos es devolver los objetos actualizados en la última semana. También, dada una fecha como parámetro, pueden devolver los objetos actualizados desde esa fecha. De esta manera, un cliente que tenga todos los comics actualizados, recibirá una respuesta vacía, con lo que ahorrará en tráfico de datos.. 47.

(49) Francisco Burgos Valdés Todas las respuestas que se mandan son en formato JSON. La elección de este formato es que es readable for humans y al mismo tiempo es uno de los formatos más compactos para enviar datos. Esto es una ventaja frente al XML (SOAP), demasiado verboso y el binario, difícil de depurar. Si lo comparamos con el XML, con JSON se puede llegar al mismo resultado, pero transmitiendo menos datos (etiquetas), lo que resulta en un incremento de la velocidad de procesamiento de la respuesta (menos datos) y un ahorro para el cliente (menos tráfico de datos).. NGINX Es el servidor de peticiones http sobre el que funciona el servidor de Rails. Originalmente se pretendía usar Apache para esta labor. Sin embargo, la arquitectura de Nginx demostró ser más propicia para el hardware sobre el que iba ser desplegado y con los mismos o mejores tiempos de respuesta que Apache. La diferencia principal entre Apache y Nginx, es que la arquitectura de Apache es de tipo process-based mientras que la de Nginx es event-based. Esto quiere decir que Apache crea un nuevo thread por cada conexión, lo cual es una operación costosa en comparación con la otra implementación que consiste en uno o muy pocos threads que procesan todas las conexiones. Así pues, como Nginx es mucho más eficiente que Apache en entornos de limitado hardware, especialmente si se dispone de poca memoria RAM. Ya que el entorno de producción es precisamente una instancia micro de Amazon, se entiende que tiene más sentido usar Nginx en lugar de Apache.. Phusion Passenger Es el servidor de aplicaciones sobre el que está montado la aplicación Rails y que se integra con Nginx. Es un servidor diseñado para facilitar deploy de las aplicaciones Rails en producción. Este servidor está recomendado por los autores de Ruby on Rails en combinación con Ruby 2.0 para lograr reducir el consumo de memoria de las aplicaciones Rails en hasta un 33% e incrementando el rendimiento concurrente de la aplicación (según datos oficiales). Ofrece también un sistema de e s t a d í s t i c a s s o b r e e l u s o d e l s e r v i d o r , p e r o ya q u e e s t o e s u n s e r v i c i o de pago que queda fuera de la versión Open-Soruce.. 48.

(50) Francisco Burgos Valdés. Base de Datos Es el sistema de persistencia para los datos extraídos gracias al crawler y que posteriormente se servirán en la aplicación móvil de Mangapp. La elección de MongoDB como motor de base de datos para esta aplicación se ha justificado en las primeras páginas de este trabajo. Sin embargo, al margen del tema de escalabilidad horizontal y sus beneficios para la concurrencia, hay otro factor más, que es que todos los documentos se almacenan en formato JSON. Ya que este es el formato elegido para servir los datos a la aplicación móvil dadas sus ventajas para este tipo de entorno, se consideró que si todo el sistema (servidor rails, base de datos, etc.) trabajaba sobre el mismo formato, se evitaría tener que convertir los datos de un formato a otro y se ganaría en rendimiento. Estrictamente hablando, MongoDB usa un formato propio llamado BSON (Binary JSON), sin embargo las variaciones que presenta frente a JSON (Añade tipos: String, Integer, BSON Object, etc) solo afectan en cómo a l m a c e n a M o n g o D B l o s d a t o s , ya q u e l a s a l i d a s i e m p r e s e p r o d u c e e n formato JSON.. Esquema Los sistemas No-SQL no se basan en el tradicional Modelo Entidad Relación omnipresente. Es por eso que tampoco soportan Normalización de sus datos, puesto que no están basados en tablas. Y no soportan operaciones Inner-Join. Por consiguiente, el esquema usado para Mangapp es:. Se ha usado el Diagrama de Clases de UML para modelar el esquema, ya que la notación JSON (Javascript Object Notation) está basada, en definitiva, en el paradigma de la Orientación a Objetos.. 49.

(51) Francisco Burgos Valdés Un ejemplo de un documento (manga) con este esquema sería:. En lugar de la salida por consola, se ha usado el programa Robomongo para mejorar la legibilidad. Además aporta información adicional como el tipo de campo.. Además se han creado índices sobre los campos que están implicados en las consultas más habituales que usan los servicios del servidor de Rails con el fin de mejorar su rendimiento. Hay un dato que apuntar en el esquema, y es que el campo Creado_en se refiere a la fecha de creación del recurso por la fuente, si es que se ofrece esta información, y sirve para compararlo con otras fuentes. La fecha de inserción del recurso en la base de datos viene en el propio campo Id, que es un objeto ObjectId del que se puede recuperar la fecha de creación del Id y por tanto, del documento. 50.

(52) Francisco Burgos Valdés. PRUEBAS. 51.

(53) Francisco Burgos Valdés. Pruebas Ap licació n Móvil Referente a la pruebas de la aplicación móvil, se estuvo estudiando la posibilidad de automatizarlas con las propias clases que proporciona para ello el SDK de Android o incluso usar el framework de Mono, que sirve para grabar flujos de trabajo sobre la aplicación del móvil y reproducirlos de manera automática posteriormente, sin necesidad de que el desarrollador tenga que probar manualmente la aplicación.. Finalmente no se ha utilizado ninguna automatización de pruebas, y todas han sido realizadas de manera manual sobre el emulador o un dispositivo físico con Android. Además, en la fase de desarrollo se s u s t i t u yó e l e m u l a d o r o f i c i a l d e A n d r o i d p o r G e n ym o t i o n , q u e t r a b a j a sobre VirtualBox. Este emulador proporciona una increíble velocidad de iniciación y deploy de la aplicación en comparación con su homólogo oficial.. Sin embargo sí que se está valorando, que en caso de seguir con el desarrollo de la aplicación e ir añadiendo funcionalidades nuevas, sería interesante usar Robotium o Mono a fin de garantizar una Integración Continua robusta.. Lo que sí que se ha incorporado es el servicio que ofrece Crashlytics, que consiste en un sistema de reporte de errores a través de su plataforma, con notificaciones de email, cuando la aplicación de algún cliente ocurre algún error. Este servicio recoge la traza del error y en ocasiones metadata adicional (versión Android, RAM libre/ocupada, % uso CPU, etc) y lo envía al desarrollador. Es realmente útil en el estadio de beta de la aplicación con un reducido número de usuarios, e incluso en producción.. 52.

Referencias

Documento similar