martes, 31 de agosto de 2010

TabletsPC

 nec  produce  etsa  nueva  tablet 



 NEC LT-W




acer iconia





una  portatil  touch  de  doble pantalla  ,  excelente por  acer.
pagina oficial





The KNO

una tablet pc  con doble  pantalla, diseñada para  ambientes  educativos, pero bien podria servir  para muchas  cosas  mas.

pagina principal
un video 


Microsoft Courier, el nuevo tablet PC tendrá dos pantallas y cámara(aunque parece que nunca  sladra a la venta)
 pero tambien era muy interesante la propuesta.
 mas informacion

Libretto W100, el tablet PC de dos pantallas de Toshiba

 mas informacion
un video 

MSI y su tablet de 2 pantallas
MSI  en un fabricante  taiwanes


mas informacion 

lenovo ThinkPad Serie X Tablet

Procesador
Intel® Core™ i7-640LM (4M Cache, 2.13 GHz)
Sistema Operativo
Windows® 7 Professional Original
Tarjeta de Video
Intel® GMA HD
Memoria
4GB DDR3 (PC3-8500, 1066 MHZ)
Pantalla
12.1" WXGA 1280x800 LED Multitouch
Dispositivo de Puntero
UltraNav™ (Trackpoint + Touchpad)
Disco Rígido
320GB 7200rpm
Unidad Óptica
No Incluye
Batería
8 celdas Li-Ion
Conectividad
1GB Ethernet
Bluetooth
Bluetooth 2.1
Adaptador Inalámbrico
Intel® 6200 AGN
Garantía
3 años en centro de servicio
Otros
Camera 2.0MP, Lector Huella Digital, Express card + 5en1 multicard reader, WWAN upgradable


 mas infromacion


lenovo idea pad


mas informacion

lenovo Skylight

 mas informacion


 tablet pc DELL Latitude XT2


mas informacion


1. HP Pavillion TX2500Z


This Tablet truly deserves the top rank. And for that matter of fact our ED uses it in our office too.
Processor : AMD Turion 64 X2 Dual-Core Mobile Technology
RAM : up to 4GB DDR2
Graphics : ATI Mobile Radeon HD 3200
Display : 12.1″ WXGA touchscreen/active digitizer display.
2. Fujitsu LifeBook T5010




This business focused tablet is great for taking notes and giving presentations.


Display : 13.3″ WXGA widescreen with active digitizer
Processor : Intel Centrino 2
built-in modular bay
integrated wireless access
3. Lenovo ThinkPad X200



The Lenovo X200 is a solid ThinkPad focussed on business use.
Processor : Intel Core 2 Duo
Display : 12.1″ WideView Standard WXGA
Hard Disk : 80GB
Windows Vista Business
4. HP EliteBook 2730p




This updated version of 2710p is a good travel companion tablet with a great stainless steel look and solid design
Processor : Intel Core 2 Duo
RAM : up to 4GB
Hard Disk : up to 120GB 5400 rpm 1.8-inch SATA II hard drive
Dsiplay : 12.1-inch Illumi-Lite WXGA UWVA anti-glare
5. HP TouchSmart tx2z



It can functions as a notebook or a tablet PC
Processor : AMD Dual Core
RAM : Base model is equipped with 3GB memory and can be customized up to 8GB
Display : convertible, swiveling 12.1″ touchscreen
webcam
wireless Internet card
DVD burner
Digital pen included and stored in the notebook’s base for note-taking and slate function
6. Lenovo ThinkPad X61 Tablet



This is an Ultraportable Tablet meant forBusiness.
Operating System: Microsoft Windows Vista Business
Processor Name: Intel Core 2 Duo L7500
Processor Speed: 1.6 GHz
RAM: 2 GB
Weight: 4.4 lb
Screen Size: 12.1 inches
Screen Size Type: standard
Graphics Card: Intel GMA X3100
Storage Capacity: 100 GB
Networking Options: 802.11n
Primary Optical Drive: External

7. Samsung NP-Q1U/600 Tablet PC



This stuff really conveys the meaning of Tablet PC.
Processor : Intel Ultra Mobile A110 600 MHz
Display : 7 in. WSVGA TFT Active Matrix with Touchscreen
RAM : 1 GB
Hard Disk : 40 GB
Weight : 1.52 lb
Microsoft Windows XP Tablet PC
8. Fujitsu Stylistic ST5111 (FPCM35262) Tablet PC



A stylish yet powerful Tablet PC
Processor : Core 2 Duo 1.2 GHz
Display : 10.4 in. XGA TFT Active Matrix
RAM : 1 GB
Hard Disk : 80 GB
Weight : 3.5 lb.
OS : Microsoft Windows Vista
9. HP Pavilion tx2000



The Pavilion tx2110 is an Entertainment Notebook.
Capture hand-written notes
Touchscreen
twists 180 degrees for easy viewing in cramped spaces
Webcam
Built-in fingerprint reader
10. Sony VAIO® VGN-UX180P Tablet PC



This highly portable laptop is fully loaded.
Processor : Core Solo 1.2 GHz
Display : 4.5 in. SVGA TFT Active Matrix With Touchscreen
RAM : 512 MB
Hard Disk : 30 GB
OS : Microsoft Windows XP Professional

lunes, 30 de agosto de 2010

Uniones en c Sharp

Obtenido de  aqui
And about how to simulate C++ union in C# is described underneath:

In C++, Union expression is:

union UValue
{
char _cval;
int _ival;
double _dval;
};

And in C#, to apoint where the members'd be located in the memory space, we need to use StructLayoutAttribute, LayoutKind enum and FieldOffsetAttribute, which are all in the namespace System.Runtime.InteropServices.

Then, use struct to simulate the union above:

[StructLayout(LayoutKind.Explicit, Size=8)]
struct UValue
{
[FieldOffset(0)]
public char _cval;

[FieldOffset(0)]
public int _ival;

[FieldOffset(0)]
public double _dval;
}

As we know, every member of union's address starts with the same position of memory. By adding [FieldOffset(0)] to each member of UValue, we can make they share the same memory space. Of course, we must tell .NET that the distribution of these members is up to ourselves in advance by passing LayoutKind.Explicit to constructor of StructLayoutAttribute (then to UValue). In addition, explicitly set the size of UValue 8 bytes is optional. (in this case double which cost most needs 8 bytes)

martes, 17 de agosto de 2010

wordpress en java

WordPress en Java
Numiton que "traer de código abierto PHP a Java" han anunciado WordPress en Java.
El nWordPress llamado se basa en la versión 2.5.1 de la herramienta de blogs populares PHP. Está disponible bajo la licencia GPL como WordPress y aprovecha una de primavera-MVC-marco.
Otro plan numiton aplicaciones PHP en el puerto son Joomla, Drupal, así como Mediawiki, Mantis y DocuWiki. Ellos tienen una herramienta específica portar NTILE PtoJ, que afirman que puede convertir el código PHP a Java EE.
Para justificar el esfuerzo, numiton afirmación de que las soluciones PHP sufren a menudo de la calidad del código debajo del nivel óptimo, junto con herramientas insuficientes / soporte IDE, que le hace preguntarse lo difícil que es mantener y desarrollar tales proyectos.
Ellos creen que por portar el de Java EE a través de un proceso automatizado, que ganarán más fácil el mantenimiento y el desarrollo y ser capaces de establecer arquitecturas superiores y, por último herramientas superior.

traductor de codigo php a codigo java

obtenido de aqui: nTile PtoJ
La ruta más corta desde PHP a Java Numiton OFRECE Una alternativa PARA LA Migración Automatizada de la base de Código PHP. Numiton ofrece una alternativa automatizada para la migración de base de código PHP. Así, Las Aplicaciones establecidas podran beneficiarse de las Ventajas Que OFRECE Java Su Capacidad en un Nivel de empresa. Así, las aplicaciones establecidas podrán beneficiarse de las ventajas que ofrece Java en su capacidad a nivel de empresa.

NTILE PtoJ es un migrador de software automatizado que traduce el código fuente PHP en Java ™ / Java Enterprise Edition.
La aplicación resultante parece y se comporta muy parecido al original, como la estructura y la semántica son totalmente iguales

Detrás de las escenas, la calidad del código se mejora mediante la plena utilización de las capacidades de Java.
Dependiendo de las necesidades de cada proyecto, NTILE PtoJ se pueden personalizar para ofrecer sabores diferentes de salida.
Una de las aplicaciones que han emigrado de esta manera es el foro phpBB motor bien conocidas. El Resultado de la Traducción, nBB2, Poderes Nuestro Propio foro FUE y Donado recientemente una la Comunidad de Código Abierto Como El Proyecto de SourceForge.

php implementado e interpretado por java

obtenido de  aqui php interpretado por java
pagina  oficial del proyecto quercus
Quercus es una implementación de PHP 5.2 escrita totalmente en Java, algo similar al famoso Hiphop de facebook sólo que en lugar de un traductor a C++ se trata de un intérprete PHP que corre en Java.
Se ha oído hablar mucho menos de Quercus que de HipHop pero es probable que Hiphop no llegue a utilizarse tanto como ya se está utilizando Quercus.
¿En qué casos puede ser interesante utilizar Quercus?
  • Desplegar aplicaciones web en entornos muy controlados donde sólo se acepta Java o en plataformas cloud computing que no soportan PHP pero sí Java (Google App Engine).
  • Necesitar cierta mejora en rendimiento que puede suponer utilizar Quercus en ciertas situaciones.
  • Desplegar scripts PHP encapsulados en una aplicación Java.
  • Utilizar PHP como motor de scripting de una aplicación Java, desarrollando el frontend por ejemplo en Swing y dejando el trabajo sucio para los scripts PHP.
  • Integrar aplicaciones PHP desde Java. (Alfresco lo utiliza).
  • Estás aburrido, probar por curiosidad.
obtenido de :  ¿Cuál es el PHP / Puente de Java?

El PHP / Java Bridge es una aplicación de streaming, protocolo de red basado en XML, que puede ser usado para conectar un motor de scripts nativo, por ejemplo, PHP, Python o sistema, con una máquina virtual Java. Es hasta 50 veces más rápido que el local RPC a través de SOAP, requiere menos recursos del lado del servidor web. Es más rápido y más fiable que la comunicación directa a través de la interfaz nativa de Java, y no requiere de componentes adicionales para invocar procedimientos de Java desde PHP o PHP procedimientos de Java.
J2EE extremo posterior agrupación y el equilibrio de carga de Apache son compatibles, así como ejecutar scripts PHP dentro de JSP, JSF o de otros marcos.

Integración de Java y PHP

obtenido de :  Integración de Java y PHP

Introducción

Existen dos formas diferentes de integrar PHP y Java: en primer lugar, se puede integrar PHP dentro de un entorno de ejecución de servlets de Java, que en estos momentos es una solución más estable y más eficiente. La segunda opción es la de integrar Java dentro de PHP. La primera forma de integración se realiza a traves de un módulo SAPI que actua como interfaz del servidor de servlets. La segunda forma se realiza mediante esta extensión de Java.
Esta extensión de Java proporciona de forma sencilla los medios necesarios para crear e invocar métodos sobre objetos de Java desde PHP. La JVM se crea utilizando JNI y todo se ejecuta en un unico proceso.
Aviso
Esta extensión es EXPERIMENTAL. Esto significa que el comportamiento de esta extensión, los nombre de sus funciones y en definitiva TODO lo documentado sobre esta extensión, puede cambiar en una futura versión de PHP SIN AVISO. La advertencia queda hecha, y utilizar esta extensión queda bajo su propia responsabilidad.

Requisitos

Para utilizar esta extensión es necesario disponer de una máquina virtual Java (JVM) instalada en el sistema.

Instalación

Esta extension PECL no esta ligada a PHP.
En PHP 4 la fuente de las extensiones PECL pueden encontrarse en el directorio ext/ que se existe en las fuentes de PHP o en el enlace PECL de arriba. Para incluir el soporte de Java en PHP, es necesario añadir el parámetro --with-java[=DIR] a las opciones de configuración de PHP, donde DIR apunta al directorio base de instalación del JDK. Esta extensión solamente puede ser construida como un módulo compartido. En el archivo php-src/ext/java/README se incluye mas información sobre como construir esta extensión.
Los usuarios de Windows deben activar la opción php_java.dll en el fichero php.ini para poder utilizar estas funciones. En PHP 4, esta DLL se encuentra en el directorio extensions/ que existe en los binarios de PHP para Windows. Podeis descargar esta DLL de las extensiones PECL desde la pagina PHP Downloads o desde http://snaps.php.net/.
Nota: Para poder trabajar con este módulo en un entorno Windows con una versión de PHP <= 4.0.6, se debe hacer accesible el archivo jvm.dll desde el PATH del sistema. Para versiones de PHP > 4.0.6 no es necesario realizar esta operación.

Configuración en tiempo de ejecución

El comportamiento de estas funciones está afectado por los valores definidos en php.ini.

Tabla 1. Opciones de configuració de Java
NombreValor por defectoDonde se cambiaRegistro de cambios
java.class.pathNULLPHP_INI_ALL 
java.homeNULLPHP_INI_ALL 
java.library.pathNULLPHP_INI_ALL 
java.libraryJAVALIBPHP_INI_ALL 
For further details and definitions of the PHP_INI_* constants, see the Apéndice G.

Tipos de recursos

Esta extensión no tiene ningún tipo de recurso definido.

Constantes predefinidas

Esta extensión no tiene ninguna constante definida.

Ejemplos


Ejemplo 1. Ejemplo de Java
  // se obtiene la instancia de la clase de Java java.lang.System desde PHP
  
$system = new Java('java.lang.System');

  
// ejemplo de acceso a las propiedades de Java
  
print 'Version de Java='.$system->getProperty('java.version').'
'
;
  print
'Desarrollador de la JVM=' .$system->getProperty('java.vendor').'
'
;
  print
'Sistema Operativo='.$system->getProperty('os.name').' '.
              
$system->getProperty('os.version').' on '.
              
$system->getProperty('os.arch').'
'
;

  
// ejemplo de java.util.Date
  
$formatter = new Java('java.text.SimpleDateFormat',
                        
"EEEE, MMMM dd, yyyy 'at' h:mm:ss a zzzz");

  print
$formatter->format(new Java('java.util.Date'));?>
Ejemplo 2. Ejemplo de AWT
  // Este ejemplo solo puede ser ejecutado como CGI.

  
$frame  = new Java('java.awt.Frame', 'PHP');
  
$button = new Java('java.awt.Button', 'Hola Mundo de Java!');

  
$frame->add('North', $button);
  
$frame->validate();
  
$frame->pack();
  
$frame->visible = True;

  
$thread = new Java('java.lang.Thread');
  
$thread->sleep(10000);

  
$frame->dispose();?>
Notas:
  • new Java() crea una nueva instancia de una clase solamente si existe un constructor adecuado. Si no se le pasan parámetros, debe existir un constructor por defecto adecuado, como por ejemplo en el caso de java.lang.System que permite el acceso a la mayoría de sus funcionalidade a través de metodos estáticos.
  • Al acceder a los miembros de una instancia, en primer lugar se buscarán las propiedades del bean y en segundo lugar los miembros publicos. En otras palabras, print $date.time se intentará resolver en primer lugar como $date.getTime() y posteriormente como $date.time.
  • Tanto los miembros estáticos como los miembros de una instancia de un objeto pueden ser accedidos utilizando la misma sintaxis. Ademas, si el objeto es de tipo java.lang.Class, entonces se puede acceder a los miembros estaticos de la clase (tanto los atributos como los metodos).
  • Las excepciones que se lanzan durante la ejecución se transforman en avisos de tipo "warning" de PHP y en resultados de tipo NULL. Los avisos de tipo "warning" se pueden eliminar añadiendo el prefijo "@" a la llamada del metodo. Las siguientes funciones de la API se pueden utilizar para obtener y borrar el ultimo error surgido:
  • La resolución de la sobrecarga es uno de los problemas mas dificiles de resolver dadas las grandes diferencias entre PHP y Java en el tema del "tipado" de las variables. Esta extensión utiliza un metodo simple pero muy efectivo para determinar cual es la mejor decisión a tomar cuando se produce la sobrecarga.
    Ademas, los nombres de los métodos en PHP no distinguen entre mayusculas y minusculas, por lo que se aumenta elnúmero de posibilidades para elegir en las situaciones de sobrecarga.
    Una vez seleccionado el método, los parámetros se transforman si es necesario, incluso con la posibilidad de perder datos (por ejemplo, los números de tipo "double" se transforman en tipo boolean) (Nota del traductor: esta conversion parece totalmente absurda, asi que puede tratarse de un fallo de la documentación de la version original).
  • En PHP, las variables de tipo "array" y "hashtable" pueden ser utilizadas de forma indistinta. En PHP, las hashtables solo pueden incluir en las claves variables de tipo integer o string. Ademas, en Java los arrays cuyas variables son de algun tipo primitivo, no pueden contener huecos. Por ultimo, se debe recordar que este tipo de variables se pasan por valor, por lo que pueden llegar a consumir una cantidad apreciable de memoria y de tiempo.

SAPI de los servlets Java

Basandose en el mismo mecanismo que la extension de Java de PHP, la SAPI de los servlets Java permite ejecutar PHP como un servlet de Java. La ventaja más significativa de esta forma de actuar es que se aprovechan las características de "pooling" y de reutilización de recursos implementadas por la mayoría de servidores que permiten ejecutar servlets. El archivo php4/sapi/README contiene las instrucciones necesarias para compilar el modulo SAPI para los servlets Java. Notas:
  • Aunque, en principio, este código podría ser ejecutado en cualquier servidor que permita la ejecución de servlets, solo se ha probado en el servidor Jakarta/Tomcat desarrollado por la fundación Apache. Por ese motivo, cualquier información sobre la forma de ejecutarlo en otros servidores, los errores encontrados, las soluciones planteadas, etc...sera una información muy apreciada y que animamos a que los desarrolladores envien a los responsables del desarrollo del proyecto PHP.
  • Se pueden producir conflictos entre PHP y SAPI con respecto al directorio de trabajo. Mientras PHP se está ejecutando, el servidor de servlets no podrá cargar ninguna clase que se encuentre en el CLASSPATH si su ruta se especifica de forma relativa y tampoco podrá encontrar el directorio de trabajo utilizado para las tareas de administración y compilación de JSP.

Tabla de contenidos
java_last_exception_clear -- Borra la última excepción de Java
java_last_exception_get -- Obtiene la última excepción de Java

conexion php y java

obtenido de :Zend Java Bridge



Zend proporciona a los desarrolladores de Java Puente PHP con una manera de utilizar código Java existente y crear aplicaciones PHP que utilice el código Java.
El puente de Java integra el código de Java en PHP mediante la conexión del sistema de objetos de PHP con el sistema de objetos de Java Bridge.
Nota:
El puente de Java requiere que usted tenga SUN Microsystems JRE 1.4 (o posterior) o Java de IBM 1.4.2 (o posterior) instalado en su equipo. Durante (o después) de la instalación, (dependiendo del tipo de instalación, se le pide para dirigir el programa de instalación a la ubicación del JRE. Usted debe, por lo tanto, ya se han instalado JRE. JRE de 64 bits no es compatible. Más información acerca de JRE y las actualizaciones más recientes se pueden obtener desde el sitio web de Sun Microsystems.
El puente de Java PHP extensión agrega funciones que permiten crear instancias nuevas clases Java desde dentro de su script PHP. Una vez que una clase Java se crea una instancia, el Puente de Java recibe un mensaje del motor Zend para ejecutar el código Java. El puente de Java ejecuta el script y devuelve los resultados en el motor de Zend.

 
Zend Server Community Edition incluye el Java PHP Puente de Extensión y la posibilidad de reiniciar el puente de Java y configurar las opciones de Java Puente (de la instalación del servidor | Componentes).
El puente de Java es un componente opcional que se instala de forma diferente, dependiendo del sistema operativo (WIN, UNIX, MAC) y el formato método de instalación (EXE, DEB, RPM, Tarball). Una vez que la extensión está instalada y su estado es El, el código PHP puede utilizar la API de Java puente para llamar objetos Java.

 
El proceso de llamar a objetos Java en PHP se describe en el siguiente diagrama:
java_bridge.png Ventajas
El Zend Java Bridge ofrece las siguientes ventajas:

    
* Servidores de aplicaciones J2EE se puede ampliar para incluir a las ventajas que ofrece PHP (en relación con otros idiomas en la Web de activación), como el tiempo de desarrollo, reducción de tiempo de salida al mercado, reducir el TCO (Coste Total de Propiedad), etc
    
* PHP empresas centradas pueden aprovechar los servicios de J2EE que no están presentes en lenguajes de script.
    
* El PHP / Java Bridge ofrece la posibilidad de interactuar con los objetos Java normal.
    
* El puente de Java funciona sin la sobrecarga de una JVM para cada proceso Apache.
    
* El puente de Java consume una cantidad de memoria que es desproporcionadamente pequeño en relación con la cantidad de actividad que maneja. 




Related Links:
Components Working with Components
Working with the Java Bridge
Zend Java Bridge - Configuration Directives
Zend Java Bridge - PHP API
Java Bridge Use Cases

FIYI Intérprete Java ForthIsh

FIYI Intérprete Java ForthIshFiji, la ForthIsh Java Intérprete es un entorno interactivo con una sintaxis de procedimiento similares al lenguaje de programación Forth. FIYI puede cargar, introspección, y ejecutar las clases Java y métodos. uso principal de Fiji es de unidad y ensayos de los componentes de Java, o por un intérprete en un entorno de todo-Java.
FIYI trabaja en la línea de comandos, o como aplicación GUI.
encontrado aqui

BeanShell es un pequeño intérprete gratuito, integrable fuente de Java con el objeto de secuencias de comandos características del lenguaje, escrito en Java. BeanShell ejecuta dinámicamente la sintaxis estándar de Java y se extiende con las conveniencias comunes de secuencias de comandos, como los tipos sueltos, los comandos, y el cierre de método como las de Perl y JavaScript.
Puede usar BeanShell de forma interactiva para experimentación y depuración de Java, así como para extender sus aplicaciones de nuevas maneras. Secuencias de comandos de Java se presta a una amplia variedad de aplicaciones, incluyendo creación rápida de prototipos, el usuario de secuencias de comandos de extensión, motores de reglas, configuración, pruebas, despliegue dinámico, los sistemas integrados, e incluso la educación de Java.
BeanShell es pequeño y de empotrar, para que pueda llamar BeanShell desde sus aplicaciones Java para ejecutar código Java de forma dinámica en tiempo de ejecución o para proporcionar la extensibilidad de las aplicaciones. Alternativamente, puede utilizar secuencias de comandos independiente BeanShell para manipular las aplicaciones Java, trabaja con objetos Java y las API de forma dinámica. Desde BeanShell está escrito en Java y se ejecuta en la máquina virtual igual que su solicitud, usted puede pasar libremente las referencias a "vivir" objetos en secuencias de comandos y devolver como resultados.
En resumen, BeanShell es interpretado dinámicamente en Java, además de un lenguaje de scripting y el medio ambiente flexible, todo en un paquete de limpieza.
Resumen de las características

    
* Dinámica de la ejecución completa de la sintaxis de Java, fragmentos de código en Java, así como vagamente escrito en Java y otras comodidades de secuencias de comandos.
    
* Acceso transparente a todos los objetos Java y las API.
    
* Se ejecuta en cuatro modos: Línea de comandos, la consola, Applet, Remote sesión de servidor.
    
* Puede trabajar en entornos con restricciones de seguridad sin un cargador de clases o la generación de código de bytes para la mayoría de características.
    
* El intérprete es pequeño archivo de 150K ~ frasco.
    
* Java puro.
    
* ¡Es gratis!
Java dispone de evaluación:

    
* Evaluar la fuente completa de Java clases de forma dinámica, así como métodos aislados de Java, las declaraciones y expresiones.
Secuencias de comandos características:

    
* Opcionalmente variables con tipo.
    
* Siguiendo los métodos con argumentos, opcionalmente, con tipo y valores de retorno
    
* Siguiendo los objetos (el cierre de método)
    
* Interfaces de secuencias de comandos y controladores de eventos.
    
* Conveniencia de sintaxis para trabajar con propiedades JavaBean, tablas hash, y tipo primitivo envoltura.
    
* Auto-asignación de variables para emular las propiedades de archivos Java.
    
* Conjunto ampliable de utilidad y de concha comandos como
    
* Dinámica de ruta de clases de gestión, incluyendo encontrar la clase de grano recarga
    
* Carga dinámica de comando y la ruta de comando de usuario
    
* Espacio de nombres sofisticados y administración de pila de llamadas
    
* Informe detallado de error
BeanShell Usos

    
* Interactivo Java - comprobar las características de objetos, APIs y widgets GUI - "hands on".
    
* Extensión de secuencias de comandos para aplicaciones - Permita que sus aplicaciones se extienda a través de secuencias de comandos de una forma intuitiva y simple.
    
* Idiomas Macro - Generar secuencias de comandos y ejecutar macros como ellos viven en la máquina virtual con facilidad.
    
* Educación - Enseñe a Java en un manos-en, el medio ambiente en vivo
    
* Evaluador de expresiones para aplicaciones científicas, financieras y de motores de reglas - evaluar expresiones complejas con las condiciones y bucles.
    
* La depuración remota - Insertar un concierto, concha acceder desde / línea de comandos de la aplicación con sólo unas pocas líneas de código.
    
* Use BeanShell de forma declarativa para reemplazar archivos de propiedades y vuelva a colocar los archivos de configuración de inicio con secuencias de comandos reales que llevan a cabo la inicialización y configuración de complejos con la plena sintaxis de Java a su disposición.

Jython, interprete para python basado en java


obtenido del siguiente enlace:
Jython, interprete para python basado en java
Esta no es nueva noticia, sólo que me parecio curioso ver una IDE para python basada en Java.
Jython es una implementación de alto nivel para python desarrollada por completo en Java, tipicamente los interpretes para para python están escritos en C. Jython funciona de manera muy particular, ya que construye las clases de python creando un byte code que es posible ejecutarse en la Java Virtual Machine (JVM), gracias a esto es posible tener un puente entre estos dos lenguajes, las aplicaciones hechas en python puede utilizar la biblioteca de clases de Java y las aplicaciones de Java pueden utilizar scripts de python.
Jython puede ser utilizado en Java para las siguientes tareas:
  • Scripts embebidos: Los programadores de java pueden incluir las librerias de Jython en sus sistemas, permitiendo así a los usuarios finales desarrollar scripts que le añadan funcionalidad a sus aplicaciones.
  • Experimentación interactiva: Jython proporciona un interprete interactivo que puede utilizarse para interactuar con los paquetes de Java o correr aplicaciones Java. Esto permite a los programadores experimentar y depurar cualquier sistema en Java.
  • El rápido desarrollo de aplicaciones: Los programas en python son tipicamenta más cortos que los hechos en java, esto se traduce directamente en un aumento en la productividad. La interacción entre python y java permite mezclar libremente dos lenguajes.

Algunas características que separan a Jython de los demás interpretes:
  • La compilación dinámica a Java bytecodes: Conduce al mayor rendimiento posible sin sacrificar la interactividad.
  • Posibilidad de extender las clases de Java existentes en Jython: Esto permite una utilización eficaz de clases abstractas.
  • Opcional compilación estática: Permite la creación de applets, servlets, beans, etc.
  • Lenguaje Python: Combina perfecta con sintaxis muy clara. Soporta ampliamente el modelo de programación orientada a objetos modelo.
Personalmente me parece una excelente fusión, estos son dos de los lenguajes de programación que más me gustan, su portabilidad y el hecho que sean multiplataforma los hace muy amplios y potentes, ahora gracias a Jython es posible trabajarlos conjuntamente.
Leer Más: The Jython Project

jueves, 5 de agosto de 2010

herramientas para crear contenido para educacion a distancia

obtenido de  aqui
programas para crear contenidos utilizando el estándar SCORM 1.2 me dedicaré a hablar de los programas a los que considero de autoría, es decir, aquellos que te permiten ordenar e insertar los contenidos que ya has creado (imágenes, textos, animaciones, audios, videos) y generar los paquetes de contenidos.
QSAuthorEmpecemos con mi favorito, es un programa de pago hecho por una empresa española, se llama QS Author. Básicamente es un programa que permite generar los contenidos de aprendizaje con estructuras anidadas (Capítulos, Temas, Subtemas…), puede generar entornos multipáginas e integrar todos los tipos de archivos que uno comúnmente encuentra en un sitio web. Tiene una serie de plantillas de estilos integradas (basadas en CSS) que pueden modificarse o crear nuevas. Lo más interesante de esta aplicación es la posibilidad de integrar distintos tipos de cuestionarios y actividades de evaluación, ya sea de opción múltiple, de respuesta múltiple, de rellenar espacios en blanco, de relación de columnas y de respuesta de texto simple. Adicionalmente, esta aplicación genera todos los archivos necesarios para conectar con el LMS, es decir, genera todo el sistema de seguimiento que hace tan versatil al estándar SCORM. El único punto negativo que le veo es que la empresa distribuidora de este software en México tarda años en responder a una petición de compra. Más información en este vínculo.
eXeLa siguiente opción que quiero comentar es un programa llamado eXe, una aplicación multiplataforma de código abierto que permite generar paquetes de contenidos mediante una interfaz que se integra dentro del navegador Firefox. Para mi gusto es un poquito limitada al brindar muy pocas opciones de personalización e integración de elementos y estilos diferentes a los que se incluyen en las plantillas que trae por defecto. Es una aplicación ideal para aquellos que quieren generar paquetes de contenidos sin demorarse mucho en los aspectos estéticos y funcionales, entrando de lleno en materia. Tiene la opción de integrar cuestionarios de opción múltiple, agregando un elemento valioso al paquete. Más información en este vínculo.
lcdsLa siguiente opción es el Microsoft Learning Content Development System (LCDS), la aplicación de Microsoft para el desarrollo rápido de paquetes de contenido para e-learning. En lo particular, no la he utilizado mucho ni a profundidad, sin embargo, las opciones que tiene me parecen un poco complejas, como que dificultan las cosas en vez de facilitarlas. Si alguien se anima a probar esta herramienta, puede obtenerla de este vínculo.
reditorLa siguiente opción es una herramienta llamada simplemente Editor, producido por la iniciativa RELOAD (Reusable eLearning Object Authoring & Delivery), por lo que suele llamársele RELOAD Editor. Esta herramienta es una aplicación java y por lo tanto multiplataforma que sirve para organizar, agregar y empaquetar objetos de aprendizaje con base a los estándares IMS y SCORM. Es muy importante resaltar que esta herramienta no tiene opciones para generar cuestionarios ni actividades de evaluación, y que tampoco genera los elementos necesarios para que los contenidos se comuniquen con el LMS (esos se agregan a mano). Por otra parte, tienes acceso a una gran cantidad de opciones referentes al etiquetado y prerequisitos de los contenidos de aprendizaje, lo que hace que esta herramienta sea ideal para el usuario avanzado que gusta de meter mano en las variables y configuración. Más información en este vínculo.
Las siguientes aplicaciones que voy a mencionar no son herramientas de autoría ni sirven para integrar paquetes de contenidos. Se trata de un complemento ideal a cualquier entorno de desarrollo de paquetes de contenidos SCORM, ya que son aplicaciones que están pensadas para validar los paquetes SCORM 1.2, para que detectes fallos, variables que no funcionan adecuadamente, manifiestos mal estructurados y todos aquellos pequeños errorcitos que pueden ser una causa potencial de fallos mayores, y lo mejor de todo, es que se usan antes de que subas el contenido al LMS, así no dañas tu plataforma de producción.
rsplayerLa primera herramienta es el SCORM Player, producido por RELOAD. Esta herramienta es la que más utilizo para la revisión de los paquetes de contenidos que recibo y que produzco, ya que verifica la validez del archivo imsmanifest.xml , proporciona información a nivel de variables, simula la comunicación con un LMS y guarda los resultados hasta que reinicies las pruebas. Se puede obtener desde este vínculo.
adlLa última herramienta es el ADL SCORM Version 1.2 Conformance Test Suite Version 1.2.7 (Self Test), una aplicación desarrollada por ADL (los responsables de desarrollar el estándar SCORM 1.2). Incluye una serie de pruebas  muy extensas que permiten verificar la integridad de los paquetes de contenidos a todos los niveles. Como dato curioso, es casi imposible encontrar un paquete de contenidos que pase todas las pruebas de esta herramienta, ni siquiera los ejemplos de prueba que la propia ADL publica en sus páginas. Se puede descargar desde este vínculo.
Quiero cerrar este post comentando que en el mercado se van a encontrar numerosos proveedores “expertos” en e-learning y la integración de contenidos en formato SCORM 1.2 que entregan paquetes de contenidos con fallos, mal estructurados, con una organización exótica de archivos y que pretenden venderlos como sifueran la última maravilla. Mi consejo es que siempre exijan que haya un periodo de pruebas y que los contenidos pasen por las dos últimas aplicaciones que mencioné, ya que de lo contrario los “expertos” cobrarán un dineral por algo que no sirve y que tendrás que reparar por tu cuenta.

arquitectura de software basada en componentes


obtenido de La Guía de Arquitectura Versión 2.0a del grupo de Patterns and Practices de Microsoft. Para los que nos gusta en la lengua de cervantes:
ARQUITECTURA BASADA EN COMPONENTES.
Una arquitectura basada en componentes describe una aproximación de ingeniería de software al diseño y desarrollo de un sistema. Esta arquitectura se enfoca en la descomposición del diseño en componentes funcionales o lógicos que expongan interfaces de comunicación bien definidas. Esto provee un nivel de abstracción mayor que los principios de orientación por objetos y no se enfoca en asuntos específicos de los objetos como los protocolos de comunicación y la forma como se comparte el estado.
El estilo de arquitectura basado en componentes tiene las siguientes características:
• Es un estilo de diseño para aplicaciones compuestas de componentes individuales.
• Pone énfasis en la descomposición del sistema en componentes lógicos o funcionales que tienen interfaces bien definidas.
• Define una aproximación de diseño que usa componentes discretos, los que se comunican a través de interfaces que contienen métodos, eventos y propiedades.
Principios Fundamentales
Un componente es un objeto de software específicamente diseñado para cumplir con cierto propósito. Los principios fundamentales cuando se diseña un componente es que estos deben ser:
• Reusable. Los componentes son usualmente diseñados para ser utilizados en escenarios diferentes por diferentes aplicaciones, sin embargo, algunos componentes pueden ser diseñados para tareas específicas.
• Sin contexto especifico. Los componentes son diseñados para operar en diferentes ambientes y contextos. Información específica como el estado de los datos deben ser pasadas al componente en vez de incluirlos o permitir al componente acceder a ellos.
• Extensible. Un componente puede ser extendido desde un componente existente para crear un nuevo comportamiento.
• Encapsulado. Los componentes exponen interfaces que permiten al programa usar su funcionalidad. Sin revelar detalles internos, detalles del proceso o estado.
• Independiente. Los Componentes están diseñados para tener una dependencia mínima de otros componentes. Por lo tanto los componentes pueden ser instalados en el ambiente adecuado sin afectar otros componentes o sistemas.
Beneficios
Los siguientes son los principales beneficios del estilo de arquitectura basado en componentes:
• Facilidad de Instalación. Cuando una nueva versión esté disponible, usted podrá reemplazar la versión existente sin impacto en otros componentes o el sistema como un todo.
• Costos reducidos. El uso de componentes de terceros permite distribuir el costo del desarrollo y del mantenimiento.
• Facilidad de desarrollo. Los componentes implementan un interface bien definida para proveer la funcionalidad definida permitiendo el desarrollo sin impactar otras partes del sistema.
• Reusable. El uso de componentes reutilizables significa que ellos pueden ser usados para distribuir el desarrollo y el mantenimiento entre múltiples aplicaciones y sistemas.
• Mitigación de complejidad técnica. Los componentes mitigan la complejidad por medio del uso de contenedores de componentes y sus servicios. Ejemplos de servicios de componentes incluyen activación de componentes, gestión de la vida de los componentes, gestión de colas de mensajes para métodos del componente y transacciones.
Ejemplos
Tipos comunes de componentes usados en aplicaciones incluyen:
• Componentes de interfaz de usuario, como grillas, botones, etc., generalmente conocidos como “controles”.
• Componentes de ayuda que exponen un conjunto específico de funciones usados por otros componentes.
• Componentes que se no se usan con mucha frecuencia o son intensivos en recursos y deben ser actividades usando una aproximación de solo en el momento justo (Just in Time (JIT)). Estos son comunes en escenarios de componentes distribuidos o en componentes remotos.
• Componentes encolados, aquellos cuyos métodos pueden ser ejecutados de forma asíncrona usando colas de mensajes del tipo almacenamiento, entrega.


Juan Carlos Pelaez
Arquitecto de Sofware.


Links...................................................................
http://www.scribd.com/doc/14704374/Arquitectura-Basada-en-Componentes

lunes, 2 de agosto de 2010

CTDD: design by contract & Test Drive Development

aqui el articulo original   no pongo traduccion por no perder el sentido del mensaje
tal vez  lo traduzca


Contractual Test-Driven Development (DBC with TDD)



This article is written by Dave Chaplin, an IT Consultant with 10 years experience. He leads and mentors teams of developers on agile .NET projects and has extensive experience in agile development techniques, particularly Test-Driven Development. Dave can be emailed atdavechaplin@byte-vision.com.
Date: Tuesday, April 22, 2003

Abstract

Test Driven Development (TDD) is at the heart of Extreme Programming and is used to add significant quality to the programming process. It drives the development and ensures you only build what is required for a particular test case, rather than spending time developing the system for what ‘might be’ needed in the future. Productivity is enhanced since the system is continuously regression tested. Better design is achieved since writing the tests first helps to validate existing design decisions and refine and improve them.
Design By Contract (DBC) was invented by Bertrand Meyer. It adds a significant quality aspect to the design and programming process. The technique enormously improves development productivity by ensuring that what is built conforms to the defined specification. It provides clients with a precise definition of the behaviour of a component. Integrating components becomes much less painful and code bloat is reduced by removing the amount of error checking code required.
The two techniques do have some overlap and also some areas of confliction. This article discusses effective ways to blend the two techniques to further increase quality, and thus productivity, in an agile development process.

Account Deposit with TDD

Below is an overview of the techniques.
In TDD we write a test before we actually write the code. The test sets up an initial condition (like creating an instance of something). We then run some code against it, and then assert that certain conditions are true. It works like this:
Step 1: Write the test: Set up an initial condition and write some test code against it with some assertions.
Lets say I want to write an account object and then be able to deposit money into my account. Yep, our good ole friend the account object has popped up again. My test code, written using NUnit 2.0 would look something like this:
Note that, in order to be able to test the Deposit method on the Account object I needed to have a Balance property. Thus, TDD has driven out a design decision. I still haven’t written the account object yet, which is why I have the blue wiggly lines indicating it will not compile.
Step 2: Get the test to compile: To get things compiling I create an account class that does nothing, but adheres to the interface defined in the test:
[I have also added the ‘using Domain;’ line to the test class to get it to compile.]
So, now when we run the test in NUnit we get a red light because the assertion fails.
Step 3: Code until the test passes: All we do now is complete the code until the test passes:

Now, when we run the test we get a green light and we know we have completed the code.
Granted, there are some gaps in the code at this point: what happens if I try to deposit a negative amount? Well, lets say that if we try to deposit a negative amount then an exception should be thrown. [We shouldn’t really be throwing expections for business rule failures which are not exceptional circumstances, but it will help illustrate some ideas.]. The test looks like this:

I’ve thrown an application expection here, but you could define expections that are more meaningful. This test fails, so we now write the code to pass the test:

The tests now pass. There are also some additional questions you could ask. For example, can I have an overdraft? Well, if we think in terms of TDD, the only requirement we have at the moment is to deposit an amount, and we have achieved that, so we move on. That is the essence of TDD with XP. Build only what you need now. If we need to enhance things later then we will do so. We will also refactor to change the design when required, with the comfort of a suite of tests that tell us if we have broken anything.
Lets now look at how things would turn out using DBC.

Account Deposit with DBC

DBC is all about 3 things:
preconditions : things that must be true before we invoke a method.
postconditions : things that must be true after a method is invoked.
Invariants: things that must be true both before and after a method is invoked.
For our account object withdraw method we could state the following DBC rules:
Account::Deposit(decimal depositAmount)
Pre : depositAmount > 0
Post : Account.Balance = Account.Balance@pre + depositAmount
Inv : Balance > 0
For the sake of this example, I’ve just invented a requirement here that says you have no overdraft facility. This then means I have an invariant which states that the balance must always be positive.
Note also the use of the ‘@pre’ symbol. This means the value of the property before the body of the method call was invoked.
Now, lets see what this looks like in code:
C#.Net does not have DBC support built in so I’ve had to write ‘@pre’ values to local variables at the start of the method body that can be used later in the method. This is a pain.
The DBC class has a bunch of methods that simply check the assertion passed and throw an exception with the passed message if the assertion fails. You might want to define different DBC exception types if you wish to distinguish between the varying types.
I’ve not written any code to roll back the transaction if the post or invariant checks failed. This is not required, since the DBC checks are compiled out for the release version. In DBC the client (calling code of this method) is responsible for ensuring that it adheres to the precondition before it calls the method. If the client illegally calls the supplier, then the supplier makes no promises about what will happen. The behaviour is essentially undefined. This removes the need to put lots of exception catching code in the client. If you wish to leave the DBC checks in at run time you can, but if one fails there is no much you can do about anyway. The system has a fault, and needs to be fixed.

Comparison of TDD and DBC

Both sets of code using TDD and DBC pass the tests.
During TDD we design for the specific (what we are building now) whereas in DBC we think more generally about the object itself regardless of who uses it. The focus is wider. The two methods conflict. With TDD we have a very narrow focus, which enables us to quickly build what is required now, whereas with DBC we have a danger to wander off into the ‘what if’ cases.
If the methods require precondition checks then TDD requires you to write a test for each condition which can result in an exponential explosion of tests when the number of preconditions increases. You also need tests for the edge cases. With DBC you don’t get that explosion at all since the precondition deals with the general case. The same argument can be used for invariant checking.
Because you are continuously testing TDD builds extra quality into the programming process by ensuring that breaks in the code do not occur as changes are introduced. DBC does not give you that comfort, although you may well have an automated test harness you can run. With TDD, the harness pops out as part of the process.
Using DBC precondition checks and the DBC method means that client code does not have to check for exceptions thrown due to preconditions failing. With the way I’ve used TDD it means the client code has to be aware of the exceptions that can be raised. Granted, this is a weak argument, since you could turn off the precondition checks in TDD for production code.
Both TDD and DBC force design decisions to ensure client code can check a methods preconditions before it is called. This is good design, which ensures that the calling code can change it’s behaviour if the supplier is not going to pass the preconditions. For example, rather than trying to withdraw a negative amount the user could be redirected to an area of the application that offers the ability to apply for a loan. This is more powerful than trying to capture an exception then change the behaviour based on that exception. Although the last statement is more to do with using exceptions for the right purpose than TDD and DBC driving the proper use of exceptions.
So, given the above arguments, and my experience of using the two techniques together I believe the techniques I describe below effectively combine TDD and DBC into what I loosely call Contractual Test Driven Development (CTDD).

Contractual Test Driven Development (CTDD)

The follow points below are guidelines for doing contractual test driven development.
  • Do not write tests for negative behaviour. Use a DBC precondition check instead which can be compiled out at run time.
  • Use post condition checks if you want, but don’t re-write the whole body of code. [ if you work with a DBC supported language, like Eiffel.Net, I would suggest using full DBC and derive generalised post conditions from your TDD assertions. This is just an idea though, I’ve not actually tried it in practice. It could reduce the amount of test code.]
  • Use Post conditions where you can without re writing the whole body, or have to then introduce a lot of code because your language does not support DBC.
  • Turn off DBC checks for production if performance is an issue.
  • Leave DBC checks in the code if the system is life critical.

Benefits of CTDD

The benefits from TDD are:
  • building only what is required now. Keep it simple and well focused.
  • a suite of automated tests for effective refactoring, continuous integration and regression testing.
  • Design decisions are driven from the tests.
The benefits from DBC are
  • the code quality is higher due to the precondition checks.
  • you do not need all the checking code in the production code which forces code bloat.
  • design decisions are driven from the preconditions.
  • cleaner code since there is no need for checking code in the method body.

CTDD In Practice

The CTDD technique was developed in practice, rather than theory, by an XP team that I am currently leading. We started with some “interesting ideas” about how it could be done, some of which were clearly flawed when it came to actually trying them out. The methods I describe herein are now practiced by the team wholeheartedly and we have found that adding DBC to the TDD equation has significantly increased the quality of the code, particularly the refactoring and debugging activities.
A sincere acknowledgement goes to Duncan Green, who helped develop and practice these ideas during the agile development at Freshfields Bruckhaus Deringer. Duncan is a superb technician and designer, and pragmatist who has a shared interest good design and high quality.

Closing Comments (A Dose of Reality)

Whilst I’ve coined the phrase CTDD here, I’m certainly not going to try and pretend that I’ve invented something new, by any stretch of the imagination. TDD, DBC and the use of assertions were invented years ago. What I’ve described in this article are observations of how, in practice, I’ve personally managed to combine the techniques.
Happy developing (not debugging!).
Dave Chaplin


Generate meaningful unit tests quickly & easily


Last time, I introduced the topics of TDD and DBC. These techniques lead you to:
  • define what it is you are trying to build,
  • create test cases to see if you are building what is required (and no more), and
  • iteratively and incrementally verify that the code you are writing is correct.
Never fear - I wouldn't expect you to do all this without any help. Awhile back, I checked out multiple tools to help with this effort. The one I chose as the best for this situation was Instantiation's CodePro.


Note: CodePro can create test cases for existing code too! It does a great job of testing based on your current design. It parses the code as well as actually running it to examine the behavior of your system. So, these techniques can be used with new or existing efforts.

CodePro works with Eclipse and uses JUnit. Both of these are free. For more information about JUnit, I recommend JUnit Recipes by Rainsberger.

UML Model

We are going to go through a relatively simple example of how to use CodePro to generate meaningful test cases for your designs. The package we are going to target is the event package, as shown in this Unified ModelingLanguage class diagram:
Note: if you don't know UML, I recommend Applying UML and Patternsby Larman and UML Distilled by Fowler. This diagram was created using MagicDraw, which is an excellent product.

I have noted the classes and methods that I will show assertions for:
  • Loggable
    The ability to take part in a SystemEvent.
    @invariant (getEventString() != null && getEventString().length() > 0)
    @invariant (getEvents() != null)
  • Loggable.add()
    Add anEvent to my events. Throw an Exception if anEvent is not one of my
    validEventTypes.
    @throws Exception
    @post (getEvents().contains(anEvent))
  • UpdateEvent()
    Constructor
    @throws Exception
    @pre target instanceof Loggable
    @pre EventType.contains( type )
    @pre attributeName != null && attributeName.length() > 0
    @pre oldValue != newValue
  • SystemEvent.getType()
    @return a String to uniquely indicate my type
    @post ($ret == type)
Note that Loggable is an interface. CodePro is smart enough to use the concrete implementors to test the assertions forLoggable!

In some complex portions of the design, CodePro cannot figure out how to create valid instances for the test fixtures. In this case, you can provide a <className>Factory class in the<projectName>Test project with static methods that return valid instances. You find these situations when you encounter aNullPointerException when running a test case and the test fixture has null(s) in its logic.

Process

The process we will follow looks like this:


Assertions are entered into our modeling tool, such as MagicDraw, as comments on the classes (for invariants) and methods (for pre and post conditions). These are carried over to our IDE (Eclipse in this case) as JavaDocs. The assertions can be edited or entered in the IDE as needed, with roundtrip engineering updating our model. 


The generated test cases
We then use CodePro to generate test cases from our Java code. Here's some of what we'd get for LoggableTest:
/**
* Return an instance of the class being tested.
* @return an instance of the class being tested
* @see Loggable
* @generatedBy CodePro at 1/18/06 1:33 PM
*/
public Loggable getFixture7()
throws Exception
{
if (fixture7 == null) {
fixture7 = new TestOrder(...);
}
return fixture7;
}
/**
* Return an instance of the class being tested.
* @return an instance of the class being tested
* @see Loggable
* @generatedBy CodePro at 1/18/06 1:33 PM
*/
public Loggable getFixture8()
throws Exception
{
if (fixture8 == null) {
fixture8 = new Specimen( SpecimenNumberFactory.sampleSpecimenNumber(), new PatientRole(PersonFactory.heathcliffPeterman()...);
}
return fixture8;
}

/**
* Run the void add(SystemEvent) method test.
*
* @targetAssertion @post (getEvents().contains(anEvent))
* @targetAssertion @invariant (getEvents() != null)
* @targetAssertion @invariant (getEventString() != null && getEventString().length() > 0)
* @generatedBy CodePro at 2/24/06 10:57 AM
*/
public void testAdd_fixture28_5() throws Exception {
Loggable fixture = getFixture28();
SystemEvent anEvent = new UpdateEvent("Anäßt-1.0.txt", (Loggable) null, "Anäßt-1.0.txt", "Anäßt-1.0.txt", "Anäßt-1.0.txt");
fixture.add(anEvent);
// add test code here
assertTrue(fixture.getEvents().contains(anEvent));
assertTrue(fixture.getEvents() != null);
assertTrue(fixture.getEventString() != null && fixture.getEventString().length() > 0);
}
Note that both concrete implementors of Loggable (TestOrder and Specimen) are used as fixtures! Also note that, when available, our factory static methods are used.

All our assertions are being tested. If we change them, we can just regenerate the affected objects (method, class, package, project).

CodePro and JUnit provide tools to run the test cases, see the results, fix any problems, rerun the tests, ... This supports TDD. 

But that's not all: CodePro also will parse, run, and create test cases for existing code too:

From EmployeeEfficiencyReport.java
 (the concrete subclass chosen for this test case)
/**
* Method getParameters.
* @return my parameters to my BIRT design
*/
protected HashMap getParameters() {
HashMap params = new HashMap();
params.put("department", department);
params.put("dateRange", dateRange);
return params;
}

From ReportTest.java
/**
* Return an instance of the class being tested.
* @return an instance of the class being tested
 * @see Report
  * @generatedBy CodePro at 2/24/06 11:36 AM
   */
   public Report getFixture5() throws Exception
    {
        if (fixture5 == null) {
            fixture5 = new EmployeeEfficiencyReport(new Department("", ""), 
                   new DateRange(new GregorianCalendar(1999, 11, 31, 23, 59, 59),
                   new GregorianCalendar(1999, 11, 31, 23, 59, 59)));
        }
        return fixture5;
    }
/**
     * Run the java.util.HashMap getParameters() method test.
     *
     * @generatedBy CodePro at 2/24/06 11:36 AM
     */
    public void testGetParameters_fixture5_1()
        throws Exception
    {
        Report fixture = getFixture5();
        java.util.HashMap result = fixture.getParameters();
        // add test code here
        assertNotNull(result);
        assertEquals(2, result.size());
        assertTrue(result.containsKey("dateRange"));
        assertTrue(result.containsKey("department"));
    }
You can see that I didn't have any assertions - CodePro just parsed and ran the code and figured out what to test! How easy is that! (Hope you don't want to hold onto your old excuses for not unit testing adequately.)

This has been a short (well, not that short) look at a process and tools to use TDD on your project in a way that makes you more productive, rather than a drag on productivity.


CodePro Guidelines

As with any product, there are some lessons you learn along the way. These are mine, in no particular order:
  • Turn off the verification preference
Window / Preferences / CodePro / JUnit, Test Methods tab, Test Verification group - uncheck "Mark new test methods as unverified"

If verification is active, every test case will have a "fail(unverified)" line at the end. EPT does have a menu action to verify test cases so make it easy to eliminate these lines. Their thinking is that you should check out every test case to make sure it is doing the right thing. Considering that one class will have many test cases, I choose to take my chances with their generated code. I tend to look at a few of them, but nowhere near all of them.
  • Keep the default preferences (other than ones specifically listed here).
This will result in a project named Test with packages named exactly as those being tested. The classes in the packages are named Test. Note: you must leave the "Design by Contract" options selected or else your test cases will not test your assertions!
  • If you edit a test case, e.g. to add logic not generated for you, then you should delete the comment line that includes "@generatedBy CodePro".
This will keep CodePro from replacing that test case if another generate action is taken.
  • If you have not edited test cases, delete the test class(es) before regenerating test cases.

This will make the generate action run much faster, since it doesn't have to check for edited logic that must be preserved.
  • Before deploying, the code should be "uninstrumented" to remove unnecessary logic during production.
CodePro includes code coverage collection and reporting. Instantiations is able to collect coverage information because they "instrument" the code (add metric collection logic to the .class files).
  • Create Factory classes in the Test
  • project for cases where CodePro doesn't handle complex situations as well as you'd like.
If you have complicated business objects with nested compound collaborating objects, CodePro may use a meaningless String or even null for portions. If you create a factory class in the test project, CodePro will use it in the generated test cases. The factory class should be in the package with the same name as the real class' package and should have static methods (e.g. public static Person aCustomer() { ...} ) to return a valid instance. The Instantiations folks are working on enhancements that will flag when they had to use null.
  • Generate test cases even if an Exception is thrown.
Preferences/CodePro/JUnit, Execution tab, "When an exception is thrown, generate a test method:", select "always". If you don't do this, you will have situations where you are scratching you head as to why there are no test cases generated for a class. When you select "always", you can run the tests, see the Exception and resolve the problem without having to guess what's wrong.

  • Add or edit Design by Contract (DBC) tags if you have additional business rules you want tested or the DBC tags are erroneous. Instantiations is working on an enhancement to indicate when an assertion has invalid syntax (Eclipse ignores the assertions).
Tags should be in the same place you would put JavaDoc tags. The tags currently supported by CodePro are:
  • @pre
This tag is used to indicate a precondition, i.e. something that should be true (or false) upon entry to a method. This tag can only be used for methods. For example:
@pre (aName != null && aName.length() > 0)
  • @post
This tag is used to indicate a postcondition, i.e. something that should be true (or false) after a method executes. This tag can only be used for methods. For example:
@post specimens.contains( newSpecimen )


  • @inv(ariant)
This tag is used to indicate something that should always be true (or false). This tag can only be used for classes. For example:
@inv (numEmployees >= 0)
The variables used within these tags' expressions currently supported by CodePro are:

  • $ret
This tag is used to test a return value. This tag can only be used for methods. For example:
@post ($ret == type)
  • $pre
This tag makes use of a value upon entry to a method. This tag can only be used for methods. For example:
@post count == $pre(int, count) + 1
  • $result
This tag is used to check a non-void return from a method. This tag can only be used for non-void methods. For example:
@post ($result != null)

Note: Be careful how you specify assertions or EPT will generate compile errors in the test cases! Syntax checking of assertions in JavaDocs will be added in a future release. Until then, watch your parentheses, method name spelling, …

Troubleshooting

Symptom: You are getting a NullPointerException where you shouldn't.
Possible reason: You may need a Factory class. Look for nullin your fixture code to determine where.

Symptom: You don't get test cases where you should.
Possible reason: You might have a problem with a (super)class at load or construction time. Check static blocks, constructors, and variable initialization.

Symptom: There are errors in the test cases.
Possible reason: Your assertions may have a syntax error. Look at related pre, post, or invariant lines.

Symptom: All your test cases are failing, when some should pass.Possible reason: Make sure Preferences/CodePro/JUnit, Test Methods tab, Test Verification is unchecked. Alternatively, verify the test cases from the Test Case Outline view.

Symptom: Test results seem to be based on old code.
Possible reason: A class' source is out of sync with the binary file. If you have not edited the test case logic, delete the ClassNameTest class and regenerate it. If you have edited the test case logic, try forcing a rebuild of the Test project.


1 comments links to this post 

TDD using DBC




Test Driven Development usingDesign bContract


TDD

Test-Driven Development Cycle in general involves these steps:
  1. Write the test
  2. Write the code
  3. Run the automated test
  4. Refactor
  5. Repeat
This is a laudable process to aspire to. The problem is that unit testing is time-consuming and arduous without help. For Java developers using Eclipse as their IDE, there is a solution (read on).

Note: A good book on TDD is Agile Java by Langr.

DBC

Design by Contract has a history that goes back to the 1980s with work by Bertrand Meyer. The primary pragmatic idea we will use today is the concept of an assertion. There are three types of assertions:
  1. Precondition
  2. Postcondition
  3. Invariant
The goal is to specify business rules that must be enforced for the services to take place.
Precondition
precondition is a condition that must hold true before a method can be executed. The format is:


@pre (boolean expression)

Examples

  • @pre !isCancelled()
    This might be used to make sure an Order can be modified.
  • @pre quantityOrdered > 0
    This might be used to make sure an amount being Ordered is a positive integer.
Postcondition
postcondition is a condition that must hold true after a method is executed. The format is:


@post (boolean expression)

Examples

  • @post ($ret == (inventory.contains(aProduct))
    This can be read as "answer whether my inventory contains a product". It may be an assertion on the Business.sells( aProduct ) method.
  • @post savingsAcct.getBalance() ==$pre(savingsAcct.getBalance()) - anAmount
    This business rule checks to make sure that after theSavingsAccount.withdraw( anAmount ) method that the balance is debited correctly.
Invariant
An invariant is a condition that must always hold true for a class. The format is:


@inv (boolean expression)

Examples

  • @inv balance >= 0.0
    This would certainly be a rule for Accounts in a banking application.
  • @inv number.length() == 9
    This would be a rule for a SocialSecurityNumber class.

Development Process using TDD and DBC

To use the assertions we've been discussing, put them in as comments into your modeling tool or in JavaDocs in your IDE.

Alright - that's a lot of information to digest before actually doing anything productive. In my next post, I'll introduce a tool to automate much of the heavy lifting, making TDD a real possibility on your project.



links.....................................
un link sobre TDD en DbC

un video de  TDD en Dbd (en ingles)