Primero vamos a instalar ant4eclipse como un plugin.
Cierra el eclipse si lo tienes abierto. Descarga el archivo zip de esta pagina (el tar.gz siempre me decia que estaba corrupto) y luego descomprimelo en la carpeta donde instalaste el eclipse con el comando

sudo unzip ~/Downloads/ant4eclipse-plugin-0.5.0.rc1a.zip

Verifica que se halla instalado abriendo el eclipse y dando clic en el menu Windows->Preferences y luego seleccionando Ant->Runtime en el arbol de la izquierda. Si en el listado de “Contributed Entries” se encuentra algo que diga ant4eclipse ya se ha instalado.
Ahora solo nos queda instalar ant-contrib. Descarga de esta pagina el archivo ant-contrib-[version] y descomprimelo en la carpeta de tu eleccion (yo tengo una llamada “librerias”). Luego desde el Eclipse en el mismo menu donde verificamos la instalacion de ant4eclipse, selecciona “Ant Home Entries (Default)” y da clic en el boton de agregar un jar externo. Seleccionamos el archivo ant-contrib.jar que debe estar en ~/librerias/ant-contrib/lib y damos clic en OK.

Listo, ya deberiamos tener instalado el ant4eclipse y el ant-contrib. byte!

ArrayVSList
Dentro de nuestros programas siempre habrá algun pedazo de código donde utilicemos arreglos.
Mientras implementaba unos métodos para insertar y eliminar registros de una clase, noté que en algunos había utilizado Arrays y en otros Lists. Por ello decidí buscar que es lo que recomendaban otros programadores al respecto, fue así como encontré este artículo.

Finalmente quede convencido de utilizar Lists debido a la flexibilidad que ofrecen.

Ejemplo:

public static void insert(List<Dato> datos) {
  //... configuracion de conexion
  for(Dato dato:datos){
	db.executeUpdate("insert into datos(desc,cantidad) values(:desc,:cantidad)",
	new Object[]{dato.getDescripcion(),dato.getCantidad()});
  }
}

VS.

public static void insert(Dato[] datos) {
  //... configuracion de conexion
  for(Dato dato:datos){
	db.executeUpdate("insert into datos(desc,cantidad) values(:desc,:cantidad)",
	new Object[]{dato.getDescripcion(),dato.getCantidad()});
  }
}

Como puedes observar, es prácticamente lo mismo, la diferencia es que al invocar el primer método puedes pasar como párametro un ArrayList, LinkedList, Vector o tu propia clase que implemente la interfaz List ;-) .

byte!

extendingBirtBook

Con la ayuda de este ejemplo(bueno, el de la version 2.5 que aparece en los comentarios), pude crear un servlet que ejecuta y despliega un reporte de BIRT.
Para establecer el valor de un parámetro desde este servlet, a través del Report Engine API, hay que utilizar la interfaz IRunAndRenderTask (no he visto si se puede con alguna otra).
Lo primero es obtener una referencia a esta interfaz mediante:

IRunAndRenderTask task = birtReportEngine.createRunAndRenderTask( design );

y luego simplemente utilizar el método setParameterValue de la siguiente forma:

task.setParameterValue(“Name”, “Value”);

Fuente:
Integrating BIRT with PHP

gpartedInAction

El otro día quise instalar Windows después de haber instalado Ubuntu, asi que reparticione mi disco con el fabuloso livecd de gparted, y supuestamente, ya tenia todo listo para insertar el disco de instalacion de windows y dejar que él hiciera el resto. Me llevé una sorpresa cuando al seleccionar la partición donde quería instalar Windows me marcaba un error de que no podía encontrar una partición donde pudiera instalarse. Intente una y otra vez eliminar y crear la partición que tenía destinada para el Windows sin conseguir éxito. Decidí desistir por ese día y volver a trabajar en mi querido Ubuntu. Fue ahí cuando me lleve una terrible sorpresa, “Insert disk, Operating System not Found”… WTF……..

El problema es que tenía una partición extendida y el espacio que deje para Windows lo puse en esa partición extendida, esto ocasionaba que Windows no se pudiera instalar. Lo que no entendí es, PORQUE DEMONIOS BORRÓ MI TABLA DE PARTICIONES. En fin, para recuperarla hay una excelente herramienta que se llama TestDisk y es muy fácil de usar. También la puedes encontrar en el “Ultimate Boot CD” (fabuloso para toda clase de tareas de diagnóstico y reparación), lo díficil es encontrarla en los menús… :-| bump ..  pero si no mal recuerdo esta en la opción de “Recovery Tools” (yo andaba perdido buscandolo en Partition Tools, Hard Disk Tools, Antivirus :-D jajaja)

Una vez recuperada tu tabla de particiones tienes que vovler a cargar el GRUB en el MBR (asi es, Windows no solo borró la tabla de particiones, reescribió el MBR completamente :@ ) para poder arrancar Ubuntu. Esto lo puedes hacer con cualquier disco de Linux (Ubuntu, Fedora, OpenSuse, etc), yo lo hice con el de Ubuntu ;-)
Basta con arrancar el liveCD de Ubuntu (seleccionar “probar Ubuntu sin modificar mis archivos”) y una vez que carga la interfaz gráfica, abrir una terminal (Applications->Accesories->Terminal)
Ejecuta el siguiente comando para entrar en la consola de GRUB

sudo grub

Ejecuta

find /boot/grub/stage1

Te va a regresar algo como “hd?,?”, p. ej. “hd0,0″, vamos a usar esa ubicación para el siguiente comando

root (hd?,?)

finalmente ejecuta

setup (hd0)

Nota: El ultimo comando instala el GRUB en el MBR, si quieres instalarlo en una partición utiliza setup(hd?,?).

Listo! Hemos recuperado nuestra tabla de particiones (gracias TestDisk) y reinstalado el GRUB (boot loader).

Fuentes:
Ubuntu Forums – Ubuntu install not recognizing current partitions.
Ubuntu Forums – How to install Grub from a live Ubuntu cd.

Después de instalar google-earth -mediante ’sudo googleearth.bin’- en Ubuntu. Cada que lo iniciaba me marcaba un error:

could not create directory: /root/.googleearth/Cache

El problema es que al ejecutarse como root crea algunos archivos de configuración para el usuario root.
La solución la encontré aquí.
Basta con borrar (más fácil que cambiar permisos) el directorio ~/.config/Google.

sudo rm -Rf ~/.config/Google

byte!

String query="select from "+Rim.class.getName();
return (List<Rim>) PMF.get().getPersistenceManager().newQuery(query).execute();

Ahora que empiezo a utilizar el app engine sdk, queriendo hacer una consulta sencillisima me marcaba un error parecido al siguiente

StreamingQueryResult was not included in the set of types which can be serialized

La respuesta la encontre aqui. El punto es que no puedes regresar directamente el objeto StreamingQueryResult al cliente, a pesar de que implemente la interfaz List<T>. En fin, lo unico que tienes que hacer para poder regresar los resultados al cliente es copiar los elementos a un nuevo arreglo de la siguiente forma.

String query="select from "+Rim.class.getName();
List<Rim> rims = new ArrayList<Rim>();
for(Rim rim:(List<Rim>) PMF.get().getPersistenceManager().newQuery(query).execute()){
			rims.add(rim);
		}
return rims;

byte!

Java – Concatenar RTF’s

Septiembre 15, 2009

Para concatenar varios archivos RTF’s en un solo RTF lo unico que tenemos que hacer es:

    remover la etiqueta rtf de fin de documento del primer archivo
    remover la etiqueta de inicio de documento y fin de documento de archivos subsecuentes
    remover la etiqueta de inicio de documento del ultimo archivo

esta idea surgio a partir de este post.
El problema es identificar la etiqueta de inicio de documento, ya que depende de la codificacion que se utilizo para crear el archivo. Aqui dejo el codigo que utilicé, espero posteriormente mejorarlo -mediante el uso de expresiones regulares- para que pueda concatenar cualquier RTF (independiente de la codificación). Si alguien sabe como hacer esto, le agradecería deje un comentario ;-) .
Los documentos de entrada como el documento que se regresa son representados como bytes, para que sea más fácil su manejo -ej. documentos almacenados en la base de datos-

private byte[] concatenateRTF(List<byte[]> documentos)
            throws UnsupportedEncodingException {
        StringBuffer rtf = new StringBuffer(), subRtf;
        int indexOfEndTag, indexOfBeginTag;
        final String CHARSET = "UTF-8";
        final String BEGIN_TAG = "{\\rtf1\\ansi\\ansicpg1252\\uc1 \\deff0\\deflang3082\\deflangfe3082";
        final String END_TAG = "\\par }";
        for (int docNumber = 0; docNumber < documentos.size(); docNumber++) {
            byte[] contenido = documentos.get(docNumber);
            if (contenido != null) {
                if (docNumber == 0) {

                    rtf = new StringBuffer(new String(contenido, CHARSET));
                    indexOfEndTag = rtf.lastIndexOf(END_TAG);
                    if (indexOfEndTag != -1)
                        rtf = rtf.replace(indexOfEndTag, indexOfEndTag + END_TAG.length(), "");
                } else if (docNumber < documentos.size() - 1) {
                    subRtf = new StringBuffer(new String(contenido, CHARSET));
                    indexOfBeginTag = subRtf.indexOf(BEGIN_TAG);
                    if (indexOfBeginTag != -1)
                        subRtf = subRtf.replace(indexOfBeginTag,
                                indexOfBeginTag + BEGIN_TAG.length(), "");
                    indexOfEndTag = subRtf.lastIndexOf(END_TAG);
                    if (indexOfEndTag != -1)
                        subRtf.replace(indexOfEndTag, indexOfEndTag + END_TAG.length(), "");
                    rtf.append(subRtf);
                } else {
                    subRtf = new StringBuffer(new String(contenido, CHARSET));
                    indexOfBeginTag = subRtf.indexOf(BEGIN_TAG);
                    if (indexOfBeginTag != -1)
                        subRtf = subRtf.replace(indexOfBeginTag,
                                indexOfBeginTag + BEGIN_TAG.length(), "");
                    rtf.append(subRtf);
                }
            }
        }
        return rtf.toString().getBytes(CHARSET);
    }

byte!

El día de hoy me apareció una actualización disponible en mi flamante ubuntu 9.04, como de costumbre le di clic en actualizar sin pensar mucho.
Pues dentro de las actualizaciones venia una actualizacion del JDK, esto ocasiono que Eclipse quitara el JRE de su lista. Esto ocasiono que mis proyectos fallaran miserablemente con el error

java.lang.UnsupportedClassVersionError: Bad version number in .class file

Para corregir esto, simplemente hay que reconfigurar el JRE en las preferencias de Eclipse y -tal vez- recompilar los proyectos (Project->Clean…)

byte!

Para instalar el plugin de adobe en la version de 64 bits de ubuntu y poder reproducir contenido flash en firefox (youtube) primero tienes que descargar la libreria desde aqui. Al final viene un link donde lo puedes descargar.
Ahora hay que descomprimir el archivo (puede cambiar el nombre por la version)

tar xvzf libflashplayer-10.0.32.18.linux-x86_64.so.tar.gz

y luego copiar la libreria y crear algunos enlaces para que firefox la pueda encontrar

sudo cp libflashplayer /usr/lib/mozilla/plugins/
sudo ln -sf /usr/lib/mozilla/plugins/libflashplayer.so /usr/lib/firefox-addons/plugins/
sudo ln -sf /usr/lib/mozilla/plugins/libflashplayer.so /usr/lib/xulrunner-addons/plugins/

Reinicia firefox para que los cambios surtan efecto y listo!

byte!

Fuente: myScienceIsBetter

Si te aparece este error lo mas seguro es que olvidaste “anotar” la interfaz del servicio RPC con el atributo RemoteServiceRelativePath.

@RemoteServiceRelativePath("MyRPCService")
public interface MyRPCService extends RemoteService {
    public String getHelloWorld(String name);
}

Aqui lo importante es que la anotación concuerde con nuestras declaraciones del servlet en el archivo de configuracion del modulo, ej. MyModule.gwt.xml, y en el web.xml

MyModule.gwt.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 1.6.4//EN" "http://google-web-toolkit.googlecode.com/svn/tags/1.6.4/distro-source/core/src/gwt-module.dtd">
<module rename-to="my.web.application">
    <inherits name="com.google.gwt.user.User" />
    <inherits name="com.smartgwt.SmartGwt"/>
    <entry-point class="my.web.application.client.Main" />
    <servlet class="my.web.application.server.MyRPCServiceImpl" path="/MyRPCService"/>
</module>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
    <servlet>
        <servlet-name>MyRPCService</servlet-name>
        <servlet-class>my.web.application.server.MyRPCServiceImpl</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>MyRPCService</servlet-name>
        <url-pattern>/my.web.application/MyRPCService</url-pattern>
    </servlet-mapping>

    <!-- Default page to serve -->
    <welcome-file-list>
        <welcome-file>Main.html</welcome-file>
    </welcome-file-list>
</web-app>

byte!