Translate

domingo, 27 de diciembre de 2009

JavaFX Script


JavaFX Script es un lenguaje scripting desarrollado por Sun Microsystems, que forma parte de la familia de tecnologías JavaFX. JavaFX permite crear aplicaciones web para escritorio, navegadores, dispositivos móviles, etc.

JavaFX Script es un lenguaje de scripting altamente productivo que permite a los desarrolladores de contenido crear multimedia y contenido para plataformas en ambientes java. JavaFX Script es un lenguaje de programacion declarativo, tipado estaticamente. Tiene funciones de primer clase, sintaxis declarativa, comprension de listas y evaluacion incremental dependiente. Puede hacer llamadas directas a cualquier API de Java que exista en la plataforma

Veamos unos ejemplos de este lenguaje:
Strings:

var nombre = 'Pepe';
var s = "Hola {nombre}"; // s = 'Hola Pepe'

var respuesta = true;
var s = "La respuesta es {if respuesta then "Si" else "No"}";
// s = 'La respuesta es Si'

Arreglos:
var unoACien = [1..100];
var tamanio = sizeof unoACien; // tamanio == 100
var porTres = [1*3, 2*3 .. 10*3]; // [3,6,9,12,15,18,21,24,27,30]
tamanio = sizeof porCien; // tamanio == 10

var nums = [1,2,3,4];
var numsMayoreQueDos = nums[n|n > 2]; // resulta en [3,4]
var numsMenosLosDosPrimeros = nums[n|indexof n > 1];
// resulta en [3,4]

var x = [1,2,3];
insert 12 into x; // resulta en [1,2,3,12]
insert 10 as first into x; // resulta en [10,1,2,3,12]
insert [99,100] as last into x; // resulta en [10,1,2,3,12,99,100]

var y = [1,2,3];
insert 10 after y[n|n == 3]; // resulta en [1,2,3,10]
insert 12 before y[1]; // resulta en [1,12,2,3,10]
insert 13 after y[n|n == 2];
// resulta en [1, 12, 2, 13, 3, 10];
delete x[n|n == 12]; // resulta en [1,2,3,10]
delete x[n|n >= 3]; // resulta en [1,2]

var a:Integer* = select n*n from n in [1..10];
// resulta en [1,4,9,16,25,36,49,64,81,100]

var a:Integer* = select n*m from n in [1..4], m in [100,200] where (n%2 == 0);
// resulta en [200, 400, 400, 800]

Formateado:
100.896 format as <<%f>>; // resulta en '100.896000'
31.intValue() format as <<%02X>>; // resulta en '1F'
var d = new Date();
d format as <>; // resulta en '2005-10-31T08:04:31.323-0800'
0.00123 format as <<00.###e0>>; // resulta en '12.3E-4'

sábado, 19 de diciembre de 2009

RestTemplate en Spring 3

La clase RestTemplate es la principal clase de spring para acceso http del lado cliente. Conceptualmente es similar a JdbcTemplate, JmsTemplate y a otros templates proveídos por spring.
Los principales metodos del template tienen el nombre de los metodos Http:

HTTP RestTemplate

DELETE delete(String, String...)

GET getForObject(String, Class, String...)

HEAD headForHeaders(String, String...)

OPTIONS optionsForAllow(String, String...)

POST postForLocation(String, Object, String...)

PUT put(String, Object, String...)

Estos nombres indican claramente cuál de los métodos Http son invocados, mientras la segunda parte indica que devuelven los métodos. Por ejemplo getForObject() usa el método GET y transforma la respuesta HTTP en un objeto que decida. Como se puede apreciar los métodos se enfocan en las mejores prácticas REST.
Cada uno de los métodos tiene un parámetro de tipo string (el primero) este es la URI del método. Se puede pasar parámetros de dos formas una usando varargs:

String result = restTemplate.getForObject("http://example.com/hotels/{hotel}/bookings/{booking}", String.class, "42", "21");

Esto debería llamar a http://example.com/hotels/42/bookings/21 por el método GET.

También podemos usar mapas, por ejemplo:

Map vars = new HashMap();
vars.put("hotel", "42");
vars.put("booking", "21");
String result = restTemplate.getForObject("http://example.com/hotels/{hotel}/bookings/{booking}", String.class, vars);

Esto debería llamar a http://example.com/hotels/42/rooms/42 también por el método GET.

HttpMessageConverters se encarga de convertir los HTTP requests a los tipos que se indiquen.

sábado, 12 de diciembre de 2009

Podcast de JavaHispano sobre pruebas automatizadas

Acabo de escuchar el último podcast de JavaHispano que va sobre
pruebas automatizadas y me ha parecido muy recomendable.



Alfredo Casado aporta comentarios excelentes y habla en primera
persona de TDD (no de oidas, como hacemos muchos)

Conclusiones en primera "lectura":
* automatizar las pruebas es más rentable que no hacerlo
* los principios FIRST son fundamentales para unas buenas pruebas
* que tu código sea testeable se consigue de entrada haciendo TDD
* aprender a hacer TDD es duro, pero como cualquier otra cosa en la
vida que merece la pena (es una inversión en tu carrera
independientemente de la elección del lenguaje)

Las pérdidas de datos más increíbles del año

La especialista en recuperación de datos Kroll Ontrack ha presentado los casos más increíbles e impactantes a los que ha tenido que hacer frente durante el año saliente.

Gracias a una encuesta efectuada en el conjunto de sus laboratorios implantados en todo el mundo, esta lista de accidentes representa los casos más curiosos a los que ha tenido que enfrentarse en recuperación de datos y dan un pulso de los casos más sorprendentes a los que se enfrentan las compañías o las fuerzas del orden en pérdida de información.

En primera posición se encuentra el caso de un registro en un apartamento. El sospechoso había lanzado desde un 12º piso su portátil, que contenía las pruebas de su culpabilidad. No muy divertido. Tras recuperar las piezas para rehacer el PC, las fuerzas del orden contaron con el disco duro de nuevo.

Cuando no es las altas esferas, es en la profundidad del mar donde acaban los discos duros. La situación más impactante es, sin duda, un ordenador portátil que cayó en alta mar desde un barco y fue recuperado seis meses más tarde, tras estar a 60 metros bajo el agua. "El 99% de los datos fueron recuperados".

La lista también incluye discusiones entre colegas en la sala informática, con uno de los protagonistas dañando (¿accidentalmente?) el servidor. Otro caso: el de un fotógrafo profesional que, al pasar por un badén, deja caer la tarjeta de memoria de su cámara en un charco.

La situación más divertida, sin embargo, es la protagonizada por un hombre de negocios que, buscando las llaves de su coche, dejó su portátil en el capó. Una vez las llaves recuperadas, se fue dejando, como era de esperar, su ordenador donde lo había dejado. El equipo puso fin a su vida empotrándose contra un muro después de planear un rato.

El caso más enternecedor es el de un gato que tomó por objetivo el cable de conexión de un disco duro externo. A fuerza de jugar con él, consiguió que el disco se cayese perdiendo los datos grabados. El gato se salvó, por cierto, del impacto de la caída.

Para evitar estas perdidas el consejo es claro: evitar la moto, los gatos, el contacto con el agua y el planear. Y, claro está, un back up regular.

sábado, 5 de diciembre de 2009

The Spring Rich Client Project

The Spring Rich Client Project es un proyecto, que tiene como objetivo hacernos la vida más fácil cuando tenemos que desarollar aplicaciones swing.

Como nos va a cumplir el objetivo?


· Proporciona una forma de desarrollo estructurada, altamente configurable, estándares y más rápido, aprovechando spring framework.

· Fomentar la integración con proyectos rich-client-related donde esto tenga sentido.

· Adherirse a la filosofía de spring , interfaces , la importancia de diseño orientado a objetos, pruebas y documentación.


Entre las características:


· Centralización de configuración de swing actions y controlador de registro basado en la vista activa actual.

· Un form data binding y un framework de validación.

· Soporte para gestion multiples ventanas, pagina de configuración y manejo de vistas

· Clases de apoyo comunes frente a diversos requerimientos de los clientes ricos, incluyendo: diálogos bien formados, los asistentes, la validación de entrada (escribir sugerencias y resultados de la validación de informes), barras de botones, la internacionalización, la imagen / el caché de iconos, seguimiento de los avances, la interfaz de usuario Threading (clases limpiamente la promoción de interfaces sensibles),

Manual de JPA

Dejo este manual de jpa, es corto y aporta mucho, recomiendo que lo lean:

http://www.javahispano.org/contenidos/archivo/7296830/Manualjpa.pdf

miércoles, 2 de diciembre de 2009

sábado, 28 de noviembre de 2009

Spring Roo

Spring Roo viene a ser la alternativa Spring a Ruby on Rails o Grails. Es decir, un framework creado bajo los principios de convención frente a configuración y que aprovecha al máximo Java y Spring.

Ni que decir tiene que el framework está totalmente centrado en torno a Spring, Maven, JPA, muchas anotaciones, el soporte de REST de Spring 3.0 y AspectJ, siendo este último lo que se utiliza para introducir el llamemos "dinamismo" en la aplicación. La verdad es que me parece muy interesante.

Si leemos las características en http://www.springsource.org/roo, nos llama la atención que por ejemplo:
  • Se puede construir aplicaciones en 10 minutos.
  • 100% programado en java, no es necesario cambiar de lenguaje.
  • Eficiencia
  • Implementación de las mejores prácticas de spring 3
  • Basado en maven 2, jpa (hibérnate) ,
  • Incluye soporte para configuración de base de datos
  • Incluye test automáticos de jUnit y test web con Selenium
  • Aplicación backend basada en RESTfull
  • Integración con Spring security
  • URL amigables, url RESTfull
  • Soporte para Scripting

Spring Integration

Spring Integration es una nueva extensión de Spring Framework, el popular framework Java de aplicaciones. Spring Integration brinda una extensión a Spring para soportar los Patrones de Integración Corporativos (Enterprise Integration Patterns), ampliamente conocidos en el desarrollo de aplicaciones JEE.

El sitio web dos ideas publico un tutorial de este framework.

sábado, 21 de noviembre de 2009

Inyección de dependencia


Lo prometido es deuda, vamos a hacer un ejemplo de inyección de dependencia bastante simple usando como framework spring. Spring no es el único framework de Inyección de Dependencia, pero es sin duda el más usado.
Vamos a los bifes!!! Vamos a hacer un servicio que salude. Antes de empezar a escribir el servicio vamos a hacer una interfaz que lo describa.

package com.ejemplo;

public interface SaludadorService {

String saludar();
}

Esto, por que lo hacemos? Cuando nosotros queramos usar nuestro servicio vamos a usar esta interfaz, de esta forma si cambia la implementación, no vamos a necesitar cambiar el código.
Implementemos la interfaz!!!

package com.ejemplo;

/**
* Implementación de SaludadorService
*
* @author Emanuel
*/
public class SaludadorServiceImpl implements SaludadorService {

private String saludo;

public void setSaludo(String saludo) {
this.saludo = saludo;
}

public SaludadorServiceImpl() { }

public SaludadorServiceImpl(String saludo) {
this.saludo = saludo;
}
@Override
public String saludar() {
return saludo;
}
}


Bastante simple, ahora debemos hacer a configurar el xml para que spring sepa que inyectar.


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<bean id="saludador" class="com.ejemplo.SaludadorServiceImpl" >
<property name="saludo" value="Holasss !! " />
</bean>
</beans>


Ahí inyectamos el valor “Holasss !!” a la propiedad saludo por medio del set, es decir spring va a hacer lo siguiente:

SaludadorServiceImpl saludador = new SaludadorServiceImpl();
saludador.setSaludo("Holasss !! ");

Podriamos haberlo hecho por constructor de la siguiente forma:

<bean id="saludador" class="com.ejemplo.SaludadorServiceImpl" >
<constructor-arg index="0" value=" Holasss !! " />
</bean>

Podemos discutir todo un día cual es mejor si inyectar por set o constructor. Yo personalmente uso por set. Ustedes usen el que le parezca.
Ahora vamos a usar nuestro bean:

/**
* @author Emanuel
*
*/
public class Principal {

public static void main(String[] args) {
BeanFactory fabrica = new XmlBeanFactory(new FileSystemResource("bean.xml"));
SaludadorService saludador = (SaludadorService)fabrica.getBean("saludador");
System.out.println(saludador.saludar());
}
}

Y Listo!!

Si fueron observadores yo construyo una fabrica con un archivo xml donde declare el bean. Además uso la interfaz de esta forma el día de mañana quiero cambiar la implementación , lo pueda hacer sin problema, sin modificar código solo tocando el xml.

Además use spring solo como fabrica de beans, no como contenedor, como contenedor es más potente. Pero esto es otra historia...




domingo, 15 de noviembre de 2009

JNA

JNA es un framework que nos facilita las tareas con dll; es decir nos hace más fácil jni.
Alguien que leyo, vio, trabajo o se pregunto que es jni; debe haberse dado cuenta que es complejo. Esta complijida se ve disminuida casi a 0 con JNA.

Parece publicidad barata pero es verdad. Si te digo que con una interfaz podes usar funciones que se encuentran en una dll?

Mira, tengo la siguiente dll:

// dllParaPruba.cpp : Defines the exported functions for the DLL application.
//

#include "stdafx.h"


extern "C"
{
//---------------------------------------------------------------------------
double __declspec(dllexport) multiplicar(double a, double b)
{
return a * b;
}
//---------------------------------------------------------------------------
double __declspec(dllexport) sumar(double a, double b)
{
return a + b;
}

//---------------------------------------------------------------------------

double __declspec(dllexport) potencia(double a, double n)
{
double acumulador = 1;
for (int i = 0; i <>
acumulador*=a;
}

return acumulador;
}
}

Y yo desde java quiero leerla y usarla, bueno tengo que escribir la siguiente interfaz:

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;

/**
*
* @author Emanuel
*/
public interface EjemploJNA extends Library {

EjemploJNA INSTANCE = (EjemploJNA)
Native.loadLibrary("dllParaPruba",
EjemploJNA.class);

double multiplicar(double a, double b);

double sumar(double a, double b);

double potencia(double a, double b);
}

Bueno ahora vamos hacer un test:

import org.junit.Test;
import static org.junit.Assert.*;
/**
*
* @author Emanuel
*/
public class EjemploJNATest {

static {
System.load("pathDondeSeEncuentraMiDll\dllParaPruba.dll");
}

@Test
public void sumar(){
double resultado = EjemploJNA.INSTANCE.sumar(2.3, 4.5);
assertEquals(new Double(resultado), new Double(6.8));
}

@Test
public void multiplicar(){
double resultado = EjemploJNA.INSTANCE.multiplicar(2.3, 4.5);

assertEquals(new Double(resultado), new Double(10.35));
}

@Test
public void potencia(){
double resultado = EjemploJNA.INSTANCE.potencia(2, 4);

assertEquals(new Double(resultado), new Double(16));
}

}

Listo!!

Que lo pario dijo mendieta!!

Una cosa me queda por aclarar es que compile la dll con el compilador de borland y no me fue muy bien, explotaba (no se bien por que) use el de microsoft y no hubo problema.

El que quiera más info dejo el link: https://jna.dev.java.net/

Y para toda la gente linda que usa maven la entrada en el pom:

<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>3.2.2</version>
</dependency>

Saludos!!!

domingo, 8 de noviembre de 2009

¿Quién necesita un arquitecto?

Como ya dije antes dos ideas es una pagina web muy buena, mezcla lo técnico con lo metodológico de una forma muy buena. Hoy quiero aconsejarles que lean este articulo :


Describe el rol de un arquitecto de software.

sábado, 7 de noviembre de 2009

Apache Solr

Solr es un servidor de búsquedas basado en Lucene, contiene Apis de comunicación xml/http y JSON. Entre otras características: es liviano, tiene cache, replicable y trae una interfaz web para administrarlo.


El modo de distribución es un war el cual nosotros deployeamos en nuestro web conteiner (jetty, tomcat o otro) y listo!


Vamos al browser y ponemos por ejemplo http://localhost:8080/solr (si lo deployearon como solr) y hay va aparecer la interfaz web para configurarlo.


Solr provee diferentes clientes para casi todas las plataformas:

· Ruby - SolRuby

· PHP - SolPHP

· Java - SolJava

· Python - SolPython

· JSON - SolJSON

· .Net - solrnet

  • C#

o SolrSharp

o Deveel Solr Client

  • Perl

o SolPerl

o Solr.pm

· JavaScript

o AJAX Solr.


Dejo links:

http://lucene.apache.org/solr/

http://wiki.apache.org/solr/

domingo, 1 de noviembre de 2009

RESTEasy

Es un proyecto de jboss que provee una implementación a jsr 311. Este proyecto contiene un conjunto de frameworks que nos facilitan el desarrollo con web services rest.

Jsr 311 nos permite desarrollar y publicar web services rest con anotaciones, vean que fácil es:

@Path("/library")

public class Library {

@GET

@Path("/books")

public String getBooks() {...}

@GET

@Path("/book/{isbn}")

public String getBook(@PathParam("isbn") String id) {

// search my database and get a string representation and return it

}

@PUT

@Path("/book/{isbn}")

public void addBook(@PathParam("isbn") String id, @QueryParam("name") String name) {...}

@DELETE

@Path("/book/{id}")

public void removeBook(@PathParam("id") String id {...}

}

Recuerden que los web services rest no tienen un descriptor wsdl como los soap, sino que lo que describe a los servicios rest en la url y el método por donde se aceden.

@PUT, @DELETE, @GET, etc decimos el método y con @Path indicamos el path donde esta publicado.

RESTeasy puede ejecutarse sobre cualquier contenedor web.