Mostrando entradas con la etiqueta Programación. Mostrar todas las entradas
Mostrando entradas con la etiqueta Programación. Mostrar todas las entradas

jueves, 4 de febrero de 2016

Facebook cierra Parse : El backend como servicio


Recientemente se ha anunciado en el blog de Parse que van a dejar de dar servicio, cerrando por completo sus servidores en el plazo de un año. Es una verdadera lástima, pues en mi opinión era un servicio muy útil y bien estructurado... pero lamentablemente parece que no rentable, a pesar de que Facebook la adquiriese hace tres años por 85 millones de dólares.

Al igual que la creación del App Store de Apple supuso un cambio exponencial en la facilidad para distribuir y monetizar aplicaciones, en mi opinión Parse y su modelo de "backend como servicio" supuso un gran avance en la facilidad para crear aplicaciones para dispositivos móviles sin tenerse que preocupar por la capa de servidor (desarrollo, infraestructura, mantenimiento, etc.).

Tengo que reconocer que no hace mucho tiempo que conocía el servicio (sólo desde que empecé mi master en la UOC hace unos meses), sin embargo me había enganchado a él.

Afortunadamente y a pesar de la noticia, estos chicos hacen las cosas bien... hasta irse lo hacen por la puerta grande. Han desarrollado una completa guía de migración, han creado una herramienta de migración de la base de datos a cualquier base de datos MongoDB, y han liberado como Open Source el código de su servidor.

Actualización: Reacciones y alternativas a parse en este enlace

jueves, 15 de enero de 2015

Editplus: Mi editor de texto favorito

Todo informático que se precie tiene un editor de texto "favorito", ese que lleva utilizando años y años y que es de las utilidades más socorridas.
En mi caso ese editor de texto es EditPlus. Llevo más de 15 años utilizándolo, y me parece uno de los mejores del mercado, al menos para los temas que yo lo uso (no lo utilizo como editor de código para programar, para eso ya están los IDEs especializados).
Entre sus principales ventajas, a mis ojos, están:

  • Rapidez: Se trata de un software increíblemente rápido, arranca inmediatamente y cualquier operación se realiza de forma ágil.
  • Macros: El sistema de macros está muy logrado, se pueden grabar macros para realizar automáticamente labores repetitivas (por ejemplo para eliminar la primera palabra de todas las filas, etc.).
  • Manejo de encodings: EditPlus maneja bastante bien los encodings, al menos la conversión a/desde UTF-8, un tema que suelo utilizar a menudo.
  • Apertura de ficheros grandes: Se pueden abrir ficheros de muchos megas sin problemas, el programa no consume demasiada memoria.
  • Apertura de decenas de ficheros: Se pueden abrir cientos de ficheros a la vez y el programa funciona perfectamente.
  • Buscar y Reemplazar en múltiples ficheros: La búsqueda en ficheros es rapidísima, y se puede reemplazar de una vez en todos los ficheros (en realidad para hacerlo hay un truco, abrirlos todos y reemplazar en todos los ficheros abiertos).
  • Selección vertical: El programa permite realizar selecciones verticales (manteniendo la tecla "Alt" pulsada), un tema muy útil por ejemplo para eliminar una columna vertical de caracteres de todas las líneas a la vez.

Existen otras muchas alternativas como Notepad++, UltraEdit, JEdit, etc., pero como os comento a mi entender EditPlus satisface al 100% mis necesidades, y tiene una versión gratuita que puedes descargar aquí.

Y tú, ¿cuál es tu editor favorito?

miércoles, 24 de diciembre de 2014

Uso de pencil para prototipado rápido de pantallas


Una de las herramientas más potentes que he descubierto durante el 2014 es Pencil. Se trata de un producto Open Source que permite realizar prototipos rápidos de pantallas de aplicaciones, para mostrar al usuario final

La mayor potencia de la herramienta es que además de venir con componentes visuales que simulan muchos tipos de aplicaciones (por ejemplo para iOs y Android), también permite realizar tus propias plantillas de componentes (denominadas Stencils) para adaptarlas a tu propio estilo de pantallas (así lo hicimos para el framework Atlas de la Comunidad de Madrid).

Ejemplo con Stencil iOs

Ejemplo con Stencil Android


Otra de las ventajas de esta herramienta es que te permite exportar las pantallas a diversos formatos, entre ellos a HTML, con la peculiaridad de que puedes enlazar unas pantallas con otras al realizar click, de forma que puedes simular el comportamiento básico de un usuario dentro del prototipo (por ejemplo pulsando en un botón para ir a otra pantalla, haciendo click en un enlace para realizar cierta acción, etc.). Puedes descargar diferentes formatos de exportación (templates) en la página de descargas de google code.

Las últimas versiones también permiten pintar diagramas de flujo, con unos resultados bastante profesionales:

Te recomiendo que pruebes la herramienta, para mí ha sido todo un descubrimiento.
Puedes descargarla en el siguiente enlace, tiene versión disponible para Windows, Linux y Mac.

domingo, 3 de agosto de 2014

Framework Atlas de la Comunidad de Madrid en una Raspberry Pi con Tomcat y MySql

Después de mis primeros pasos con la Raspberry Pi y algunos experimientos esta semana, he decidido hacer una prueba de concepto, tratando de ejecutar una aplicación realizada con el Framework Atlas de la Comunidad de Madrid (en el que como sabéis llevo años involucrado) en un servidor Tomcat 7 contra una base de datos MySql, ambos instalados en la Raspberry.

Instalación de las Herramientas
Para ello, y tras comprobar que la JDK1.7 de Oracle ya viene incluída en Rapsbian, lo primero que he tenido que hacer es instalar el acceso remoto por SSH, de manera que a partir de entonces todo el trabajo lo he realizado desde mi PC, conectándome por SSH o por Escritorio Remoto a la Raspberry cuando ha sido necesario.
Lo siguiente ha sido instalar el servidor Tomcat 7. Instalar Tomcat ha sido fácil, basta con descargar el fichero apache-tomcat-7.0.55.tar.gz y descomprimirlo en el directorio donde quieras ejecutar tomcat (en mi caso en "/home/pi/java/tomcat/apache-tomcat-7.0.55").
Para poder ejecutar las aplicaciones Atlas en el servidor Tomcat también he tenido que tocar un poco la instalación por defecto de Tomcat, he eliminado la versión de la librería de Expression Language que viene en "/home/pi/java/tomcat/apache-tomcat-7.0.55/lib" y he añadido a ese directorio las siguientes librerías adicionales:
el-api-2.2.jar
el-impl-2.2.jar
jstl-1.2.jar
Después he instalado MySql en la Raspberry, según se indica en esta página. Una vez instalado, he tenido que conectarme y crear una base de datos de ejemplo llamada "atlas", y un usuario con el mismo nombre para poder acceder a ella. He utilizado las siguientes sentencias:
mysql -u root -p
Enter password:
mysql> CREATE DB atlas
mysql> USE atlas
mysql> CREATE USER 'atlas'@'localhost' IDENTIFIED BY 'atlas';
mysql> GRANT ALL PRIVILEGES ON atlas.* TO 'atlas'@'localhost'
mysql> FLUSH PRIVILEGES;
mysql> quit
Como ya tenía configurado en mi PC con Windows el filesystem compartido con la Raspberry, he decidido por agilidad realizar la aplicación de pruebas en el PC, y una vez generado el war copiarlo a la Raspberry para desplegarlo en Tomcat.

Entorno de Desarrollo y Arquetipo Web
Una vez descargado e instalado el DVD para el desarrollo de aplicaciones Atlas, he creado un Arquetipo Web básico para tratar de hacerlo correr en la Raspberry.
Para crear las tablas en la base de datos para el ejemplo que viene configurado en el Arquetipo Web, he tenido que modificar ligeramente el script de creación de objetos de base de datos que viene en la ruta "src/test/resources/schema_arquetipo_oracle.sql", he creado un fichero llamado "schema_arquetipo_mysql.sql" en el que he cambiado el tipo de datos Number de Oracle por el Int de MySql, y he eliminado la creación de las secuencias (no las necesitaba para mi prueba básica).

Modificaciones sobre el Arquetipo Web
Lo primero que he tenido que modificar sobre el Arquetipo Web recién generado ha sido el fichero "web/src/main/resources/environment.properties" para configurar la conexión contra la base de datos MySql:
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost/atlas
jdbc.username=atlas
jdbc.password=atlas
hibernate.dialect=org.hibernate.dialect.MySQLDialect
También he configurado en ese fichero la ruta donde se generan los archivos de log:
monitor.FILE.directorioCliente=/home/pi/java/tomcat/apache-tomcat-7.0.55/logs
Además de configurar la conexión, he tenido que añadir la siguiente dependencia de Maven al fichero "web/pom.xml" para incluir en el war el driver Jdbc de MySql:
También he tenido que modificar el fichero "src/main/webapp/META-INF/context.xml" para configurar la conexión con la base de datos en Tomcat, dejando el siguiente contenido:
Por último y antes de generar el war he tenido que editar el fichero "web/src/main/resources/conf/applicationContext-security-hostPolitica.xml" para añadirle la política a utilizar cuando se acceda a la aplicación a través de la IP de la Raspberry:


Modificaciones sobre el "war" y arranque
Realizadas todas estas modificaciones, he generado el war para el entorno local utilizando "maven clean install" sin ningún perfil. En ese momento he intentado desplegar tal cuál el war en el Tomcat de la Raspberry (copiándolo al subdirectorio "webapps"), pero ha surgido un problema con la librería "aspectj", ya que Atlas 1.2.7 está preparado para correr sobre JDK1.6, y no sobre 1.7. Para arreglar el problema he tenido que abrir el war y eliminar del directorio WEB-INF/lib las dos librerías de aspectj:
       aspectjrt-1.6.0
       aspectjweaver-1.6.0
Y en su lugar he puestos las del mismo nombre pero que corresponden a la versión 1.7.0.
Hecho esto el war ya estaba listo, lo he copiado al directorio "webapps" de la instalación de Tomcat y tras arrancar el servidor de aplicaciones (lo que ha durado 5 minutos)... VOILA!
Han sido varias horas hasta que he tenido la aplicación funcionando pero ha valido la pena. Aunque el rendimiento de la Raspberry con la aplicación deja bastante que desear, he conseguido el objetivo de la prueba de concepto, y por el camino he aprendido mucho sobre el funcionamiento de mi nuevo juguete ;-)





domingo, 29 de diciembre de 2013

Vídeo: Visualización y sonido de los algoritmos de ordenación

Aquí os dejo un vídeo que muestra de manera visual (y con sonido) la forma en la que ordenan los diferentes algoritmos de ordenación (desde el lento "selection sort" hasta el famoso "quick sort", pasando por el algoritmo de la burbuja).
Para los que no sepáis de qué hablo, los algoritmos de ordenación son formas de utilizar los ordenadores para ordenar una lista de números desordenados (más información aquí).
Aprovecho también para dejaros un enlace a las transparencias del tema en el que tratábamos los algoritmos de ordenación en la asignatura de Programación en Java de la Universidad Carlos III (se incluye código fuente en Java para los principales algoritmos de ordenación).
El vídeo:

Me siento un poco viejuno, cuando estudié estos algoritmos me quedé en el QuickSort, y en el vídeo se muestran algunos que ni siquiera conocía.
La lista completa de los algoritmos del vídeo es:

  • selection sort
  • insertion sort
  • quick sort
  • merge sort
  • heap sort
  • radix sort (LSD)
  • radix sort (MSD)
  • std::sort (intro sort)
  • std::stable_sort (adaptive merge sort)
  • shell sort
  • bubble sort
  • cocktail shaker sort
  • gnome sort
  • bitonic sort 
  • bogo sort

Más información sobre cómo se ha creado el vídeo en The Sound Of Sorting.

miércoles, 27 de febrero de 2013

Vídeo: Gates, Zuckerberg y otros genios de la tecnología te invitan a aprender a programar

Este vídeo se ha lanzado para estimular la enseñanza del "arte de la programación" en los jóvenes.
Aprende a programar! Es estimulante, creativo, reconfortante... toda una experiencia que nadie debería perderse.

viernes, 4 de enero de 2013

¿Qué es Redis?


Con el auge de Internet, las aplicaciones modernas cada vez tienen que dar servicio a un mayor número de usuarios (imaginaros el número de peticiones por segundo que reciben los servidores de Facebook, Google o Twitter). Las arquitecturas tecnológicas que se utilizaban antiguamente para desarrollar aplicaciones no son suficientemente escalables como para soportar cientos de millones de usuarios, por lo que ha sido necesario re-inventar el concepto de "Arquitectura Tecnológica de Aplicaciones" para dar cabida a estas nuevas necesidades, apoyándose en productos innovadores que sustituyen a las antiguas arquitecturas Cliente-Servidor y las Bases de Datos Relacionales.

En febrero del 2011 estuve en el Spring I/O, y os conté como una de las charlas que me encantó se llamaba “Aplicaciones web ultraescalables con Redis”. Era uno de mis primeros contactos con las base de datos NoSQL (de las que también os hablé hace tiempo). Ha llovido mucho desde entonces, y de todos los nuevos productos con los que he trabajado en este tiempo hay uno que me parece especialmente revolucionario y visionario, REDIS.

¿Qué es Redis?
La mejor definición que se me ocurre de Redis es que se trata de “un servidor de caché de memoria que conoce la estructura de los datos que alberga” o dicho de otra forma, “una caché de datos con estructura”.
La idea de servidores de caché de memoria en los que se alberga información para su rápido acceso desde distintos puntos es muy antigua, y existen productos muy consolidados en el mercado, como el famoso Memcached, utilizado por sitios con muchos millones de usuarios como Wikipedia, Twitter, Youtube, WordPress, etc.
Y si ya existen otros productos servidores de caché de memoria, ¿qué aporta Redis sobre ellos y por qué es tan revolucionario? El factor que diferencia a Redis respecto a una caché de memoria convencional es que conoce la estructura de los datos que alberga. Lo más fácil para entender el concepto es poner un ejemplo:

Imaginad que tenéis una aplicación web y queréis cachear en un servidor aparte (un servidor de memoria) la lista de los usuarios que están activos, para que pueda ser accedida desde diversas máquinas – todas las de un cluster:

  • Si queremos realizar esto con un producto que no sabe de estructuras de datos (como Memcached), cada vez que queremos modificar dicha lista de usuarios – por ejemplo para eliminar uno de ellos que ya no está activo - la tenemos que traer entera a uno de los servidores, modificarla y volverla a escribir entera. Esto es muy ineficiente, sobre todo cuando mayor es la lista. 
  • Para realizar esto con Redis, tenemos funciones de la caché para albergar listas (entre otras estructuras de datos, sabe manejar listas), de forma que sólo tendríamos que indicar a Redis que elimine un determinado elemento de la lista. Más adelante indicaremos los tipos de estructuras de datos que maneja Redis.


Un poco de historia
El desarrollo de Redis fue iniciado por Salvatore Sanfilippo a principios del 2009, para acelerar los tiempos de respuesta de un producto llamado LLOGG. Pronto fue ganando popularidad, hasta que en Marzo del 2012 la empresa VMWare contrató a Salvatore para trabajar a tiempo completo en Redis. Poco después VMWare contrató también a uno de los principales desarrolladores de Redis, Pieter Noordhuis. Desde entonces Redis ha evolucionado muy rápidamente, incluyendo funcionalidades que le hacen tan útil.

Tipos de Estructura de Datos soportados por Redis
Actualmente Redis soporta cinco tipos de estructuras de datos:
  1. Cadenas de caracteres (Strings)
  2. Listas (Lists)
  3. Conjuntos (Sets)
  4. Conjuntos Ordenados (Sorted Sets)
  5. Tablas Hash (Hashes)
Aunque puede parecer una lista muy corta, sólo con estos cinco tipos de estructuras se pueden modelar infinitud de procesos y aplicaciones complejas, hasta el punto que muchos de los usuarios de Redis han terminado por sustituir completamente las bases de datos relacionales.

Otras funcionalidades que aporta
Además de actuar como servidor de estructuras de datos, Redis aporta otras funcionalidades muy interesantes:

  • Expiración de claves basada en tiempo
  • Sistema de Publicación y Subscripción a colas de mensajes
  • Operaciones Atómicas y Transacciones
  • Persistencia periódica de la memoria a disco, para recuperación ante caídas
  • Replicación Maestro-Esclavo, para en el futuro implementar un Cluster
  • Protocolo abierto, y uso desde decenas de lenguajes de programación

Además, con la versión 2.6 de Redis liberada a finales de Octubre de 2012, se introduce una funcionalidad clave, la posibilidad de ejecutar Scripts dentro del servidor Redis, escritos en lenguaje LUA.

Rendimiento y Uso de Redis
Redis está escrito en ANSI C muy optilizado, lo que le hace increíblemente rápido, he visto con mis propios ojos a un sólo servidor de Redis procesar más de 150.000 peticiones por segundo. Este es uno de los motivos por los que se ha hecho tan popular, y es utilizado en multitud de sitios actualmente, algunos tan famosos como Flickr, Stack Overflow, GitHub,  o la española Telefónica Digial.

El futuro de Redis
Desde la liberación de la versión 2.6, el equipo de Redis está bastante centrado en el desarrollo del Cluster de Redis, cuyo trabajo comenzó hace tiempo pero fue delegado a un segundo plano hasta que estuviese listo el Scripting en LUA (el cluster en principio estaba planificado para ser liberado a finales del 2011). Ahora que la versión 2.6 está liberada y estable, parece que hay avances en la implementación del Cluster que se liberará en la versión 3.0.

Algunos Enlaces Interesantes


viernes, 23 de diciembre de 2011

Artículo: ¿Qué es la recursividad?


¿Qué es la recursividad?

En ocasiones nos encontramos con problemas aparentemente complejos de resolver programando al estilo “tradicional”, es decir utilizando bucles para repetir un código hasta que se cumpla una condición. Esta forma de programar se denomina programación iterativa, y como digo no siempre es la mejor para resolver cierto tipo de problemas.
En contraposición a la programación iterativa surge la denominada recursividad o programación recursiva, que consiste en aplicar al mundo de la programación la famosa frase de Julio Cesar "Divide et vinces" – Divide y Vencerás. La programación recursiva a menudo ofrece soluciones elegantes a problemas difíciles de resolver de otro modo, descomponiendo dichos problemas en otros más sencillos.

Una función recursiva (o método recursivo) es aquella que contiene invocaciones a sí misma, de manera que el problema se va descomponiendo en sub-problemas más fáciles de resolver.  Así, una llamada a una función recursiva puede generar una o más invocaciones a la misma función, que a su vez genera otras llamadas, y así sucesivamente hasta llegar a lo que se denomina el caso base.  El caso base es un problema tan básico que la función sabe resolver sin necesidad de volver a invocarse a sí misma.
Una función recursiva debe cumplir las siguientes condiciones:

  • Asegurarse de que existe una condición de salida, en la que no se producen llamadas recursivas (el caso base).
  • Asegurarse de que se cubren todos los posibles casos entre el caso base y los no-base.
  • Cada llamada, si se trata de un caso no-base, conduce a problemas cada vez más pequeños que terminarán en el caso base.

Como la definición de una función recursiva puede resultar complicada de comprender, vamos a ilustrarlo con unos ejemplos para tratar de entenderlo mejor.

Cálculo del Factorial de un Número

Un ejemplo de algoritmo recursivo es el cálculo del factorial de un número. El factorial de un número es el resultado del producto de todos los números inferiores o iguales a él, empezando por el 1. Por ejemplo, el factorial de 4 (que se escribe 4!) es 3*2*1 = 6. Así, la definición recursiva del factorial podría estar compuesta por dos puntos:


El primer punto dice que el factorial de un número no es más que el mismo número multiplicado por el factorial de su número predecesor (el número menos uno). El segundo punto es el caso base, que dice que el factorial de uno es uno.
A continuación se muestra el código en Java de una función que es capaz de calcular el factorial de un número de manera recursiva (llamándose a sí mismo hasta llegar al caso base):


En el código anterior se puede ver cómo la función factorial se llama a sí misma con el número anterior al que se le ha enviado (línea 10), a no ser que el número sea uno, en cuyo caso se devuelve uno (línea 8).  Así, se van produciendo sucesivas invocaciones a la función hasta llegar al caso base.

Las Torres de Hanoi

Otro ejemplo clásico de algoritmo recursivo es la resolución del problema de Las Torres de Hanoi. Se trata de un rompecabezas inventado en  1883 por el matemático francés Éduard Lucas, que consiste en pasar una serie de discos de diferentes tamaños de una barra vertical situada a la izquierda a otra barra vertical situada a la derecha. Para ello se puede utilizar una barra auxiliar situada en el centro de las otras dos, con la única restricción de que nunca un disco de menor tamaño puede quedar por encima debajo de otro mayor.


Si pensamos en cómo resolveríamos este problema con un ordenador, la solución iterativa no es nada fácil de implementar. Sin embargo, una solución recursiva puede programarse con pocas líneas de código, según se muestra en la siguiente figura:


Fijándonos en el código, podemos ver como la función mover tiene dos llamadas recursivas. El caso base es cuando ya no hay que mover ningún disco, y cualquier caso no-base realiza tres pasos:

  1. Mueve todas las piezas menos una a la barra temporal
  2. Mueve la pieza que queda a la barra destino
  3. Mueve todas las piezas que movió a la barra temporal a la barra destino

Con este sencillo algoritmo somos capaces de resolver un problema tan complejo como las torres de Hanoi con pocas líneas de código. La salida del programa para una torre de Hanoi de cuatro discos (aunque funciona para cualquier número) es la siguiente:


Backtracking: Cuando recursividad y fuerza bruta van de la mano

El backtracking, también conocido como “vuelta atrás”, es una técnica algorítmica de resolución de problemas mediante una búsqueda sistemática de soluciones. El backtracking hace uso de la recursividad para descomponer la tarea a realizar en tareas parciales, y probar cada una de estas. Cuando al elegir una tarea se comprueba que no lleva a ninguna solución, se debe volver atrás, y probar con otra. Así, se van probando sistemáticamente posibles soluciones al problema hasta que se encuentra una que lo resuelve.

Ejemplo de Backtracking: Resolviendo Laberintos

Un ejemplo de problema fácilmente resoluble con backtracking (y difícil sin métodos recursivos) es el encontrar la salida a un laberinto. El algoritmo básicamente funciona así:

  1. Comprobamos si la casilla donde estamos actualmente ya es la salida, y si es así, salimos de la función indicando que se ha encontrado la casilla de salida.
  2. Si no es así, entonces llamamos recursivamente a esta misma función con la casilla de arriba de la actual, y si ahí se encuentra la salida, salimos de la función indicando que se ha encontrado la salida del laberinto.
  3. Si no se encontró la salida por arriba, entonces llamamos recursivamente a esta misma función con la casilla de abajo de la actual, y si ahí se encuentra la salida, salimos de la función indicando que se ha encontrado la salida del laberinto.
  4. Si no se encontró la salida por abajo, entonces llamamos recursivamente a esta misma función con la casilla de la izquierda de la actual, y si ahí se encuentra la salida, salimos de la función indicando que se ha encontrado la salida del laberinto.
  5. Si no se encontró la salida por la izquierda, entonces llamamos recursivamente a esta misma función con la casilla de la derecha de la actual, y si ahí se encuentra la salida, salimos de la función indicando que se ha encontrado la salida del laberinto.
  6. Si no se encontró la salida por ninguna de las cuatro casillas colindantes, entonces salimos de la función indicando que no existe salida del laberinto por la casilla actual.

A continuación se muestra el código del algoritmo de resolución de laberintos:


Parece increíble que con estas pocas líneas de código se pueda encontrar la salida de cualquier laberinto,  independientemente de su complejidad (aunque no se asegura que sea la salida más corta). Al ejecutar el programa, obtenemos la salida del laberinto de ejemplo:


Otro Ejemplo de Backtracking: Resolviendo Sudokus

Otro clásico ejemplo para ilustrar el uso del backtracking es un programa que resuelve sudokus utilizando esta técnica. El algoritmo funciona básicamente así:

  1. Elegir la primera casilla vacía, empezando a buscar desde la casilla superior izquierda.
  2. Probar a colocar el número 1 en esa casilla, y ver si no existe ningún conflicto (no existe ningún número igual en la misma fila, columna o bloque):
  • Si existe un conflicto, volver al paso 2) y probar con el siguiente número
  • Si no existe ningún conflicto, llamar recursivamente al paso 1) para ver si se encuentra una solución:
    • Si no se encuentra, y hay más números para probar, volver al paso 2) y probar con el siguiente número.
    • Si no se encuentra y no hay más números para probar, salir de la función indicando que no se ha encontrado solución.
    • Si se encuentra, salir de la función indicando que si se ha encontrado solución.
A continuación se muestra el código en Java del algoritmo para resolver cualquier Sudoku utilizando backtracking:

Al ejecutar el programa con el Sudoku de ejemplo se obtiene la solución en pocos segundos:


sábado, 22 de octubre de 2011

Mi librillo: El ranking


Existe un refrán popular que dice que "cada maestrillo tiene su librillo", y hoy me apetecía compartir con vosotros parte de "mi librillo".
Se trata de una experiencia docente que comencé a llevar a cabo hace cuatro años entre mis alumnos de la asignatura de Programación en Java de primer año de carrera (ahora del Grado en Ingeniería Informática) en la Universidad Carlos III de Madrid.
Esta experiencia ha resultado ser una de las mayores medicinas contra el absentismo (se ha pasado de tasas del 25% a las actuales de menos del 10%), además de aumentar la motivación y el grado de atención de los alumnos en clase: "EL RANKING".
Tal como cuento a los alumnos el primer día de clase, "El Ranking" es el nombre de una lista donde mantengo una puntuación asociada a cada alumno. La puntuación varía en función de sus aciertos en unas preguntas tipo test que todos los días realizo al final de clase.
La motivación de los alumnos por el ranking según avanza la asignatura es increíble, y a ello contribuyen diversas razones:
  • La puntuación en el ranking afecta a la nota final en la asignatura: Aunque podría parecer que este debiera ser el motivo fundamental, para los alumnos se trata de un motivo residual, ya que el ranking sólo afecta a la nota de manera simbólica y así quiero que sea (medio punto sobre la nota final). Prefiero que se diviertan aprendiendo Java y les apetezca subir en el ranking por otros motivos, más que por ese medio punto.
  • Al final de la asignatura, regalo un libro sobre Java a los primeros clasificados en el ranking: Esta ha resultado ser una de las mayores motivaciones para ellos, en ocasiones les oigo hacer comentarios sobre ese libro y lo cerca o lejos que están de conseguirlo.
  • Cada día lo primero que hago al llegar a clase es mostrar cómo va el ranking: Lo muestro ordenado para que los alumnos vean el número de aciertos que llevan en las preguntas, y cómo están situados en el ranking respecto a sus compañeros. Esto ha generado un tipo de competitividad sana entre ellos, y digo "sana" porque compiten y se pican entre ellos por el simple hecho de conseguir el libro, o por ver que ese día están por encima de su compañero/amiguete de al lado, o por ver que han llegado a estar entre los diez primeros de la lista. Promuevo esto con comentarios sobre el ranking cuando lo muestro (algunos jocosos al más puro estilo de un comentarista del Tour), como "parece que Fulanito ya está más cerca del libro", "Fulanito y Menganito siguen mano a mano disputándose los primeros puestos", "Menganito ha remontado varios puestos", etc.
La metodología del ranking es bastante sencilla, y merece la pena por los resultados, aunque supone bastante trabajo adicional para mí (todos los días tengo que llevar preparadas preguntas para el ranking, corregir las del día anterior y mantener la lista actualizada para mostrarla al principio de la clase). La metodología es básicamente la siguiente:
  1. Todos los días al comenzar la clase muestro el ranking ordenado y "comento las mejores jugadas"
  2. Reservo los diez últimos minutos de clase para plantear dos o tres preguntas de tipo test. Es importante que las preguntas estén relacionadas con lo que se ha explicado ese día en clase, esto hace que los alumnos estén más atentos durante la clase porque saben que al final habrá preguntas de "el ranking" sobre eso.
  3. Cada alumno pone su nombre en una hoja junto a sus respuestas a estas preguntas (los primeros años probé a pasar una hoja con sus nombres para que pusiesen ahí las respuestas y facilitarme la corrección, pero se tardaba mucho y además algunos de ellos copiaban las respuestas de sus compañeros).
  4. Después de recoger las hojas con las respuestas de todos, corrijo las preguntas en la pizarra para que vean si han cometido errores y aprendan de ellos.
El ranking ha llegado a tener tanto éxito entre los alumnos que cuando termina la clase algunos me piden que haga más preguntas para poder "subir puestos". Lo nunca visto, alumnos pidiendo que se alargue el tiempo de clase!!!
Además gracias al ranking las clases se han hecho bastante más dinámicas y amenas, y esto es de agradecer porque la asignatura se imparte los viernes por la tarde y cuesta más mantener a los alumnos motivados y atentos, teniendo el fin de semana tan próximo.

Y a ti, ¿qué te parece la iniciativa?
¿Crees que es bueno fomentar la competitividad en clase?
Si has sido alumno mío durante estos últimos cuatro años, ¿te ha gustado el método? ¿qué cambiarías en él?

miércoles, 27 de julio de 2011

ATLAS: Nuevo framework para el desarrollo de aplicaciones en la Comunidad de Madrid

* Artículo escrito junto con mis compañeros del Área de Arquitectura e Integración de Aplicaciones de ICM para la revista ICM Conecta 


Introducción
El mundo de la tecnología evoluciona constantemente y con él los lenguajes de programación y las plataformas o frameworks que se apoyan sobre ellos. Una de las labores principales del Área de Arquitectura e Integración de Aplicaciones de ICM (AIAA) es estar al corriente de la evolución tecnológica, e incorporar a las aplicaciones de la Comunidad de Madrid aquellas tecnologías que puedan aportar valor, haciéndolas más eficientes y disminuyendo los tiempos y costes de desarrollo y mantenimiento.
En este contexto, el nuevo framework ATLAS incorpora las tecnologías más consolidadas del mundo Java a todos los desarrollos de aplicaciones que se emprendan en la Comunidad de Madrid.

¿Qué es ATLAS?
Antes de empezar a hablar en detalle de ATLAS, lo que incorpora y las mejoras que aporta para el desarrollo de aplicaciones, sería muy importante tener claro qué es un Framework. Según la wikipedia, un framework o marco de trabajo es “un conjunto estandarizado de conceptos, prácticas y criterios para enfocar un tipo de problemática particular, que sirve como referencia para enfrentar y resolver nuevos problemas de índole similar”. Aun siendo una descripción muy conceptual, podemos hacernos una idea de lo que significa dentro del contexto de las aplicaciones informáticas: durante el desarrollo de software aparecen una serie de requisitos similares entre aplicaciones a los que se ha de dar solución. Ese conjunto de soluciones, junto con la documentación, buenas prácticas y ejemplos de uso constituyen lo que comúnmente se entiende como un framework. El concepto de ATLAS es más amplio, ya que además de todo esto incluye una definición detallada de los procesos que afectan al ciclo de vida de desarrollo y mantenimiento de software, así como una serie de herramientas de ayuda al programador.

Un poco de historia
Desde ICM se ha recorrido un largo camino hasta llegar a la tecnología de desarrollo de aplicaciones actual. Llevamos más de doce años creando aplicaciones web para la Comunidad de Madrid (aquellas que se utilizan desde un navegador). En un principio se utilizó la tecnología de CGI’s a través de ejecutables generados con Object Pascal (con componentes Delphi CGI Expert). Posteriormente se dio el salto al lenguaje Java, creándose el primer framework, que se apoyaba en la tecnología de Servlets. El siguiente paso fue la creación de un nuevo framework (Framework2 de ICM) que utilizaba la tecnología de páginas JSP y el patrón de diseño MVC para separar las distintas capas de las aplicaciones. 
Como respuesta a las nuevas necesidades tecnológicas surgidas desde la aparición del Framework2, desde ICM se vio necesario dar un salto cualitativo que agilizara y facilitara el desarrollo de aplicaciones, para lo cual, hace tres años, se contrata la construcción de un nuevo framework denominado ATLAS.
La construcción de un framework es un proyecto atípico, pues lo que se desarrolla no es una aplicación o sistema de información al uso, sino los cimientos para la construcción de futuras aplicaciones, por lo que la calidad y el control del proyecto tienen que ser máximos. Para la construcción del framework se tuvo en cuenta el contexto actual de ICM, en el que el desarrollo de aplicaciones se realiza por parte de proveedores externos en factorías, y el mantenimiento y evolución de dichas aplicaciones puede ser realizado por otros proveedores ajenos al proyecto inicial. Esto exige una disciplina muy estricta para que el código sea homogéneo, así como la utilización de buenas prácticas y soluciones estándar, con el objetivo principal de que el mantenimiento de la base instalada sea ágil, rápido y por lo tanto económico (el coste del mantenimiento de un aplicación es, a la larga, bastante mayor que el de su desarrollo).

Elementos de ATLAS
ATLAS está formado por los siguientes elementos:
  • Normativa: Es una de las piezas fundamentales del framework. Se trata de un documento que describe en profundidad la forma en la que se deben desarrollar las aplicaciones. Incluye una serie de Normas de obligado cumplimiento, así como Buenas Prácticas o recomendaciones.
La normativa de ATLAS incluye una serie de normas y buenas prácticas
  • Librerías: Se trata de una serie de librerías escritas en lenguaje Java que permiten llevar a la práctica las especificaciones definidas en la normativa. Entre estas librerías se incluyen módulos de integración con tecnologías horizontales a todas las aplicaciones (Servicios Web, Gestión Documental, Business Intelligence, etc.).
  • Documentación de Uso y Procedimientos: ATLAS incluye documentación de uso de todos sus componentes, así como documentos internos que describen en detalle todos los procesos a seguir desde el comienzo del desarrollo hasta que la aplicación se encuentra en producción y se procede a su mantenimiento.
  • Herramienta de ayuda a la verificación de la calidad: Junto con el framework ATLAS se incluye una herramienta que permite al proveedor comprobar el grado de cumplimiento de la normativa durante el desarrollo de una determinada aplicación. Utilizando la herramienta desde el comienzo del desarrollo, se evita que al final del proyecto se detecten incumplimientos de la normativa que requieran cambios estructurales.
  • Plantillas de partida: Para acelerar el arranque de los desarrollos, en el framework se incluyen una serie de plantillas de partida (denominadas Arquetipos), que contienen todo lo necesario para comenzar a desarrollar una aplicación de forma ágil.
  • Aplicación de Ejemplo: Para mostrar el uso de los distintos componentes de la arquitectura, junto con el framework se distribuye el código fuente de una aplicación de ejemplo.
Aplicación de Ejemplo
  • Portal de Conocimiento: Para facilitar la distribución de la documentación y la formación a proveedores, existe un portal de conocimiento con toda la información necesaria para aprender a utilizar el framework y mantenerse al día de su evolución (incluyendo vídeos formativos sobre los distintos componentes).
¿Qué beneficios aporta ATLAS
El framework ATLAS supone un importante cambio en el desarrollo de aplicaciones, tanto en aspectos tecnológicos como procedimentales. Este cambio redunda en una serie de beneficios específicos para cada uno de los tres principales agentes implicados: el usuario final, ICM y el proveedor externo. En el siguiente gráfico se muestra un resumen de estos beneficios:
Beneficios de ATLAS
Arquitectura del framework
La arquitectura del framework está basada en tres tecnologías ampliamente extendidas y utilizadas en el desarrollo de aplicaciones Java. Estas tecnologías son: JSF que se utiliza en la capa de presentación, Spring en la capa de lógica de negocio e Hibernate en el acceso a los datos. Sobre estas tecnologías se ha construido una capa de servicios y herramientas propios de ICM cuya misión es simplificar el desarrollo de aplicaciones, a la vez que facilitar el mantenimiento de las mismas. Entre los servicios que ofrece el framework están los siguientes:

  • Servicio de autenticación y autorización basado en políticas de seguridad predefinidas.
  • Componentes de presentación más habituales en los desarrollos de la Comunidad de Madrid.
  • Servicio de Trazas con información que permite la monitorización de las aplicaciones.
  • Servicio de Auditoría de acceso a datos personales para cumplimiento de la LOPD.
  • Servicios de integración con otras tecnologías: Gestión Documental, Certificados Digitales, Servicios Web, Planificación, Reporting, Bussiness Intelligent, etc.

Adicionalmente a estos servicios, para asegurar la calidad del código de las aplicaciones desde su comienzo se han seleccionado una serie de herramientas que facilitan la construcción de pruebas automatizadas, como son JMeter, JUnit y Selenium, y se ha desarrollado la herramienta de ayuda a la verificación automática de la calidad del código.

Como base para el arranque de nuevos desarrollos, se proporcionan una serie de Arquetipos o plantillas de partida que incluyen toda la configuración necesaria para utilizar los distintos servicios que ofrece el framework según se indica en la normativa. Actualmente se dispone de arquetipos para aplicaciones web, procesos batch, librerías, servicios web y aplicaciones que se integren con Documentum.

En ATLAS, todo el código fuente de las distintas aplicaciones se almacena en un único repositorio centralizado (Subversion). Para la gestión del ciclo de vida de las aplicaciones se utiliza la herramienta Maven, que aporta los siguientes beneficios:

  1. Permite la automatización de las tareas más comunes (como la compilación, empaquetado y despliegue de las aplicaciones en los distintos entornos de ICM).
  2. Proporciona la gestión automática de las dependencias de un proyecto, descargando todas las librerías necesarias para una aplicación de un repositorio centralizado de librerías (Artifactory).
  3. Establece un método único de gestión de la configuración: Permite la gestión de las versiones del framework y de las aplicaciones, lo que aporta control sobre su estado y evolución a lo largo del tiempo.
Próximos Pasos
Se han liberado ya varias versiones estables de ATLAS, el framework se encuentra disponible para desarrollar proyectos de forma estándar para la organización, permitiendo un nuevo horizonte sobre el que sustentar futuros procesos de renovación tecnológica de la base instalada.

Para una correcta adopción del nuevo framework es imprescindible que los desarrolladores conozcan los estándares tecnológicos en los que se apoya (JSF, Spring e Hibernate). Para garantizar el éxito de los proyectos, los proveedores externos tienen que tener esto muy presente e involucrar a personal cualificado en los desarrollos.
Mientras siguen creándose nuevas aplicaciones basadas en ATLAS, el framework continúa evolucionando (un framework siempre está vivo, en un proceso constante de adaptación a las nuevas necesidades). El futuro de ATLAS pasa por seguir trabajando en enriquecer su contenido y facilitar la labor de desarrollo. En este sentido, se está trabajando en incorporar a futuras versiones del framework funcionalidades como la generación automática de código a partir de un modelo de datos (para generar automáticamente pantallas de administración de catálogos). La integración con otras tecnologías emergentes en la organización será otra línea de trabajo muy importante a tener en cuenta.

    miércoles, 9 de marzo de 2011

    Recuperando archivos cifrados de una partición NTFS con EFS (Encrypted File System)

    Ayer me dejaron un portátil que no arrancaba, para que tratase de arreglarlo. Había que intentar no perder los datos si era posible, porque su dueño tenía ahí todas sus fotos y vídeos personales, y como siempre, no tenía copia de seguridad (Me recuerda la frase "hay dos tipos de usuarios de ordenadores: los que han perdido datos, y los que los perderán".
    El disco duro tenía dos particiones, una con las aplicaciones instaladas y otra con los datos de usuario (escritorio, documentos, fotos, etc.). Windows XP comenzaba a arrancar, pero en mitad del arranque el portátil se reiniciaba sólo.
    Intenté varias cosas como restaurar el MBR desde la consola de recuperación de Windows, y también arranqué el ERD Commander para verificar que los ficheros seguían ahí. ERD Commander te permite "Restaurar el sistema a un estado anterior", pero desafortunadamente estaba desactivado este sistema en Windows XP, por lo que no había backups anteriores del sistema.
    Sin embargo, desde ERD Commander pude ver que los datos seguían ahí y podía acceder a ellos. Así que decidí sencillamente borrar la partición del sistema, formatearla con NTFS (rápido), crear una nueva y reinstalar Windows XP en ella.
    Cuál fue mi sorpresa cuando, una vez reinstalado el sistema operativo, me dí cuenta de que podía ver los ficheros de la partición de datos, pero no podía acceder a ellos (aparecían con un color verde en el explorador de Windows).
    Comencé a investigar por qué aparecían los ficheros en color verde, y entonces descubrí lo que desconocía: El Encrypting File System. Resulta que en un sistema de ficheros NTFS se pueden tener carpetas y archivos encriptados, de manera que alguien puede acceder a los ficheros pero su contenido no se puede descifrar sin una clave de desencriptado, que Windows almacena en su partición del sistema (la que yo acababa de formatear).
    Después de muchas investigaciones, pude hacerme con la herramienta Advanced EFS Data Recovery, que busca los archivos encriptados y trata de desencriptarlos, buscando también los ficheros de Windows con la clave.
    Sin embargo, como yo había formateado la partición, el wizard que trae la herramienta para buscar las claves de desencriptación no funcionó. Tuve que entrar en el modo experto, el cuál incorpora una opción (sólo a partir de la versión 4) para poder examinar a nivel de sector físico el disco duro, buscando posibles claves. Tuve suerte, ya que al formatear la partición con el modo "rápido" el contenido no se borra físicamente del disco duro, así que el programa encontró las claves de desencriptación y pude recuperar las fotos del dueño.

    • Nota importante: El programa, en su versión "Trial", aunque parece que ha desencriptado bien los ficheros no lo hace, ya que como te avisa en un mensaje, sólo desencripta los primeros 512 bytes de cada archivo (el resto lo rellena a ceros). Si adquieres una licencia puedes desencriptar los ficheros completos.

    Espero que os sirva de ayuda si alguna vez os encontráis con este tipo de ficheros "marcianos" mostrados en verde.

    jueves, 24 de febrero de 2011

    Mi primer análisis forense: recuperando fotos borradas de un iPhone


    Estos días me he enfrentado con un amigo a un reto apasionante a la vez que estresante. Alguien había borrado unas fotos importantes de un iPhone 4, y necesitaba recuperarlas. La historia ha sido toda una odisea, aquí os cuento los pasos que dimos (se hizo todo en cuatro tardes/noches, no teníamos más tiempo e íbamos contra-reloj).

    Fase 1: Jailbreak y Dump de disco
    Lo primero que se hizo fue un Backup del iPhone utilizando iTunes, por si se perdían el resto de datos intentando recuperar las fotos borradas.
    Después de investigar sobre el tema, se decidió proceder a realizar un jailbreak del iPhone, para intentar volcar todo el contenido de su disco interno y así tratar de recuperar las fotos.
    Se realizó el jailbreak utilizando cynthia y nos conectamos a él según se indica aquí, es decir, montando un servidor ssh en el iPhone y conectándonos a él por Wifi (aquí está bien explicado, la password de root es alpine).
    Como no conseguimos volcar toda la imagen de disco por Wifi (se desconectaba cuando llevaba unas megas), realizamos un tunnel para conseguir el volcado a través de USB.
    Con esto se consiguió volcar el contenido de la partición de usuario (unos 15 Gb) a una imagen iso, y aquí comenzó la segunda fase.

    Fase 2: Abrir la imagen de la partición e intentar recuperar las fotos
    Una vez que teníamos la imagen de la partición, estuvimos viendo cómo poder abrirla e intentar recuperar las fotos. Después de investigar bastante, descubrimos que la partición está en formato HFS+, por lo que puede montarse en un Linux y tratar de recuperar los datos de ahí.
    Probamos decenas de utilidades para tratar de recuperar las fotos borradas, pero ninguna era capaz de hacerlo. Entre otras muchas, probamos con photorecsleuthkit y autopsy, pero lo más que conseguimos fue sacar los ficheros ya existentes. También conseguimos sacar archivos existentes utilizando HFSExplorer en Windows, montando la imagen como si fuese un disco. Sin embargo, al examinar alguno de los ficheros que habíamos sacado (fotos que no se habían borrado), vimos que no se podían abrir. Hicimos también una aplicación en Java que fuese mirando sector a sector (cada 512 bytes), buscando la cabecera típica de los archivos JPG, pero no encontramos nada. Y no encontramos nada por lo mismo que no se podían abrir los archivos que extrajimos con autopsy o HFSExplorer, y es que el iPhone 4 encripta por hardware el contenido de todos los ficheros que almacena en el disco, por lo que aunque consigas sacarlos no hay manera de desencriptarlos. Se explica así en este thread, en el que se dice que tiene que ver con un sistema de encriptado hardware, y un archivo llamado "".
    En este momento desistimos de tratar de recuperar las fotos borradas, porque aunque fuésemos capaces de extraerlas de la imagen del disco que habíamos hecho, no habría forma de desencriptarlas. ¿Y ahora qué?

    Fase 3: Recuperar los thumbnails de las fotos
    Como no podíamos recuperar las fotos borradas, pensamos que tal vez pudiésemos recuperar los thumbnails (las miniaturas) de las fotos que almacena el iPhone en su caché, y que milagrosamente no hubiese refrescado estas miniaturas después de borrar las fotos (se apagó el teléfono justo después de borrarlas). Buscando con el HFSExplorer en la imagen de la partición de usuario, encontramos dos archivos que podrían contener lo que buscábamos, los ficheros "120x120.ithmb" y "158x158.ithmb", además del fichero "thumbnailconfiguration" según se muestra en esta imagen:
    Recuperamos esos tres ficheros de la imagen, pero al igual que el resto de ficheros que habíamos logrado extraer estaban encriptados. Sin embargo ya sabíamos dónde estaban los ficheros que queríamos, así que pensamos que tal vez conectándonos por ssh al iPhone y utilizando scp para traernos los ficheros, el iPhone se encargase de dárnoslos ya desencriptados. Y así fue, ya que trayendo los ficheros de los thumbnails por ssh vimos que el fichero thumbnailconfiguration estaba en formato legible (xml), y contenía esto:
    ¿Pero en qué formato estaban los archivos con extensión ithmb?

    Fase 4: Recuperar las fotos a partir de los thumbnails
    Buscamos en cientos de sitios para saber cómo convertir el fichero ithmb a jpg o a algún formato de fotos legible, pero no hubo manera (ni siquiera con aquellos programas como iThmbConv.exe que prometían hacerlo). ¿Y ahora qué? ¿En qué formato está un archivo con extensión ithmb y cómo conseguimos abrirlo para ver las fotos?. La pista nos la dio este post en el que un tipo prometía que había conseguido abrir un fichero de thumbnails con photoshop, tratándolo como un fichero raw con 16 bits de profundidad de color.
    Hicimos una primera prueba, intentando abrir el archivo "158x158.ithmb" con las siguientes opciones:
    Parece que nos íbamos acercando, porque aunque no se veía mucho, en lo que apareció se podía distinguir una imagen desplazada:
    Parecía claro que el ancho no era 158, pero se aproximaba. Después de muchas otras pruebas abrimos la imagen con 160 píxels de ancho y apareció ante nosotros la primera imagen visible. ¿Y dónde estaban las otras?. Cambiamos el alto a 10000 pixels y empezaron a aparecer el resto de imágenes, unas debajo de otras, pero aparecían cada vez más desplazadas hacia la derecha:
    Nos dimos cuenta de que esto era porque entre imagen e imagen parecía haber una cabecera, que era lo que hacía que la siguiente foto apareciese desplazada. Entonces hicimos un programa en Java para tratar el fichero ithmb y quitarle esas cabeceras. Después de mucha prueba y error (y de mucho visor hexadecimal para tratar de ver los patrones entre fotos) conseguimos eliminar las cabeceras con este pequeño programa en Java:


    Y así, después de procesar el fichero raw con este programa, conseguimos quitar el ruido de los thumbnails y abrir el archivo con Photoshop, que por fin nos mostró todas las fotos colocadas unas debajo de las otras:


    Y con esto, por fin, conseguimos recuperar las (miniaturas de) las fotos que se habían borrado. Fue suficiente con las miniaturas, pues tienen un tamaño de 158x158 pixels, con lo que se apreciaba bastante bien el contenido de las fotos:

    Toda una odisea, pero después de muchos quebraderos de cabeza, dos noches casi sin dormir, cerca de treinta herramientas probadas, dos programas en java y un entendimiento preciso del sistema de ficheros HFS+... PRUEBA SUPERADA!