Translate

viernes, 2 de marzo de 2012

Spring data + mongoDB

Bueno vamos a hacer otro ejemplo con Spring data y mongoDB. La idea seria que tengo un usuario y debo guardarlo en una base NoSQL como MongoDB.

Antes de empezar es necesario instalar mongoDB y levantar la base como lo indica el siguiente tutorial:

http://emanuelpeg.blogspot.com/2012/02/instalar-mongodb-en-linux.html

Vamos hacer el proyecto con maven:

mvn archetype:generate

Creamos el proyecto comunacho de maven, con los nombres de paquetes que deseen. Vamos a agregar al pom las dependencias necesarias:

		
			org.springframework.data
			spring-data-mongodb
			1.0.1.RELEASE
		
		
		
			org.springframework
			spring-core
			${spring.version}
		

		
			org.springframework
			spring-context
			${spring.version}
		

		
			org.springframework
			spring-aop
			${spring.version}
		

		
			org.springframework
			spring-aspects
			${spring.version}
		

		
			org.springframework
			spring-tx
			${spring.version}
		

		
			junit
			junit
			4.10
			test
		

		
			org.springframework
			spring-test
			${spring.version}
			test
		


donde:


	3.1.0.RELEASE



Además agregamos el repositorio:

	
		
			spring-release
			Spring Maven Release Repository
			http://repo.springsource.org/libs-release
		
	


Hacemos maven para agregar las dependencias:

mvn clean install
mvn eclipse:eclipse

Ahora importamos el proyecto a eclipse o su IDE favorita, la mía es eclipse.

Creamos la clase User, vamos a hacer antes una clase padre que contenga las particularidades generales de las clases del modelo que van a hacer persistidas:

public abstract class PersistentEntity {
	@Id
	private Long id;

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}


}


Ahora hacemos la clase User:

@Document
public class User extends PersistentEntity {

	private String userName;
	
	private String password;
	
	private List emails = new ArrayList();
	
	public User() {
	}
	
	public User(String userName, String password) {
		super();
		this.userName = userName;
		this.password = password;
	}

	public User(String userName, String password, List emails) {
		this(userName, password);
		this.emails = emails;
	}

	//getters and setters

} 


Vamos a escribir un DAO para ello vamos hacer lo siguiente vamos a generar una clase genérica que contenga métodos genéricos de acceso a datos y vamos a heredar de esta clase; a la vez cada clase va a tener su interfaz que la describa.

La interfaz del genericDAO:

package org.assembly.edda.repository;

import java.io.Serializable;
import java.util.List;

import org.assembly.edda.model.PersistentEntity;

public interface GenericDAO {
	
	T get(ID id);
	
	T save(T object);
	
	void delete(T object);
	
	List findAll();
} 


Su implementación:

package org.assembly.edda.dao;

import java.io.Serializable;
import java.util.List;

import org.assembly.edda.model.PersistentEntity;
import org.assembly.edda.model.User.User;
import org.assembly.edda.repository.GenericDAO;
import org.springframework.data.mongodb.core.MongoTemplate;

/**
 * @author emanuel
 *
 */
public abstract class GenericDAOImpl implements GenericDAO {

	private MongoTemplate mongoTemplate;
	
	public void setMongoTemplate(MongoTemplate mongoTemplate) {
		this.mongoTemplate = mongoTemplate;
	}
	
	protected abstract Class getEntityClass();
	
	public T get(ID id) {
		return (T) mongoTemplate.findById(id, getEntityClass());
	}

	public T save(T objectToSave) {
		mongoTemplate.save(objectToSave);
		return objectToSave;
	}

	public void delete(T objectToDelete) {
		mongoTemplate.remove(objectToDelete);
	}
	
	public List findAll() {
		return mongoTemplate.findAll(getEntityClass());
	}

}


Ahora la interfaz de UserDAO:

package org.assembly.edda.repository.user;

import org.assembly.edda.model.User.User;
import org.assembly.edda.repository.GenericDAO;

public interface UserDAO extends GenericDAO{

}


y su implementación:

package org.assembly.edda.dao.user;

import org.assembly.edda.dao.GenericDAOImpl;
import org.assembly.edda.model.User.User;
import org.assembly.edda.repository.user.UserDAO;

/**
 * @author emanuel
 *
 */
public class UserDAOImpl extends GenericDAOImpl implements UserDAO{

	
	@Override
	protected Class getEntityClass() {
		return User.class;
	}

}


Ahora vamos a escribir el ApplicationContext.xml de spring:



        
    
    
    
    	
    
    
    
    	
    	
    

	
    
    	
    
    
	
	
	
	
		
		
	
    



Bueno con esto estamos, solo debemos testar para ver si funciona. Creamos un test; ojo tener levantada la base cuando se lo corre. Para testear esto lo voy hacer más difícil voy a generar una clase padre generica y luego el test concreto (solo para ver como queda)

package org.assembly.edda.dao;

import static org.junit.Assert.*;
import java.util.List;

import org.assembly.edda.model.PersistentEntity;
import org.assembly.edda.repository.GenericDAO;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;


/**
 * @author emanuel
 *
 */
@ContextConfiguration(locations = "classpath:applicationContext.xml")
@RunWith(SpringJUnit4ClassRunner.class)
@Transactional
public abstract class GenericDAOTest> {
	
	protected abstract DAO getDAO();
	protected abstract T createObject();
	protected abstract T createOtherObject();
	protected abstract void assertEqualsObject(T object, T objectSaved);
	
	@Test
	public void find() {
		T object = createObject();
		getDAO().save(object);
		
		T objectSaved = getDAO().get(object.getId());
		assertEqualsObject(object, objectSaved);
	}

	
	@Test
	public void findAll() {
		T object = createObject();
		getDAO().save(object);
		
		T otherObject = createOtherObject();
		getDAO().save(otherObject);
		
		List all = getDAO().findAll();
		
		assertEquals(2, all.size());
	}

}

Y la implementación del test:

package org.assembly.edda.dao.user;

import static org.junit.Assert.*;

import javax.annotation.Resource;

import org.assembly.edda.dao.GenericDAOTest;
import org.assembly.edda.model.User.User;



public class UserDAOTest extends GenericDAOTest {

	@Resource
	private UserDAOImpl dao;
	
	public void setDao(UserDAOImpl dao) {
		this.dao = dao;
	}
	
	@Override
	protected UserDAOImpl getDAO() {
		return dao;
	}

	@Override
	protected User createObject() {
		User user = new User("Pepe", "0303456yalalala");
		user.setId(4l);
		return user;
	}

	@Override
	protected User createOtherObject() {
		User user = new User("Pepe", "0303456yalalala");
		user.setId(5l);
		return user;
	}
	
	@Override
	protected void assertEqualsObject(User object, User objectSaved) {
		assertEquals(object.getId(), objectSaved.getId());
		assertEquals(object.getUserName(), objectSaved.getUserName());
		assertEquals(object.getEmails(), objectSaved.getEmails());
		assertEquals(object.getPassword(), objectSaved.getPassword());
	}


}



Eso es todo amigos!!

lunes, 27 de febrero de 2012

Udacity, la primea universidad online gratuita para todo el mundo


El renombrado profesor de Stanford, Sebastian Thrun, ha dejado la docencia en el centro y ha anunciado un proyecto revolucionario: Udacity, una “universidad” online gratuita e interactiva para cualquier persona en el mundo. El primer curso: cómo construir un motor de búsqueda.

En la pagina web dice:
Creemos que la enseñanza universitaria puede ser a la vez alta calidad y bajo costo.

La verdad es que estoy totalmente de acuerdo con esta premisa, y voy a aprovechar haciendo estos cursos.

Dejo el link:
http://www.udacity.com/

sábado, 25 de febrero de 2012

Agile Open Paraná 2012




En el contexto de los exitosos eventos del Agile Open Tour, se organizará un nuevo Agile Open Paraná 2012 "Compartiendo Metodologías Ágiles" el Viernes 30 de Marzo.


No tengo ni una sola palabra para agregar. En realidad 2... 


Ha inscribirse!!

Dejo el link:



jueves, 23 de febrero de 2012

Hyperpolyglot


Cuando alguien hace un buen trabajo no queda otra que sacarse el sombrero y si es licito compartir ese trabajo a la comunidad. Por esta razón quiero compartir una pagina que encontré que tiene diferentes comparaciones de lenguajes de programación. Estas comparaciones son muy completas y tienen una buena calidad.

Las comparativas son:


Interpreted Languages:PHP, Perl, Python, Ruby
Interpreted Languages:Tcl, Lua, JavaScript, Io
Operating System Automation:POSIX Shell, AppleScript, PowerShell
C++ Style Languages:C++, Objective C, Java, C#
Pascal Style Languages:Pascal, Ada, PL/pgSQL, MySQL
Lisp Dialects:Common Lisp, Scheme, Clojure, Emacs Lisp
Type Inference Languages:Standard ML, OCaml, Scala, Haskell
Untyped Declarative Languages:Prolog, Erlang, Oz
Concatenative Languages:Forth, PostScript, Factor
Tabular Data Selection:SQL, Awk, Pig
Computer Algebra Software:Maxima, Mathematica
Numerical Analysis Software:Fortran, MATLAB, R, NumPy


Dejo el link:
http://hyperpolyglot.org/

miércoles, 22 de febrero de 2012

Code Hero

"Code Hero" es el video juego que fue diseñado para aprender a programar en javascript. Es un juego en primera persona y usa la api Unity3D.
Lo realmente malo es que se descarga para windows o mac solamente; pruebo si mi wine lo tira!

Dejo el video:



Dejo link:
http://primerlabs.com/codehero

LungoJS



Quiero compartir un screencast sobre LongoJS un framework que aprovecha las caracteristicas de HTML 5, CSS 3 y javascript para desarrollar aplicaciones moviles.

LungoJS - RESTful + Templating + Cache (Spanish) from LungoJS on Vimeo.


Dejo la fuente y links:
http://www.genbetadev.com/desarrollo-aplicaciones-moviles/lungojs-usando-restful-templating-cache-screencast
http://vimeo.com/37014134
http://www.lungojs.com/

Apache celebra su 17 aniversario con un release de su servidor

Leo en infoq que el servidor Apache cumple 17 añitos y para festejarlo libera su versión 2.4 de su servidor http.


Dejo mis felicitaciones!!


Y dejo links:
http://httpd.apache.org/
http://www.infoq.com/news/2012/02/Apache-HTTP-Server-2-4


martes, 21 de febrero de 2012

Infografía sobre HTML 5

Comparto una Infografía sobre HTML 5 y sus nuevos tags y propiedades:

Pinned Image

viernes, 17 de febrero de 2012

Spring data y mongodb parte 2

Spring data nos brinda muchos beneficios para poder utilizar MongoDB entre los cuales ya nombramos en este post:

http://emanuelpeg.blogspot.com/2012/02/mongodb-spring-data.html

Pero vamos a empezar?

Spring MongoDB requiere MongoDB 1.4 o superior y JDK 1.5 o superior. Obiamente que lo ideal seria utilizar Spring MongoDB en un proyecto que use Spring.

Antes que nada debemos iniciar MongoDB como lo explica el siguiente post:

Podemos hacer un proyecto Spring con maven y agregar las siguientes dependencias:


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


y el siguiente repositorio:


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



Debemos agregar un archivo log4j.properties si necesitamos ver el log. El archivo va a contener lo siguiente:

http://emanuelpeg.blogspot.com/2012/02/instalar-mongodb-en-linux.html

log4j.category.org.springframework.data.document.mongodb=DEBUG
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %40.40c:%4L - %m%n


Para el siguiente ejemplo vamos hacer una clase persona:

package org.spring.mongodb.example;

public class Person {

  private String id;
  private String name;
  private int age;
   
  public Person(String name, int age) {
    this.name = name;
    this.age = age;
  }
  
  //Getters and setters
  
  @Override
  public String toString() {
    return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
  }
  
}


Buenisimo, ahora hacemos un main para probar:

package org.spring.mongodb.example;

import static org.springframework.data.mongodb.core.query.Criteria.where;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Query;

import com.mongodb.Mongo;

public class MongoApp {

  private static final Log log = LogFactory.getLog(MongoApp.class);

  public static void main(String[] args) throws Exception {

    MongoOperations mongoOps = new MongoTemplate(new Mongo(), "database");

    mongoOps.insert(new Person("Joe", 34));

    log.info(mongoOps.findOne(new Query(where("name").is("Joe")), Person.class));

    mongoOps.dropCollection("person");
  }
}


Es magia.

En 4 lineas de código se guarda en la base de datos NoSQL MongoDB y se consulta con una consulta con where y se logea el resultado y al terminar la prueba se borra los datos; en 4 lineas.

En este pequeño ejemplo se pueden ver 4 cosas:

  • Se puede instanciar MongoTemplate con el objeto estandar de MongoDB com.mongodb.Mongo y el nombre de la base.
  • Se puede guardar un POJO así de simple sin metadata, ni herencia, ni nada raro.
  • MongoDB sabe el ObjectID por convensión, se maneja el campo id por convesión
  • La clase Persona puede tener solo getters, dado que asigna los datos por convensión. Si los nombres de los parametros del contructor coinciden con los datos usa estos datos para construir el objeto.



Para la proxima un ejemplo más copado. Continuara...

miércoles, 15 de febrero de 2012

Apache Apollo la nueva generación de mensajería!





ActiveMQ Apollo es más rapido, seguro, confiable y facil de mantener broker de mensajería. El cual fue construido a partir de Apache ActiveMQ. Los ingenieros de Apache le dieron una vuelta de rosca a ActiveMQ.

Apollo sólo soporta el protocolo STOMP pero al igual que ActiveMQ, ha sido diseñado para correr sobre varios protocolos. En futuras versiones se añadirá soporte OpenWirepor lo que puede ser compatible con ActiveMQ 5.x clientes JMS.

Entre los cambios de arquitectura podemos nombrar:


  • Refactor basado en Thread Model
  • Implementación para scala 2.8
  • Protocolo agnóstico
  • Administración basada en REST



Dejo links:
http://activemq.apache.org/apollo/
http://activemq.apache.org/apollo/documentation/architecture.html
http://activemq.apache.org/apollo/documentation/getting-started.html

martes, 14 de febrero de 2012

Documentación completa de Play Framework disponible en español


Me llego el siguiente mail de la gente de play, una gran noticia:

"Finalmente hemos concluido la traducción de la documentación de Play
Framework. Pueden consultarla en http://playdoces.appspot.com/

Hace apenas tres meses anunciábamos en esta lista que junto con varios
colegas iniciábamos la traducción de la documentación de Play
Framework, y al mismo tiempo invitábamos a todos los usuarios de este
framework a sumarse a la tarea.

Hoy, mientras nos preparamos para el lanzamiento de play 2.0, gracias
a la colaboración de colegas de América Latina y España ya podemos dar
por concluida la traducción de toda la documentación del sitio de play
Framework.

Aquí tienen los links:

Página principal: http://playdoces.appspot.com/

Si vives en alguno de los países a quienes google restringe el acceso
a las aplicaciones de Google Application Engine (¿qué habrá pasado con
el lema de “No seas malo”?), también tenemos una copia del sitio
alojada en openshift: http://playdoces-opensas.rhcloud.com/

Anuncio de la versión 2.0 de play: http://playdoces.appspot.com/2.0

Hola mundo en play: http://playdoces.appspot.com/documentation/latest/firstapp

Tutorial completo de play: una aplicación completa paso a paso:
http://playdoces.appspot.com/documentation/latest/guide1

y muchos artículos más que pueden encontrar en
http://playdoces-opensas.rhcloud.com/documentation/latest/home

También pueden ver el anuncio en el blog:
http://playlatam.wordpress.com/2012/02/14/documentacion-completa-de-play-framework-disponible-en-espanol/

Queremos agradecer a @rodriguezlaurag y @mfmontanari de Argentina,
@gualtrapa de España, @pjquero de Venezuela and @alfonsokim de México,
y también a los desarrolladores de la traducción japonesa del sitio de
Play, @garbagetown y @ikeike443, cuyo trabajo forkeamos
descaradamente.

Esperamos que nos ayuden a difundir esta noticia y que esta iniciativa
ayude a impulsar el uso de Play en los países de habla hispana.

Saludos

Sas (@develsas)"



Felicitaciones!! 

lunes, 13 de febrero de 2012

Más de Spring Data y MongoDB

Sigo leyendo sobre spring-data un proyecto que se las trae. Ahora vamos analizar el proyecto Spring Data con MongoDB.

Repository es la interfaz más general de Spring Data; CRUDRepository extiende esta y agrega metodos basicos para hacer las operaciones CRUD.


public interface CrudRepository
    extends Repository {
                                                                                         
    T save(T entity);
                                                                                         
    T findOne(ID primaryKey);
                                                                                         
    Iterable findAll();

    Long count();
                                                                                         
    void delete(T entity);
                                                                                         
    boolean exists(ID primaryKey);
                                                                                         
    // … more functionality omitted.
}



PagingAndSortingRepository nos provee los metodos de busqueda:


public interface PagingAndSortingRepository extends CrudRepository {

    Iterable findAll(Sort sort);

    Page findAll(Pageable pageable);
}





Donde Pageable es una clase que sirve para paginar; por ejemplo si quisieramos ir a 2 pagina y la pagina va cada 20 filas se debe instanciar de la siguiente manera: new PageRequest(1, 20)

Seteamos spring para que cree los proxys de nuestra interfaces:


  






Luego inyectamos el objeto a la clase que lo deberia usarlo:

public class SomeClient {

  @Autowired
  private PersonRepository repository;

  public void doSomething() {
    List persons = repository.findByLastname("Matthews");
  }
}




Tambien se pueden definir implementaciones para las interfaces por ejemplo si tenemos un metodo particular. Simplemente hay que definir la implementación:


interface UserRepositoryCustom {

  public void someCustomMethod(User user);
}


class UserRepositoryImpl implements UserRepositoryCustom {

  public void someCustomMethod(User user) {
    // Your custom implementation
  }
}


Como se puede ver no hay que extender de ninguna clase de Spring data, ni hay que hacer algo raro. Ahora hacemos la interfaz posta, la cual va tener los metodos que provee Spring Data y el metodo custom:


public interface UserRepository extends CrudRepository, UserRepositoryCustom {

  // Declare query methods here
}



Esa es una primera parte de Spring Data con MongoDB. Mientras voy aprendiendo escribo algo acá!

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

viernes, 10 de febrero de 2012

Instalar MongoDB en Linux

No es el super tutorial, no por culpa mía sino que es muy fácil instalar mongoDB. 
Empezamos bajando la base de este link: http://www.mongodb.org/downloads 
Una vez que hallamos bajado el archivo nos logeamos como root en el directorio que se bajo la base y movemos el archivo a opt (o a la que quieran ustedes)


# mv mongodb-linux-x86_64-2.0.3-rc0.tgz /opt/
# cd /opt


Ahora vamos a descomprimir el archivo y de paso borramos el tgz:


# tar -xvf mongodb-linux-x86_64-2.0.3-rc0.tgz 
# rm mongodb-linux-x86_64-2.0.3-rc0.tgz 

Se crea la carpeta data

# mkdir -p /data/db/
# chown `id -u` /data/db

Luego de crear el directorio de datos dado que MongoDb usa una carpeta para datos con el path configurable pero nosotros vamos usar el path por defecto.

Y ahora a levantar:

# cd mongodb-linux-x86_64-2.0.3-rc0/bin
# ./mongod

Ahora podemos jugar un rato: 

#db.foo.save( { a : 1 } )
#db.foo.find()

Dejo links:

miércoles, 8 de febrero de 2012

NoSQL

Dejo un gráfico que muestra en que conceptos se basaron para desarrollar las bases NoSQL.

Los puntos son: Consistencia, distribuido o capacidad de distribuirse y disponibilidad. En El grafico se puede ver por ejemplo que Voldemort es una base clave-valor que se apoyo sobre los conceptos de disponibilidad y capacidad de distribuirse.


NoSQL y SQL amigos?


Xeround esta brindando un servicio donde mezcla base de datos NoSQL con bases de datos SQL de forma híbrida. En front-end se trabaja con una base MySQL pero el corazón del servicio es una base NoSQL distribuida de 50 gigas.

Xeround provee base de datos como servicio para aplicaciones MySQL en la nube. De esta forma el desarrollador trabaja con una base MySQL sin tener que lidiar con detalles de bases NoSQL.

El servicio se ejecuta en la nube proporciona la alta disponibilidad (99,9%) y la escalabilidad en general,asociado a un almacén de datos NoSQL, que se puede implementar en Amazon EC2 y Rackspace, y puede ser utilizado como un add-on de Heroku para bases de datos de hasta 500 MB.

Dejo links:
http://www.infoq.com/news/2012/02/Hybrid-SQL-NoSQL
http://xeround.com/
http://xeround.com/developers/



martes, 7 de febrero de 2012

Smalltalk y Javascript un solo corazón!


Cada vez estamos en la era donde se va a poder escribir cualquier programa en cualquier lenguaje en cualquier tecnología . Y este es un buen ejemplo! Compilar Smalltalk a Javascript.

Existen varios proyectos que permiten hacer esto:

ST2JS:
ST2JS – Smalltalk to Javascript translator
http://www.squeaksource.com/ST2JS/
ST2JS – Traductor de Smalltalk a JavaScript (Parte I)
http://diegogomezdeck.blogspot.com/2006/07/st2js-traductor-de-smalltalk.html
ST2JS – Traductor de Smalltalk a JavaScript (Parte II)
http://diegogomezdeck.blogspot.com/2006/07/st2js-traductor-de-smalltalk_28.html

Otro proyecto muy bueno es S8, paso a copiar y pegar un párrafo de la presentación de este framework:

"El pasado sábado 17 tuvo lugar una importante reunion de Smalltalkig donde definimos el alcance de lo que llamamos Proyecto S8 y el rol que queremos que Smalltalking juegue en ese Proyecto. S8 comenzo siendo un proyecto personal de Alejandro Reimondo de desarrollo de un Smalltalk corriendo sobre la maquina virtual javascript open source de Google, la famosa V8 (de alli su nombre). Durante el transcurso de ese proyecto que aun continua en desarrollo, nos dimos cuenta que S8 podria transformarse en una plataforma de desarrollo para otros frentes, incluso aquellos que no necesiten soporte de V8 (un ejemplo de ello es el smalltalk jtalk o su nuevo nombre Amber). Es por ello que decidimos ponerle licencia MIT y potenciar una comunidad que utilize la herramienta desde Smalltalking. De esa forma le daremos previsibilidad a la herramienta y sustentabilidad en el tiempo, dos cosas que para los smalltalkers es fundamental"

Copiado textualmente de :
http://leodemarco.blogspot.com/2011/09/lanzamiento-de-s8-en-smalltalking.html

Dejo la fuente:
http://ajlopez.wordpress.com/2011/09/22/smalltalk-and-javascript/

domingo, 5 de febrero de 2012

Configuración De Servidores Con GNU/Linux

Quiero compartir un libro de Linux totalmente gratuito y sobre licencia Creative Commons. Es de muy buena calidad, dejo el link:

http://www.mediafire.com/?axozs408qao4a83

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

Spring by example


Quiero compartir una pagina que explica como configurar Spring mediante ejemplos. Si bien esta basada en Spring 2, de a poco están escribiendo ejemplos de spring 3.

Dejo el link:

http://springbyexample.org/

viernes, 6 de enero de 2012

10 lenguajes que podrían influir en el futuro


Estuve leyendo un articulo sobre 10 lenguajes que podrían influir en el futuro. Los lenguajes son: Dart, Ceylon, Go, F#, Opa, Fantom, Zimbu, X10, haXe, chapel.

La verdad es que a Opa, Zimbu, X10, haXe, chapel no los conozco; pero por lo que veo creo que los demás lenguajes no dejan muchas cosas nuevas. Me parece que el que falta es Scala que es un gran lenguaje la innovación es tener lo bueno de muchos lenguajes. Erlang otro que falta.

Cual piensa que falta?

Dejo el link:

http://www.infoworld.com/d/application-development/10-programming-languages-could-shake-it-181548

jueves, 5 de enero de 2012

Recursos sobre HTML 5

SourceForge abrió una pagina para compartir con nosotros una buena cantidad de recursos sobre HTML 5.

Dejo el link:

http://elcentrohtml5.sourceforge.net/

miércoles, 4 de enero de 2012

Rusia ahorrará 55.300 millones de dólares en software gracias a GNU/Linux


La necesidad de afianzar una industria informática nacional, escapar de la dependencia tecnológica de la infraestructura informática pública, especialmente de los sistemas de Microsoft va a permitir ahorros milmillonarios a las arcas públicas.

Según el analista Román Dórojov en principio se han previsto 4 distribuciones principales cuyo desarrollo principal será a cargo de la empresa PingWin Software. El derroche y la insostenibilidad de la dependencia tecnológica en el área informática fue denunciado por el Programa Estatal “Comunidad de Información” aprobado en octubre de 2010 y concebido para el período 2011-2020. El plan va cumpliendo plazos y el prototipo de la plataforma del software nacional (PSN), que sustituirá a Windows en los ordenadores de las Administraciones Púlicas y escuelas de enseñanza media obligatoria, ya ha sido aprobado por el Ministerio de Comunicación. Las inversiones durante los primeros dos años de funcionamiento del programa en empresas locales alcanzará los 490 millones de rublos.

Argentina y todos los países deberías seguir por el mismo camino!!

Dejo la fuente:

http://www.hispalinux.es/node/747

Bio4j


Bio4j seria como grafo bioinformatico basado en base de dato que incluye la mayor cantidad de datos de UniProt KB(SwissProt + Trembl), Gene Ontology (GO), UniRef (50,90,100), RefSeq, and NCBI taxonomy. (Manuscript in preparation). La verdad es que esto es chino básico para mi pero creo que mi hermano que es bioinformatico le va interesar.

Bio4j  usa neo4j para representar la información.

Lo interesante es que utiliza licencia AGPL 3 .

Dejo links:

http://www.bio4j.com/
http://blog.bio4j.com/

martes, 3 de enero de 2012

Spring Data Neo4j

Neo4j es una base de datos basada en grafos. De la cual ya hablamos:

http://emanuelpeg.blogspot.com/2009/09/neo4j.html

Neo4j permite acceder a un nodo mediante una clave la cual contiene un valor. También tenemos una API para acceder a los datos y un lenguaje de consulta llamado Cypher.

Una de las características de Neo4j es que es una base transaccional y por lo tanto soporta ACID. Esto es bastante inusual para una base de datos NoSQL.

Podemos agregar a un estro proyecto Neo4j (si utilizamos maven) con la siguiente entrada en el pom:

  
   org.neo4j
   neo4j
   1.5
  


Trabajar con la Api de Neo4j puede ser un trabajo duro por lo tanto Spring framework nos provee un modulo que nos permite trabajar con Neo4j de forma más fácil y elegante.

Primero agregamos la siguiente entrada al pom:

 
org.springframework.data 
spring-data-neo4j 
2.0.0.RC1 
 
Y ahora vamos a agregar la siguiente entrada al applicationContext.xml :

 
... 
 
... 
 
La idea es hacer una aplicación que mantenga la relación de amistad entre personas. Primero creamos el proyecto con maven:

mvn archetype:generate

Luego configuramos como un proyecto normalito de maven.

Y el pom debería tener las siguientes dependencias:


 4.0.0

 org.assembly
 friend
 1.0-SNAPSHOT
 jar

 friend
 http://maven.apache.org

 
  UTF-8
  3.0.6.RELEASE
 

 
  
   
    maven-compiler-plugin
    
     1.6
     1.6
    
   
   
    org.apache.maven.plugins
    maven-eclipse-plugin
    2.7
    
     2.0
     true
    
   
   
    org.apache.maven.plugins
    maven-javadoc-plugin
   
   
    org.apache.maven.plugins
    maven-project-info-reports-plugin
   
  
 

 
  
   spring-snapshot
   Spring Maven SNAPSHOT Repository
   http://s3.amazonaws.com/maven.springframework.org/snapshot
  
 

 

  
   org.springframework.data
   spring-data-neo4j
   2.0.0.BUILD-SNAPSHOT
  

  
   org.springframework
   spring-core
   ${spring.version}
  

  
   org.springframework
   spring-context
   ${spring.version}
  

  
   org.springframework
   spring-aop
   ${spring.version}
  

  
   org.springframework
   spring-aspects
   ${spring.version}
  

  
   org.springframework
   spring-tx
   ${spring.version}
  

  
   org.neo4j
   neo4j
   1.5
  

  
   junit
   junit
   4.10
   test
  

  
   org.springframework
   spring-test
   ${spring.version}
   test
  


 



Luego hacen mvn clean install y luego eclipse:eclipse.

Luego importamos el proyecto a eclipse, ahora veamos la clase persona:

/**
 * 
 */
package org.assembly.model;

import java.util.HashSet;
import java.util.Set;

import org.springframework.data.neo4j.annotation.GraphId;
import org.springframework.data.neo4j.annotation.Indexed;
import org.springframework.data.neo4j.annotation.NodeEntity;

/**
 * @author emanuel
 *
 */
@NodeEntity
public class Person {
 
 @GraphId
 private Long id;
 
 @Indexed //nos permite buscar por ejemplo por nombre. 2 personas no deberian llamarse igual
 private String name;
 
 private String lastName;
 
 private Set friends = new HashSet();

 public Person() { }
 
 public Person(String name, String lastName) {
  super();
  this.name = name;
  this.lastName = lastName;
 }

 public Person(String name, String lastName, HashSet friends) {
  super();
  this.name = name;
  this.lastName = lastName;
  this.friends = friends;
 }

 public void makeAFriend(Person friend) {
  this.getFriends().add(friend);
  friend.getFriends().add(this);
 }
 
//geters , seters, hashcode and equal
 

}



Con esas anotaciones le decimos a spring cual es el id de nuestro nodo y que puede usar como indice para buscar. Ahora hagamos un dao:

package org.assembly.dao;
//La interfaz
import org.assembly.model.Person;

public interface PersonDAO {
 
 void save(Person person);

 Person get(Long id);
 
 Person findByName(String name);
 
}



package org.assembly.dao;

import java.util.List;

import org.assembly.model.Person;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.neo4j.repository.GraphRepository;
import org.springframework.data.neo4j.support.Neo4jTemplate;
//La implementacion
public class PersonDAOImpl implements PersonDAO {
 
 @Autowired
 private Neo4jTemplate template;
 
 public void setTemplate(Neo4jTemplate template) {
  this.template = template;
 }

 @Override
 public void save(Person person) {
  this.template.save(person);
 }

 @Override
 public Person get(Long id) {
  return this.template.findOne(id, Person.class);
 }

 @Override
 public Person findByName(String name) {
  GraphRepository movieRepository =
    template.repositoryFor(Person.class);
  
  return movieRepository.findByPropertyValue("name", name);
 }


}



Vamos a configurar el applicationContext.xml:



 

 
  
  
 

 

 

 
  
  
 





Vamos a probar todo con un test:

package org.assembly.dao;

import static org.junit.Assert.assertEquals;

import javax.annotation.Resource;

import org.assembly.model.Person;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;

@ContextConfiguration(locations = "classpath:applicationContext.xml")
@RunWith(SpringJUnit4ClassRunner.class)
public class PersonDAOTest {

 @Resource
 private PersonDAO dao;
 
 public void setDao(PersonDAO dao) {
  this.dao = dao;
 }
 
 @Test 
 @Transactional
 public void save() {
  Person person = new Person("Pablo", "Goette");
  
  dao.save(person);
  
  Person personSaved = dao.get(person.getId());
  
  assertEquals(person, personSaved);
 }
 
 @Test 
 @Transactional
 public void saveFriendly() {
  Person person = new Person("Pablo", "Goette");
  
  person.getFriends().add(new Person("Mercedez","Benz"));
  person.getFriends().add(new Person("Al","Colico"));
  person.getFriends().add(new Person("Barry","Gota"));
  person.getFriends().add(new Person("Mercedez","Benz"));
  dao.save(person);
  
  Person personSaved = dao.get(person.getId());
  
  assertEquals(person, personSaved);
 }

 @Test 
 @Transactional
 public void findByName() {
  Person person = new Person("Aquiles", "Canto");
  
  dao.save(person);
  
  Person personSaved = dao.findByName("Aquiles");
  
  assertEquals(person, personSaved);
 }
}

Y listo, verán por ahí la carpeta data con la base de neo4j.


Si todo salio bien los test terminaron exitosos.

Dejo el repositorio subversion:
svn checkout http://spring-neo4j.googlecode.com/svn/trunk/ spring-neo4j-read-only

Dejo links:

http://www.springsource.org/spring-data/neo4j
http://neo4j.org/
http://video.neo4j.org/YbYN/webinar-introduction-to-spring-data-neo4j/
http://youtu.be/9qVs9vxx8lk
http://www.infoq.com/presentations/Introduction-to-Spring-Data-Neo4j

Y dejo un video:



lunes, 2 de enero de 2012

Libro de Javascript gratuito

Comparto un buen libro de javascript gratuito:

http://eloquentjavascript.net/

Entre los comentarios se encuentra el siguiente:

A concise and balanced mix of principles and pragmatics. I loved the tutorial-style game-like program development. This book rekindled my earliest joys of programming. Plus, JavaScript!
Brendan Eich, the man who gave us JavaScript

Ranking de lenguajes 2011

Estaba leyendo genbetadev y me encontré el ranking de lenguajes que realiza la empresa TIOBE:


Dejo links: