miércoles, 27 de abril de 2011

Sistemas distribuidos

Semana 12
Clase de Programación Orientada a Objetos


Sistemas distribuidos
Se podría definir un sistema distribuido por un conjunto de computadoras que aunque están separadas físicamente y conectadas entre sí por una red, cada computadora tiene sus componentes de software y hardware que el usuario percibe como un solo sistema. El usuario puede acceder a recursos remotos de la misma forma que puede manejar recursos locales, o un conjunto de maquinas que usan un software para conseguir un objetivo común.

Los sistemas distribuidos tienen que ser confiables es por eso que si un componente del sistema de descompone otro componente debe poder reemplazarlo, a esto se le conoce como tolerancia a fallos.

Los tamaños de sistemas distribuidos pueden variar, a esto se le conoce como escalabilidad, es decir pueden ser para una red de área local, metropolitana o Internet.

Características
  • Seguridad en el sistema distribuido
  • Se ejecuta en muchas computadoras
  • Interacción entre los equipos
  • Software diseñado para ser compatible con varios usuarios y sistemas operativos
  • Compatibilidad entre los dispositivos conectados

RMI
RMI(Java Remote Method Invocation) es un mecanismo de Java que llama a un método de forma remota. Es parte de el entorno de ejecución en Java y proporciona una manera sencilla para la comunican de servidores en aplicaciones distribuidas basadas en Java.

En otros lenguajes se puede utilizar CORBA o SOAP en vez de RMI.

La característica de RMI es la facilidad de su uso en la programación por estar diseñado en Java, se puede pasar objetos por referencia, recolectar basura y paso de tipos arbitrarios.

Con RMI, un programa en Java puede exportar un objeto y así estar accesible en la red, entonces el programa permanece esperando peticiones de un puerto TCP. Con este método un cliente podrá conectarse i llamar métodos dados al objeto.

La invocación tiene los siguientes pasos:
  • Encapsulado de los parámetros.
  • Invocación del método.
  • El servidor manda alguna respuesta.
  • El cliente recibe la respuesta y puede utilizarlo.

Serialización
La serialización es un proceso de calificación de un objeto en un medio de almacenamiento ya sea un archivo o un buffer de memoria con el propósito de mandarlo a través de un conexión de red como cadenas de bytes o un formato mas legible como XML.

Esta es una forma muy común de para pasar objetos a través de la red, para hacer persistente un objeto en un archivo o base de datos, o para distribuir objetos idénticos a varias aplicaciones.

Algunas ventajas son:
Un método para checar el cambio en variables con respecto al tiempo
Un método de persistencia de objetos
Un método para la distribución de objetos.

Socket
El socket es concepto abstracto en el cual dos programas programas pueden pasarse datos de manera ordenada.
Un socket se constituye de dos direcciones, una IP y una REMOTA, un protocolo de transporte un par de números de puerto local y remoto.
Los sockets permiten implementar un cliente-servidor. La comunicación debe ser iniciada por uno de los programas que se denomina programa cliente y el segundo programa se mantiene esperando a que el programa cliente inicie por eso se llama servidor.

En mi proyecto
En mi proyecto puedo implementar un pequeño ejemplo que utilicé algunos de estos métodos, lo que se me ocurre es que varias personas puedan dibujar online al mismo tiempo, para esto quiero utilizar algunas propiedades de Javascript y HTML5 como son los socket utilizando Websockets y la serialización :
"Con HTML5 contamos con una nueva técnica para almacenar datos persistentes en el navegador cliente. Cuando HTML5 esté ampliamente extendido podremos hacer uso del API DOM Storage de HTML5 con el cúal los datos persistirán entre sesiones sin tener que usar las limitadas cookies (4KB por cookie). Con el API DOM Storage y los métodos JSON#stringify y JSON#parse podremos almacenar objetos complejos de un modo muy sencillo."

Este es un ejemplo de página en donde varias personas pueden dibujar online:
http://william.hoza.us/graffiti/




Bibliografía

http://es.wikipedia.org/wiki/Sistema_distribuido
http://es.wikipedia.org/wiki/Serializaci%C3%B3n
http://www.inmensia.com/blog/20110125/html5_web_sockets.html
http://notasweb.com/articulo/javascript/persistencia-de-objetos-javascript-en-html5.html



domingo, 10 de abril de 2011

Diseño de pruebas unitarias

Semana 11
Clase de Programación Orientada a Objetos

Una prueba unitaria es la manera de probar el buen funcionamiento de un módulo de código. Esto sirve para asegurar que cada uno de los módulos funcione correctamente independientemente uno del otro.

El objetivo es escribirle casos de prueba a cada método en el módulo de forma que cada caso sea independiente de lo demás.

Las pruebas unitarias sirven para utilizar otro código fuente llamado directamente a los métodos de una clase, pasando los parámetros necesarios y después, si se incluyen instrucciones Assert se pueden comparar valores esperados, los métodos de las clases unitarias se basan en clases Test, que se almacenan en archivos de código fuente.

Características de las pruebas unitarias
Las pruebas unitarias deben cumplir con los siguientes requisitos para que sean buenas:

  • Automatizable: Es decir no se debería hacer manualmente.
  • Completas: Deben de contener la mayor cantidad de código.
  • Repetibles: Se deben crear pruebas para ejecutarlas varias veces.
  • Independientes: La ejecución de una prueba no tendrá nada que ver con la ejecución de otra prueba, deben ser independientes.
  • Profesionales: Las pruebas deben ser tomadas en cuenta con la misma importancia que el código, con documentación, etc.


Ventajas
El objetivo de las pruebas unitarias es aislar cada parte del programa y probar su correcto funcionamiento, estas pruebas individuales proporcionan 5 ventajas básicas:

  • Fomentan el cambio: Facilitan al programador encontrar errores para así poder reeprogramar el código.
  • Simplifica la integración: Ya que si el código funciona correctamente indivdualmente se facilita más adaptarlo para las pruebas de integración.
  • Documenta el código: En dónde las propias pruebas unitarias son documentación del código ya que se puede ver como utilizarlo.
  • Separa la interfaz y la implementación
  • Los errores son más fáciles de encontrar

Limitaciones
Se debe de saber que las pruebas unitarias no descubrirán todos los errores del código. Ya que sólo prueban unidades por si solas. Entonces no son capaces de descubrir errores de integracion, problemas de rendimiento, entre otros.

Pruebas Unitarias para mi Proyecto en Javascript y Html5

Para esto lo primero que hice fue descargar JsUnit:



después descomprimimos el "jsunit2_2.zip", ahora dentro de la carpeta descomprimida tenemos varios archivos y carpetas interesantes por ejemplo: tenemos una carpeta llamada "tests" con muchos ejemplos útiles que podemos correr, y tenemos el archivo llamado "testRunner" que es en dónde probaremos nuestro código.
"testRunner.html"

Carpeta "tests"


Después también encontré otra herramienta para pruebas unitarias que me ha gustado un poco más se llama Qunit, y es muy fácil de intalar solamente se tienen que descargar dos archivos uno .js y otro .css para poder ver el resultado de tus pruebas unitarias.
Así es como se ve:


Y en la siguiente entrada aplicaré estos conceptos a mi proyecto.


JsUnit:
http://www.jsunit.net/

Bibliografía:
http://es.wikipedia.org/wiki/Prueba_unitaria
http://msdn.microsoft.com/es-es/library/ms182517(v=vs.80).aspx

sábado, 9 de abril de 2011

Implementación de pruebas unitarias

Semana 11
Taller de Programación Orientado a Objetos


Para empezar les voy a mostrar un ejemplo de pruebas unitarias que lo que hace es verificar si el valor es un string o un número:
El código:


La prueba:





Y en mi proyecto hicé esta pequeña prueba que decia si el objeto devuelto era el esperado, como líneas, círculos...etc.
Este es el código:




Y esta es la prueba:



Podemos ver que todas pasaron a prueba sólo en el módulo 4 no dónde se esperaba un valor de retorno de false y llegó true.

Saludos.

viernes, 1 de abril de 2011

Identificación de eventos, excepciones y errores

Semana 10
Clase Programación Orientada a Objetos


Excepciones

El manejo de excepciones es una estructura de control en la programación creada para manejar situaciones anormales que pueden ser tratadas por el mismo programa que se desarrolla.

Es decir un programa podría admitir cierta cantidad de errores y continuar su proceso produciendo el mejor resultado que le es posible en vez de una salida desagradable que este llena de mensajes que puede que el usuario no entienda.
Muchas veces se soluciona con algún mensaje informativo y se termina; otras veces es una indicación de que se necesita cambiar la forma de resolución del problema.
Muchos lenguajes incluyen el manejo de excepciones, y javascript no es la "excepción".

Las excepciones son imprevistos que ocurren durante la ejecución de un programa.
Su objetivo, es separar el código para manejar errores de la lógica de aplicación del programa. Cuando ocurre una excepción lo que se hace es seguir la ejecución del programa hasta encontrar algo que maneje esa excepción, el cual en ese momento tomará el control de la aplicación.

En Javascript, manejar errores resulta muy necesario ya que presenta dificultad natural para testear aplicaciones. Por lo generar los errores en Javascript son poco informativos, especialmente en IE. Por lo que es muy interesante contar con operadores que permiten lanzar nuestros propios y particulares mensajes indicando que algo salió
mal.

Las excepciones pueden hacerse con:

Throw

La manera mas sencilla de lanzar errores es utilizando throw. Este comando nos permite mandar al navegador un evento similar al que ocurre cuando pasa algo imprevisto o hay un tipo inesperado de datos. El lenguaje permite enviar todo tipo de elementos, incluyendo texto, números, valores booleanos o incluso objetos. Pero la opción más usual es enviar el objeto nativo Error.

Try/Catch

Es una estructura en javascript que permite comprobar el flujo de un programa con comportamientos inesperados. La diferencia entre throw y try/catch es que throw detiene completamente la ejecución mientras que catch realiza una acción determinada frente a los errores para proseguir después con el flujo definido.

Este tipo de excepciones se estructuran con un código que evalúa una condición previa y propone una ejecución predefinida y otra alternativa frente a anormalidades.

En mi proyecto...

He estado pensando mucho las excepciones que podría manejar mi proyecto sin embargo me ha sido muy difícil pensar en alguna puesto que aun no llego a un punto avanzado de mi proyecto, se me viene a la mente quizá cuando el usuario quiera usar una fotografía de algún álbum de un amigo y que al momento de cargar el álbum por paint la foto aún este ahí pero a la hora de seleccionar esa foto en partícula ya no este entonces obviamente javascript ya no podrá acceder a ella, ya que no se encuentra en la memoria, pero me resulta difícil comprobar si de verdad pasaría eso, o si son excepciones que facebook ya maneja por defecto.

Entonces he pensado en esta otra, es una excepción para cuando el navegador web no soporta el elemento "canvas", entonces se mandaría un mensaje al usuario sugiriendo que utilicé otro navegador como Chrome o algo así.


Errores

Los errores comunes en javascript pueden ser "errores de ejecución" que ocurren cuando se están ejecutando los scripts, por ejemplo la llamada a alguna función que no ha sido definida.

La otra forma en la que Javascript muestra un error puede variar de un navegador a otro. En versiones antiguas algunos navegadores como IE y Netscape lanzaban al usuario una ventanita con el error y un botón de aceptar. En la actualidad estos errores se mantienen más ocultos para el usuario, ya que es molesto que salgan esos mensajes de error cuando puede ser que el usuario no se de cuenta de que estén ocurriendo.

Se pueden tratar también con try/catch.


En mi proyecto...


Una aplicación para mi proyecto podría ser cuando el usuario entró a la aplicación con acceso a internet, pero después dejo de tener acceso a internet, entonces la aplicación web que funciona cuando se tiene internet dejará de funcionar. Esto lo podré detectar con un script en Javascript que comprueba la conexión a internet queriendo cargar una página confiable tipo "wikipedia" o "google".

Otro enfoque de errores en mi código Javascript es un poco complicado ya que por ejemplo, cuando pruebo mi código y hay algún error el navegador simplemente no me muestra nada. Entonces tengo la opción de gestionar los errores utilizando el evento onerror que se lanza siempre que se produce un error en
el código Javascript.


Eventos


Los eventos es todo lo que permite la interacción con el usuario, se produce mediante la captura de eventos que se produce.

Los eventos se capturan mediante los manejadores de eventos, el proceso que se realiza se captura mediante funciones en Javascript que se llaman "manejadores de eventos"
Cuando un usuario visita una página web e interactúa con ella se crean eventos y con Javascript se puede definir que es lo que se quiere que ocurra cuando se producen los eventos.

Con los eventos podemos responder a las acciones de los usuarios. Ejemplos de manejadores de eventos:
  • onAbort
  • onBlur
  • onChange
  • onClick
  • onDragDrop
  • onMouseMove
  • onMouseOut
  • onMouseOver
  • onMouseUp
  • onError
Entre muchos otros.

En mi proyecto...

En mi proyecto estoy manejando ya varios eventos como:

  • onMouseOver:Este evento me sirve para saber cuando se esta pasando el mouse dentro del elemento canvas.
  • onMouseOut: Este manejado lo utilizo para saber cuando el mouse esta fuera del elemento canvas.
  • onClick: Y este otro será quizá el evento más utilizado en el proyecto me indica cuando el usuario a dado algún click en el elemento canvas, así como en botones, radios, etc., etc.

  • Y me faltan implementar alguos otros como drag-and-drop
En la próxima entrada implementaré algo de código para cada evento, excepción y error.