martes, junio 30, 2009

Usando el ScrollMode con Hibernate

JDBC nos proporciona cursores tipo Scroll (soportados por algunas bases de datos eso si), para recorrer poco a poco una cantidad muy grande de filas en una determinada tabla; como es de suponer una consulta que recupere miles o millones de objetos, puede traerse abajo el sistema por falta de memoria; Estos cursores también están disponibles con Hibernate y los mismos son utilizados en forma objetual mediante la implementación del patrón iterable (regularmente en JDBC tenemos los métodos last(), first(), next(), previous, relative con los cuales nos movemos a través del ResultSet y este se encarga de encapsular la traída por demanda de los Rows.

Dicho lo anterior, vamos al ejemplo con Hibernate:


SessionFactory sessionFactory = this.getSessionFactory();
Session session = sessionFactory.openSession();
String sql = "from MyDomainObject"; // fetch all data.
ScrollableResults results = null;
Object [] objects = null;

Transaction transaction = session.beginTransaction();
int rowCount = 0;
MyDomainObject domain = null;

results = session.createQuery(sql).setCacheMode(CacheMode.IGNORE)
.scroll(ScrollMode.FORWARD_ONLY);


while (results.next()) {

objects = results.get();
domain = MyDomainObject .class.cast(objects[0]);

// TODO: save or update or do something
if (rowCount % 20 == 0) { // clean buffer every 20 objects.

session.flush();
session.clear();
}

rowCount++;
}

System.out.println("Row process: " + rowCount);
transaction.commit(); // send de transaccion
session.close();
session = null;


La linea importante en realidad es esta:

results = session.createQuery(sql).setCacheMode(CacheMode.IGNORE)
.scroll(ScrollMode.FORWARD_ONLY);

Esta, nos proporciona un iterador con el cual podemos recuperar por demanda, miles si no millones de registros sin la necesidad de cargarlos todos en memoria, el resto del código me parece que es muy estándar, se trata de un iterador, hago alguna operación con el valor actual, hago flush y close, para salvar objetos proxy que hibernate no ha persistido del todo, al final envio la transacción si todo estuvo bien, realiza la operación y listo.

Un saludo,
J

lunes, junio 29, 2009

Como hacer un delete from con Hibernate y Spring

Eliminacion con Hibernate y Spring Hibernate Template

Regularmente Hibernate nos permite eliminar entidades mediante el uso del método delete [https://www.hibernate.org/hib_docs/v3/api/org/hibernate/Session.html#delete(java.lang.Object))].

Sin embargo esta operación nos permite solamente eliminar una entidad especifica; sin embargo si deseamos eliminar todas las entidades o un subconjunto utilizando HQL, Spring y Hibernate nos lo permiten.

El template de Hibernate, al cual tenemos acceso cuando extendemos de la clase: HibernateDaoSupport de spring-orm, nos proporciona un método bastante útil llamado bulkUpdate [http://static.springframework.org/spring/docs/2.0.8/api/org/springframework/orm/hibernate3/HibernateOperations.html#bulkUpdate(java.lang.String)] el cual como mencionamos anteriormente nos permite eliminar una, varios o todas las entidades.

A continuación un ejemplo:

this.getHibernateTemplate().bulkUpdate("delete from MyEntity");

Donde MyEntity representa una entidad persistida ya sea mediante XML propios de Hibernate o JPA. De igual manera podemos utilizar sentencias where, etc.

Un saludo,
J


sábado, junio 27, 2009

La Vela Puerca en Costa Rica - 1 Julio - Latino Rock Cafe

La Vela Puerca en Tiquicia

Pues se vino la Puerca, grupo de origen Uruguayo, cabe decir uno de los mejores! Es increíble que un grupo tan bueno, pero de tan poca difusión, tengamos la suerte de verlo, cuando? pues este primero de Julio (Que mejor forma de empezar el mes), onde? Latino Rock Café en el Barrio la California (ahí mismo venden las entradas por el ridículo precio de 5000 rojos).
La verdad que es un regalo de navidad adelantado, ahora solo faltan las Pastillas del Abuelo o La Renga ;).

Yo ya compre su ultimo disco, el Impulso que esta super bueno, como todos.


Un saludo,
J

jueves, junio 25, 2009

Pollo a la Carta (Rajado veanlo)

Acabo de recibir este video, donde muestra uno de los cortos (tan solo 6 minutos), enseñándonos lo afortunados que somos, y que de verdad uno tiene que dar gracias por todo lo que tiene.
La verdad, hasta las lágrimas me saco, realmente creo que uno debería empezar a cooperar para erradicar el hambre y la disparidad social que hoy reina en el mundo.


Un saludo,
J

miércoles, junio 24, 2009

Observers con Java Core

Este pequeño articulo pretende mostrar las facilidades que ofrece Java para implementar el patrón Observer ([+] info http://en.wikipedia.org/wiki/Observer_pattern).

Sin entrar en detalles acerca del patrón, en la mayoría de los contextos buscamos tener un objeto observado, el cual cada vez que cambia de estado o sucede algo importante, sin saber a quien enviara un mensaje, notificando que su nuevo estado al resto de los objetos que observan.

En Java, contamos con dos clases para implementar este patrón, la primera es la clase: java.util.Observable, esta clase tiene varios métodos ya implementados, de los cuales los mas importantes son:

notifyObservers()
notifyObservers(Object arg)
setChanged

El primero y el segundo hacen exactamente lo mismo, invocan a los observadores, la diferencia fundamental recae en que el primero pasara null como parámetro a los observadores.

El tercer método, es aun mas importante, pues si invocamos a cualquiera de los métodos notify sin antes haber invocado a setChanged, el Observable no sabrá que su estado a cambiado y por lo tanto no llamara a ningún observador.

Por ultimo, el metodo: addObserver (Observer observer), permite agregar un nuevo observador, lo cual nos permite contar con N observadores para un objeto.

Ahora bien, asociado a la clase Observable, necesitamos la interface Observer; esta clase nos permite observar los cambios del objeto observable como anteriormente señalábamos, para ello debemos simplemente implementar el método:

update(Observable observable, Object parameter)

Aquí el primer parámetro es el objeto observable que nos esta notificando que cambio propiamente, el segundo el es argumento pasado por el objeto observable cuando su estado cambia y el notifyObservers es invocado.

Como pueden darse cuenta, este par de simples clases nos permiten implementar el patrón de una forma sencilla y estándar dentro del core de Java. Adicionalmente vale la pena comentar que en ambientes Web, Java EE proporciona Listener para Observar los cambios en objetos como el SevletContext (scope application), HttpSession (scope session), HttpServletRequest (scope request), etc.

Ejemplo:


import java.text.MessageFormat;

import java.util.HashMap;

import java.util.Map;

import java.util.Observable;

import java.util.Observer;


public class MyContextObservable extends Observable {


private Map attributes = new HashMap();


public enum ContextOperation {


SET, DELETE;

}


public void setAttribute(String key, Object o) {


this.attributes.put(key, o);

this.notifyChange(ContextOperation.SET, key, o);

} // setAttribute


public void deleteAttribute (String key) {


Object o = this.attributes.remove(key);

if(null != o) {

this.notifyChange(ContextOperation.DELETE, key, o);

}

} // deleteAttribute.


private void notifyChange(ContextOperation operation, String key, Object o) {


this.setChanged();

this.notifyObservers(new Object[] { operation, key, o });

} // notifyChange.

public static void main(String[] args) {

MyContextObservable myContextObservable = new MyContextObservable ();

myContextObservable.addObserver(new DummyObserver ());

myContextObservable.setAttribute("one", "First attribute");

myContextObservable.setAttribute("two", "Second attribute");

myContextObservable.deleteAttribute("one");

}

} // MyContextObservable.


class DummyObserver implements Observer {


@Override

public void update(Observable o, Object arg) {


MessageFormat messageFormat = new MessageFormat ("Message {0}, key {1}, value {2}");

Object[] params = (Object[])arg;

if ((null != params) && (params.length > 1)) {

System.out.println(messageFormat.format(params));

}

} // update

} // DummyObserver.


Salida:

Message SET, key one, value First attribute

Message SET, key two, value Second attribute

Message DELETE, key one, value First attribute


Un saludo,
J

viernes, junio 19, 2009

Tabla con los codigos de status, para el protocolo HTTP

Este documento, explica el significado de los códigos retornados por el protocolo HTTP; resultan muy útil cuando tenemos que implementar algo de bajo nivel o trabajar con Socket o algo por el resto, en el se explica por ejemplo que un 404, es pagina no encontrada, 200 pagina servida con éxito, 500 error interno, etc.

Tabla con los HTMLCODES

Hola,

Quiero compartir esta tabla con los acentos y signos para que lo puedan utilizar en sus páginas Web;

http://www.starr.net/is/type/htmlcodes.html

A mi me ha sido de mucha ayuda.

Saludos,
J

Bunbury, Calamaro, Loquillo y Jaime Urrutia: ¿Dónde Estás?

Hola,

Solo quiero compartir algo con ustedes (poco de moustros, btw):



Dicen que estás muerta,
las calles desiertas,
el olvido.
Nunca sabrán, que sigo el rastro de tu amor.

Sus amplias avenidas
le sirven de guarida
a tu corazón.
Nunca sabrán, que sigo el rastro de tu amor.
Nunca sabrán, que sigo el rastro de tu amor.

Dónde estás, quiero verte,
dónde estás.
Dónde estás, reina de mi soledad.

Cuándo vas, a quererme.
Cuándo vas,
a despertar, del sueño de tu libertad.
A despertar, del sueño de tu libertad.

Eh! nena,
he pasado tanto, tanto tiempo buscándote
y la ciudad es tan grande
pero tu amor tan pequeño.

Los ángeles del cielo
prendados de tu pelo
patrullan por la ciudad,
nunca sabrán, que me partiste el corazón.

Dónde estás, dónde duermes,
dónde estás.
Dónde estás, princesa de mi soledad.
Cuándo vas, a quererme,
cuándo vas,
a renunciar, al sueño de tu libertad,
monstrando donde estás.
Dónde estás, quiero verte,
dónde estás.
Dónde estás, donde duermes,
dónde estás.
Dónde estás, quiero verte,
dónde estás.

lunes, junio 15, 2009

Prox Reunión del CRJUG - WebServices

Logo del CR JUG

Hola,

Solo para anunciar por este medio la próxima reunión del Java User Group de Costa Rica. El 23 de Junio a las 6:30 pm en el Auditorio de la Universidad Latina.

El tema es Java Web Services y el expositor es Rodrigo Nuñez, la agenda es la siguiente:

- Definicion de Web Services
- Conceptos y Herramientas para SOA
- WebServices en Java
o Metro
o GlassFish
o Sysdinet
- REST en Java
- WebServices en .Net
- Opciones de Escalabilidad y Seguridad
- Conclusiones


Saludos,

J

domingo, junio 14, 2009

Herramienta para pronunciacion en ingles de AT&T Text-To-Speech (TTS) research

Hola en esta ocasión he querido compartir con todos ustedes una herramienta que estoy seguro que para los que trabajan con personas de habla inglesa o están aprendiendo el idioma, se convertirá en una herramienta importante de uso diario, me refiero al TTS (Text-To-Speech, por sus siglas en ingles), este software en linea toma un texto en ingles y pronuncia para nosotros, he hecho algunas pruebas y va super bien.

Adicionalmente cuenta con varias voces y el mismo genera un archivo de audio que puede ser bajado o escuchado en linea.

Que los disfruten,
J

Una de Celtas Cortos - Tu eres el mejor

Celtas Cortos, grupo español; debo decir de mis favoritos, suelen combinar el Ska, con ritmos latinos y del mediterraneo, con una influencia celta muy marcada en la flauta, gaita y violín; les dejo algo de ellos. Un saludo!



De todo un tiempo curándome heridas,
he rescatado todo lo mejor.

Y el sentimiento me ha dado palabras que he convertido en esta
canción
Y pese a todo, qué hermosa es la vida, aunque regale a veces dolor
Aunque sea a veces cabrona perdida,
siempre hay un sitio para el amor
No te rindas nunca a la depresión.

Saca algo de fuerza de esta canción.
No abandones nunca, hay un lugar mejor, y lo llevas dentro de
tu corazón
De todo malo siempre hay algo bueno.
Del lado bueno hay algo mejor,
Y del mejor, saca lo que tú puedas, y gástalo con los de alrededor.
Date una fiesta en un día cualquiera.
Un homenaje: tú eres el mejor.

Deja que pasen esos nubarrones.
Tras la tormenta siempre sale el sol
Porque está claro, la vida es jodida, pero tú puedes darle un subidón.
Un subidón que cierre las heridas y las convierta en acorde mayor
Cómete al mundo mirando sus ojos, verás qué rico que sabe el cabrón
Y que la vida tiene muchas vidas, y es verdadera esta canción

Celtas Cortos.

lunes, junio 08, 2009

Configura tu MMS - ICE CELULAR

Hola gente,

Me encontre esta para configurar en tu aparato el servicio del ICE, para enviar mensajes con Imagen:

http://www.grupoice.com/esp/serv/per/cel/catal_sm/men_multi/guia.htm

En mi caso yo tengo un K550i, aunque no vi mi modelo dentro de la lista que dan en el PDF, me guié con el modelo mas similar y funko.

Como dato curioso si envía un mensaje a un celular sin soporte o conflagración MMS, el ICE manda un link y credenciales para ver el mensaje en:

http://mms.grupoice.com/m/C?url=mmc1

upd (edit):

Para que funcione los MMS debe tener instalado Internet en su Celular; el costo por tarifa fija, es de 3500 colones por mes.

update (dic 29 2010)

Me encontré estos otros links con mas info:

También puedes ver mas, en el thread del facebook de Kolbi

Un saludo,
J

martes, junio 02, 2009

A tu lado ICE

Hola gente,

Al parecer el Instituto Nacional de Electricidad (ICE), esta realizando un esfuerzo por acercarse a los usuarios, lo anterior se pueden sumar espacios en facebook, hi5 entre otras redes sociales, además existe un blog donde el ICE puede contestar tus dudas y también el owner de este blog parece que se pasea por los blogs que hablan del ICE, tratando de dar a conocer el blog y disponiendo el servicio para responder dudas y obtener comentarios acerca de la compañia.

A mi en lo personal, me parece muy bueno que las instituciones publicas se acerquen a los usuarios, por estos medios;

Aquí la dirección, para que la checken:

http://atuladoice.blogspot.com/2009/05/que-quieres-preguntarle-al-ice-si.html

Un saludo,
J

lunes, junio 01, 2009

Phrasal & verbs - useful list

Hola me encontre esta lista, es super util para aprender y/o buscar los phrasal/verbs en ingles;

http://www.englishclub.com/vocabulary/phrasal-verbs-list.htm

Un saludo,
J

Como ejecutar solo un unit test en Maven (goal test)

En parte, Maven se encuentra orientado al modelo test driven, donde tenemos que hacer diferentes test de unidad para nuestras clases y así intentar asegurar la calidad.

Si nuestro proyecto es muy grande y seguimos esta metodología, ejecutar la tarea:

mvn test

Puede tomar un tiempo bastante considerable. Sin embargo existe una forma de ejecutar solo un test dentro del conjunto de testes que tenemos en el proyecto:

mvn test -Dtest=className

Le indica a Maven, que solo debe correr la clase. Tome en cuenta que className se refiere al paquete y nombre de la clase que realiza el test.

Por ejemplo:

mvn test -Dtest=com.jsanca.TestSomething

Un saludo,
J