<?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; ejemplo</title>
	<atom:link href="http://casidiablo.net/tag/ejemplo/feed/" rel="self" type="application/rss+xml" />
	<link>http://casidiablo.net</link>
	<description>Blog de Java, Programación y Linux</description>
	<lastBuildDate>Fri, 11 Nov 2011 05:41:21 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<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 [...]]]></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%253A%252F%252Fcasidiablo.net%252Fcorrer-programa-java-como-demonio%252F%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>
<pre class="brush: plain; title: ; notranslate"># 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>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 &#8216;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>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/correr-programa-java-como-demonio/feed/</wfw:commentRss>
		<slash:comments>34</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: Para compilarlo y ejecutarlo desde la consola: javac -cp mail.jar:. EnviarMail.java java -cp mail.jar:. EnviarMail Si [...]]]></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%253A%252F%252Fcasidiablo.net%252Fenviar-mail-usando-api-java%252F%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>
<pre class="brush: java; title: ; notranslate">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 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>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/enviar-mail-usando-api-java/feed/</wfw:commentRss>
		<slash:comments>20</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, [...]]]></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%253A%252F%252Fcasidiablo.net%252Fcapturar-informacion-sistema-operativo-java%252F%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>
<pre class="brush: plain; title: ; notranslate">====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>
<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>
<pre class="brush: java; title: ; notranslate">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 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>
<pre class="brush: java; title: ; notranslate">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>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>
<pre class="brush: java; title: ; notranslate">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>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>
<pre class="brush: java; title: ; notranslate">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 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>
<pre class="brush: java; title: ; notranslate">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>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>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/capturar-informacion-sistema-operativo-java/feed/</wfw:commentRss>
		<slash:comments>29</slash:comments>
		</item>
		<item>
		<title>Obtener información del sistema con Python</title>
		<link>http://casidiablo.net/capturar-info-sistema-usando-python/</link>
		<comments>http://casidiablo.net/capturar-info-sistema-usando-python/#comments</comments>
		<pubDate>Thu, 24 Sep 2009 13:46:30 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[programación]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[ejemplo]]></category>
		<category><![CDATA[informacion]]></category>
		<category><![CDATA[sistema]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3307</guid>
		<description><![CDATA[Puesto que estaré haciendo un proyecto en Python, iré colocando aquellos tips útiles que he aprendido usando este maravilloso lenguaje de programación. En este caso, se trata de obtener la información del sistema que ejecuta el script; cosas como el PID del script, el directorio donde se está ejecutando, el nombre y versión del sistema [...]]]></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%253A%252F%252Fcasidiablo.net%252Fcapturar-info-sistema-usando-python%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Obtener%20informaci%C3%B3n%20del%20sistema%20con%20Python%22%20%7D);"></div>
<p style="text-align: justify;">Puesto que estaré haciendo un proyecto en Python, iré colocando aquellos tips útiles que he aprendido usando este maravilloso lenguaje de programación. En este caso, se trata de obtener la información del sistema que ejecuta el script; cosas como el PID del script, el directorio donde se está ejecutando, el nombre y versión del sistema operativo, etc.:</p>
<pre class="brush: python; title: ; notranslate">#!/usr/bin/python

import os
import time

numUsuario = os.getuid()
pidProceso = os.getpid()
donde = os.getcwd()
sistemaOperativo = os.uname()
tiempos = os.times()
horaRaw = time.time()
horaFormato = time.ctime(horaRaw)

print &quot;Numero de usuario&quot;,numUsuario
print &quot;PID&quot;,pidProceso
print &quot;Directorio actual&quot;,donde
print &quot;Informacion del sistema&quot;,sistemaOperativo
print &quot;Informacion de tiempos del sistema&quot;,tiempos

print &quot;\nLa hora/fecha actual es&quot;,horaRaw
print &quot;Lo cual significa&quot;,horaFormato</pre>
<p>Información extra: <a href="http://docs.python.org/library/os.html">http://docs.python.org/library/os.html</a></p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/capturar-info-sistema-usando-python/feed/</wfw:commentRss>
		<slash:comments>5</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 [...]]]></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%253A%252F%252Fcasidiablo.net%252Fpantalla-completa-java%252F%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>
<pre class="brush: java; title: ; notranslate">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><a class="tooltip descargacodigo" title="Descarga las fuentes del ejemplo" href="http://casidiablo.net/descargar/Ejemplo+Pantalla+Completa">Descargar código fuente</a></p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/pantalla-completa-java/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Constantes en C#</title>
		<link>http://casidiablo.net/constantes-en-c/</link>
		<comments>http://casidiablo.net/constantes-en-c/#comments</comments>
		<pubDate>Mon, 24 Nov 2008 13:44:58 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[C-Sharp]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[constantes]]></category>
		<category><![CDATA[ejemplo]]></category>
		<category><![CDATA[ejercicio]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=2280</guid>
		<description><![CDATA[Existen dos maneras de definir constantes en C Sharp: usando const o readonly. Cuando se usa const, es posible acceder a la variable directamente desde la clase (sin instanciar un objeto), como si se tratase de un atributo estático; mientras que con readonly, es un tipo de constantes que funciona como un atributo normal, y [...]]]></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%253A%252F%252Fcasidiablo.net%252Fconstantes-en-c%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Constantes%20en%20C%23%22%20%7D);"></div>
<p style="text-align: justify;">Existen dos maneras de definir constantes en <a href="http://casidiablo.net/category/programacion/net/c-sharp/">C Sharp</a>: usando <code>const</code> o <code>readonly</code>. Cuando se usa <code>const</code>, es posible acceder a la variable directamente desde la clase (sin instanciar un objeto), como si se tratase de un <a href="http://casidiablo.net/atributos-estaticos-destructores-c-sharp/">atributo estático</a>; mientras que con <code>readonly</code>, es un tipo de constantes que funciona como un atributo normal, y que una vez inicializada no se le puede cambiar el valor.</p>
<p>Veamos un ejemplo sencillo para aclararnos:<span id="more-2280"></span></p>
<pre class="brush: csharp; title: ; notranslate">using System;
public class Constantes {
  // crear constante PI
  public const double PI = 3.14159;
  // radio es una constante esta sin iniciar
  public readonly int radio;
  public Constantes( int radioValue ) {
     radio = radioValue;
  }
}
// Clase UsarConstantes
public class UsarConstantes {
  // metodo Main crea un objeto de tipo 'Constantes'
  // y muestra los valores
  static void Main( string[] args ) {
     Random random = new Random();
     Constantes valoresConstantes =
        new Constantes( random.Next( 1, 20 ) );
     Console.WriteLine( &quot;Radio = &quot; + valoresConstantes.radio +
        &quot;\nCircunferencia = &quot; +
        2 * Constantes.PI * valoresConstantes.radio);
  }
}</pre>
<p><strong>Resultado&#8230;<strong></strong></strong></p>
<div class="consola"><strong><strong>Radio = 10<br />
Circunferencia = 62.8318 </strong></strong></div>
<p><strong><strong><a class="tooltip descargacodigo" title="Constantes en C#::Contiene archivo fuente .cs" href="http://casidiablo.net/descargar/Constantes+C+Sharp">Descargar código fuente</a></strong></strong></p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/constantes-en-c/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Variables estáticas y destructores en C#</title>
		<link>http://casidiablo.net/atributos-estaticos-destructores-c-sharp/</link>
		<comments>http://casidiablo.net/atributos-estaticos-destructores-c-sharp/#comments</comments>
		<pubDate>Mon, 24 Nov 2008 11:52:32 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[C-Sharp]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[destructor]]></category>
		<category><![CDATA[ejemplo]]></category>
		<category><![CDATA[ejercicio]]></category>
		<category><![CDATA[estatico]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=2283</guid>
		<description><![CDATA[Las variables estáticas son atributos de una clase que están disponibles para todas las instancias de dicha clase, y a los cuales puedes acceder directamente (sin instanciar un objeto) de la forma Clase.Variable. Los destructores son métodos que se ejecutan cuando se elimina un objeto; son especialmente útiles si deseamos hacer algo en particular, antes [...]]]></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%253A%252F%252Fcasidiablo.net%252Fatributos-estaticos-destructores-c-sharp%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Variables%20est%C3%A1ticas%20y%20destructores%20en%20C%23%22%20%7D);"></div>
<p style="text-align: justify;">Las variables estáticas son atributos de una clase que están disponibles para todas las instancias de dicha clase, y a los cuales puedes acceder directamente (sin instanciar un objeto) de la forma Clase.Variable.</p>
<p style="text-align: justify;">Los destructores son métodos que se ejecutan cuando se elimina un objeto; son especialmente útiles si deseamos hacer algo en particular, antes de eliminar la referencia al objeto. A continuación un sencillo ejercicio, en donde se ejemplifica el uso de las variables estáticas y de los destructores en <a href="http://casidiablo.net/category/programacion/net/c-sharp/">C Sharp</a>:</p>
<p><span id="more-2283"></span></p>
<pre class="brush: csharp; title: ; notranslate">using System;
namespace Estatico{
   public class Clase {
      //un atributo normal
      private string variable;
      //esta variable esta disponible para todas
      //las instancias de esta clase
      private static int contador;
      //constructor
      public Clase(string x) {
         variable = x;
         //aumentar valor de la variable estatica
         ++contador;
         Console.WriteLine(&quot;Constructor de &quot;+variable);
      }
      ~Clase(){
         --contador;
         Console.WriteLine(&quot;Se destruyo una de las instancias (&quot;+variable+&quot;)&quot;+contador);
      }
      public static int Contador{
         get{
            return contador;
         }
      }
   }
}</pre>
<p>Clase que utiliza los valores estáticos de la clase anterior:</p>
<pre class="brush: csharp; title: ; notranslate">using System;
namespace Estatico{
   public class Principal{
      static void Main(string[] args){
         Console.WriteLine(&quot;Contador antes de crear objetos: &quot;+Clase.Contador);
         //crear 2 instancias de la clase
         Clase objeto1 = new Clase(&quot;primero&quot;);
         Clase objeto2 = new Clase(&quot;segundo&quot;);
         Console.WriteLine(&quot;Contador despues de crear objetos: &quot;+Clase.Contador);
         //eliminar referencias a los objetos
         objeto1 = null;
         objeto2 = null;
         //forzar al recolector de basura a ejecutarse
         System.GC.Collect();
         //esperar hasta que el recolector de basura termine su trabajo
         System.GC.WaitForPendingFinalizers();
         //despues de la recolecta de basura...
         Console.WriteLine(&quot;Despues de la recolecta de basura, contador: &quot;+Clase.Contador);
      }
   }
}</pre>
<p><a class="tooltip descargacodigo" title="Estáticas y destructores en C#::Contiene archivo fuente .cs" href="http://casidiablo.net/descargar/Variables+estaticas+constructrores+C+Sharp">Descargar código fuente</a></p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/atributos-estaticos-destructores-c-sharp/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Uso de propiedades para acceder a los atributos de objetos en C#</title>
		<link>http://casidiablo.net/get-set-c-sharp/</link>
		<comments>http://casidiablo.net/get-set-c-sharp/#comments</comments>
		<pubDate>Sat, 22 Nov 2008 14:56:07 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[C-Sharp]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[ejemplo]]></category>
		<category><![CDATA[ejercicio]]></category>
		<category><![CDATA[getter]]></category>
		<category><![CDATA[setter]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=2276</guid>
		<description><![CDATA[Al momento de acceder a los atributos de una clase, podemos usar métodos para asignar y obtener dichos datos (normalmente llamados getters y setters). En C Sharp podemos usar una caracterí­stica llamada &#8216;propiedades&#8217;, por medio de la cual declaramos un alias de acceso público para los atributos de acceso privado. Me explico. Cuando declaramos atributos [...]]]></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%253A%252F%252Fcasidiablo.net%252Fget-set-c-sharp%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Uso%20de%20propiedades%20para%20acceder%20a%20los%20atributos%20de%20objetos%20en%20C%23%22%20%7D);"></div>
<p style="text-align: justify;">Al momento de acceder a los atributos de una clase, podemos usar métodos para asignar y obtener dichos datos (normalmente llamados getters y setters). En C Sharp podemos usar una caracterí­stica llamada &#8216;propiedades&#8217;, por medio de la cual declaramos un alias de acceso público para los atributos de acceso privado.</p>
<p style="text-align: justify;">Me explico. <strong>Cuando declaramos atributos en una clase, lo más aconsejable es crearlos con el modificador de acceso <code>private</code></strong>. Por tal motivo no es posible acceder a dichos atributos directamente desde el objeto (de la manera: objeto.atributo), porque como vimos en esta entrada nos arrojará errores de compilación.</p>
<p style="text-align: justify;">Aquí­ es cuando las &#8216;propiedades&#8217; son especialmente útiles. <strong>Una propiedad es como un alias que nos permite acceder a los atributos de manera segura</strong>, y con la que nos ahorramos tiempo y espacio en nuestro código. Vamos directamente con un ejemplo, y posteriormente una breve explicación del mismo.</p>
<p style="text-align: justify;">Clase de ejemplo, que implementa una &#8216;propiedad&#8217; para acceder al atributo:</p>
<p><span id="more-2276"></span></p>
<pre class="brush: csharp; title: ; notranslate">public class Clase {
	//atributo
	private int variable;
	//constructor
	public Clase(int variable) {
		this.variable = variable;
	}
	//declaracion de la propiedad
	public int atributo{
		//get sirve para devolver el valor del atributo
		get{
			return variable;
		}
		//set sirve para cambiar el valor del atributo
		set{
			variable = value;
		}
	}
}</pre>
<p style="text-align: justify;">En la lí­nea 9 tenemos la declaración de la propiedad; en dicha declaración debemos especificar un nombre (diferente al del atributo al que vamos a acceder), y un tipo (en este caso int, entero). Dentro de la propiedad tenemos dos bloques: <code>get</code> y <code>set</code>. Dentro de get debemos poner los valores a retornar cuando se acceda a la propiedad; mientras que en set podemos usar la palabra clave <code>value</code> para asignar un valor al atributo.</p>
<p style="text-align: justify;">En la siguiente clase se utiliza la propiedad de la clase anterior, para obtener y modificar los valores del atributo:</p>
<pre class="brush: csharp; title: ; notranslate">using System;
public class Propiedades {
	public Propiedades() {
		//declaracion del objeto
		Clase objeto = new Clase(5);
		//obteniendo el valor de la variable 'variable'
		//usando la propiedad 'atributo' (se usa el bloque get)
		Console.WriteLine(&quot;El atributo del objeto es &quot;+ objeto.atributo);
		Console.WriteLine(&quot;Cambiando el valor usando la propiedad 'atributo'...&quot;);
		//cambiando el valor de la variable 'variable'
		//usando la propiedad 'atributo' (se usa get)
		objeto.atributo = 10;
		Console.WriteLine(&quot;Ahora el atributo del objeto es &quot;+ objeto.atributo);
	}
	static void Main(string[] args){
		new Propiedades();
	}
}</pre>
<p style="text-align: justify;">Como puedes observar, es posible obtener y modificar los datos de un atributo privado usando una &#8216;propiedad&#8217; pública, y todo de una manera totalmente segura, puesto que dentro de la &#8216;propiedad&#8217; podemos verificar la consistencia de los datos.</p>
<p><strong>El resultado&#8230;</strong></p>
<div class="consola">El atributo del objeto es 5<br />
Cambiando el valor usando la propiedad &#8216;atributo&#8217;&#8230;<br />
Ahora el atributo del objeto es 10</div>
<p><a class="tooltip descargacodigo" title="Uso de propiedades en C Sharp::Contiene archivos fuentes .cs, proyecto para Visual Studio y Proyecto para Monodevelop" href="http://casidiablo.net/descargar/Propiedades+C+Sharp">Descargar código fuente</a></p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/get-set-c-sharp/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Ejemplo de constructores de clases en C#</title>
		<link>http://casidiablo.net/constructores-clases-c-sharp/</link>
		<comments>http://casidiablo.net/constructores-clases-c-sharp/#comments</comments>
		<pubDate>Thu, 20 Nov 2008 23:45:42 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[C-Sharp]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[ejemplo]]></category>
		<category><![CDATA[ejercicio]]></category>
		<category><![CDATA[objetos]]></category>
		<category><![CDATA[orientada]]></category>
		<category><![CDATA[poo]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=2271</guid>
		<description><![CDATA[Tal como veí­amos en el ejemplo anterior, en donde explicabamos las nociones básicas de la programación orientada a objetos en C Sharp, los objetos pueden tener uno o más constructores. El siguiente ejemplo es una modificación del anterior ejercicio, en donde declaramos y usamos varios constructores. El código&#8230; La clase Tiempo2 que declara 5 constructores; [...]]]></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%253A%252F%252Fcasidiablo.net%252Fconstructores-clases-c-sharp%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Ejemplo%20de%20constructores%20de%20clases%20en%20C%23%22%20%7D);"></div>
<p style="text-align: justify;">Tal como veí­amos en el ejemplo anterior, en donde explicabamos las nociones básicas de la <a href="http://casidiablo.net/poo-c-sharp/">programación orientada a objetos en C Sharp</a>, los objetos pueden tener uno o más constructores. El siguiente ejemplo es una modificación del anterior ejercicio, en donde declaramos y usamos varios constructores.</p>
<h3>El código&#8230;</h3>
<p><span id="more-2271"></span></p>
<p style="text-align: justify;">La clase Tiempo2 que declara 5 constructores; el primero de ellos (lí­nea 9) no recibe argumentos e inicia las variables a cero; el segundo recibe solo parámetro e inica solo una de los atributos de la clase; mientras que el quinto constructor (lí­nea 32) recibe como parámetro un objeto del mismo tipo de la clase, y usando los atributos de dicho objeto inicia los atributos propios:</p>
<pre class="brush: csharp; title: ; notranslate">using System;
public class Tiempo2
{
  private int hora;    // 0 -23
  private int minuto;  // 0-59
  private int segundo;  // 0-59
  // Constructor de la clase Tiempo que inicialize
  //las variables a cero para poner la hora en media noche
  public Tiempo2()
  {
     cambiarHora( 0, 0, 0 );
  }
  // Contructor que recibe unicamente la
  // hora, y lo demas lo inicia a 0
  public Tiempo2( int hora )
  {
     cambiarHora( hora, 0, 0 );
  }
  // Contructor que recibe la hora y el
  // minuto, y lo demas lo inicia a 0
  public Tiempo2( int hora, int minuto )
  {
     cambiarHora( hora, minuto, 0 );
  }
  // Contructor que recibe los tres atributos
  public Tiempo2( int hora, int minuto, int segundo )
  {
     cambiarHora( hora, minuto, segundo );
  }
  // Constructor que utiliza los datos de otro
  //metodo de tipo Tiempo2 para inciar los datos
  public Tiempo2( Tiempo2 hora )
  {
     cambiarHora( hora.hora, hora.minuto, hora.segundo );
  }
  // este metodo asigna una nueva hora en formato 24-horas.
  public void cambiarHora(
     int valorHora, int valorMinuto, int valorSegundo )
  {
     hora = ( valorHora &gt;= 0 &amp;amp;amp;&amp;amp;amp; valorHora &lt; 24 ) ?
        valorHora : 0;
     minuto = ( valorMinuto &gt;= 0 &amp;amp;amp;&amp;amp;amp; valorMinuto &lt; 60 ) ?
        valorMinuto : 0;
     segundo = ( valorSegundo &gt;= 0 &amp;amp;amp;&amp;amp;amp; valorSegundo &lt; 60 ) ?
        valorSegundo : 0;
  }
  // convertir a hora universal con el metodo format
  public string horaUniversal()
  {
     return String.Format(
        &quot;{0:D2}:{1:D2}:{2:D2}&quot;, hora, minuto, segundo );
  }
  // convertir a tiempo estandar (12 horas) usando el metodo format
  public string horaEstandar()
  {
     return String.Format( &quot;{0}:{1:D2}:{2:D2} {3}&quot;,
        ( ( hora == 12 || hora == 0 ) ? 12 : hora % 12 ),
        minuto, segundo, ( hora &lt; 12 ? &quot;AM&quot; : &quot;PM&quot; ) );
  }
}</pre>
<p>Clase en donde se utilizan los diferentes tipos de constructores:</p>
<pre class="brush: csharp; title: ; notranslate">using System;
class PruebaTiempo2 {
  static void Main( string[] args ) {
     Tiempo2 hora1, hora2, hora3, hora4, hora5, hora6;
     hora1 = new Tiempo2();               // 00:00:00
     hora2 = new Tiempo2( 2 );            // 02:00:00
     hora3 = new Tiempo2( 21, 34 );       // 21:34:00
     hora4 = new Tiempo2( 12, 25, 42 );   // 12:25:42
     hora5 = new Tiempo2( 27, 74, 99 );   // 00:00:00
     hora6 = new Tiempo2( hora4 );        // 12:25:42
     String salida = &quot;Construido con: &quot; +
        &quot;\nhora1: todos los argumentos por defecto&quot; +
        &quot;\n\t&quot; + hora1.horaUniversal() +
        &quot;\n\t&quot; + hora1.horaEstandar();
     salida += &quot;\nhora2: hora especifica; minuto y segundo por defecto&quot; +
        &quot;\n\t&quot; + hora2.horaUniversal() +
        &quot;\n\t&quot; + hora2.horaEstandar();
     salida += &quot;\nhora3: hora y minuto especifico; segundo por defecto&quot; +
        &quot;\n\t&quot; + hora3.horaUniversal() +
        &quot;\n\t&quot; + hora3.horaEstandar();
     salida += &quot;\nhora4: los tres argumentos especificamente&quot; +
        &quot;\n\t&quot; + hora4.horaUniversal() +
        &quot;\n\t&quot; + hora4.horaEstandar();
     salida += &quot;\nhora5: los tres argumentos especificamente&quot; +
        &quot;\n\t&quot; + hora5.horaUniversal() +
        &quot;\n\t&quot; + hora5.horaEstandar();
     salida += &quot;\nhora6: otro objeto de tipo Tiempo2 (hora4)&quot; +
        &quot;\n\t&quot; + hora6.horaUniversal() +
        &quot;\n\t&quot; + hora6.horaEstandar();
     Console.WriteLine( salida );
  }
}</pre>
<p>El resultado del programa es el siguiente:</p>
<div class="consola">Construido con:<br />
hora1: todos los argumentos por defecto<br />
	00:00:00<br />
	12:00:00 AM<br />
hora2: hora especifica; minuto y segundo por defecto<br />
	02:00:00<br />
	2:00:00 AM<br />
hora3: hora y minuto especifico; segundo por defecto<br />
	21:34:00<br />
	9:34:00 PM<br />
hora4: los tres argumentos especificamente<br />
	12:25:42<br />
	12:25:42 PM<br />
hora5: los tres argumentos especificamente<br />
	00:00:00<br />
	12:00:00 AM<br />
hora6: otro objeto de tipo Tiempo2 (hora4)<br />
	12:25:42<br />
	12:25:42 PM</div>
<p><a class="tooltip descargacodigo" title="Constructores en C Sharp::Contiene archivos fuentes .cs, proyecto para Visual Studio y Proyecto para Monodevelop" href="http://casidiablo.net/descargar/Constructores+C+Sharp">Descargar código fuente</a></p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/constructores-clases-c-sharp/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Programación Orientada a Objetos en C Sharp</title>
		<link>http://casidiablo.net/poo-c-sharp/</link>
		<comments>http://casidiablo.net/poo-c-sharp/#comments</comments>
		<pubDate>Thu, 20 Nov 2008 23:30:30 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[C-Sharp]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[ejemplo]]></category>
		<category><![CDATA[ejercicio]]></category>
		<category><![CDATA[objetos]]></category>
		<category><![CDATA[orientada]]></category>
		<category><![CDATA[poo]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=2268</guid>
		<description><![CDATA[La POO es un paradigma de programación que intenta abstraer los módulos de cada programa en objetos. Los objetos son instancias de clases, en las que se declaran/especifican al menos dos cosas: los atributos, los métodos y opcionalmente los constructores. Los atributos son las variables que posee el objeto, mientras que los métodos son las [...]]]></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%253A%252F%252Fcasidiablo.net%252Fpoo-c-sharp%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Programaci%C3%B3n%20Orientada%20a%20Objetos%20en%20C%20Sharp%22%20%7D);"></div>
<p style="TEXT-ALIGN: justify">La POO es un paradigma de programación que intenta abstraer los módulos de cada programa en objetos. Los objetos son instancias de clases, en las que se declaran/especifican al menos dos cosas: <strong>los atributos, los métodos</strong> y opcionalmente los constructores.</p>
<p style="TEXT-ALIGN: justify">Los atributos son las variables que posee el objeto, mientras que los métodos son las funciones o procedimientos que podemos invocar para realizar operaciones especí­ficas sobre los atributos.</p>
<p style="TEXT-ALIGN: justify">Como en Java, en C Sharp utilizamos siempre clases y objetos, aún cuando no tengamos claro el concepto. Por ejemplo, el simple <em>hola mundo</em>:</p>
<pre class="brush: csharp; title: ; notranslate">using System;
class Hola{
   static void Main(string[] args){
      Console.WriteLine(&quot;Hola parce!&quot;);
   }
}</pre>
<p style="TEXT-ALIGN: justify">En cada lí­nea de código estamos usando la programación orientada a objetos: lí­nea 1, creamos una clase (llamada <em>Hola</em>); lí­nea 2, declaramos un método (función) para nuestra clase; lí­nea 3, usando <strong>la clase</strong> <code>Console</code> invocamos <strong>el método</strong> <code>WriteLine</code>. Todo, programación orientada a objetos.</p>
<h3>Ejemplo de POO en C Sharp</h3>
<p style="TEXT-ALIGN: justify">En el siguiente ejemplo tomado del libro <em>Cómo programar en C Sharp de Deitel</em>, se utiliza una clase llamada <strong>tiempo</strong>. Dicha clase posee tres atributos (hora, minuto, segundo; todos variables enteras), y tres métodos. Vamos con el código, y mí¡s abajo una explicación:</p>
<p><span id="more-2268"></span></p>
<pre class="brush: csharp; title: ; notranslate">using System;
public class Tiempo
{
  private int hora;    // 0 -23
  private int minuto;  // 0-59
  private int segundo;  // 0-59
  // Constructor de la clase Tiempo que inicialize
  //las variables a cero para poner la hora en media noche
  public Tiempo()
  {
     cambiarHora( 0, 0, 0 );
  }
  // este metodo asigna una nueva hora en formato 24-horas.
  public void cambiarHora(
     int valorHora, int valorMinuto, int valorSegundo )
  {
     hora = ( valorHora &gt;= 0 &amp;&amp; valorHora &lt; 24 ) ?
        valorHora : 0;
     minuto = ( valorMinuto &gt;= 0 &amp;&amp; valorMinuto &lt; 60 ) ?
        valorMinuto : 0;
     segundo = ( valorSegundo &gt;= 0 &amp;&amp; valorSegundo &lt; 60 ) ?
        valorSegundo : 0;
  }
  // convertir a hora universal con el metodo format
  public string horaUniversal()
  {
     return String.Format(
        &quot;{0:D2}:{1:D2}:{2:D2}&quot;, hora, minuto, segundo );
  }
  // convertir a tiempo estandar (12 horas) usando el metodo format
  public string horaEstandar()
  {
     return String.Format( &quot;{0}:{1:D2}:{2:D2} {3}&quot;,
        ( ( hora == 12 || hora == 0 ) ? 12 : hora % 12 ),
        minuto, segundo, ( hora &lt; 12 ? &quot;AM&quot; : &quot;PM&quot; ) );
  }
}</pre>
<ul>
<li style="text-align: justify;">En la segunda lí­nea vemos la instrucción <code>public class Tiempo</code>; esto no es mí¡s que la declaración de nuestra clase. Las clases por lo general son de tipo <code>public</code>, aunque si usamos clases internas anónimas es recomendable que sean <code>private</code>, aunque eso es otro tema&#8230; sigamos.</li>
<li style="text-align: justify;">En las lí­neas 4, 5 y 6 tenemos la declaración de los atributos de nuestra clase. Fí­jate como todos ellos son <code>private</code>; es un buen tip de programación que los atributos de nuestras clases sean privados, lo que significa que sólamente serí¡n accesibles desde los métodos de la clase.</li>
<li style="text-align: justify;">En la lí­nea 9 tenemos la declaración de un constructor. Los constructores son los métodos invocados en el momento de crear objetos; su función es la darle valores a los atributos del objeto. Podemos tener cuantos constructores necesitemos, por supuesto con diferente tipo de argumentos. Ademí¡s, es necesario tener en cuenta que <strong>los constructores son métodos que NO tienen ningún valor de retorno</strong>, y que <strong>deben llevar el mismo nombre de la clase</strong>.</li>
<li style="text-align: justify;">En las lí­neas 14, 25 y 31 estí¡n declarados los métodos o funciones, que permiten realizar operaciones sobre nuestro objeto. Por ejemplo, el método <code>cambiarHora</code> recibe tres argumentos, con los cuales modifica los atributos. Por lo general, los métodos de las clases son de tipo <code>public</code>, lo que permite invocarlos directamente a través de una instancia de la clase (es decir, un objeto).</li>
</ul>
<p style="text-align: justify;">Con el siguiente código, utilizamos la clase Tiempo:</p>
<pre class="brush: csharp; title: ; notranslate">using System;
class PruebaTiempo {
  static void Main( string[] args ) {
     Tiempo tiempo = new Tiempo();  // llamada al constructor de Tiempo
     string salida;
     // mostrar datos iniciales
     salida = &quot;Hora universal inicial es: &quot; +
        tiempo.horaUniversal() +
        &quot;\nHora estandar inicial es: &quot; +
        tiempo.horaEstandar();
     // cambiar hora (valida)
     tiempo.cambiarHora( 13, 27, 6 );
     // aniadir nueva hora a la salida
     salida += &quot;\n\nHora universal despues de cambiada: &quot; +
        tiempo.horaUniversal() +
        &quot;\nHora estandar despues de cambiada: &quot; +
        tiempo.horaEstandar();
     // cambiar hora (invalida)
     tiempo.cambiarHora( 99, 99, 99 );
     salida += &quot;\n\nDespues de poner valores invalidos: &quot; +
        &quot;\nHora universal: &quot; + tiempo.horaUniversal() +
        &quot;\nHora estandar: &quot; + tiempo.horaEstandar();
     Console.WriteLine( salida );
  }
}</pre>
<ul>
<li style="text-align: justify;">En la lí­nea 3 creamos un objeto de tipo tiempo. Por lo general la sintaxis para crear objetos es la siguiente: <code>Clase objeto = new Clase()</code>. Es decir, el nombre de la clase, el nombre del objeto, y posteriormente se incia el objeto haciendo una invocación al constructor de la clase (anteponiendo la instrucción <code>new</code>).</li>
<li style="text-align: justify;">En la lí­nea 8, invocamos uno de los métodos de la clase (<code>horaUniversal</code>). La sintaxis para la invocación de los métodos es: <code>objeto.nombreMetodo(arg1, arg2, ...)</code>. Así­, en la lí­nea 12 podemos ver otro ejemplo de invocación, en la que pasamos algunos argumentos al método.</li>
</ul>
<p style="text-align: justify;">El resultado del programa es el siguiente:</p>
<div class="consola">Hora universal inicial es: 00:00:00<br />
Hora estandar inicial es: 12:00:00 AM</p>
<p>Hora universal despues de cambiada: 13:27:06<br />
Hora estandar despues de cambiada: 1:27:06 PM</p>
<p>Despues de poner valores invalidos:<br />
Hora universal: 00:00:00<br />
Hora estandar: 12:00:00 AM</p></div>
<p><a class="tooltip descargacodigo" title="Ejemplo POO en C Sharp::Contiene archivos fuentes .cs, proyecto para Visual Studio y Proyecto para Monodevelop" href="http://casidiablo.net/descargar/Programacion+Orientada+a+Objetos+C+Sharp">Descargar código fuente</a></p>
<h3>Acceso a los atributos de un objeto</h3>
<p style="text-align: justify;">Si al momento de declarar los atributos de una clase utilizamos el modificador de acceso <code>public</code>, es posible acceder a dichos atributos directamente de la siguiente manera: <code>objeto.variable;</code> ó <code>objeto.variable = unValor;</code>. Esto por supuesto NO es recomendable, es decir, los atributos de una clase deberí­an ser SIEMPRE privados.</p>
<p style="text-align: justify;">De igual forma, si hemos declarado atributos con el modificador de acceso <code>private</code>, NO es posible acceder directamente a ellos. Así­ que para modificarlos, debemos crear métodos de acceso público, algo por supuesto mí¡s seguro. Si intentamos acceder directamente a atributos que se han declarado como privados, obtendremos errores de compilación.</p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/poo-c-sharp/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
	</channel>
</rss>

