Translate

viernes, 3 de febrero de 2012

MongoDB + Spring Data

Ya hablamos bastante de spring data y también de mongoDB. El proyecto Spring Data intenta facilitarnos el acceso a diferente repositorios de datos. En esta oportunidad vamos a hablar de como nos facilita el acceso y manejo de la base de datos noSQL MongoDB.

Recordemos que MongoDB es una base documental, clave-valor; escrita en c++. Es conocida como la MySQL de las bases NoSQL. Dado que es liviana, muy usada y fácil de usar.

Spring Data nos provee:

  • Configuración basada en Spring con XML o anotaciones
  • MongoTemplate nos brinda la principales funcionalidades que se pueden aplicar a la base MongoDB.
  • Traducción de las excepciones a excepciones más amigables.
  • Mapeos de objetos integrados con Spring's Conversion Service
  • Querys, criterias y DSLs basados en java.
  • Implementaciones de interfaces de repositorio con métodos comunes.
  • Integración con QueryDSL!!
  • Persistencia cross-store; soporta entidades de JPA
  • Log4j
  • Integración con Map-Reduce
  • Monitorización y administración basado en JMX 


Para utilizar esta herramienta con maven es necesario agregar el siguiente repositorio:


    spring-milestone
    Spring Maven MILESTONE Repository
    http://maven.springframework.org/milestone



y la siguiente dependencia:


 org.springframework.data
 spring-data-mongodb
 1.0.0.RC1
 



Dejo links:
http://www.springsource.org/spring-data/mongodb
http://static.springsource.org/spring-data/data-document/docs/current/reference/html/

Apache MINA


Apache MINA es un Framework de aplicación de red que ayuda a los usuarios a desarrollar aplicaciones con un alto rendimiento y alta escalabilidad fácilmente. Este framework provee una API asincrona sobre varios protocolos como TCP/IP y UDP/IP a gracia a Java NIO. Con lo que se puede hacer Comet muy fácilmente. 

Las APIs NIO se introdujeron en Java 1.4 y son utilizadas desde entonces por un gran número de aplicaciones. Las APIs NIO permiten operaciones de IO sin bloquear sin bloquear el procesamiento con esto.

Mina es un framework de aplicación de red simple, pero con todas estas funcionalidades:
  • Unifica la API para distintos tipos de transporte: TCP / IP y UDP / IP a través de Java NIO
  • Comunicación serie (RS232) a través de RXTX
  • Interfaz de filtro como un punto de extensión, similar a los filtros de Servlet
  • API de bajo nivel y de alto nivel: De bajo nivel: usos ByteBuffers, De Alto Nivel: definidos por el usuario utiliza objetos de los mensajes y códecs.
  • Manejo de hilos modificable: u solo hilo o un grupo de subprocesos, más de mil grupos de subprocesos (es decir, SEDA)
  • Sobrecarga de protección y limitación del tráfico
  • Unidad de capacidad de prueba y los objetos mock
  • Se puede administrar con JMX
  • Basada en Stream  I/O soportado vía StreamIoHandler
  • Integración con contenedores conocidos como PicoContainer y Spring
Esta bajo licencia Apache 2. 


CriteriaQuery de JPA vs Criteria de Hibernate vs QueryDSL

Estuve leyendo sobre la API de Criteria de JPA, y la verdad es que no me gusto.

Vamos por parte porque usar esta API? Porque nos provee la seguridad por tipo; escribiendo hql o ejbql por ejemplo tenemos el problema que al modificar un objeto; las consultas no se enteran y por lo tanto pueden explotar. Este problema se podría atacar haciendo una buena batería de test y ir corriéndola con maven por ejemplo. Pero lo ideal es que al modificar la clase se rompa donde esta siendo usada esa propiedad de esta manera el programa no compila hasta que no solucione todo. A la vez las herramientas de refactor me podrían ayudar modificando las consultas.

Veamos un ejemplo de criteria con JPA:

CriteriaQuery criteria = builder.createQuery( Person.class );
Root personRoot = criteria.from( Person.class );
criteria.select( personRoot );
criteria.where( builder.equal( personRoot.get( Person_.eyeColor ), "brown" ) );
List people = em.createQuery( criteria ).getResultList();


Esto en hql seria: from Person p where p.eyeColor = 'brown' (un poco mas fácil) Pero porque tanta cosa? Veamo el ejemplo de JPA, antes que nada necesitamos crear un builder de la query luego con ese builder creamos la query donde le decimos lo que vamos a consultar y que vamos a seleccionar y luego con el builder agregamos la condición. Cuando agregamos la condición (si fueron observadores) vieron que llama a una clase Person_ esta clase es la que contiene la metainformación de la clase y obviamente hay que programarla seria algo así:

import javax.persistence.metamodel.SingularAttribute;
import javax.persistence.metamodel.SetAttribute;
import javax.persistence.metamodel.StaticMetamodel;

@StaticMetamodel( Person.class )
public class Person_ {
    public static volatile SingularAttribute id;
    public static volatile SingularAttribute name;
        public static volatile SingularAttribute eyeColor;
    public static volatile SingularAttribute age;
    public static volatile SingularAttribute address;
    public static volatile SetAttribute orders;
}


Luego de hacer todo eso no me acuerdo que estoy consultando. Hay cosas que muy fácilmente se podrían mejorar como por ejemplo no puede suponer que lo que consultamos es lo que debe seleccionar? Todo hay que decirle!

Veamos como se puede hacer la consulta con Criteria de Hibernate:

List people = sess.createCriteria(Person .class).add( Restrictions.eq("eyeColor", "brown") ); 

Bastante más fácil pero se puede ver un pequeño problema si yo cambio en mi clase la propiedad "eyeColor" esta consulta va a seguir compilando pero va explotar cuando la ejecute. Ahora veamos como podríamos hacer esto con QueryDSL:

JPAQuery query = new JPAQuery(em);
QPerson p = new Qperson("p");
query.from(p).where(p.eyeColor.eq("brown"));


QueryDSL genera un tipo para consultar con el nombre Qperson que sería como este:

public class QPerson extends EntityPathBase{
…
}


Como conclusión podemos decir que es complejo hacer consultas de forma tipada y que queden bien es más complejo aun. De igual forma la API de Criteria de JPA se podria mejorar mucho más. Y esto se ve cuando miramos proyectos que nacieron para simplificar esta API como QueryDSL.

Con Heroku, Neo4J se va a las nubes!

Una base de datos NoSQL que esta haciendo su camino hacia la nube, es Neo4J, una base de datos gráfica; de la cual ya hablamos. Además de otras mejoras como Cypher (el motor de consulta), web de administración, actualización Lucene. Neo4J 1.6 ahora se puede acceder desde Heroku actualmente a través de un add-on beta a través de una interfaz REST. Hay un número de clientes REST Neo4J permitidos; y como es REST se puede consultar de diferentes lenguajes como: .NET, Python, Django, PHP, Ruby y Java. 

Heroku adds-on permite a los usuarios que puedan ampliar la funcionalidad básica, añadir características o conectarse a servicios externos, el último de ellos el caso de cómo se accede desde Heroku a Neo4J.

Dejo links:
http://blog.neo4j.org/2011/12/neo4j-labs-heroku-neo4j-and-google.html
http://addons.heroku.com/neo4j
http://devcenter.heroku.com/articles/neo4j

Postgres Plus® Cloud Database

La verdad estoy sorprendido al leer esto: EnterpriseDB ha anunciado la disponibilidad de Postgres Plus Nube de base de datos (PPCDB), una base de datos con un servicio que ofrece PostgreSQL 9.1 y Postgres Plus Advanced Server 9.0 como IAM en Amazon AWS. OpenStack incluirá soporte para PPCDB.

PPCDB viene con una interfaz web para la instalación y la gestión de casos individuales o grupos de bases de datos Postgres en la nube, y funciones de escala automática, leer y escribir en el balanceador de carga, la replicación binaria, conmutación por error, de auto-aprovisionamiento, almacenamiento elástico, la clonación de DB, y automatización copias de seguridad.

Postgres Plus Advanced Server incluye compatibilidad con Oracle permite a los desarrolladores ejecutar  SQL de Oracle contra una base de datos PostgreSQL.

Dejo un video:



Dejo Links:
http://www.infoq.com/news/2012/02/PostgreSQL-Neo4J-Cloud
http://www.enterprisedb.com/products-services-training/products-overview/postgres-plus-cloud-database

martes, 31 de enero de 2012

Desarrollo de proyectos informáticos con tecnología Java

"La escritura de un libro es una tarea ingente. La motivación para abordarla debe ser, al menos, tan grande como la tarea que se desea acometer. Para nosotros, la motivación ha consistido en escribir un libro que se distinguiera del resto de libros que abordan el aprendizaje del lenguaje de programación Java."

De esta forma comienza el libro "Desarrollo de proyectos informáticos con tecnología Java" escrito por Oscar Belmonte Fernández, profesor de la Universidad Jaime I de Castellón. Este libro es gratuito y bajo licencia "Commons Atribución-NoComercial-CompartirIgual 3.0 Unported"

Es un libro básico de java para iniciados.

Dejo el link:  http://www3.uji.es/~belfern/docencia.html

viernes, 27 de enero de 2012

Con Play framework desarrollar aplicaciones web con Java y Scala... ¡vuelve a ser divertido!

Con Play framework desarrollar aplicaciones web con Java y Scala... ¡vuelve a ser divertido! es el titulo de la web en español de play; si!

Los usuarios de play decidieron traducir toda la documentación es español y colgarla en la web.

Dejo los links:
http://playdoces.appspot.com/
http://playdoces-opensas.rhcloud.com/

Curso de HTML 5


La gente de msdn ( del Inglés: Microsoft Developer Network ) ha realizado unos cursos de html que se pueden tomar de forma gratuita, parecen estar buenos.

Dejo el link: http://msdn.microsoft.com/es-es/ie/hh749020

domingo, 22 de enero de 2012

Hibernate 4!!

Jboss libero la versión número 4 de Hibernate entre las características nuevas podemos nombrar:


  • Mejor logging con soporte a i18n y codigo de mensajes
  • Preparan el soporte a OSGI
  • Soporta Multitenancy
  • Remueve código deprecado


Multitenancy es cuando un componente de software corre en un servidor pero sirve a múltiples clientes.

Dejo la entrada en el pom para el que usa maven:
  
  
 org.hibernate
 hibernate-core
 4.0.1.Final
  
            

Dejo links:
http://www.infoq.com/news/2012/01/hibernate-4-released
http://www.hibernate.org/downloads

Tutorial de Java 7

Han publicado un tutorial de java 7, es un tutorial basado ejemplos, fácil de leer y entretenido. Ideal para el verano:

http://www.javacodegeeks.com/2012/01/java-7-project-coin-in-code-examples.html

domingo, 15 de enero de 2012

Más de Hadoop!!



Sigo leyendo más de Hadoop un framework que ya estuvimos hablando:

http://emanuelpeg.blogspot.com/2009/10/apache-hadoop-es-un-proyecto-java-de.html
http://emanuelpeg.blogspot.com/2009/10/hadoop-hbase.html

El proyecto comenzo como funcionalidad de Nutch pero rapidamente se convirtio en un proyecto aparte; basado en Google GFS y MapReduce. Iniciado por Doug Cutting.

Apache Hadoop es un framework para computación distribuida y persistencia distribuida el cual tiene las siguientes características:

  • Permite montas fácilmente y de manera fiable clusters con multitud de nodos
  • Implementa Map/Reduce y sistema de archivos distribuido (HDFS)
  • y es Open Source!!


Buenísimo pero que es MapReduce? Es un modelo de programación aplicable a problemas en los que la solución de una subparte no sea dependiente de las soluciones de las demás subpartes. Es un estilo "divide y vencerás"; se divide el problema e subproblemas independientes y se soluciona cada uno de forma independiente. El MapReduce de hadoop tiene una arquitectura maestro/esclavo.


  • Un único maestro (JobTracker): Responsable de la gestión de tareas asignadas a esclavos, las monitoriza y se encarga de re-ejecutarlas si han fallado.
  • N esclavos (TaskTracker) : Ejecutan la tarea asignada.

En principio pensado para Java, pero con Hadoop Pipes para C++ y se esta implementando Hadoop Streaming para el resto de los lenguajes.

HDFS: Hadoop Distributed File System. Es el framework encargado de simular un file system como si estuviera en un equipo pero este esta distribuido.

HDFS tiene una arquitectura maestro/esclavo, hay un maestro que tiene la responsabilidad de administrar y nodos que se guardan los archivos. Existen estrategias para recuperar el maestro, para eliminar el punto de fallo. Todos los protocolos que usa se implementan sobre TCP/IP.

Además cuenta con una serie de comandos que permiten utilizarlo:

get: Copia a local el archivo de HDFS

put: Copia desde local múltiples ficheros HDFS

strep: Cambia el factor de replicación

Comandos típicos: ls, mkdir, cp, cat, etc...

Bueno este fue un pequeño resumen sobre un gran proyecto.

Dejo links:
http://hadoop.apache.org/
http://hadoop.apache.org/hdfs/
http://hadoop.apache.org/mapreduce/

sábado, 14 de enero de 2012

Post de Ceylon

En Java Mexico están publicado unos post acerca de Ceylon el lenguaje de Red Hat diseñado por Gavin King (el creador de hibernate).

Dejo el link:

http://www.javamexico.org/categorias/lenguajes_jvm/ceylon

jueves, 12 de enero de 2012

Understanding Big Data

IBM nos regala un libro sobre Big Data; por Big Data Nos referimos al tratamiento y análisis de enormes repositorios de datos, tan desproporcionadamente grandes que resulta imposible tratarlos con las herramientas de bases de datos y analíticas convencionales. La tendencia se encuadra en un entorno que no nos suena para nada extraño: la proliferación de páginas web, aplicaciones de imagen y vídeo, redes sociales, dispositivos móviles, apps, sensores, internet de las cosas, etc.  


El libro es una introducción al tratamiento de estos datos y hace una introducción a Apache Hadoop 


Dejo el link: 

https://www14.software.ibm.com/webapp/iwm/web/signup.do?source=sw-infomgt&S_PKG=500016891

martes, 10 de enero de 2012

sábado, 7 de enero de 2012

Escribiendo sql más fácil con Querydsl


No les pasa que cuando escriben hql les da miedo de equivocarse en el nombre de alguna propiedad o algo que pueda hacer explotar la aplicación? Cuando escriben consultas con criterios de hibernate, no les pasa que no saben como se deben hacer ciertas cosas o tienen que mirar el manual? No les parece poco intuitiva la API de Critera de hibernate?

Si a todo contestaste que si Querydsl es para vos. Querydsl es un framework el cual permite construir consultas type-safe muy similares a Sql para multiples formas de acceder a datos JPA, JDO y SQL.

En lugar de escribir consultas en texto  lo escribimos con este dsl de forma fluida y segura.

Que ventajas tiene usar Querydsl?


  • Nos puede ayudar la IDE a escribir nuestras consultas, porque son propiedades. 
  •  Contamos con la seguridad por tipo 
  • Si refactorisamos nos permite refactorisar la consulta y si se rompe alguna consulta no compila. 
  • Es más fácil escribir consultas complejas 
  • Podemos escribir SQL o usarlo con Hibernate y también con MongoDB


Veamos un ejemplo de consulta:

query.from(customer)
    .where(customer.firstName.eq("Bob").and(customer.lastName.eq("Wilson")));


query.from(cat)
    .innerJoin(cat.mate, mate)
    .leftJoin(cat.kittens, kitten)
    .list(cat);


query.from(cat)
    .leftJoin(cat.kittens, kitten)
    .on(kitten.bodyWeight.gt(10.0))
    .list(cat);


query.from(customer)
    .orderBy(customer.lastName.asc(), customer.firstName.desc())
    .list(customer);


Se integra con Hibernate, maven, y también con Spring Data JPA. Además lo podemos usar con MongoDB y también con Scala.

Es de licencia Apache 2.

Dejo un video:



Dejo links:
http://www.querydsl.com/
http://www.querydsl.com/documentation
http://blog.mysema.com/2010/07/querying-hibernate-with-querydsl.html
http://blog.mysema.com/2010/11/mongodb-with-querydsl.html