<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Linux, Java y programación &#187; java</title>
	<atom:link href="http://casidiablo.net/tag/java/feed/" rel="self" type="application/rss+xml" />
	<link>http://casidiablo.net</link>
	<description>Blog de Java, Programación y Linux</description>
	<lastBuildDate>Mon, 08 Mar 2010 03:41:21 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Usando el System Tray desde Java</title>
		<link>http://casidiablo.net/systray-java-ejemplo/</link>
		<comments>http://casidiablo.net/systray-java-ejemplo/#comments</comments>
		<pubDate>Mon, 15 Feb 2010 13:55:04 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[ejercicios en java]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[area]]></category>
		<category><![CDATA[awt]]></category>
		<category><![CDATA[ide]]></category>
		<category><![CDATA[jpoupmenu]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[notificacion]]></category>
		<category><![CDATA[system tray]]></category>
		<category><![CDATA[systray]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3625</guid>
		<description><![CDATA[

En esta ocasión vamos a aprender usar el System Tray desde una aplicación hecha en Java. El System Tray o área de notificaciones, es el espacio en el escritorio en donde &#8216;residen&#8217; aplicaciones que el sistema está ejecutando, pero que no tienen en foco de lo que estamos haciendo.
Antes se usaban librerías nativas + JNI [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%3A%2F%2Fcasidiablo.net%2Fsystray-java-ejemplo%2F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fcasidiablo.in%2FckC2zY%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Usando%20el%20System%20Tray%20desde%20Java%22%20%7D);"></div>
<p style="text-align: justify;">En esta ocasión vamos a aprender usar el System Tray desde una aplicación hecha en Java. El System Tray o área de notificaciones, es el espacio en el escritorio en donde &#8216;residen&#8217; aplicaciones que el sistema está ejecutando, pero que no tienen en foco de lo que estamos haciendo.</p>
<p style="text-align: justify;"><strong>Antes</strong> se usaban librerías nativas + JNI para lograr esto, pero desde hace un tiempo se incluyeron en el API de Java 6 las clases SystemTray y TrayIcon (dentro del paquete java.awt) lo cual nos facilita mucho las cosas.</p>
<p style="text-align: center;"><img class="size-full wp-image-3638 aligncenter" title="windowsxp" src="http://casidiablo.net/wordpress/wp-content/uploads/2010/02/windowsxp.png" alt="" width="325" height="173" /></p>
<h3>0. Entendiendo las clases SystemTray y TrayIcon + Prerrequisitos</h3>
<p style="text-align: justify;">Antes que nada, debes tener instalada una versión reciente del JDK6. La clase <code><a href="http://java.sun.com/javase/6/docs/api/java/awt/SystemTray.html">java.awt.SystemTray</a> </code>representa el System Tray del escritorio. Para manipular dicha clase es necesario obtener un objeto estático de esta usando el método <code>SystemTray.getSystemTray() </code> (es decir, no es posible crear instancias de dicha clase). Además, es necesario verificar que el uso de esta clase sea soportada en el sistema donde se ejecuta. Esto lo hacemos usando el método estático <code>SystemTray.isSupported()</code>. Si no hay soporte, este método retornará false. Si haces un llamado al método <code>getSystemTray</code> y tu sistema no está soportado, se lanzará la excepción <code>java.lang.UnsupportedOperationException</code>.</p>
<p style="text-align: justify;">La instancia de <code>SystemTray</code> contiene uno o más <code>TrayIcons</code>, los cuales son añadidos usando el método <code>add(java.awt.TrayIcon)</code>, y son eliminados con el método <code>remove(java.awt.TrayIcon)</code>.</p>
<p><span id="more-3625"></span></p>
<h3>1. Ejemplo de uso</h3>
<p><!--INFOLINKS_OFF-->
<pre class="brush: java; highlight: [8,10,46,50];">import java.awt.*;
import java.awt.event.*;
public class EjemploSystemTray {
    public EjemploSystemTray() {
        //se declara el objeto tipo icono
        final TrayIcon iconoSystemTray;
        //se verifica que el SystemTray sea soportado
        if (SystemTray.isSupported()) {
            //se obtiene una instancia estática de la clase SystemTray
            SystemTray tray = SystemTray.getSystemTray();
            //esta es la imagen de icono
            Image imagenIcono = Toolkit.getDefaultToolkit().getImage(&quot;icono.png&quot;);
            //este listener nos permite capturar cualquier tipo de evento
            //que se haga con el mouse sobre el icono
            MouseListener mouseListener = new MouseListener() {
                public void mouseClicked(MouseEvent e) {
                    System.out.println(&quot;Icono del System Tray - Mouse clicked!&quot;);
                }
                public void mouseEntered(MouseEvent e) {
                    System.out.println(&quot;Icono del System Tray - Mouse entered!&quot;);
                }
                public void mouseExited(MouseEvent e) {
                    System.out.println(&quot;Icono del System Tray - Mouse exited!&quot;);
                }
                public void mousePressed(MouseEvent e) {
                    System.out.println(&quot;Icono del System Tray - Mouse pressed!&quot;);
                }
                public void mouseReleased(MouseEvent e) {
                    System.out.println(&quot;Icono del System Tray - Mouse released!&quot;);
                }
            };
            //este listener se asociara con un item del menu contextual
            //que aparece al hacer click derecho sobre el icono
            ActionListener escuchadorSalir = new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    System.out.println(&quot;Saliendo...&quot;);
                    System.exit(0);
                }
            };
            //menu que aparece al hacer click derecho
            PopupMenu popup = new PopupMenu();
            MenuItem item = new MenuItem(&quot;Exit&quot;);
            item.addActionListener(escuchadorSalir);
            popup.add(item);
            //iniciamos el objeto TrayIcon
            iconoSystemTray = new TrayIcon(imagenIcono, &quot;Prueba System Tray&quot;, popup);
            //este tipo de listener captura el doble click sobre el icono
            ActionListener accionMostrarMensaje = new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    iconoSystemTray.displayMessage(&quot;Titulo mensaje&quot;,
                            &quot;Este es el contenido del mensaje!&quot;,
                            TrayIcon.MessageType.INFO);
                }
            };

            iconoSystemTray.setImageAutoSize(true);
            iconoSystemTray.addActionListener(accionMostrarMensaje);
            iconoSystemTray.addMouseListener(mouseListener);

            //se debe capturar una excepción en caso que falle la adicion de un icono
            try {
                tray.add(iconoSystemTray);
            } catch (AWTException e) {
                System.err.println(&quot;No es posible agregar el icono al System Tray&quot;);
            }
        }
        else
            System.err.println(&quot;Tu sistema no soporta el System Tray&quot;);
    }
    public static void main(String[] args) {
        new EjemploSystemTray();
    }
}</pre>
<p><!--INFOLINKS_ON--><br />
Así se ve en Linux (usando Gnome) y en Windows7:</p>
<p style="text-align: center;"><img title="en gnome" src="http://casidiablo.net/wordpress/wp-content/uploads/2010/02/gnome.png" alt="" /> <img title="en-windows7" src="http://casidiablo.net/wordpress/wp-content/uploads/2010/02/windows7.png" alt="" /></p>
<p style="text-align: justify;">Del ejemplo anterior veamos las líneas más importantes:</p>
<ul>
<li style="text-align: justify;">Línea 8: verificamos que tengamos soporte.</li>
<li style="text-align: justify;">Línea 10: obtenemos una instancia de la clase SystemTray.</li>
<li style="text-align: justify;">Línea 46: creamos el icono que vamos a añadir.</li>
<li style="text-align: justify;">Línea 50: invocación del método displayMessage para mostrar globos de notificación.</li>
<li style="text-align: justify;">Línea 62: añadimos el icono al systray.</li>
</ul>
<h3>2. ¿Cómo usar Swing en vez de AWT?</h3>
<p style="text-align: justify;">Si te fijaste bien, el SystemTray es una clase que pertenece al paquete AWT&#8230; por alguna razón no se tuvo en cuenta Swing en todo esto. Es por ello que no podemos usar directamente <code>JPopupMenu</code> en vez de <code>PopupMenu</code>. Además, <code>JPopupMenu</code> tampoco es una subclase de <code>PopupMenu</code> por lo cual no podemos usar polimorfismo <img src='http://casidiablo.net/wordpress/wp-includes/images/smilies/icon_mrgreen.gif' alt=':mrgreen:' class='wp-smiley' /> </p>
<p style="text-align: justify;">Afortunadamente hay algunos trucos para hacerlo funcionar con Swing que nos proporciona varias ventajas: la apariencia del menú sería igual en cualquier sistema operativo, podemos añadir iconos a los items, etc.</p>
<p style="text-align: justify;">El truco más sencillo del cual tengo conocimiento lo leí en el blog de Artem Ananiev, en un post llamado <a href="http://weblogs.java.net/blog/2006/05/04/using-jpopupmenu-trayicon">Using JPopupMenu in TrayIcon</a>. He preparado entonces otro ejemplo sencillo en donde se muestra cómo lograr esto:</p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: java; highlight: [40,41,42,43,44];">import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class EjemploSystemTraySwing {
    public EjemploSystemTraySwing() {
        //se declara el objeto tipo icono
        final TrayIcon iconoSystemTray;
        //se verifica que el SystemTray sea soportado
        if (SystemTray.isSupported()) {
            //se obtiene una instancia estática de la clase SystemTray
            SystemTray tray = SystemTray.getSystemTray();
            //esta es la imagen de icono
            Image imagenIcono = Toolkit.getDefaultToolkit().getImage(&quot;icono.png&quot;);
            //este listener se asociara con un item del menu contextual
            //que aparece al hacer click derecho sobre el icono
            ActionListener escuchadorSalir = new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    System.out.println(&quot;Saliendo...&quot;);
                    System.exit(0);
                }
            };
            //menu que aparece al hacer click derecho
            final JPopupMenu popup = new JPopupMenu();

            //aniadir un menu con icono (swing)
            JMenuItem carita = new JMenuItem(&quot;casidiablo.net&quot;,  new ImageIcon(&quot;carita.png&quot;));
            popup.add(carita);
            popup.addSeparator();

            //aniadir el item de salir
            JMenuItem item = new JMenuItem(&quot;Exit&quot;, new ImageIcon(&quot;salir.png&quot;));
            item.addActionListener(escuchadorSalir);
            popup.add(item);
            //iniciamos el objeto TrayIcon
            iconoSystemTray = new TrayIcon(imagenIcono, &quot;Prueba System Tray&quot;, null);
            iconoSystemTray.setImageAutoSize(true);
            //iconoSystemTray.addMouseListener(mouseListener);
            iconoSystemTray.addMouseListener(new MouseAdapter() {
                public void mouseReleased(MouseEvent e) {
                    if (e.isPopupTrigger()) {
                        popup.setLocation(e.getX(), e.getY()-50);
                        popup.setInvoker(popup);
                        popup.setVisible(true);
                    }
                }
            });
            //se debe capturar una excepción en caso que falle la adicion de un icono
            try {
                tray.add(iconoSystemTray);
            } catch (AWTException e) {
                System.err.println(&quot;No es posible agregar el icono al System Tray&quot;);
            }
        }
        else
            System.err.println(&quot;Tu sistema no soporta el System Tray&quot;);
    }
    public static void main(String[] args) {
        new EjemploSystemTraySwing();
    }
}</pre>
<p><!--INFOLINKS_ON--></p>
<p style="text-align: justify;">El resultado es algo como lo que aparece en la primera imagen que acompaña esta entrada. Importante tener en cuenta las líneas resaltadas (40 a 44) que es donde se hace la <em>magia</em> <img src='http://casidiablo.net/wordpress/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  Como siempre, puedes descargar el código y probar tú mismo:</p>
<p><a href="http://casidiablo.net/descargar/Ejemplos+System+Tray+Java" class="descargacodigo">Descargar ZIP con ejemplos</a></p>


	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/area/" rel="tag nofollow">area</a>, <a href="http://casidiablo.net/tag/awt/" rel="tag nofollow">awt</a>, <a href="http://casidiablo.net/tag/ide/" rel="tag nofollow">ide</a>, <a href="http://casidiablo.net/tag/java/" rel="tag nofollow">java</a>, <a href="http://casidiablo.net/tag/jpoupmenu/" rel="tag nofollow">jpoupmenu</a>, <a href="http://casidiablo.net/tag/linux/" rel="tag nofollow">linux</a>, <a href="http://casidiablo.net/tag/mac/" rel="tag nofollow">mac</a>, <a href="http://casidiablo.net/tag/notificacion/" rel="tag nofollow">notificacion</a>, <a href="http://casidiablo.net/tag/system-tray/" rel="tag nofollow">system tray</a>, <a href="http://casidiablo.net/tag/systray/" rel="tag nofollow">systray</a>, <a href="http://casidiablo.net/tag/windows/" rel="tag nofollow">Windows</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/systray-java-ejemplo/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Ejecutar aplicación Java como servicio &#8211; Integración básica</title>
		<link>http://casidiablo.net/correr-programa-java-como-demonio/</link>
		<comments>http://casidiablo.net/correr-programa-java-como-demonio/#comments</comments>
		<pubDate>Sun, 22 Nov 2009 01:16:20 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[ejercicios en java]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[daemon]]></category>
		<category><![CDATA[demonio]]></category>
		<category><![CDATA[ejemplo]]></category>
		<category><![CDATA[ide]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[servicio]]></category>
		<category><![CDATA[solaris]]></category>
		<category><![CDATA[tip]]></category>
		<category><![CDATA[unix]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3407</guid>
		<description><![CDATA[

En esta entrada abordaremos un tema bastante interesante: cómo correr un programa en Java como servicio en Windows o demonio en UNIX/Linux. Puesto que el API de Java no proporciona nada para estos casos, utiliza
remos una librería llamada Java Service Wrapper. Dicha librería nos ofrece una serie de scripts y binarios preparados para diferentes sistemas [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%3A%2F%2Fcasidiablo.net%2Fcorrer-programa-java-como-demonio%2F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Ejecutar%20aplicaci%C3%B3n%20Java%20como%20servicio%20-%20Integraci%C3%B3n%20b%C3%A1sica%22%20%7D);"></div>
<p style="text-align: justify;">En esta entrada abordaremos un tema bastante interesante: <strong>cómo correr un programa en Java como servicio en Windows o demonio en UNIX/Linux</strong>. Puesto que el API de <a href="http://casidiablo.net/java/">Java</a> no proporciona nada para estos casos, utiliza</p>
<p style="text-align: justify;">remos una librería llamada <a href="http://wrapper.tanukisoftware.org/">Java Service Wrapper</a>. Dicha librería nos ofrece una serie de scripts y binarios preparados para diferentes sistemas operativos y arquitecturas, que nos permitirán correr nuestros programas como un servicio; además ofrece diferentes versiones: Profesional, Estándar y Comunity. En este caso usaremos la versión Comunity que es libre y gratuita.</p>
<p style="text-align: justify;">La mejor manera de aprender a usar dicha librería es con un pequeño laboratorio, así que he preparado uno en donde explico la integración más simple que existe con Java Service Wrapper (existen 4 métodos; unos más avanzados que otros). La integración sencilla que he escogido nos permitirá ejecutar como servicio una aplicación que ya esté creada (probablemente ya empaquetada en un .jar) y a la que no podemos o es difícil hacerle modificaciones. Esta es la manera más sencilla de hacerlo, sin embargo tiene una desventaja: al detener el servicio se envía directamente un System.exit() a la JVM por lo que la aplicación no se cerrará limpiamente.</p>
<p style="text-align: justify;">Si quieres integrar tu aplicación de una manera más segura y estás en la capacidad de prepararla para ello, podrías intentar la integración avanzada en la que utilizas el API de Java Service Wrapper para implementar métodos de inicio, pausa y detención del servicio [<a href="http://casidiablo.net/descargar/Ejemplo+Servicio+Avanzado+Java+src&#8220;>descargar un ejemplo</a>].</p>
<h3>Laboratorio 1 &#8211; Integración Simple (Linux/Windows/Solaris)</h3>
<p style="text-align: justify;">Para este caso utilizaremos una aplicación de ejemplo que recibe un archivo como parámetro y escribe en él <a href="http://casidiablo.net/capturar-informacion-sistema-operativo-java/">información sobre la memoria del sistema</a>, cada 60 segundos. He escogido este ejemplo porque posee varios aspectos interesantes: requiere de librerías externas (tanto JARs como librerías nativas [.so, dll, etc.]) y recibe parámetros.</p>
<p style="text-align: justify;">Puedes descargar la aplicación de ejemplo de haciendo <a class="tooltip" title="Descargar los binarios del ejemplo" href="http://casidiablo.net/descargar/Ejemplo+Servicio+Simple+Java+bin">clic aquí</a>. Si la ejecutáramos de manera convencional veríamos algo de este tipo:</p>
<div class="consola">gentookde@larry bin % java -jar servicio.jar /tmp/log<br />
^C<br />
gentookde@larry bin % cat /tmp/log<br />
======Mon Oct 05 09:42:05 COT 2009=======<br />
Cantidad de memoria RAM: 3952MB<br />
Total: 4042664<br />
Usada: 3509516<br />
Disponible: 533148<br />
Memoria SWAP total: 1052248<br />
Memoria SWAP usada: 0<br />
Memoria SWAP libre: 1052248</div>
<p style="text-align: justify;">Como puedes ver se trata de una aplicación de consola común y corriente. La aplicación consta básicamente de:</p>
<ul style="text-align: justify;">
<li>El ejecutable servicio.jar ubicado en el directorio bin/</li>
<li>La librería sigar.jar en el directorio lib/</li>
<li style="text-align: justify;">Las librerías específicas de cada arquitectura de sigar en lib/</li>
</ul>
<h3>Pasos para la integración</h3>
<p style="text-align: justify; ">Lo primero es descargar el paquete de <a href="http://wrapper.tanukisoftware.org/doc/english/download.jsp">Java Service Wrapper</a> y descomprimirlo<span style="background-color: #ffffff;">. Supondremos que el directorio donde se encuentra Java Service Wrapper es $RUTA_JSW y que el directorio de la aplicación que  vamos a convertir en servicio es </span><span style="background-color: #ffffff;">$RUTA_APP</span><span style="background-color: #ffffff;">.</span></p>
<h4>1. Copiamos los siguentes archivos al directorio bin de nuestra aplicación de ejemplo&#8230;</h4>
<p style="text-align: justify; "><span style="background-color: #ffffff;"><strong>UNIX/Linux</strong><br />
</span></p>
<div class="consola">cp $RUTA_JSW/bin/wrapper $RUTA_APP/bin/<br />
cp $RUTA_JSW/src/bin/sh.script.in $RUTA_APP/bin/<br />
cp $RUTA_JSW/lib/* $RUTA_APP/bin/</div>
<p style="text-align: justify; ">El archivo $RUTA_JSW/bin/wrapper podría no existir; por lo tanto lo que debes copiar es el archivo wrapper-xxx específico para tu plataforma. Por ejemplo, en este caso estoy usando Gentoo Linux de 64bits por lo tanto copiaré el archivo $RUTA_JSW/bin/wrapper-linux-x86-64.</p>
<p style="text-align: justify; "><strong><span style="background-color: #ffffff;">Windows</span></strong></p>
<div class="consola">copy $RUTA_JSW/bin/ wrapper-windows-x86-32.exe $RUTA_APP/bin/<br />
copy $RUTA_JSW/src/bin/ App.bat.in $RUTA_APP/bin/<br />
copy $RUTA_JSW/src/bin/ InstallApp-NT.bat.in $RUTA_APP/bin/<br />
copy $RUTA_JSW/src/bin/ UninstallApp-NT.bat.in $RUTA_APP/bin/<br />
copy $RUTA_JSW/lib/* $RUTA_APP/bin/</div>
<h4>2. Renombramos algunos archivos&#8230;</h4>
<p><strong>UNIX/Linux&#8230;</strong></p>
<p style="text-align: justify;">Ahora debes renombrar el script sh.script.in con el nombre de la aplicación con la que haremos la integración y darle privilegios de ejecución. En este casó se llama simplemente &#8220;servicio&#8221;:</p>
<div class="consola">cd $RUTA_APP/bin<br />
mv sh.script.in servicio<br />
chmod a+x servicio</div>
<p><strong>Windows</strong></p>
<p style="text-align: justify;">Ahora debes renombrar los archivos .bat  para que concuerden con el nombre de la aplicación con la que haremos la integración. En este casó se llama simplemente &#8220;servicio&#8221; (lo puedes hacer usando el explorador si no te gusta usar la consola, pero a mi me daría pena):</p>
<div class="consola">cd $RUTA_APP/bin<br />
move App.bat.in servicio.bat<br />
move InstallApp-NT.bat.in InstallServicio-NT.bat<br />
move UninstallApp-NT.bat.in UninstallServicio-NT.bat</div>
<h4>3. editar archivo de configuración</h4>
<p style="text-align: justify;">Editamos el archivo wrapper.conf y lo dejamos en el directorio $RUTA_APP/conf/. El archivo para este ejemplo tendrá el siguiente contenido (<strong>importante</strong>! lee la explicación si usas Windows):</p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: plain;"># Comando de Java
wrapper.java.command=java
# Clase que ejecutara el Wrapper
wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp
# Librerias necesarias para ejecutar el programa
wrapper.java.classpath.1=../lib/wrapper.jar
wrapper.java.classpath.2=servicio.jar
# Java Library Path (ubicacion de las librerias wrapper.dll o wrapper.so)
wrapper.java.library.path.1=../lib
# Java Bits.  On applicable platforms, tells the JVM to run in 32 or 64-bit mode.
wrapper.java.additional.auto_bits=TRUE
# Parametros del programa
wrapper.app.parameter.1=net.casidiablo.servicio.Servicio
wrapper.app.parameter.2=/tmp/log
#********************************************************************
# Wrapper General Properties
#********************************************************************
# Allow for the use of non-contiguous numbered properties
wrapper.ignore_sequence_gaps=TRUE
# Title to use when running as a console
wrapper.console.title=servicio
#********************************************************************
# Wrapper Windows NT/2000/XP Service Properties
#********************************************************************
# Name of the service
wrapper.name=jgossip
# Display name of the service
wrapper.displayname=Servicio
# Description of the service
wrapper.description=Monitor de memoria
# Mode in which the service is installed. AUTO_START or DEMAND_START
wrapper.ntservice.starttype=AUTO_START
# Allow the service to interact with the desktop.
wrapper.ntservice.interactive=false</pre>
<p><!--INFOLINKS_ON--></p>
<p>Explicación del archivo de configuración:</p>
<ul>
<li style="text-align: justify;"><code>wrapper.java.command=java</code> es el comando para ejecutar java. En este caso es simplemente java porque estoy en Linux y además tengo configurado correctamente el path. En Windows podría ser algo como: c:\archivos de programa\java\jdk1.6\bin\java.exe</li>
<li style="text-align: justify;"><code>wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp</code> indica el archivo a ejecutar es la clase WrapperSimpleApp que se usa en la integración sencilla. Esta clase envoltorio es la que permite ejecutar la aplicación como servicio.</li>
<li style="text-align: justify;"><code>wrapper.java.classpath.1=../lib/wrapper.jar<br />
wrapper.java.classpath.2=servicio.jar</code> indican las rutas o archivos del classpath.</li>
<li style="text-align: justify;"><code>wrapper.java.library.path.1=../lib</code> indica el directorio donde se encuentran las librerías a usar.</li>
<li style="text-align: justify;"><code>wrapper.app.parameter.1=net.casidiablo.servicio.Servicio<br />
wrapper.app.parameter.2=/tmp/log</code> estos son los parámetros que se pasarán al programa. <strong>Importante</strong>: como estamos haciendo la integración simple, el primer parámetro debe ser la clase que contiene el método main de nuestra aplicación.</li>
<li style="text-align: justify;"><code>wrapper.name=jgossip</code> esta opción es para Windows y define el nombre del servicio en el sistema.</li>
<li style="text-align: justify;"><code>wrapper.ntservice.starttype=AUTO_START</code> si estás en windows, define si el servicio quedará configurado para iniciar automáticamente.</li>
</ul>
<h4>4. Probar/Instalar el servicio&#8230;</h4>
<p style="text-align: justify;">Ahora veremos cómo podemos probar la aplicación para asegurarnos que ha quedado bien configurada antes de proceder con la instalación.</p>
<p><strong>UNIX/Linux</strong></p>
<p style="text-align: justify;">Ejecutamos el script &#8217;servicio&#8217; que configuramos en el paso 1 y 2 con el parámetro console:</p>
<div class="consola">./servicio console</div>
<p>Deberías ver algo como:</p>
<div class="consola">Running un servicio que escribe cosas&#8230;<br />
wrapper  | &#8211;&gt; Wrapper Started as Console<br />
wrapper  | Java Service Wrapper Community Edition 64-bit 3.3.6<br />
wrapper  |   Copyright (C) 1999-2009 Tanuki Software, Ltd.  All Rights Reserved.<br />
wrapper  |     http://wrapper.tanukisoftware.org<br />
wrapper  |<br />
wrapper  | Launching a JVM&#8230;<br />
jvm 1    | WrapperManager: Initializing&#8230;</div>
<p style="text-align: justify;">Lo detienes presionando Ctrl+C. Ahora, si queremos probarlo como demonio basta con ejecutar los comandos típicos de un demonio en UNIX/Linux:</p>
<div class="consola">$ ./servicio start<br />
Starting un servicio que escribe cosas&#8230;<br />
$ ./servicio stop<br />
Stopping un servicio que escribe cosas&#8230;<br />
Stopped un servicio que escribe cosas.</div>
<p style="text-align: justify;">Para instalarlo basta con crear un enlace simbólico del script en el directorio /etc/init.d y añadirlo al listado de servicios a iniciar; por ejemplo:</p>
<div class="consola">sudo ln -sv $RUTA_APP/bin/servicio /etc/init.d/servicio<br />
sudo rc-update add servicio default</div>
<p><strong>Windows</strong></p>
<p style="text-align: justify;">Para instalarlo en Windows basta con ejecutar el archivo InstallServicio-NT.bat. Puedes verificar que fue instalado correctamente accediendo a la consola de administración de servicios de NT (ejecutas el comando services.msc):</p>
<p><a href="http://casidiablo.net/wordpress/wp-content/uploads/2009/11/screenshot_001.png"><img class="aligncenter size-full wp-image-3460" title="servicio windows java" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/11/screenshot_001.png" alt="servicio windows java" width="778" height="566" /></a></p>
<h3>Fuentes y descargas</h3>
<p>Aunque en esta entrada no explico cómo hacer la integración avanzada, he preparado un ejemplo completo que puedes descargar en el listado de abajo.<strong><br />
</strong></p>
<ul>
<li><a href="http://wrapper.tanukisoftware.org/doc/">Puedes encontrar más documentación en la página oficial del proyecto</a></li>
<li><a href="http://casidiablo.net/descargar/Ejemplo+Servicio+Simple+Java+bin">Descargar el laboratorio de esta entrada</a></li>
<li><a href="http://casidiablo.net/descargar/Ejemplo+Servicio+Simple+Java+src">Descargar el código fuente del laboratorio</a></li>
<li><a href="http://casidiablo.net/descargar/Ejemplo+Servicio+Avanzado+Java+src"><strong>Descargar código fuente y laboratorio de la integración avanzada</strong></a></li>
</ul>
<p><br/><br/><br/></p>


	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/daemon/" rel="tag nofollow">daemon</a>, <a href="http://casidiablo.net/tag/demonio/" rel="tag nofollow">demonio</a>, <a href="http://casidiablo.net/tag/ejemplo/" rel="tag nofollow">ejemplo</a>, <a href="http://casidiablo.net/tag/ide/" rel="tag nofollow">ide</a>, <a href="http://casidiablo.net/tag/java/" rel="tag nofollow">java</a>, <a href="http://casidiablo.net/tag/linux/" rel="tag nofollow">linux</a>, <a href="http://casidiablo.net/tag/programacion/" rel="tag nofollow">programación</a>, <a href="http://casidiablo.net/tag/servicio/" rel="tag nofollow">servicio</a>, <a href="http://casidiablo.net/tag/solaris/" rel="tag nofollow">solaris</a>, <a href="http://casidiablo.net/tag/tip/" rel="tag nofollow">tip</a>, <a href="http://casidiablo.net/tag/unix/" rel="tag nofollow">unix</a>, <a href="http://casidiablo.net/tag/windows/" rel="tag nofollow">Windows</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/correr-programa-java-como-demonio/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Enviar correo desde Java</title>
		<link>http://casidiablo.net/enviar-mail-usando-api-java/</link>
		<comments>http://casidiablo.net/enviar-mail-usando-api-java/#comments</comments>
		<pubDate>Sat, 07 Nov 2009 18:38:39 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[ejercicios en java]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[correo]]></category>
		<category><![CDATA[ejemplo]]></category>
		<category><![CDATA[enviar]]></category>
		<category><![CDATA[mail]]></category>
		<category><![CDATA[programación ejercicios]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3449</guid>
		<description><![CDATA[

Este es un pequeño ejemplo de cómo enviar correos desde Java usando el API de Java Mail. Lo único que necesitaremos es descargar la librería mail.jar de la página de Java Mail y crear un programa de este estilo:

import javax.mail.*;
import javax.mail.internet.*;
import java.util.*;

public class EnviarMail {
  public static void main(String[] args) {
    [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%3A%2F%2Fcasidiablo.net%2Fenviar-mail-usando-api-java%2F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Enviar%20correo%20desde%20Java%22%20%7D);"></div>
<p style="text-align: justify;">Este es un pequeño ejemplo de cómo enviar correos desde Java usando el API de <a href="http://java.sun.com/products/javamail/">Java Mail</a>. Lo único que necesitaremos es descargar la librería <code>mail.jar</code> de la página de <a href="http://java.sun.com/products/javamail/">Java Mail</a> y crear un programa de este estilo:</p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: java;">import javax.mail.*;
import javax.mail.internet.*;
import java.util.*;

public class EnviarMail {
  public static void main(String[] args) {
    try {
      // Se debe crear un archivo de propiedades que
      // contenga el nombre del servidor SMTP
      Properties props = new Properties();
      props.put(&quot;mail.host&quot;, &quot;mail.servidorcorreo.com&quot;);

      // se crea un objeto de sesion
      Session conexionCorreo = Session.getInstance(props, null);
      // este objeto representa el mensaje a enviar
      Message mensaje = new MimeMessage(conexionCorreo);

      // los objetos Adress contienen informacion de recipientes de correo
      Address desde = new InternetAddress(&quot;tucorreo@servidorcorreo.biz&quot;,
          &quot;Pepito Perez&quot;);
      Address para = new InternetAddress(&quot;destinatario@otroservidor.com&quot;);

      // asignamos el contenido. En este caso usamos 'text/plain' pero
      // es posible usar 'text/html' para enviar correos con contenido
      // HTML
      mensaje.setContent(&quot;Este es un mensaje de texto plano!&quot;,
          &quot;text/plain&quot;);
      // asignar el origen del correo
      mensaje.setFrom(desde);
      // asignar un destinatario
      mensaje.setRecipient(Message.RecipientType.TO, para);
      // asignar el asunto del correo
      mensaje.setSubject(&quot;Hola, Java Mail!&quot;);

      Transport.send(mensaje);

    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }
}</pre>
<p><!--INFOLINKS_ON--></p>
<p style="text-align: justify;">Para compilarlo y ejecutarlo desde la consola:</p>
<div class="consola">javac -cp mail.jar:. EnviarMail.java<br />
java -cp mail.jar:. EnviarMail</div>
<p style="text-align: justify;">Si estás usando Eclipse, debes añadir la librería mail.jar al classpath. En <a href="http://casidiablo.net/capturar-informacion-sistema-operativo-java/">este artículo explico cómo hacerlo</a>.</p>
<p><a title="Contiene el archivo de ejemplo y la librería mail.jar (ver. 1.4.2)" href="http://casidiablo.net/descargar/Ejemplo+Java+Mail" class="download tooltip">Descargar</a></p>


	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/correo/" rel="tag nofollow">correo</a>, <a href="http://casidiablo.net/tag/ejemplo/" rel="tag nofollow">ejemplo</a>, <a href="http://casidiablo.net/tag/enviar/" rel="tag nofollow">enviar</a>, <a href="http://casidiablo.net/tag/java/" rel="tag nofollow">java</a>, <a href="http://casidiablo.net/tag/mail/" rel="tag nofollow">mail</a>, <a href="http://casidiablo.net/tag/programacion-ejercicios/" rel="tag nofollow">programación ejercicios</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/enviar-mail-usando-api-java/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>JBoss Seam Framework + Laboratorio de iniciación</title>
		<link>http://casidiablo.net/jboss-seam-framework-introduccion/</link>
		<comments>http://casidiablo.net/jboss-seam-framework-introduccion/#comments</comments>
		<pubDate>Fri, 06 Nov 2009 07:14:03 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[artículos]]></category>
		<category><![CDATA[ejercicios en java]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[bpm]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[ejb3]]></category>
		<category><![CDATA[how-to]]></category>
		<category><![CDATA[j2ee]]></category>
		<category><![CDATA[jboss]]></category>
		<category><![CDATA[jsf]]></category>
		<category><![CDATA[manual]]></category>
		<category><![CDATA[seam]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3422</guid>
		<description><![CDATA[

Seam es un proyecto desarrollado por JBoss, cuyo lider es Gavin King. Es un completo framework para la creación de aplicaciones web 2.0 que unifica varias tecnologías como AJAX, Enterprise Java Beans (EJB3), Java Server Faces (JSF), Java Portlets and Business Process Management (BPM), Hibernate, y mucho más.
De la Wikipedia:
Seam introduce el concepto de contextos. [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%3A%2F%2Fcasidiablo.net%2Fjboss-seam-framework-introduccion%2F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22JBoss%20Seam%20Framework%20%2B%20Laboratorio%20de%20iniciaci%C3%B3n%09%22%20%7D);"></div>
<p style="text-align: justify;"><a href="http://www.seamframework.org/">Seam</a> es un proyecto desarrollado por JBoss, cuyo lider es Gavin King. Es un completo framework para la creación de aplicaciones web 2.0 que unifica varias tecnologías como AJAX, Enterprise Java Beans (EJB3), Java Server Faces (JSF), Java Portlets and Business Process Management (BPM), Hibernate, y mucho más.</p>
<p style="text-align: justify;">De la Wikipedia:</p>
<p style="text-align: justify; padding-left: 30px;"><em>Seam introduce el concepto de contextos. Cada componente de Seam existe dentro de un contexto. El contexto conversacional por ejemplo captura todas las acciones del usuario hasta que éste sale del sistema o cierra el navegador &#8211; inclusive puede llevar un control de múltiples pestañas y mantiene un comportamiento consistente cuando se usa el botón de regresar de el navegador.</em></p>
<p style="text-align: justify; padding-left: 30px;"><em>Tú puedes automáticamente generar una aplicación web de altas, bajas, cambio y modificaciones a partir de una base de datos existente utilizando una herramienta de linea de comandos llamada seam-gen incluida con el framework.</em></p>
<p style="text-align: justify; padding-left: 30px;"><em>El desarrollo WYSIWYG es facilitado a través del uso de las JBoss Tools, que es un conjunto de plug-ins diseñados para el entorno integrado de desarrollo Eclipse. Seam puede ser integrado con las bibliotecas de componentes JSF JBoss RichFaces o con ICEsoft ICEFaces. Ambas bibliotecas poseen soporte para AJAX.</em></p>
<p style="text-align: justify;">Actualmente soporta varios contenedores de aplicaciones como JBoss 4 o 5, IBM Websphere, BEA WebLogic, Oracle OC4J y por supuesto Apache Tomcat.</p>
<p style="text-align: justify;">Puedes encontrar ejemplos de proyectos creados con seam y listos para ejecutar dentro del directorio examples de la aplicación.</p>
<p style="text-align: justify;"><strong>Referencias y documentación:</strong></p>
<ul>
<li><a href="http://www.seamframework.org/Home">Página oficial de Seam Framework</a></li>
<li><a href="http://www.jboss.com/products/seam/">Página del producto JBoss Seam</a></li>
<li><a href="http://docs.jboss.com/seam/latest/reference/en-US/html/index.html">Documentación Online mantenida por la comunidad</a></li>
<li><a href="http://docs.jboss.com/seam/">Documentación de JBoss Seam</a></li>
<li><a href="http://www.infoq.com/articles/jboss-seam">Introduction to JBoss Seam [artículo en InfoQ]</a></li>
</ul>
<p style="text-align: justify;">
<h3>Laboratorio de JBoss Seam Framework</h3>
</p>
<p style="text-align: justify;">Con el siguiente laboratorio se pretende dar un punto de partida a la creación de aplicaciones usando Seam. El laboratorio está enfocado al desarrollo sobre Eclipse, que es el IDE que recomiendo para trabajar con Seam.</p>
<p style="text-align: justify;">Este laboratorio está enfocado al uso de Seam para JBoss, aunque con pocas o sin modificaciones puede funcionar en Apache Tomcat. Recordemos además que Seam también soporta los contenedores IBM Websphere, BEA WebLogic y Oracle OC4J.</p>
<p style="text-align: justify;">Nota: todas las pruebas se realizaron sobre Linux (<a href="http://casidiablo.net/category/gentoo/">Gentoo</a> amd64) y <a href="http://opensolaris.org">OpenSolaris</a> 9.6. Sin embargo, hacerlo en Windows con los mismos pasos no debería presentar problemas; solo se debe tener cuidado con las rutas donde se guarden los archivos usados.</p>
<p style="text-align: justify;">
<h3>Prerequisitos</h3>
</p>
<ul>
<li><span style="background-color: #ffffff;"><a href="http://eclipse.org">Eclipse 3.4 o 3.5</a></span></li>
<li><span style="background-color: #ffffff;"><a href="http://seamframework.org/Download">La última versión de JBoss Seam</a> (la más reciente al momento de escribir este documento es la 2.2.0).</span></li>
<li><span style="background-color: #ffffff;"><a href="http://labs.jboss.com/jbossas/downloads/">La última versión de Jboss Server</a> (la más reciente al momento de escribir este documento es la 5.1.0).</span></li>
<li><span style="background-color: #ffffff;">Un gestor de bases de datos. En mi caso he usado MySQL, aunque hay soporte para muchos otros gestores. No olvides además descargar el conector JDBC, en mi caso el mysql-connector-java-bin.jar.</span></li>
</ul>
<p><span id="more-3422"></span></p>
<p style="text-align: justify;">
<h3>Instalación</h3>
</p>
<p style="text-align: justify;">Para instalar Seam y JBoss basta con descomprimir los paquetes que descarguemos de Internet. Yo recomiendo hacerlo en la carpeta /opt en sistemas UNIX/Linux, o directamente en C:/ en sistemas Windows.</p>
<p style="text-align: justify;">
<h3>Creación de un proyecto base para Eclipse</h3>
</p>
<p style="text-align: justify;">SeamFramework nos proporciona una herramienta de línea de comandos para la generación de proyectos base. Vamos al directorio donde lo instalamos y ejecutamos:</p>
<div class="consola">./seam setup</div>
<p style="text-align: justify;">Ahora debemos responder a cada una de las preguntas que nos hace; muchas de ellas las debemos dejar por defecto, así que nos concentraremos solo en aquellas en donde tengamos que cambiar. Resumiendo:</p>
<ul>
<li>El directorio donde se creará el proyecto:
<div class="consola">[input] Enter the directory where you want the project to be created (should not contain spaces) [/home/funtoo/projects] [/home/funtoo/projects]<br />
/home/funtoo/Poli/Componentes/seam-framework/workspace</div>
</li>
<li>El directorio donde se encuentra el JBoss AS:
<div class="consola">[input] Enter your JBoss AS home directory [C:/Program Files/jboss-5.1.0.GA] [C:/Program Files/jboss-5.1.0.GA]<br />
/opt/jboss-5.1.0.GA/</div>
</li>
<li>El nombre del proyecto:
<div class="consola">[input] Enter the project name [myproject] [myproject]<br />
holaseam</div>
</li>
<li>Vamos a desarrollar nuestra aplicación como EAR:
<div class="consola">[input] Is this project deployed as an EAR (with EJB components) or a WAR (with no EJB support)? [war] (ear, [war])<br />
ear</div>
</li>
<li>Definimos el nombre del paquete en base de la aplicación:
<div class="consola">[input] Enter the base package name for your Java classes [com.mydomain.holaseam] [com.mydomain.holaseam]<br />
org.ejemplo.seam</div>
</li>
<li>Los que hacen referencia a los Session Beans o Test Cases los podemos dejar como nos lo pongan. El gestor de base de datos; en este caso usé mysql aunque debería ser practicamente transparente:
<div class="consola">[input] What kind of database are you using? [hsql] ([hsql], mysql, derby, oracle, postgres, mssql, db2, sybase, enterprisedb, h2)<br />
mysql</div>
</li>
<li>Ingresamos la ruta en donde se encuentra el driver JDBC:
<div class="consola">[input] Enter the filesystem path to the JDBC driver jar [] []<br />
/opt/conectores/mysql-connector-java-5.0.8-bin.jar</div>
</li>
<li>Ahora debemos definir la URL de conexión a la base de datos. En este caso, he creado una base de datos llamada ejemplo, y por lo tanto la URL quedaría así:
<div class="consola">[input] Enter the JDBC URL for your database [jdbc:mysql:///test] [jdbc:mysql:///test]<br />
jdbc:mysql://localhost:3306/ejemplo</div>
</li>
<li>Con esta opción se ejecutará un script llamado import.sql cada vez que hagamos un deploy del proyecto. Dicho archivo deberá tener los scripts necesarios para crear tablas y registros. Puesto que en este laboratorio poco vamos a usar MySQL, puedes poner lo que quieras; pero es importante tener en cuenta esta opción a la hora de desarrollar un proyecto.
<div class="consola">[input] Do you want to recreate the database tables and execute import.sql each time you deploy? [n] (y, [n])<br />
y</div>
</li>
</ul>
<p style="text-align: justify;">Ya que hemos configurado lo que será el proyecto, es hora de crearlo. Ejecutamos el comando:</p>
<div class="consola">./seam create-project</div>
<p style="text-align: justify;">Esto creará un proyecto base que puedes abrir con Eclipse, y eso es justo lo que haremos a continuación.</p>
<p style="text-align: justify;">Abrimos eclipse y nos aseguramos que el workspace sea el mismo directorio en el que creamos el proyecto desde Seam. Vamos a la creación de un nuevo proyecto Java:</p>
<p style="text-align: center;"><img title="seam-screenshot" alt="seam-screenshot" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/11/screenshot_005.png" width="540" height="402" /></p>
<p style="text-align: justify;">Le damos el mismo nombre que a nuestra aplicación Seam (en este caso holaseam):</p>
<p style="text-align: center;"><img title="seam-screenshot" alt="seam-screenshot" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/11/screenshot_006.png" width="524" height="736" /></p>
<p>Y puesto que ya existe un proyecto creado en el workspace muchas de las opciones ya aparecen asignadas. Hacemos clic en Next y vemos que ya hay una estructura de directorios creada con la base del proyecto Seam.</p>
<p style="text-align: center;"><img title="seam-screenshot" alt="seam-screenshot" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/11/screenshot_007.png" width="639" height="714" /></p>
<p style="text-align: justify;">Hacemos clic en Finish, y ya podemos comenzar a editar y modificar el proyecto.</p>
<p style="text-align: center;"><img title="seam-screenshot" alt="seam-screenshot" title="screenshot_008" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/11/screenshot_008.png" width="573" height="364" /></p>
<p style="text-align: justify;">
<h3>Despliegue del proyecto</h3>
</p>
<p style="text-align: justify;">Primero debemos iniciar el servicio de JBoss. Para ello ejecutamos el archivo run.sh (run.bat en Windows) del directorio bin de Jboss. Este dejará el servicio web corriendo por defecto en el puerto 8080.</p>
<p style="text-align: justify;">Para hacer el despliegue sobre JBoss, usamos un archivo Ant que se generó junto con el proyecto. Dicho archivo nos permite ejecutar tests, hacer (re)despliegues, generar el JavaDoc, entre otras. Así que habrímos el archivo build.xml y nos aseguramos que la vista Outline esté abierta:</p>
<p style="text-align: center; "><a href="http://casidiablo.net/wordpress/wp-content/uploads/2009/11/screenshot_009.png"><img title="seam-screenshot" alt="seam-screenshot"  src="http://casidiablo.net/wordpress/wp-content/uploads/2009/11/screenshot_009.png" width="600" /></a></p>
<p>Dentro de la vista Outline podemos ver los componentes del archivo build.xml y podemos ejecutarlos con Ant. En este caso, buscamos el componente deploy, hacemos clic derecho, Run As, y Ant Build.</p>
<p style="text-align: center; "><a href="http://casidiablo.net/wordpress/wp-content/uploads/2009/11/screenshot_010.png"><img title="seam-screenshot" alt="seam-screenshot"  src="http://casidiablo.net/wordpress/wp-content/uploads/2009/11/screenshot_010.png" width="600" /></a></p>
<p style="text-align: justify;">Algunas veces se generan errores al hacer el despliegue:</p>
<p style="text-align: center;"><a href="http://casidiablo.net/wordpress/wp-content/uploads/2009/11/screenshot_011.png"><img title="seam-screenshot" alt="seam-screenshot"  title="screenshot_011" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/11/screenshot_011.png" width="478" height="232" /></a></p>
<p style="text-align: justify;">Si es tu caso, deberás eliminar los archivos y directorios que tengan el nombre del proyecto del directorio deploy en JBoss. En mi caso los elimino con este comando:</p>
<div class="consola">rm -rf /opt/jboss-5.1.0.GA/server/default/deploy/holaseam*</div>
<p style="text-align: justify;">Si todo sale bien, cuando hagamos de nuevo deploy veremos algo como esto:</p>
<p style="text-align: center;"><img title="seam-screenshot" alt="seam-screenshot" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/11/screenshot_012.png" width="600" /></p>
<p style="text-align: justify;">Es hora de probar la aplicación. Abrimos el navegador en la dirección: http://localhost:8080/holaseam/</p>
<p style="text-align: center;"><a href="http://casidiablo.net/wordpress/wp-content/uploads/2009/11/screenshot_013.png"><img title="seam-screenshot" alt="seam-screenshot" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/11/screenshot_013.png" width="712" height="618" /></a></p>
<p style="text-align: center;"><a href="http://casidiablo.net/wordpress/wp-content/uploads/2009/11/screenshot_014.png"><img title="seam-screenshot" alt="seam-screenshot" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/11/screenshot_014.png" width="712" height="618" /></a></p>
<p style="text-align: center;"><a href="http://casidiablo.net/wordpress/wp-content/uploads/2009/11/screenshot_015.png"><img title="seam-screenshot" alt="seam-screenshot"  src="http://casidiablo.net/wordpress/wp-content/uploads/2009/11/screenshot_015.png" width="712" height="618" /></a></p>
<p style="text-align: justify;">
<h3>Descargar versión en PDF</h3>
</p>
<p><a href="http://casidiablo.net/descargar/Laboratorio+JBoss+Seam" class="tooltip download" title="Descargar versión en PDF de este artículo">Descargar</a></p>


	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/ajax/" rel="tag nofollow">AJAX</a>, <a href="http://casidiablo.net/tag/bpm/" rel="tag nofollow">bpm</a>, <a href="http://casidiablo.net/tag/eclipse/" rel="tag nofollow">eclipse</a>, <a href="http://casidiablo.net/tag/ejb3/" rel="tag nofollow">ejb3</a>, <a href="http://casidiablo.net/tag/how-to/" rel="tag nofollow">how-to</a>, <a href="http://casidiablo.net/tag/j2ee/" rel="tag nofollow">j2ee</a>, <a href="http://casidiablo.net/tag/java/" rel="tag nofollow">java</a>, <a href="http://casidiablo.net/tag/jboss/" rel="tag nofollow">jboss</a>, <a href="http://casidiablo.net/tag/jsf/" rel="tag nofollow">jsf</a>, <a href="http://casidiablo.net/tag/manual/" rel="tag nofollow">manual</a>, <a href="http://casidiablo.net/tag/programacion/" rel="tag nofollow">programación</a>, <a href="http://casidiablo.net/tag/seam/" rel="tag nofollow">seam</a>, <a href="http://casidiablo.net/tag/tutorial/" rel="tag nofollow">tutorial</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/jboss-seam-framework-introduccion/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Obtener información del sistema [memoria disponible, %CPU, espacio en disco] en Java</title>
		<link>http://casidiablo.net/capturar-informacion-sistema-operativo-java/</link>
		<comments>http://casidiablo.net/capturar-informacion-sistema-operativo-java/#comments</comments>
		<pubDate>Fri, 02 Oct 2009 22:00:33 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[ejercicios en java]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[cpu]]></category>
		<category><![CDATA[disco]]></category>
		<category><![CDATA[ejemplo]]></category>
		<category><![CDATA[ejemplos]]></category>
		<category><![CDATA[ejercicio]]></category>
		<category><![CDATA[espacio]]></category>
		<category><![CDATA[ide]]></category>
		<category><![CDATA[informacion]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[memoria]]></category>
		<category><![CDATA[ram]]></category>
		<category><![CDATA[sistema]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3382</guid>
		<description><![CDATA[

En esta guía aprenderemos a obtener información de los recursos sistema en Java, usando la librería Sigar. Los datos que podremos extraer son los siguientes:

Información de la CPU.
Espacio en disco disponible.
Cantidad de espacio que consume un directorio en específico.
Cantidad de memoria RAM disponible y en uso.
Información de red (dirección IP, nombre de la NIC, puertos [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%3A%2F%2Fcasidiablo.net%2Fcapturar-informacion-sistema-operativo-java%2F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Obtener%20informaci%C3%B3n%20del%20sistema%20%5Bmemoria%20disponible%2C%20%25CPU%2C%20espacio%20en%20disco%5D%20en%20Java%22%20%7D);"></div>
<p style="text-align: justify;">En esta guía aprenderemos a obtener información de los recursos sistema en Java, usando la librería Sigar. Los datos que podremos extraer son los siguientes:</p>
<ul style="text-align: justify;">
<li><strong>Información de la CPU.</strong></li>
<li><strong>Espacio en disco disponible.</strong></li>
<li>Cantidad de espacio que consume un directorio en específico.</li>
<li><strong>Cantidad de memoria RAM disponible y en uso.</strong></li>
<li>Información de red (dirección IP, nombre de la NIC, puertos abiertos, tablas de enrutamiento, etc.)</li>
<li>Información de los procesos que se están ejecutando en el sistema.</li>
<li>Asignación de <a href="http://casidiablo.net/obtener-variables-entorno-informacion-sistema-java/">variables de entorno</a>.</li>
<li><strong>Uptime, o cantidad de tiempo que el equipo ha estado encendido.</strong></li>
<li><strong>Nombre y versión del sistema operativo.</strong></li>
<li>Usuarios logueados actualmente.</li>
</ul>
<p style="text-align: justify;">Resaltadas en negrita está la información en la que nos concentraremos en el ejemplo. Pero antes aclaremos un poco que es Sigar: el API de Sigar nos proporciona una serie de métodos que nos permiten obtener información del sistema operativo; consta de una librería de Java (.jar) y otras librerías nativas específicas para cada sistema operativo soportado (<code>libsigar-amd64-linux.so</code>, para Linux de 64 bits o <code>sigar-x86-winnt.dll</code> para Windows de 32 bits, por poner un ejemplo).</p>
<p style="text-align: justify;">Teniendo esto en cuenta, para hacer funcionar dicha API en una de nuestras aplicaciones, bastaría con tener el archivo .jar y la librería específica de nuestro sistema operativo. En el desarrollo del ejemplo se usará Eclipse y, aunque se explicará cómo añadir las librerías en el proyecto, se da por conocido el funcionamiento del flag <code>--classpath</code> de los comandos <code>javac</code> y <code>java</code> (obligatorio si no se usa ningún IDE).</p>
<h3>El resultado&#8230;</h3>
<p style="text-align: justify;">Siempre pongo primero el resultado ya que nos aclara la visión de hacia donde vamos, y de paso saber si lo que está aquí es lo que buscamos. Esta es la salida del programa en mi Gentoo Linux:</p>
<p><span id="more-3382"></span></p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: plain;">====Informacion del sistema====
Descripcion del SO	Gentoo 2.1.6
Nombre del SO		Linux
Arquitectura del SO	x86_64
Version del SO		2.6.31-gentoo
Nivel de parches	unknown
Fabricante		Gentoo
Version SO		2.1.6
Encendido durante:	6:15

==== Informacion de la CPU ====
Fabricante:		Intel
Modelo			Core(TM)2 Duo CPU     T5750  @ 2.00GHz
Mhz			1994
Total CPUs		2
CPUs fisiscas		1
Nucleos por CPU		2
Tamanio cache		2048

Consumo de CPU 0	22.0%
Consumo de CPU 1	2.0%
Consumo total de CPU	6.0%

====Informacion del sistema de archivos====

dispos.|total|usado|disponible|%uso|dir|tipo

/dev/root|24042944|10698228|12123376|47%|/|ext4
/dev/sda1|175457764|155825380|10719932|94%|/home|ext3

====Informacion de la memoria====
Cantidad de memoria RAM: 3968MB
Total: 4056984
Usada: 2307076
Disponible: 1749908
Memoria SWAP total: 1052248
Memoria SWAP usada: 0
Memoria SWAP libre: 1052248</pre>
<p><!--INFOLINKS_ON--></p>
<h3>Descargar Sigar</h3>
<p style="text-align: justify;">Puedes descargar Sigar de la página oficial: <a href="http://support.hyperic.com/display/SIGAR/Home">http://support.hyperic.com/display/SIGAR/Home</a> que incluye además ejemplos para Java, Perl, C, Python, Ruby, y más. Puedes además descargar el código fuente que se encuentra licenciado bajo la GPL2.</p>
<h3>Creación del proyecto en Eclipse</h3>
<p style="text-align: justify;">Voy a usar este ejemplo para además enseñar a manipular librerías externas en Eclipse; si lo que te interesa es conocer el código, puedes saltarte a dicha sección directamente.</p>
<p style="text-align: justify;">Creamos un proyecto en Eclipse llamado InfoSistema:</p>
<p style="text-align: center;"><img class="size-full wp-image-3385 aligncenter" title="eclipse1" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/10/eclipse1.png" alt="eclipse1" width="457" height="381" /></p>
<p style="text-align: justify;">Ahora creamos una carpeta dentro del proyecto llamada lib, en donde guardaremos las librerías de Sigar (.jar, .so, .dll, etc.):</p>
<p style="text-align: center;"><img class="size-full wp-image-3386 aligncenter" title="eclipse2" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/10/eclipse2.png" alt="eclipse2" width="600" height="372" /></p>
<p style="text-align: justify;">Ahora descomprimimos el archivo que descargamos de Sigar, y copiamos los archivos que se encuentran en la carpeta <code>sigar-bin/lib</code> a la carpeta <code>lib</code> de nuestro proyecto. En mi caso la copia la hice con este comando:</p>
<div class="consola">cp sigar-bin/lib/* /home/compartido/workspace/InfoSistema/lib/</div>
<p style="text-align: justify;">Cabe resaltar que bastaría con copiar el archivo llamado <code>sigar.jar</code> y la librería del sistema donde vamos a correr nuestro programa (<code>libsigar-amd64-linux.so</code> en mi caso).</p>
<p style="text-align: justify;">Una vez hecha la copia, hacemos clic en la raiz del proyecto en Eclipse y presionamos F5 para actualizar el árbol de ficheros; de esta manera Eclipse sabrá de los nuevos archivos que hemos copiado. Y lo que haremos a continuación será enlazar la librería <code>sigar.jar</code> a nuestro proyecto, para lo cual hacemos clic derecho en el mismo, <em>Build Path</em> -&gt; <em>Configure Build Path&#8230;</em></p>
<p style="text-align: center;"><img class="size-full wp-image-3388 aligncenter" title="eclipse3" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/10/eclipse3.png" alt="eclipse3" width="600" height="345" /></p>
<p style="text-align: justify;">En la ventana que aparece, seleccionaremos la pestaña <em>Libraries</em> y hacemos clic en el botón <em>Add JARs&#8230;</em> Seleccionamos el archivo <code>sigar.jar</code> y hacemos clic en <em>OK</em>:</p>
<p style="text-align: center;"><img class="size-full wp-image-3389 aligncenter" title="eclipse4" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/10/eclipse4.png" alt="eclipse4" width="373" height="336" /></p>
<p style="text-align: justify;">Ahora que la librería se encuentra añadida, podemos utilizar el API que Sigar nos ofrece. ¡Pasemos entonces al código!</p>
<h3>Información del sistema&#8230;</h3>
<p style="text-align: justify;">La siguiente clase nos permite obtener información del sistema operativo, como el nombre, la versión, la arquitectura, etc. Creamos una nueva clase llamada <code>InfoSO</code> con el siguiente código:</p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: java;">import org.hyperic.sigar.OperatingSystem;
import org.hyperic.sigar.Sigar;
import org.hyperic.sigar.SigarException;

public class InfoSO {
	private Sigar sigar = new Sigar();
	public void imprimirInfo() {
		OperatingSystem sys = OperatingSystem.getInstance();
		System.out.println(&quot;Descripcion del SO\t&quot; + sys.getDescription());
		System.out.println(&quot;Nombre del SO\t\t&quot; + sys.getName());
		System.out.println(&quot;Arquitectura del SO\t&quot; + sys.getArch());
		System.out.println(&quot;Version del SO\t\t&quot; + sys.getVersion());
		System.out.println(&quot;Nivel de parches\t&quot; + sys.getPatchLevel());
		System.out.println(&quot;Fabricante\t\t&quot; + sys.getVendor());
		System.out.println(&quot;Version SO\t\t&quot; + sys.getVendorVersion());
		try {
			imprimirUptime();
		} catch (SigarException e) {
			e.printStackTrace();
		}
	}
	public void imprimirUptime() throws SigarException {
		double uptime = sigar.getUptime().getUptime();
		String resultado = &quot;&quot;;
		int dias = (int) uptime / (60 * 60 * 24);
		int minutos, horas;
		if (dias != 0)
			resultado += dias + &quot; &quot; + ((dias &gt; 1) ? &quot;dias&quot; : &quot;dia&quot;) + &quot;, &quot;;
		minutos = (int) uptime / 60;
		horas = minutos / 60;
		horas %= 24;
		minutos %= 60;
		if (horas != 0)
			resultado += horas + &quot;:&quot; + (minutos &lt; 10 ? &quot;0&quot; + minutos : minutos);
		else
			resultado += minutos + &quot; min&quot;;
		System.out.println(&quot;Encendido durante:\t&quot; + resultado);
	}
}
</pre>
<p><!--INFOLINKS_ON-->
<p style="text-align: justify;">Aspectos importantes:</p>
<ul style="text-align: justify;">
<li>La clase que nos proporciona los métodos para recuperar información del sistema operativo es <code>OperatingSystem</code>.</li>
<li>Con los métodos <code>getName</code> y <code>getDescription</code> obtenemos el nombre del sistema operativo y descripción (por ejemplo: nombre = Linux; descripción = Gentoo 2.1.6).</li>
<li style="text-align: justify;">El método <code>getUptime</code> de la clase Sigar nos permite conocer cuanto tiempo ha estado prendido el equipo analizado.</li>
</ul>
<p style="text-align: justify;">
<h3 style="text-align: justify;">Información de la CPU&#8230;</h3>
</p>
<p style="text-align: justify;">La siguiente clase nos permitirá conocer el modelo del procesador, sus capacidades, la cantidad de núcleos y el uso de los mismos, etc. Creamos una nueva clase llamada <code>InfoCPU</code> con el siguiente código:</p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: java;">import org.hyperic.sigar.CpuInfo;
import org.hyperic.sigar.CpuPerc;
import org.hyperic.sigar.Sigar;
import org.hyperic.sigar.SigarException;

public class InfoCPU {
	private Sigar sigar;

	public void imprimirInfoCPU() {
		sigar = new Sigar();
		CpuInfo[] infos = null;
		CpuPerc[] cpus = null;
		try {
			infos = sigar.getCpuInfoList();
			cpus = sigar.getCpuPercList();
		} catch (SigarException e) {
			e.printStackTrace();
		}

		CpuInfo info = infos[0];
		long tamanioCache = info.getCacheSize();
		System.out.println(&quot;Fabricante:\t\t&quot; + info.getVendor());
		System.out.println(&quot;Modelo\t\t\t&quot; + info.getModel());
		System.out.println(&quot;Mhz\t\t\t&quot; + info.getMhz());
		System.out.println(&quot;Total CPUs\t\t&quot; + info.getTotalCores());
		if ((info.getTotalCores() != info.getTotalSockets())
				|| (info.getCoresPerSocket() &gt; info.getTotalCores())) {
			System.out.println(&quot;CPUs fisiscas\t\t&quot; + info.getTotalSockets());
			System.out
					.println(&quot;Nucleos por CPU\t\t&quot; + info.getCoresPerSocket());
		}

		if (tamanioCache != Sigar.FIELD_NOTIMPL)
			System.out.println(&quot;Tamanio cache\t\t&quot; + tamanioCache);
		System.out.println(&quot;&quot;);

		for (int i = 0; i &lt; cpus.length; i++)
			System.out.println(&quot;Consumo de CPU &quot; + i + &quot;\t&quot;
					+ CpuPerc.format(cpus[i].getUser()));

		try {
			System.out.println(&quot;Consumo total de CPU\t&quot;
					+ CpuPerc.format(sigar.getCpuPerc().getUser()));
		} catch (SigarException e) {
			e.printStackTrace();
		}
	}
}
</pre>
<p><!--INFOLINKS_ON-->Aspectos importantes:</p>
<ul style="text-align: justify;">
<li style="text-align: justify;">Se deben usar objetos de <code>CpuInfo</code> y <code>CpuPerc</code> que proporcionan los métodos para recuperar información del procesador. Dichos objetos se crean a partir de un objeto principal de tipo <code>Sigar</code>.</li>
<li style="text-align: justify;">Para extraer información acerca del  procesador usamos los métodos de la clase CpuInfo (por ejemplo <code>getVendor</code> o <code>getModel</code>).</li>
<li style="text-align: justify;">Los datos específicos de cada núcleo de nuestro procesador se extraen con los métodos de la clase <code>CpuPerc</code> (getUser para obtener el uso de un núcleo, por ejemplo).</li>
</ul>
<p style="text-align: justify;">
<h3>Información del sistema de archivos&#8230;</h3>
</p>
<p style="text-align: justify;">La siguiente clase nos permite obtener información del sistema de archivos: unidades montadas, espacio en disco, tipo de sistema de archivos, etc. Creamos una nueva clase llamada <code>InfoSistemaArchivos</code> con el siguiente código:</p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: java;">import org.hyperic.sigar.Sigar;
import org.hyperic.sigar.SigarException;
import org.hyperic.sigar.FileSystem;
import org.hyperic.sigar.FileSystemUsage;
import org.hyperic.sigar.NfsFileSystem;
import org.hyperic.sigar.SigarProxy;
import org.hyperic.sigar.SigarProxyCache;

public class InfoSistemaArchivos {
	private SigarProxy proxy;
	private Sigar sigar;

	public InfoSistemaArchivos() {
		sigar = new Sigar();
		proxy = SigarProxyCache.newInstance(sigar);
	}

	public void imprimirInfo() throws SigarException {
		FileSystem[] listaSistemaArchivos = proxy.getFileSystemList();
		System.out.println(&quot;\ndispos.|total|usado|disponible|%uso|dir|tipo\n&quot;);
		for (int i = 0; i &lt; listaSistemaArchivos.length; i++)
			imprimirSistemaArchivos(listaSistemaArchivos[i]);
	}

	public void imprimirSistemaArchivos(FileSystem sistemaArchivos)
			throws SigarException {
		long usado, disponible, total, porcentaje;

		try {
			FileSystemUsage uso;
			if (sistemaArchivos instanceof NfsFileSystem) {
				NfsFileSystem nfs = (NfsFileSystem) sistemaArchivos;
				if (!nfs.ping()) {
					System.out.println(nfs.getUnreachableMessage());
					return;
				}
			}
			uso = sigar.getFileSystemUsage(sistemaArchivos.getDirName());

			usado = uso.getTotal() - uso.getFree();
			disponible = uso.getAvail();
			total = uso.getTotal();

			porcentaje = (long) (uso.getUsePercent() * 100);
		} catch (SigarException e) {
			// por ejemplo, si en al procesar D:\ en windows falla
			// con &quot;Device not ready&quot;
			usado = disponible = total = porcentaje = 0;
		}

		String porcentajeUso;
		if (porcentaje == 0)
			porcentajeUso = &quot;-&quot;;
		else
			porcentajeUso = porcentaje + &quot;%&quot;;

		System.out.print(sistemaArchivos.getDevName());
		System.out.print(&quot;|&quot; + total);
		System.out.print(&quot;|&quot; + usado);
		System.out.print(&quot;|&quot; + disponible);
		System.out.print(&quot;|&quot; + porcentajeUso);
		System.out.print(&quot;|&quot; + sistemaArchivos.getDirName());
		System.out.println(&quot;|&quot; + sistemaArchivos.getSysTypeName());
	}
}
</pre>
<p><!--INFOLINKS_ON-->Aspectos importantes:</p>
<ul style="text-align: justify;">
<li style="text-align: justify;">La clase que nos proporciona los métodos para obtener información de una unidad en específico es <code>FileSystem</code>.</li>
<li style="text-align: justify;">El método <code>getDevName</code> nos devuelve el nombre del dispositivo referenciado por el objeto de la clase <code>FileSystem</code>.</li>
<li style="text-align: justify;">Los métodos <code>getTotal</code> y <code>getAvail</code> devuelven un <code>long</code> que representa el espacio total del dispositivo y espacio disponible, respectivamente.</li>
<li style="text-align: justify;">Para conocer el tipo de sistema de archivos (ext4, ntfs, fat, btrfs, etc.) utilizamos el método <code>getSysTypeName</code>.</li>
</ul>
<p style="text-align: justify;">
<h3>Información de la memoria&#8230;</h3>
</p>
<p style="text-align: justify;">La siguiente clase nos permite conocer la cantidad de memoria RAM que tiene el equipo, así como la que se está usando actualmente (tanto memoria física como virtual, aka, swap). Creamos una nueva clase llamada <code>InfoMemoria</code> con el siguiente código:</p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: java;">import org.hyperic.sigar.Mem;
import org.hyperic.sigar.Sigar;
import org.hyperic.sigar.Swap;
import org.hyperic.sigar.SigarException;

public class InfoMemoria {
	private Sigar sigar = new Sigar();
	public void imprimirInfo() throws SigarException {
		Mem memoria = sigar.getMem();
		Swap intercambio = sigar.getSwap();

		System.out.println(&quot;Cantidad de memoria RAM: &quot;+ memoria.getRam() + &quot;MB&quot;);

		System.out.println(&quot;Total: &quot;+enBytes(memoria.getTotal()));
		System.out.println(&quot;Usada: &quot;+enBytes(memoria.getUsed()));
		System.out.println(&quot;Disponible: &quot;+enBytes(memoria.getFree()));

		System.out.println(&quot;Memoria SWAP total: &quot;+enBytes(intercambio.getTotal()));
		System.out.println(&quot;Memoria SWAP usada: &quot;+enBytes(intercambio.getUsed()));
		System.out.println(&quot;Memoria SWAP libre: &quot;+enBytes(intercambio.getFree()));

	}
	private Long enBytes(long valor) {
		return new Long(valor / 1024);
	}
}</pre>
<p><!--INFOLINKS_ON--></p>
<p style="text-align: justify;">Aspectos importantes:</p>
<ul style="text-align: justify;">
<li style="text-align: justify;">La clase <code>Mem</code> nos proporciona métodos para obtener información de la memoria del sistema.</li>
<li style="text-align: justify;">La clase <code>Swap</code> hace lo mismo que Mem, pero para la memoria virtual.</li>
<li style="text-align: justify;">Los métodos <code>getTotal</code> y <code>getUsed</code> nos devuelven un long que representa (en bits) la cantidad de memoria del equipo y lo que está usando, respectivamente.</li>
</ul>
<p style="text-align: justify;">
<h3>La clase main&#8230;</h3>
</p>
<p style="text-align: justify;">El main de nuestro proyecto estará contenido en la clase <code>InfoSistema</code>:</p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: java;">import org.hyperic.sigar.SigarException;
public class InfoSistema {
	public static void main(String[] args) {
		try {
			System.out.println(&quot;====Informacion del sistema====&quot;);
			new InfoSO().imprimirInfo();
			System.out.println(&quot;\n==== Informacion de la CPU ====&quot;);
			new InfoCPU().imprimirInfoCPU();
			System.out.println(&quot;\n====Informacion del sistema de archivos====&quot;);
			new InfoSistemaArchivos().imprimirInfo();
			System.out.println(&quot;\n====Informacion de la memoria====&quot;);
			new InfoMemoria().imprimirInfo();
		} catch (SigarException e) {
			e.printStackTrace();
		}
	}
}</pre>
<p><!--INFOLINKS_ON--></p>
<p>Eso es todo, solo nos queda ejecutar el proyecto y, opcionalmente, crear un archivo .jar para ejecutar en cualquier lado.</p>
<p style="text-align: justify;">
<h3>Descargas&#8230;</h3>
</p>
<ul style="text-align: justify;">
<li><a href="http://casidiablo.net/descargar/Informacion+Sistema+Java" class="tooltip" title="Proyecto de Eclipse comprimido en ZIP (contiene las librerías de Sigar)">Descarga del código fuente usado en esta entrada</a></li>
<li><a href="https://sourceforge.net/project/showfiles.php?group_id=172552">Descargar librerías de Sigar de SourceForge</a></li>
</ul>
<p><br/><br/></p>


	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/cpu/" rel="tag nofollow">cpu</a>, <a href="http://casidiablo.net/tag/disco/" rel="tag nofollow">disco</a>, <a href="http://casidiablo.net/tag/ejemplo/" rel="tag nofollow">ejemplo</a>, <a href="http://casidiablo.net/tag/ejemplos/" rel="tag nofollow">ejemplos</a>, <a href="http://casidiablo.net/tag/ejercicio/" rel="tag nofollow">ejercicio</a>, <a href="http://casidiablo.net/tag/espacio/" rel="tag nofollow">espacio</a>, <a href="http://casidiablo.net/tag/ide/" rel="tag nofollow">ide</a>, <a href="http://casidiablo.net/tag/informacion/" rel="tag nofollow">informacion</a>, <a href="http://casidiablo.net/tag/java/" rel="tag nofollow">java</a>, <a href="http://casidiablo.net/tag/linux/" rel="tag nofollow">linux</a>, <a href="http://casidiablo.net/tag/memoria/" rel="tag nofollow">memoria</a>, <a href="http://casidiablo.net/tag/programacion/" rel="tag nofollow">programación</a>, <a href="http://casidiablo.net/tag/ram/" rel="tag nofollow">ram</a>, <a href="http://casidiablo.net/tag/sistema/" rel="tag nofollow">sistema</a>, <a href="http://casidiablo.net/tag/wordpress/" rel="tag nofollow">wordpress</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/capturar-informacion-sistema-operativo-java/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Algoritmo: Obtener longitud del mayor subarreglo creciente de un arreglo</title>
		<link>http://casidiablo.net/algoritmo-longitud-mayor-subarreglo-creciente/</link>
		<comments>http://casidiablo.net/algoritmo-longitud-mayor-subarreglo-creciente/#comments</comments>
		<pubDate>Wed, 19 Aug 2009 20:58:48 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[ejercicios en java]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[algoritmos]]></category>
		<category><![CDATA[arreglos]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[subarreglos]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3169</guid>
		<description><![CDATA[

A falta de tiempo para cosas más profesionales, voy a ir poniendo los algoritmos bonitos que desarrolle en la Universidad. En este caso, la especificación del ejercicio sería: Dado un arreglo de números, determinar la longitud del subarreglo creciente más largo del arreglo.
Ejemplo
Si recibiéramos un arreglo de naturales con los siguientes elementos: 2, 6, 5, [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%3A%2F%2Fcasidiablo.net%2Falgoritmo-longitud-mayor-subarreglo-creciente%2F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Algoritmo%3A%20Obtener%20longitud%20del%20mayor%20subarreglo%20creciente%20de%20un%20arreglo%22%20%7D);"></div>
<p style="text-align: justify;">A falta de tiempo para cosas más profesionales, voy a ir poniendo los algoritmos bonitos que desarrolle en la Universidad. En este caso, la especificación del ejercicio sería: <em>Dado un arreglo de números, determinar la longitud del subarreglo creciente más largo del arreglo</em>.</p>
<h3>Ejemplo</h3>
<p style="text-align: justify;">Si recibiéramos un arreglo de naturales con los siguientes elementos: <em>2, 6, 5, 1, 3, 4, 9, 8</em> el resultado sería 4, puesto que es el subarreglo más largo de elementos crecientes (es decir, la longitud del subarreglo <em>1, 3, 4, 9</em>)</p>
<h3>Solución en palabras</h3>
<p style="text-align: justify;">El algoritmo que resuelve este problema debería recorrer el arreglo e ir verificando si el elemento en la posición a la que apunta es menor al de la siguiente posición. Esto supone además que, puesto que evaluaremos el elemento de la siguiente posición, debemos recorrer el arreglo desde la posición <em>0</em> hasta <em>n-1</em> (siendo <em>n</em> la longitud del arreglo), ya que no queremos sobrepasar la longitud del mismo. Por otro lado, para <strong>cada elemento</strong> del arreglo contaremos sus sucesores que sean mayores que él mismo y con dicho conteo podremos determinar cual es la longitud de los subarreglos crecientes.</p>
<h3>Solución en Java</h3>
<p>El algoritmo en Java sería este:</p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: java;">public class SubarregloCreciente{
	public static void main(String args[]){
		//arreglo a evaluar
		int[] arr = {5,6,4,1,2,6,7,78,6,2,3,4,5,6,7,3,6,1};
		//la longitud al menos sera 0;
		//k contador por cada recorrido
		int longitud = 1, k;
		//recorremos el arreglo
		for(int i=0; i&lt;arr.length-1;i++){
			//contamos desde el indice i cuantos
			//elementos hay en orden ascendente
			for(k = i; k &lt; arr.length-1 &amp;&amp; arr[k] &lt; arr[k+1]; k++);
			//si la longitud es mayor que la anterior guardarla
			if(longitud &lt; k - i + 1)
				longitud = k - i + 1;
		}
		System.out.println(&quot;Longitud del subarreglo creciente mas grande: &quot;+longitud);
	}
}</pre>
<p><!--INFOLINKS_ON--></p>
<p><a class="descargacodigo tooltip" title="Descargar el código fuente" href="http://casidiablo.net/descargar/Subarreglo+Creciente">Descargar código fuente</a></p>
<h3>Solución en Python</h3>
<p><!--INFOLINKS_OFF-->
<pre class="brush: python;">from array import array
#arreglo a evaluar
arr = array('d',[5,6,4,1,2,6,7,78,6,2,3,4,5,6,7,3,6,1])
#la longitud al menos sera 0;
#k contador por cada recorrido
longitud = 1
#k=0
#recorremos el arreglo
for i in range (0, len(arr)-1):
	#contamos desde el indice i cuantos
	#elementos hay en orden ascendente
	for k in range(i, len(arr)-1):
		if not arr[k] &lt; arr[k+1]: break
	#si la longitud es mayor que la anterior guardarla
	if longitud &lt; k - i + 1:
		longitud = k - i + 1
print &quot;Longitud del subarreglo creciente mas grande: &quot;+str(longitud)</pre>
<p><!--INFOLINKS_ON--></p>
<p><a class="descargacodigo tooltip" title="Descargar el código fuente" href="http://casidiablo.net/descargar/Subarreglo+Creciente+Python">Descargar código fuente</a></p>
<h3>Representación formal de la solución</h3>
<p style="text-align: center;"><img class="aligncenter" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/08/subarreglo.png" alt="subarreglo creciente"  /></p>
<p>Por supuesto, el algoritmo planteado es solo la aproximación más sencilla, mas no la más eficiente de todas.</p>


	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/algoritmos/" rel="tag nofollow">algoritmos</a>, <a href="http://casidiablo.net/tag/arreglos/" rel="tag nofollow">arreglos</a>, <a href="http://casidiablo.net/tag/java/" rel="tag nofollow">java</a>, <a href="http://casidiablo.net/tag/programacion/" rel="tag nofollow">programación</a>, <a href="http://casidiablo.net/tag/python/" rel="tag nofollow">python</a>, <a href="http://casidiablo.net/tag/subarreglos/" rel="tag nofollow">subarreglos</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/algoritmo-longitud-mayor-subarreglo-creciente/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Video Tutoriales &#8211; Creación de Juegos</title>
		<link>http://casidiablo.net/videotutoriales-desarrollo-juegos-java/</link>
		<comments>http://casidiablo.net/videotutoriales-desarrollo-juegos-java/#comments</comments>
		<pubDate>Thu, 25 Jun 2009 14:52:35 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[video tutoriales]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3105</guid>
		<description><![CDATA[

La siguiente es una recopilación de tutoriales hechos por Jorge Rubira, en donde explica el desarrollo de diferentes juegos en diferentes lenguajes de programación (Java, JSP, laszlo, etc.)

Matamarcianos
Algoritmo Minimax
Pong3D con Java3D
Desarrollo de una bolera virtual
Game Maker
Juego de coches
MazeRunner
Búsqueda de soluciones basadas en IA
El juego del trilero
Tiro a diana
Busca las minas
Tragaperras
Tetris



	Etiquetas: java, programación, video tutoriales
]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%3A%2F%2Fcasidiablo.net%2Fvideotutoriales-desarrollo-juegos-java%2F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Video%20Tutoriales%20-%20Creaci%C3%B3n%20de%20Juegos%22%20%7D);"></div>
<p><img class="alignright size-full wp-image-3106" title="video" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/06/video.png" alt="video" width="150" height="137" />La siguiente es una recopilación de tutoriales hechos por <a href="http://weblogs.javahispano.org/jh/entry/integrantes_de_javahispano_jorge_rubira" rel="nofollow">Jorge Rubira</a>, en donde explica el desarrollo de diferentes juegos en diferentes lenguajes de programación (Java, JSP, laszlo, etc.)</p>
<ul>
<li><a class="tooltip" title="Descargar video y código" href="http://casidiablo.net/descargar/Matamarcianos">Matamarcianos</a></li>
<li><a class="tooltip" title="Descargar video y código" href="http://casidiablo.net/descargar/Algoritmo+Minimax">Algoritmo Minimax</a></li>
<li><a class="tooltip" title="Descargar video y código" href="http://casidiablo.net/descargar/Pong3D+con+Java3D">Pong3D con Java3D</a></li>
<li><a class="tooltip" title="Descargar video y código" href="http://casidiablo.net/descargar/Desarrollo+de+una+bolera+virtual">Desarrollo de una bolera virtual</a></li>
<li><a class="tooltip" title="Descargar video y código" href="http://casidiablo.net/descargar/Game+Maker">Game Maker</a></li>
<li><a class="tooltip" title="Descargar video y código" href="http://casidiablo.net/descargar/Juego+de+coches">Juego de coches</a></li>
<li><a class="tooltip" title="Descargar video y código" href="http://casidiablo.net/descargar/MazeRunner">MazeRunner</a></li>
<li><a class="tooltip" title="Descargar video y código" href="http://casidiablo.net/descargar/Busqueda+soluciones+basadas+IA">Búsqueda de soluciones basadas en IA</a></li>
<li><a class="tooltip" title="Descargar video y código" href="http://casidiablo.net/descargar/El+juego+del+trilero">El juego del trilero</a></li>
<li><a class="tooltip" title="Descargar video y código" href="http://casidiablo.net/descargar/Tiro+a+diana">Tiro a diana</a></li>
<li><a class="tooltip" title="Descargar video y código" href="http://casidiablo.net/descargar/Busca+las+minas">Busca las minas</a></li>
<li><a class="tooltip" title="Descargar video y código" href="http://casidiablo.net/descargar/Tragaperras">Tragaperras</a></li>
<li><a class="tooltip" title="Descargar video y código" href="http://casidiablo.net/descargar/Tetris">Tetris</a></li>
</ul>


	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/java/" rel="tag nofollow">java</a>, <a href="http://casidiablo.net/tag/programacion/" rel="tag nofollow">programación</a>, <a href="http://casidiablo.net/tag/video-tutoriales/" rel="tag nofollow">video tutoriales</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/videotutoriales-desarrollo-juegos-java/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Ejemplo fullscreen y cómo crear ventanas sin bordes en Java</title>
		<link>http://casidiablo.net/pantalla-completa-java/</link>
		<comments>http://casidiablo.net/pantalla-completa-java/#comments</comments>
		<pubDate>Fri, 17 Apr 2009 15:11:41 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[ejercicios en java]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[ejemplo]]></category>
		<category><![CDATA[ejercicio]]></category>
		<category><![CDATA[fullscreen]]></category>
		<category><![CDATA[pantalla completa]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3028</guid>
		<description><![CDATA[

Este es un tip bastante útil que nos permitirá poner las ventanas de nuestras aplicaciones en Fullscreen (pantalla completa), y de paso aprenderemos a crear ventanas sin bordes (lo cual es útil si queremos hacer algún splash de inicio para nuestra aplicación).
En el siguiente ejemplo usaremos básicamente los siguientes métodos y clases:

Método setUndecorated de la [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%3A%2F%2Fcasidiablo.net%2Fpantalla-completa-java%2F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Ejemplo%20fullscreen%20y%20c%C3%B3mo%20crear%20ventanas%20sin%20bordes%20en%20Java%22%20%7D);"></div>
<p style="text-align: justify;">Este es un tip bastante útil que nos permitirá poner las ventanas de nuestras aplicaciones en Fullscreen (pantalla completa), y de paso aprenderemos a crear ventanas sin bordes (lo cual es útil si queremos hacer algún splash de inicio para nuestra aplicación).</p>
<p style="text-align: justify;">En el siguiente ejemplo usaremos básicamente los siguientes métodos y clases:</p>
<ul style="text-align: justify;">
<li>Método <code>setUndecorated</code> de la clase <code>JFrame</code>, el cual recibe un parámetro <code>boolean</code>. Si le enviamos true, quitará los bordes de la ventana.</li>
<li>La clase <code>GraphicsDevice</code> nos permite manejar objetos que representan dispositivos gráficos, como la pantalla del computador. En este caso creamos el  objeto con la instrucción <code>GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();</code> que nos devuelve un objeto que representa la pantalla en donde se está mostrando nuestro programa.</li>
<li>El método <code>setFullScreenWindow</code>, de la clase <code>GraphicsDevice</code>, nos permite poner nuestro programa en pantalla completa. Además, aunque no lo usemos en el ejemplo, contamos con el método <code>isFullScreenSupported</code> que nos permite saber si es posible poner la ventana en modo fullscreen o no.</li>
</ul>
<h3>Código fuente del ejemplo&#8230;</h3>
<p><!--INFOLINKS_OFF-->
<pre class="brush: java;">import javax.swing.*;
import java.awt.GraphicsEnvironment;
import java.awt.GraphicsDevice;
import java.awt.event.*;

public class EjemploFullscreen extends JFrame implements ActionListener{
        private JButton boton;
        private boolean estaFull = false;
        static GraphicsDevice grafica=
                GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
        public EjemploFullscreen() {
                super(&quot;Ejemplo pantalla completa en Java&quot;);

                boton = new JButton(&quot;Presioname&quot;);
                boton.addActionListener(this);
                getContentPane().add(boton);

                setSize(640, 400);
                setUndecorated(true);
                setVisible(true);
        }

        public static void main(String[] args) {
                new EjemploFullscreen();
        }

        public void actionPerformed(ActionEvent e) {
                if(!estaFull)
                        grafica.setFullScreenWindow(this);
                else
                        grafica.setFullScreenWindow(null);
                estaFull = !estaFull;
        }
}</pre>
<p><!--INFOLINKS_ON--></p>
<p><a class="tooltip descargacodigo" title="Descarga las fuentes del ejemplo" href="http://casidiablo.net/descargar/Ejemplo+Pantalla+Completa">Descargar código fuente</a></p>


	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/ejemplo/" rel="tag nofollow">ejemplo</a>, <a href="http://casidiablo.net/tag/ejercicio/" rel="tag nofollow">ejercicio</a>, <a href="http://casidiablo.net/tag/fullscreen/" rel="tag nofollow">fullscreen</a>, <a href="http://casidiablo.net/tag/java/" rel="tag nofollow">java</a>, <a href="http://casidiablo.net/tag/pantalla-completa/" rel="tag nofollow">pantalla completa</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/pantalla-completa-java/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>La clase BigInteger en Java</title>
		<link>http://casidiablo.net/numeros-primos-java-biginteger/</link>
		<comments>http://casidiablo.net/numeros-primos-java-biginteger/#comments</comments>
		<pubDate>Thu, 16 Apr 2009 18:14:15 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[ejercicios en java]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[BigInteger]]></category>
		<category><![CDATA[ejemplos]]></category>
		<category><![CDATA[ejercicios]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3021</guid>
		<description><![CDATA[

BigInteger y BigDecimal son clases envoltura de los tipos primitivos int y double, sin embargo tienen ventajas sobre los tipos primitivos. Cuando necesites usar números grandes en Java la mejor opción es usar estas clases, ya que su limite de almacenamiento es el límite de memoria que tenga la máquina virtual de Java.
Además, estas clases [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%3A%2F%2Fcasidiablo.net%2Fnumeros-primos-java-biginteger%2F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22La%20clase%20BigInteger%20en%20Java%22%20%7D);"></div>
<p style="text-align: justify;"><code>BigInteger</code> y <code>BigDecimal</code> son clases envoltura de los tipos primitivos <code>int</code> y <code>double</code>, sin embargo tienen ventajas sobre los tipos primitivos. Cuando necesites usar números grandes en Java la mejor opción es usar estas clases, ya que su limite de almacenamiento es el límite de memoria que tenga la máquina virtual de Java.</p>
<p style="text-align: justify;">Además, estas clases proporcionan algunos métodos bastante interesantes, como las operaciones básicas o saber si el número es primo o no. Como siempre vamos con algunos ejemplos de apoyo:</p>
<h3 style="text-align: justify;">Operaciones básicas con la clase BigInteger</h3>
<p style="text-align: justify;">En el siguiente ejemplo se hace uso de los métodos <em>add</em>, <em>substract</em>, <em>multiply</em> y <em>divide</em> para realizar las operaciones básicas de suma, resta, multiplicación y división:<span id="more-3021"></span></p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: java;">import java.math.BigInteger;
public class PruebaOperacionesBasicas {
    public static void main(String args[]){
        BigInteger entero1 = BigInteger.valueOf(45);
        BigInteger entero2 = BigInteger.valueOf(15);
        //sumar con metodo add()
        String texto = &quot;La suma entre &quot;+entero1+
                &quot; y &quot;+entero2+&quot; es &quot;+entero1.add(entero2);
        //restar con metodo substract()
        texto += &quot;\nLa resta entre &quot;+entero1+
                &quot; y &quot;+entero2+&quot; es &quot;+entero1.subtract(entero2);
        //multiplicar con metodo multiply()
        texto += &quot;\nEl producto de &quot;+entero1+
                &quot; y &quot;+entero2+&quot; es &quot;+entero1.multiply(entero2);
        //dividir con metodo divide()
        texto += &quot;\nLa división de &quot;+entero1+
                &quot; y &quot;+entero2+&quot; entre &quot;+entero1.divide(entero2);
        System.out.println(texto);
    }
}</pre>
<p><!--INFOLINKS_ON--></p>
<h3 style="text-align: justify;">Números primos en Java</h3>
<p style="text-align: justify;">Este es un típico ejercicio que nos plantean en la universidad; se trata de hacer un listado de los primeros X números primos. En este caso <code>BigInteger</code> nos proporciona dos métodos muy interesantes: <em>isProbablePrime</em> y <em>nextProbablePrime</em>. El primero de ellos devuelve <code>true</code> si el número es probablemente primo (recordemos que es complejo saber si un número es o no primo cuando es demasiado grande); el segundo devuelve el próximo posible número primo a partir del valor que contenga el objeto.</p>
<p style="text-align: justify;">La siguiente aplicación usa el método <em>nextProbablePrime</em> para listar los primeros 2000 números primos:</p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: java;">import java.math.BigInteger;
public class PruebaNumerosPrimos {
    public static void main(String args[]){
        //iniciar el entero en cero
        BigInteger entero = BigInteger.ZERO;
        StringBuffer texto = new StringBuffer();
        for(int i = 0; i&lt;2000; i++){
            entero = entero.nextProbablePrime();
            texto.append(entero+&quot;\n&quot;);
            entero.add(BigInteger.ONE);
        }
        System.out.println(texto);
    }
}</pre>
<p><!--INFOLINKS_ON--></p>
<p style="text-align: justify;"><strong>Otros métodos interesantes</strong></p>
<p style="text-align: justify;">La clase <code>BigInteger</code> proporciona además otros métodos que nos ahorrarán bastante tiempo y líneas de código:</p>
<ul style="text-align: justify;">
<li><em>pow</em>, nos permite elevar un número a la potencia que deseemos.</li>
<li><em>comparteTo</em>, nos permite comparar si un BigInteger es mayor, igual o menor que otro.</li>
<li><em>min</em> y <em>max</em>, nos permiten saber cuál de los dos BigInteger es menor o mayor.</li>
</ul>
<p style="text-align: justify;">Como mencioné al principio, también es posible usar la clase <code>BigDecimal</code> que funciona de manera similar pero con números de coma flotante.</p>
</p>
<p><a class="descargacodigo tooltip" title="Descargar archivo ZIP con las fuentes del ejemplo" href="http://casidiablo.net/descargar/Pruebas+BigInteger"><strong>Descargar código fuente de ejemplos</strong></a></p>


	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/biginteger/" rel="tag nofollow">BigInteger</a>, <a href="http://casidiablo.net/tag/ejemplos/" rel="tag nofollow">ejemplos</a>, <a href="http://casidiablo.net/tag/ejercicios/" rel="tag nofollow">ejercicios</a>, <a href="http://casidiablo.net/tag/java/" rel="tag nofollow">java</a>, <a href="http://casidiablo.net/tag/programacion/" rel="tag nofollow">programación</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/numeros-primos-java-biginteger/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>[Video Tutorial] Conexiones entre MySQL y Java</title>
		<link>http://casidiablo.net/video-tutorial-mysql-java/</link>
		<comments>http://casidiablo.net/video-tutorial-mysql-java/#comments</comments>
		<pubDate>Mon, 16 Mar 2009 19:06:00 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[video tutoriales]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=2930</guid>
		<description><![CDATA[

Este es un video tutorial creado por un lector de este blog (ralejanro), basado en el tutorial que escribí hace ya mucho tiempo acerca de cómo conectar aplicaciones Java con bases de datos MySQL. Espero les sea de ayuda, y desde aquí le agradezco de corazón a ralejanro por compartirlo con todos.




	Etiquetas: java, MySQL, programación, [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%3A%2F%2Fcasidiablo.net%2Fvideo-tutorial-mysql-java%2F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22%5BVideo%20Tutorial%5D%20Conexiones%20entre%20MySQL%20y%20Java%22%20%7D);"></div>
<p style="text-align: justify;">Este es un video tutorial creado por un lector de este blog (<em><strong>ralejanro</strong></em>), basado en el tutorial que escribí hace ya mucho tiempo acerca de <a href="http://casidiablo.net/conexiones-entre-mysql-y-java/">cómo conectar aplicaciones Java con bases de datos MySQL</a>. Espero les sea de ayuda, y desde aquí le agradezco de corazón a <em>ralejanro</em> por compartirlo con todos.</p>
<p><object width="600" height="360"><param name="movie" value="http://www.youtube.com/v/Ulp9mOuDWac&#038;hl=es&#038;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/Ulp9mOuDWac&#038;hl=es&#038;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="600" height="360"></embed></object></p>
<p><object width="600" height="360"><param name="movie" value="http://www.youtube.com/v/Tm7ALvYzQLk&#038;hl=es&#038;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/Tm7ALvYzQLk&#038;hl=es&#038;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="600" height="360"></embed></object></p>


	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/java/" rel="tag nofollow">java</a>, <a href="http://casidiablo.net/tag/mysql/" rel="tag nofollow">MySQL</a>, <a href="http://casidiablo.net/tag/programacion/" rel="tag nofollow">programación</a>, <a href="http://casidiablo.net/tag/video/" rel="tag nofollow">video</a>, <a href="http://casidiablo.net/tag/video-tutoriales/" rel="tag nofollow">video tutoriales</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/video-tutorial-mysql-java/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
	</channel>
</rss>
