domingo, 18 de diciembre de 2011

Una pequeña muestra de lo que me fascina hacer



Este es un Expression Sheet (modelo o plantilla de expresiones), comúnmente usada en el mundo de la animación, y sirve para mostrar,valga la redundancia, las diferentes expresiones que hacen de un personaje tener carácter, tal como lo muestra nuestro personaje de ejemplo: Eidan.

La plantilla debería transmitir la personalidad de nuestro personaje, y es exactamente lo que hice, las pocas ilustraciones demuestran que nuestro personaje carece de emociones, su mirada transmite misterio y esto ocasiona que sea estereotipado como una persona rara e introvertida. Así, mi intención fue la de transmitir esas emociones y características reflejadas en el ser humano y que son universales.

viernes, 9 de julio de 2010

ANGULAR COMO SERVICIO EN LA NUBE

Ahora con la aparición del Cloud Computing o computación en la nube, se habla de un avance tecnológico de la web, refiriéndose a una supuesta nueva versión 4.0.

El Cloud computing es el nuevo paradigma que busca que las aplicaciones, datos y relaciones en una organización cualquiera, no hagan parte de su estructura interna ni dependan mucho menos de su sistema operativo de los equipos instalados, sino que estos sean servicios alojados de forma externa, en la propia web.

¿Que es Angular?

Angular es algo entre una página web, hojas de cálculo, base de datos y una aplicación web. No se sabe de algún término en especial que defina a Angular, lo que hace un poco difícil explicar lo que realmente es.
Se puede pensar de angular como una extensión del estándar HTML & CSS. Este puede ser mezclado libremente con contenido HTML existente, esto le permite tener la capacidad de ser embebido (embeddability).
A diferencia del HTML estático, el contenido es dinámico y responde a las interacciones del usuario. Para más información acerca de este macro-framework, visiten el sitio Web de angular
Esta es una nueva tendencia de desarrollo, y para aquellos que no conozcan mucho de las nuevas tecnologías será una buena fuente para estar informados y actualizados. Una entrega bastante corta con respecto a este framework orientado al cloud computing pero que promete ser una gran herramienta de desarrollo a futuro.

ALGORTIMO PARA RESOLVER UNA SOPA DE LETRAS USANDO BACKTRACKING E INDICE INVERTIDO PARTE II

Hola a todos, que agradable es volver a compartir con ustedes otro pedazo de mi vida, gracias a Dios por esta oportunidad. Puesto que tengo una gran cantidad de información que tengo guardado en mi diario para mostrar, me ha tomado bastante tiempo poder organizar el contenido que aparece en este blog, es por esta razón, que tardo en la publicación de mis artículos, no obstante, es mi intención publicar información, pensando siempre en la relevancia y la utilidad de la misma. Siempre cargo con un cuaderno en donde hago mis anotaciones y expongo mis ideas. Cuando exponemos nuestro entendimiento por medio de palabras textuales, nuestra mente adquiere la habilidad de retenerla por más tiempo. Antes de comenzar a abarcar el tema concerniente a este artículo, también quisiera agradecer a mis amigos Jorge Tellez y Erick Estrada por su apoyo incondicional.

Bueno, ahora sí de vuelta al asunto. Para hacer un resumen de la entrega anterior, se trazó una investigación, con el fin de conocer a ciencia cierta en que consistía el problema a tratar y las posibles soluciones que se habían encontrado hasta ahora, lo que finalmente denominamos: análisis del dominio.

Volviendo a exponer la solución que vimos en la primera parte, (si no has revisado la primera parte de este tutorial, aquí les dejo un enlace para que le echen una ojeada PARTE I), en esta entrega presentamos una extensión a la solución propuesta por el backtracking, donde se aplica la técnica de índice invertido con el fin de ayudar y dar soporte a la búsqueda recursiva de las palabras claves.

Miremos ahora como aplicamos esta técnica para extender el algoritmo que vimos en la primera parte del tutorial, pero primero me gustaría explicar que es un índice invertido.


¿QUE ES UN INDICE INVERTIDO?

Un índice invertido es una estructura de datos para almacenamiento que mapea contenido tales como palabras o números con sus ubicaciones en un archivo de base de datos, en un documento o en un conjunto de documentos. Se que esta definición a lo mejor deja a algunos rascándose la cabeza, así que será mejor a través de un ejemplo, ilustrar su definición.

Digamos que tenemos los siguientes textos:
T1: "esa manzana es de color verde"
T2: “mira, esa pelota es de color azul”
T3: “eso es lo que es”

Una representación en índice invertido de lo anterior sería:

“esa”: {t1, t2}
“es”: {t1, t2, t3}
“color”: {t1, t2}
“manzana”: {t1}
“mira”: {t2}
“lo”:{t3}
etc.

La palabra que aparece en el lado izquierdo separado por los dos puntos y encerrada entre comillas, es una palabra que aparece en alguno de los 3 textos del ejemplo, llamada en el índice invertido como vocabulario. Las expresiones encerradas entre llaves que aparecen en la parte derecha, son los textos donde aparece la palabra de la izquierda, esta parte del índice invertido es llamada lista de posteo.

De lo anterior se puede concluir que:
Cada palabra que aparece en cada uno de los textos es asociada (mapeada) con el texto o los textos donde esta aparece. Así que, esta estructura tiene la obligación de permitir una búsqueda más rápida en una consulta, lo cual hace de esta técnica algo valioso para algunos de los motores de base de datos más famosos en el mundo. Creo que quedó más claro con este ejemplo que es un índice invertido.

¿Pero, por que el índice invertido servirá de apoyo o soporte al algoritmo de la sopa de letras?


Volviendo a nuestro pequeño problemita de la sopa de letras, al preguntarnos ¿por que necesito un índice invertido?, pues bien, la solución que proponíamos en la parte de nuestro análisis era inicialmente realizar una búsqueda secuencial, esto lo hacíamos Preguntando en cada letra de nuestra matriz si era igual a la primera letra de la palabra a buscar, y si era así, verificábamos en las direcciones validas donde se podía encontrar la solución, bueno eso no estaría mal, pero hablando en términos mayores, ¿que pasaría si existiese una matriz de 1000 X 1000, que da un total de 1.000.000 de letras y que al momento de buscar la solución a una palabra de 4 letras, dicha solución estuviera en la posición 999.996 y su dirección sea hacia la derecha?, ¿no se hubiese perdido bastante tiempo en comparaciones innecesarias con el resto de letras en la matriz? O en el caso en que hubiese en otra posición de la matriz, una letra parecida a la letra inicial de la palabra buscada pero no era la solución, entonces se hizo una búsqueda y verificación que no tenía que hacerse. Y esta situación solo está ocurriendo para buscar una sola palabra, ahora imagínate si tuvieses que buscar 5 o más palabras.

Lo que propongo con el uso del índice invertido, es conocer de antemano, en que posiciones están las letras candidatas a ser evaluadas y luego hacer uso del backtracking para verificar la solución a la palabra buscada.

Lo primero que haríamos para resolver la sopa de letra anterior, es crear nuestro índice invertido, tomando como vocabulario la primera letra de cada palabra a buscar y como lista de posteo las posiciones de esa letra en la matriz de letras, de esta forma tendríamos los siguientes datos:


“A”: {(0,5), (0,8), (6,6)}
“E”: {(0,0), (9,0), (9,9)}

El par ordenado que se encuentra en la lista de posteo corresponde a la expresión (fila, columna) en la matriz de letras. Así, por ejemplo, la letra “A” con la que comienza la palabra “AULA”, se encuentra en la matriz, en las posiciones (0,5) (0,8) y (6,6). La letra “E” que corresponde a la palabra “ESTUDIANTE”, se encuentra en las posiciones (0,0) (9,0) y (9,9). En el caso de la palabra “ÉXITO”, si nos damos cuenta la letra inicial es la misma que la de “ESTUDIANTE” por lo tanto ya tenemos esa referencia guardada previamente en el índice invertido.

La idea general para armar esta estructura, es:
1 - recorrer una sola vez la matriz, preguntando en cada letra si se parece a algunas de las letras con que comienzan las palabras que se quieren buscar,
2- si se parecen, preguntar si ya existe en el índice invertido. Si ya existe ir al paso 4 sino ir al paso 3.
3- almacenar la letra como vocabulario y asignar una referencia de la fila y la columna.
4 – si la posición no existe en la lista de posteo, guardar la posición de la forma (fila, columna).

Una vez tengamos el índice invertido construido, será más fácil encontrar la solución de las palabras buscada, ya que tenemos una mayor precisión en la búsqueda. Entonces, el algoritmo que teníamos anteriormente en la primera parte de nuestro tutorial, lo podemos ajustar a la siguiente forma:


1-Crear un índice invertido para la sopa de letras.

2-Tomar como entrada la primera palabra a buscar y la lista de posteo asociada a esta.

3-Se toma como pivote la letra de la matriz en la posición del par ordenado que se encuentra en la lista de posteo.

4-Seleccionar una de las direcciones: (ABAJO, ARRIBA, DERECHA, IZQUIERDA, DIAGONAL_INFERIOR_IZQUIERDA, DIAGONAL_INFERIOR_DERECHA, DIAGONAL_SUPERIOR_DERECHA, DIAGONAL_SUPERIOR_IZQUIERDA).

5-verificar la siguiente letra de la palabra buscada en una de las direcciones seleccionada.

6-Si es igual entonces: ir al paso 5.

7-No es igual entonces: ir al paso 4.

8-Si ya no hay mas letras que buscar en la palabra buscada, entonces la palabra ha sido encontrada en la dirección seleccionada y en la posición de letra de la matriz comparada. ir al paso 10.

9-Si ya no hay mas direcciones en donde buscar la solución entonces ir al paso 3.

10-Pasar a la siguiente palabra buscada.

11-No existen más palabras por buscar, entonces debemos mostrar las soluciones encontradas.


Con esto estamos listo para pasar a nuestra siguiente etapa, creo que todo luce bien y parece ser una solución bastante buena, la etapa de diseño y codificación nos presenta nuevos retos  pero ya teniendo claro lo que tenemos que hacer, nuestra implementación será muy sencilla.
En el siguiente enlace he publicado el código fuente de la solución planteada.  Utilicé Java para el desarrollo del mismo con apoyo de la técnica de programación TDD y del IDE Eclipse.

. Espero que te haya gustado este tutorial, nos veremos pronto.

lunes, 5 de julio de 2010

Principios del Diseño OO

LA IMITACION ES LA FORMA MAS SINCERA DE NO SER ESTUPIDO

No hay nada más satisfactorio que aparecer con una solución completamente nueva y original al problema que te ha estado causando muchos dolores de cabeza por estos días. Hasta que te das cuenta que alguien más resolvió el mismo problema, mucho antes que tú, e incluso hizo un mejor trabajo que el tuyo. En esta y otras entregas vamos a revisar algunos de los principios del diseño orientado a objetos que las personas han traído con el paso de los años y como estos, pueden hacerte un mejor programador. Dejando a un lado tus pensamientos de “Hacerlo a mi manera”, esta entrega trata de hacerlo de la forma más inteligentey más rápida.


RESUMEN DEL PRINCIPIO DE DISEÑO

En el momento de sumergirnos en la realización de una aplicación software, lo primero que hacemos es conocer o tener claro que se va hacer, a través del levantamiento de requerimientos, luego hacemos el análisis respectivo, y dibujamos el funcionamiento de nuestro sistema mediante un diagrama de casos de uso, para tener una vista general. Claro, en algún punto tendrás que escribir código ¿no es así? Y aquí es donde los principios del diseño juegan un papel muy importante.


¿QUE ES UN PRINCIPIO DE DISEÑO?

Un principio de diseño es una herramienta básica o técnica que puede ser aplicada para diseñar o escribir código, con el fin de hacer ese código mantenible, flexible, o extensible.

“El uso de principios de diseño OO ya probados, traen como resultado un software + mantenible,+flexible, y + extensible.”

A continuación vamos a estudiar y observar el uso de nuestro primer principio de diseño:


Principio de Responsabilidad Única (PRU)

Este principio trata de las responsabilidades, es decir, que cosas tienen que hacer los objetos de tu aplicación. Tu intención es que cada objeto que diseñaste debe tener solo una responsabilidad en que enfocarse, y cuando algo cambie en esa responsabilidad, tú sabrás exactamente donde buscar en tu código para hacer los respectivos cambios.

“Cada objeto en tu sistema debería tener una sola responsabilidad, y todos los servicios de ese objeto deberían estar enfocados en llevar a cabo esa única responsabilidad”

Muchas veces, tú puedes descubrir clases que no están usando el PRU con una simple prueba:

1 – En una hoja de papel, escribe líneas de la siguiente forma:
El/La [espacio en blanco][espacio en blanco] el/ella mismo(a).
Para cada método que tenga la clase.

2- En el primer espacio en blanco de cada línea, escribirás el nombre de la clase, en el segundo espacio en blanco, escribe uno de los métodos de la clase. Has esto para cada método de la clase.

3- Lee cada línea en voz alta (podrías tener la necesidad de agregar una letra o palabra para que la lectura parezca más natural) .Lo que dices parece tener sentido?. Tu clase realmente tiene la responsabilidad que ese método indica que hace?

“Si lo que has dicho parece no tener sentido, entonces probablemente has violado el PRU con ese método. El método puede pertenecer a otra clase… piensa en moverlo de lugar”




Miremos ahora un ejemplo de aplicación. Hacer el análisis del PRU a la clase Automóvil mostrada en la parte inferior.


Al realizar el PRU los resultados obtenidos aparece en la grafica de abajo.


- Tiene sentido que el automóvil sea el responsable de arrancar y parar, esa es una de la funciones de este.

- Un automóvil no es responsable para cambiar sus propias llantas, lavarse él mismo o chequear su propio combustible.

- El método conducir puede parecer engañoso, porque al decir que un automóvil arranca y para él mismo no necesariamente este también tiene que manejarse solo, en realidad el que conduce el automóvil es el conductor del vehiculo ¿no? Y esa responsabilidad es de él.

- Tú deberías haber pensado cuidadosamente acerca del método obtenerCombustible() , porque la verdad puede tener cierta ambigüedad, no se sabe que significa, pero en este caso la función de este método es retornar la cantidad de combustible que tiene el automóvil, y eso es algo que cualquier vehiculo tiene que hacer. Casos como este son el porque el análisis del PRU es solo una guía. Aún así,tendrás que hacer juicio propio y el uso de tu sentido común y experiencia.

DE MULTIPLE RESPONSABILIDADES A UNA RESPONSABILIDAD UNICA


Una vez hayas hecho el análisis, puedes tomar aquellos métodos que no tengan sentido en una clase, y moverlos a otra que si guarde relación con la responsabilidad de la misma.


Espero que este principio sea de mucha ayuda para cuando tengas que otorgarle responsabilidades a tus objetos y no sepas como hacerlo.
En las posteriores entregas presentaré el resto de los principios orientados a objetos.

sábado, 26 de junio de 2010

ALGORITMO PARA RESOLVER UNA SOPA DE LETRAS USANDO BACKTRACKING E INDICE INVERTIDO

En cierta ocasión, mi padre me llevo a conocer al hijo de un amigo, que trabaja como ingeniero desarrollador en una de las empresas de software más reconocidas en la ciudad de Barranquilla. Nos comentaba él, de los procesos por los que pasaba el aspirante para aplicar a un puesto en el área de desarrollo. Relataba que hacían una entrevista preliminar, luego les hacían una prueba psicotécnica (bastante aburrida considero yo), un test teórico, y finalmente un test de lógica algorítmica. La verdad, no estaba interesado para aplicar al puesto de desarrollador, pero me dedique a escuchar atentamente lo que decía, y me llamo mucho la atención el test de lógica algorítmica. Había pasado mucho tiempo que no desarrollaba algún algoritmo lo suficientemente sencillo y que requiriera de mucha lógica, por lo tanto se pueden imaginar como me sentía, bastante ansioso, así que le pregunté en que consistía el test de algoritmia.

De manera general, dice, la prueba era de dos horas, y básicamente el test consistía en desarrollar un algoritmo que permitiera darle solución a una sopa de letras. Luego comenzó a hablarnos de la forma en que pudo solucionar el problema. Después de tres horas de charlar con el hijo del señor Janestal, mi padre y yo le agradecimos su información, y nos fuimos. Pero me quedó una gran inquietud, me pareció bastante interesante desarrollar un algoritmo que de solución a una Sopa de letras. Así que decidí implementar mi propio algoritmo de solución. No fue sencillo, pues yo no tengo muy buenos hábitos para estas cosas, me tomó casi una semana para dar con la solución, yo creo que si hubiese aplicado al test de algoritmia en esa empresa, me hubiesen tenido que dar el mismo tiempo, 1 semana. Así que ahora quiero compartir con ustedes mi solución, y hacerles caer en cuenta que la solución, no solo implica la mejor búsqueda, sino también la mejor optimización de recursos en memoria y el mejor uso de la CPU.

Para empezar, he querido dividir esta entrega en varios capítulos donde me enfocaré en cada una de las etapas por las que tuve que pasar para solucionar el “pequeño” problema. Aquí les dejo la primera parte: analisis de dominio.

1. ANALISIS DE DOMINIO PARA LA SOPA DE LETRAS.

Para comenzar con la solución, hice un análisis profundo del avance tecnológico que existe actualmente en la solución de este tipo de puzzle (rompecabezas). Empezaré por definir que es una sopa de letras, pues para aquellos que estén interesados.

1.1 ¿QUE ES UNA SOPA DE LETRAS?

En la figura que verán a continuación, se muestra un ejemplo de una sopa de letras.


Una sopa de letras se puede definir como un juego de destreza y rapidez mental, donde se tiene que encontrar un número finito de palabras. Dichas palabras están definidas previamente en el mismo juego y están ocultas en una matriz cuadrada de letras. La búsqueda de las palabras en la matriz se puede realizar de la siguiente forma:


En la figura anterior se puede observar la forma de buscar una palabra en la matriz de letras, para este caso la palabra a buscar es “NADIE”.

1.2 ALGORITMOS DESARROLLADOS PARA LA SOLUCION DE SOPA DE LETRAS.

Haciendo mis investigaciones, y estableciendo un estado del arte de estos aspectos, me encontré con que algunas de las aplicaciones que le dan solución a una sopa de letras lo hacen por medio de la técnica llamada backtracking (vuelta atrás). Es una estrategia para encontrar soluciones a problemas que satisfacen restricciones, usada muy frecuentemente en sistema multi-soluciones. Uno de los ejemplos que podemos encontrar en la aplicación de este algoritmo para el contexto que estamos tratando, es la solución del famoso sudoku, o encontrar el camino que da la salida en un laberinto, o en un juego de ajedrez, podíamos usarlo para aplicarle cierta inteligencia artificial a la CPU. El backtracking también es usado como base lógica en sistemas de reglas de inferencia, como es el caso de prolog. Para más información, aquí les dejo de la wikipedia, más información básica, aunque no confiable, de cómo funciona esta técnica. http://es.wikipedia.org/wiki/Vuelta_Atrás.

1.3 SOLUCION ACTUAL PROPUESTA

Aunque la solución que propone el backtracking parece ser buena frente a otras alternativas de búsqueda para este tipo de aplicaciones, el tiempo de respuesta puede variar dependiendo del tamaño de la matriz. Las causas de esta característica radican en la forma de implementación, y si no se usa otra técnica que lo complemente para dar con la solución, puede consumir mayor tiempo para encontar las respuestas. Por ejemplo, si intentáramos solucionar la sopa de letra con la única implementación del backtracking tendríamos entonces que:

1-Comparar cada letra de la matriz, verificar si dicha letra es igual a la primera letra de la palabra buscada.

2-Si es igual entonces:

3-Seleccionar una de las direcciones: (ABAJO,ARRIBA, DERECHA, IZQUIERDA,DIAGONAL_INFERIOR_IZQUIERDA, DIAGONAL_INFERIOR_DERECHA, DIAGONAL_SUPERIOR_DERECHA, DIAGONAL_SUPERIOR_IZQUIERDA).

4-verificar la siguiente letra de la palabra buscada en una de las direcciones seleccionada.

5-Si es igual entonces: ir al paso 4.

6-No es igual entonces: ir al paso 3.

7-Si ya no hay mas letras que buscar en la palabra buscada, entonces la palabra ha sido encontrada en la dirección seleccionada y en la posición de letra de la matriz comparada. ir al paso 9.

8-Si ya no hay mas direcciones en donde buscar la solución entonces ir al paso 1.

9-Si existen mas palabras por buscar, Pasar a la siguiente palabra buscada.

10-No existen más palabras por buscar, entonces debemos mostrar las soluciones encontradas.

Continúa con la segunda parte de esta entrega.