Archivo

Archivo para la categoría ‘Linux’

Integración de JasperReports en aplicaciones Java

Domingo, 10 de octubre de 2010 Sin comentarios

Lo más complicado de integrar JasperReports en una aplicación Java es encontrar buena documentación de como hacerlo. JasperReports es muy potente y a la vez complejo que las alternativas que brinda son muchísimas. Fui encontrando distintos ejemplos y pequeños tutoriales que realmente no me sirvieron. Esta entrada está basada en el libro JasperReports 3.5 for Java Developers de David R. Heffelfinger. Para aquellos que no quieran comprar el libro, acá va un muy somero tutorial de como hacer funcionar esto. Básicamente es el tutorial que no pude encontrar en mi lucha y que hago como ayuda-memoria para mí y quizás sirva a alguien. Realmente recomiendo comprar el libro ya que es muchísimo más amplio que esta pequeña guía y muestra el uso de muchas más opciones y alternativas que simplemente voy a omitir. Se supone que el código que aparece en esta entrada debería ser correcto y funcionar, pero si encuentran algún error háganme saber y será corregido.

Todo el software necesario puede conseguirse en http://www.jaspersoft.com/

Otros links de interés:

iReport http://sourceforge.net/projects/ireport/files/

jFreeChart http://sourceforge.net/projects/jfreechart/

Breve introducción

Hay un par de conceptos que deben tenerse presentes a la hora de utilizar JasperReports para que no se convierta todo en un gran dolor de cabeza. Los pasos que daremos para alcanzar nuestro objetivo son los siguientes:

  1. crear una plantilla para el reporte (jrxml file)
  2. compilar la plantilla
  3. generar el reporte (a un archivo jrprint o a un pdf o por pantalla)

Creando la plantilla para el reporte

Esta parte es una de las más simples. Para la generación de la plantilla utilizamos iReport (yo estoy usando la versión 3.7.5). iReport tiene un muy buen wizard para la creación de plantillas y muchas opciones para cambiar el layout. Las plantillas pueden incluir elementos estáticos y dinámicos y tener embebidas las consultas sql necesarias para obtener los datos de una base de datos. También existe la posibilidad de pasar los datos programáticamente al reporte. Los ejemplos que están a continuación asumen que la consulta está embebida en el reporte y solo se hará referencia al objeto de datos que puede pasarse al reporte.

Las plantillas de reportes son archivos de extensión jrxml. El formato del archivo es en realidad un xml estándar con otra extensión.

Compilando el reporte

JasperReports no utiliza las plantillas de reportes tal como son guardadas por iReport sino que las compila. Durante este proceso el xml es parseado y la información se guarda como objetos serializados en archivos de extensión jasper. No me puse a escarbar aún en estos archivos así que no puedo decir mucho de ellos.

En la medida que las plantillas no cambien no tienen porque ser compiladas cada vez que necesitamos el reporte, sino que usaremos como entrada los archivos .jasper ya compilados.

El siguiente fragmento de código compila una plantilla (.jrxml) para convertirla en un reporte .jasper


import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperCompileManager;

public class compileReport {

public static void main(String[] args) {
    try {
        System.out.println("Compiling report...");
        JasperCompileManager.compileReportToFile("firstTestReport.jrxml");
       System.out.println("Done!");
    } catch (JRException e) {
        e.printStackTrace();
    }
}

La clase JasperCompileManager provee varios métodos para compilar las plantillas ya sea utilizando archivos o streams como salida. En este caso estamos mandando la salida a un archivo el cual tendrá el mismo nombre que la plantilla con extensión .jasper.

Generando el reporte a un archivo pdf
Una vez que tenemos nuestra plantilla compilada podemos llenar el reporte y utilizar distintas formas de salida para el mismo, ya sea un archivo pdf, html, excel, un visor en pantalla y una larga lista de etcéteras. El siguiente fragmento de código genera un archivo pdf

import java.io.File;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.export.JRPdfExporter;
import net.sf.jasperreports.engine.util.JRLoader;

public class exportToPdf {
    public static void main(String[] args) {
        File file = new File("firstTestReport.jrprint");
        try {
            JasperPrint jasperPrint = (JasperPrint) JRLoader.loadObject(file);
            JRPdfExporter pdfExporter = new JRPdfExporter();
            pdfExporter.setParameter(JRExporterParameter.JASPER_PRINT,  jasperPrint);
            pdfExporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME,  "firstTestReport.pdf");
            System.out.println("Exporting report...");
            pdfExporter.exportReport();
            System.out.println("Done!");
        } catch (JRException e){ }
    }
}

Generando el reporte a pantalla

Ya mencionamos que los reportes podían generarse y enviarse a distintas salida, la pantalla es un muy buena alternativa para la pre visualización de reportes, así que acá va el fragmente de código que genera el reporte y lo envía a pantalla

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Properties;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.view.JasperViewer;

public class reportView {

    public static void main(String[] args) {
        try {
            JasperPrint print;
            String url = "jdbc:postgresql://miserver/midatabase/";
            Properties props = new Properties();
            props.setProperty("user","miuser");
            props.setProperty("password","mipassword");
            props.setProperty("port", "5432");
            Connection conn = DriverManager.getConnection(url, props);
            print = JasperFillManager.fillReport("firstTestReport.jasper", new HashMap(), conn);
            JasperViewer view = new JasperViewer(print);
            view.setVisible(true);
        } catch (JRException ex) {}
          catch ( SQLException e ){}
     }
}

En este caso estamos pasando una conexión al método fillReport, la cual será utilizada para conectarse a la base de datos y ejecutar las sentencias sql embebidas en la plantilla. El método también soporta, en lugar de una conexión, una fuente de datos que contenga los valores necesarios para el reporte. JasperReports provee de un data source vacio (JREmptyDataSource) que puede ser utilizado para probar los reportes sin datos.

Instalando true type fonts en Ubuntu

Domingo, 10 de octubre de 2010 Sin comentarios

Algunas aplicaciones pueden requerir la instalación de las Ms True Type fonts en Linux. En particular, estaba necesitando las fuentes para usar iReport y no estaban disponibles para la JVM así que aquí vamos.

Esto es poco mas que un ayuda-memoria porque la instalación sobre Ubuntu es realmente muy sencilla usando apt-get

De aquí en más se asume que se está trabajando como root:

root@csomma-laptop:/home/csomma# apt-get install msttcorefonts
….. después de descargar los paquetes y ejecutar la instalación…

All done, no errors.
All fonts downloaded and installed.
Updating fontconfig cache for /usr/share/fonts/truetype/msttcorefonts
No CIDSupplement specified for Dotum-Bold, defaulting to 0.
No CIDSupplement specified for Batang-Regular, defaulting to 0.
No CIDSupplement specified for Batang-Bold, defaulting to 0.

No CIDSupplement specified for Dotum-Regular, defaulting to 0.
Updating fontconfig cache for /usr/share/fonts/truetype/msttcorefonts

Así de simple, fácil y rápido. Hasta la próxima entrada…

Categories: Linux Tags: , , ,

Google Chrome OS

Martes, 14 de julio de 2009 5 comentarios

Como siempre, Google haciendo las cosas bien desde el comienzo y presentó oficialmente Google Chrome OS. Ya hay cientos de sitios hablando sobre el tema, especulando sobre sus funcionalidades y hasta mostrando supuestas capturas de pantalla de como será este nuevo sistema operativo.  Pero vamos a hacer una presición antes de entrar en las bondades de este “sistema operativo”

Si bien mucho se habla de que Google lanzó su sistema operativo, técnicamente lo que Google está lanzando no es un sistema operativo sino que se trata de una distribución de Linux y la diferencia no es para nada menor. Un sistema operativo es un software que realiza de interfase entre el hardware de la computadora y el usuario, básicamente es el software que convierte en usable al pedazo de fierro que tenemos arriba de la mesa, administra la memoria, el acceso a disco, hace los dibujitos en pantalla y recibe nuestras órdenes a través del teclado y el mouse.

Linux es un sistema operativo, es un software que hace todas estas cosas, es gratuito, de código abierto y se puede conseguir a traves de una gran cantidad de distribuciones. Lo que Google está haciendo es una nueva distribución de Linux, es decir, va a meter el sistema operativo linux, con una gran cantidad de software desarrollado por ellos, optimizado y configurado para ejecutar el navegador Chrome, y todas las aplicaciones web y desktop que Google tiene y de esta manera lo va a hacer llegar al usuario. El sistema operativo será Linux, la distribución Google Chrome OS.

Dichas las diferencias, veamos porque es tan bueno que haya una nueva distribución de Linux. Según Google, la arquitectura de Google Chrome OS será Google Chrome (el navegador) en un nuevo gestor de ventanas sobre un kernel Linux todo lo cual está pensado para la nueva era en la nube que estamos viviendo, es decir, nuestro mundo cotidiano cada vez más dependiente de Internet. Una de las grandes diferencia existentes entre las distintas distribuciones de Linux es las optimizaciones y configuraciones que cada proveedor ofrece y dadas las capacidades de Google para sorprendernos, no me cabe la menor duda de que lo que Google podrá construir sobre un kernel Linux va a ser muy bueno.

Google ha demostrado ser un gran integrador de software y tener una visión de las necesidades futuras de los usuarios muy claras. Todo esto unido a los netbooks, que crecen como hongos en el mercado, a la cada vez más disponible y barata conectividad de banda ancha y al poder de su marca ya instaurada en el mercado hacen de Google Chrome OS un producto a tener en cuenta.

Espero ansiosamente que el producto llegue al mercado para poder probarlo, espero sin embargo, que sea lo suficientemente abierto como para poder usitilizarlo sin dificultades como cualquier otra distribución de linux, es decir que pueda ser capaz de soportar todo el software linux disponible y no solo aquellos que Google promueve. Eso podrían convertirlo sin lugar a dudas en la distribución preferida de muchísima gente. Estaremos alertas.

Solaris para el usuario de Linux

Lunes, 17 de noviembre de 2008 Sin comentarios

Cuando los usuarios de Linux nos enfrentamos con un Solaris 10 chocamos de frente con pequeños problemas de usabilidad, que básicamente se deben a que por defecto estamos utilizando un shell diferente. Estos problemas se manifiestas fundamentalmente en la ausencia de history y en que el backsapace no hace lo que debería.

Tips para solucionar:

1) Podemos iniciar bash
2) Seteando el backspace
Para ello debemos ejecutar stty erase ^?
donde ^? es el resultado de pulsar backspace
3) Para habilitar el history
set autolist

Simple y facil, aunque siempre podemos cambiar el shell por defecto de un usuario en /etc/passwd

Categories: Linux Tags: ,

Proxy en la linea de comandos

Martes, 22 de abril de 2008 Sin comentarios
Esto más que toda una entrada es un recordatorio para mi y para todos. Frecuentemente me veo en la necesidad de tener que establecer el proxy desde la linea de comandos. Para quienes se pregunten el porque de esto, les cuento que hay varias situaciones en las que esto es muy útil, por ejemplo, si queremos conectar a través de un proxy un sistema que no tiene entorno gráfico, o si queremos establecer las preferencias del proxy a nivel de sistema para todas las aplicaciones que lo utilicen.

Bien es muy sencillo de hacer, basta con definir la variable http_proxy con usuario y contraseña (opcional) y la dirección ip y puerto del proxy. La sintaxis para esto es la siguiente:

export http_proxy=http://usuario:contraseña@direccion_ip:puerto

por ejemplo,

export http_proxy=http://jison:miPassword@192.168.1.1:80

Categories: Linux Tags:

Más sobre túneles SSH

Martes, 4 de diciembre de 2007 4 comentarios
Oscar dejó un comentario en la entrada Túneles con ssh preguntando como acceder a un servidor web por ssh para realizar tareas administrativas, en particular para acceder a la interfaz del firewall que tiene configurado. Para ello, https es un protocolo relativamente seguro, a pesar de las vulnerabilidades encontradas en algunos navegadores en su implementación. Pero si lugar a dudas, usar un túnel ssh para conectarse al servidor, es más seguro y mucho más interesante para nuestros fines, así que a eso dedicaremos las proximas líneas.

Básicamente SSH nos permite establecer conexiones seguras entre dos extremos. Adicionalmente, ssh permite mandar otros protcolos como datos, lo cual hace que un protocolo inseguro, como http, se convierta en algo bien encriptado. Los requerimientos para ello son bastante simples, un cliente ssh en la máquina desde la que nos conectamos y un servidor ssh en el otro extremo, en el caso del ejemplo, en el equipo donde tenemos el webserver.

Una vez que tenemos los requisitos cumplidos, establecer la conexión es bastante sencillo, así como el funcionamiento. Lo que haremos será crear un túnel entre un puerto de nuestro equipo y el servidor ssh, por lo que toda conexión que se haga a dicho puerto, ssh se encargará de mandarla por el túnel hacia el otro equipo.

La sintaxis es la siguiente:

ssh -L localport:localhost:dstport usr@dstaddress

por ejemplo:

ssh -L 1000:localhost:8000 miusuario@midominio.com

En este ejemplo creamos un túnel entre el puerto 1000 del equipo local y el puerto 8000 del equipo midominio.com y estamos asumiendo que en el puerto 8000 de midominio.com atiende un servidor web. Ahora, para acceder al servidor web, debemos conectarnos a http://localhost:1000, es decir, al puerto 1000 de nuestro host local. SSH se encargará de encriptar los paquetes que se reciban en ese puerto y enviarlos al servidor de destino. Ahí serán entregados en el puerto 8000 y los paquetes de respuesta recibirán un tratamiento análogo.

Con este simple mecanismo, podemos acceder a cualquier servicio en un servidor remoto encriptándolo con ssh, ya sea para aplicaciones web, correo, news o cualquier otra cosa que queramos.

Categories: Linux Tags:

Es la hora de Ubuntu

Domingo, 25 de noviembre de 2007 Sin comentarios
Después de unos cuantos meses con Suse 10.2, me decidí por probar Ubuntu 7.10 en el notebook, es un Acer 3693 y la experiencia bien vale para toda la serie 3690 sin mayores cambios. No es que el Suse no funcionara correctamente, pero si es cierto que tenía algunos problemitas de hardware. Particularmente, el lector de tarjetas de memoria y la web cam integrada no funcionan, mientras que la tarjeta wifi requería del ndiswrapper y los drivers de Winkk Xp (los de Vista no funcionan, o al menos no pude hacerlos andar).

Con Ubuntu todo arrancó bastante lindo. Nunca había instalado uno, solo había utilizado en diversas oportunidades las versiones live, ya sea para probar hardare o como cd de recuperación en sistemas con problemas. Realmente las distintas distribuciones son como sistemas operativos diferentes, no es cuestión de pasarse de un linux a otro sin impacto alguno. Ubuntu está basado en Debia, por lo que las diferencias con Suse son realmente grandes (probablemente si instalo kubuntu pueda achicar un poco las diferencias). Pero bueno, la experiencia arrancó bastante bien. Me gusta mucho la forma de instalación que tiene Ubuntu. La misma consiste en arrancar una versión live y desde la misma ejecutar el instalador como si fuese cualquier programa. Esto permite estar utilizando el sistema mientras se hace la instalación. El instalador es sencillo, rápido y no hace preguntas complejas. No se si será como para un usuario final, pero realmente no requiere demasiados conocimientos para hacer la instalación. Todo transcurrió rápido y sin mayores problemas.

En cuanto al hardware no tengo absolutamente ninguna queja de Ubuntu, es más, hasta ahora han sido solo alegrías. Absolutamente todo el hardware funcionó de maravillas. En particular, las cosas más complicadas tales como el lector de tarjetas de memoria, la orbicam y la tarjeta inalámbrica funcionaron sin ningún tipo de configuración. También vio correctamente el disco sata y configuró adecuadamente el video a 1280×800.

Una vez instalado comencé a pelear con lo que para mí es toda una nueva forma de instalar y configurar aplicaciones. Extraño un poco el Yast y los rpms, pero con la mente abierta a los cambios, estoy dispuesto a entrarle al Ubuntu.

Arrancamos bien, el hardware funcionó y en los proximos post algunos comentarios sobre la instalación de las aplicaciones.

Categories: Linux Tags:

Tuneles ssh (parte 2)

Miércoles, 31 de octubre de 2007 Sin comentarios
A raíz de esta entrada, nos preguntaron como evitar el pedido de contraseña en una conexión ssh. Esto es sumamente útil fundamentalmente para la automatización de tareas, ya que no existe un usuario que pueda ingresar la contraseña al momento de la ejecución.

El procedimiento es bastante sencillo y consiste en copiar en el servidor al que nos conectamos la clave pública correspondiente al usuario que inicia la conexión. De esta manera, al iniciarse la conexión, el protocolo realiza la autenticación utilizando el par de claves pública/privada que conoce.

Para crear las claves pública y privada se utiliza el comando ssh-keygen de la siguiente manera:

ssh-keygen -t rsa

Esto crea el par de claves, las cuales quedarán en el directorio .ssh del usuario en los archivos id_rsa e id_rsa.pub.

La clave privada debe quedar ahí y la publica debe ser copiada al archivo authorized_keys en el directorio .ssh correspondiente al usuario con el que se está realizando la conexión en el servidor al que nos queremos conectar, es decir, el contenido del archivo id_rsa.pub debe agregarse al archivo authorized_keys.

De esta manera se podrá realizar la conexión sin necesidad de ingresar la contraseña.

Categories: Linux Tags:

Pinguinos en Japón

Sábado, 12 de mayo de 2007 Sin comentarios
Me entero a través de Enrique Dans la iniciativa del gobierno japones de apotar Linux para reducir la dependencia de un solo proveedor de software. La verdad que es toda una noticia para la comunidad linuxera y merecia un lugar en este blog.

En el artículo de Dans pueden encontrar más información así como links a los artículos originales. No voy a ponerme a hacer refritos de dichos artículos sin aportar nada nuevo así que me limitaré a referirlos a ellos.

Categories: Linux Tags:

Pocas chances a la Vista

Lunes, 26 de marzo de 2007 Sin comentarios
Tal cual lo había adelantado en un post anterior, Vista tuvo su oportunidad en esta máquina en la que hoy, felizmente, sobre un Suse 10.2, escribo este post. A pesar de no haber utilizado mucho el Vista, algunos comentarios someros (muy someros) puedo hacerles.

El post anterios comenté el proceso de instalación (en un equipo preinstalado) así que no ahondaremos en eso. Brevemente un par de referencias sobre la usabilidad, el look & feel y algunos aspectos (totalmente informales) sobre la seguridad.

En cuanto al look & feel realmente es muy bueno, tal como Micro$oft nos tiene acostumbrados, lleno de colorcitos, iconitos voladores y gadgets muy bonitos. Nada original, todos esos efectos y chiches son ya habituales en los sistemas operativos modernos, ya sea en Linux o Mac, pero no dejan de ser lindos. Algunas cosas cambiaron bastante y cuesta un poco acostumbrarse pero para un usuario doméstico no es mayor inconveniente. Ya pensando en un uso empresarial la cosa se complica, ya que de seguro eso implica una baja en la productividad y una gran cantidad de llamadas a la mesa de ayuda.

Una de la primeras cosas que me llamó la atención es el enorme consumo de memoria de la configuración por defecto. Es claro que uno puede empezar a toquetearlo para achicar ram, pero 600 mb sin estar ejecutando ninguna aplicación me parece un despropósito.


No se como responde a las aplicaciones grandes, es decir, no se que pasará cuando uno levante el Word, un navegador, el cliente de correo, el chat mientras escucha mp3 (nada raro para estos días). Lo que si es claro es que vayan comprando memoria y un buen procesador, porque este señor no se anda con chiquitas.

En lo que respecta a la seguridad, poco puedo decir y mucho ya se ha dicho, pero la impresión fue que el cartelito que te pregunta si querés hacer lo que estás intentando hacer, es realmente molesto. Sinceramente creo que es bastante poco feliz que la seguridad pase por preguntar al usuario cada vez que se intenta hacer algo. Por otra parte, muchas veces, el mensaje es muy poco claro para el usuario final, por lo que es muy probable que el usuario acepte cosas que no sabe que quieren decir.

La frutilla de la torta, para el deleite de la muchachada, pude obtenerla tras algunos minutos de uso. Acá se las dejo y me despido hasta la próxima con la instalación de Suse.

Categories: Linux Tags: