<?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; ejemplos</title>
	<atom:link href="http://casidiablo.net/tag/ejemplos/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>Comprimir archivos con PHP</title>
		<link>http://casidiablo.net/ejemplo-comprimir-zip-bunzip-zlib-php/</link>
		<comments>http://casidiablo.net/ejemplo-comprimir-zip-bunzip-zlib-php/#comments</comments>
		<pubDate>Sun, 18 Jul 2010 04:54:54 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[bunzip]]></category>
		<category><![CDATA[compresión]]></category>
		<category><![CDATA[comprimir]]></category>
		<category><![CDATA[ejemplos]]></category>
		<category><![CDATA[gzip]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[zip]]></category>
		<category><![CDATA[zlib]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3847</guid>
		<description><![CDATA[Zlib es una librería que proporciona funciones que nos permiten realizar tareas de compresión y descompresión usando el formato GZIP. En esta entrada vamos a ver algunos ejemplos sencillos de compresión de archivos usando dicha librería, y además veremos cómo funcionan las librerías adicionales para comprimir archivos en ZIP y Bunzip&#8230; aunque también existen otros [...]]]></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%252Fejemplo-comprimir-zip-bunzip-zlib-php%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fcasidiablo.in%2FcrIjSm%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Comprimir%20archivos%20con%20PHP%22%20%7D);"></div>
<p><img src="http://casidiablo.net/wordpress/wp-content/uploads/2010/07/avatardr.png" alt="" title="avatardr" width="108" height="175" style="float: right; margin: 5px;" /><a href="http://php.net/manual/en/book.zlib.php" class="external">Zlib</a> es una librería que proporciona funciones que nos permiten realizar tareas de compresión y descompresión usando el formato GZIP. En esta entrada vamos a ver algunos ejemplos sencillos de compresión de archivos usando dicha librería, y además veremos cómo funcionan las librerías adicionales para comprimir archivos en <code>ZIP</code> y <code>Bunzip</code>&#8230; aunque también existen otros formatos disponibles como <code>rar</code>, <code>lzf</code> y <code>phar</code>.</p>
<h3>Comprimir y descomprimir usando el formato GZIP</h3>
<p>Este es un ejemplo básico en donde se comprime y descomprime un archivo:</p>
<pre class="brush: php; title: ; notranslate">function descomprimir($origen, $destino) {
  $string = implode(&quot;&quot;, gzfile($origen));
  $fp = fopen($destino, &quot;w&quot;);
  fwrite($fp, $string, strlen($string));
  fclose($fp);
} 

function comprimir($origen, $destino) {
  $fp = fopen($origen, &quot;r&quot;);
  $data = fread ($fp, filesize($origen));
  fclose($fp);
  $zp = gzopen($destino, &quot;w9&quot;);
  gzwrite($zp, $data);
  gzclose($zp);
}
comprimir(&quot;archivo.txt&quot;,&quot;archivo.gz&quot;);
descomprimir(&quot;archivo.gz&quot;,&quot;archivo2.txt&quot;);</pre>
<p>Esta es una breve descripción de las funciones para Gzip incluidas en Zlib:</p>
<ul>
<li><code>gzclose</code> — Cierra un puntero gz-file</li>
<li><code>gzcompress</code> — Comprime una cadena de texto</li>
<li><code>gzencode</code> — Crea una cadena de texto comprimida en gzip</li>
<li><code>gzeof</code> — Verifica si es el fin del archivo en un puntero gz-file</li>
<li><code>gzfile</code> — Lee el contenido de un archivo gzip y lo almacena en un arreglo</li>
<li><code>gzgetc</code> — Obtiene el caracter al que apunta un gz-file pointer</li>
<li><code>gzgets</code> — Obtiene la linea a la que apunta un gz-file pointer</li>
<li><code>gzgetss</code> — Obtiene la linea a la que apunta un gz-file pointer y remueve las etiquetas HTML</li>
<li><code>gzinflate</code> — Descomprime una cadena comprimida</li>
<li><code>gzopen</code> — Abre un archivo gzip</li>
</ul>
<h3>Comprimir usando el formato Bunzip</h3>
<p>Aquí un ejemplo muy básico:</p>
<pre class="brush: php; title: ; notranslate">function comprimir_bzip($origen, $destino){
    // abrir el archivo en modo escritura
    $bz = bzopen($destino, &quot;w&quot;);
    // escribir el contenido del origen
    bzwrite($bz, file_get_contents($filename));
    // cerrar el archivo
    bzclose($bz);
}</pre>
<p>Información adicional y lista de las funciones disponibles: <strong><a class="external" href="http://www.php.net/manual/en/book.bzip2.php">PHP: Bunzip</a></strong>.</p>
<h3>Comprimir usando el formato ZIP</h3>
<p>En este caso se utilizan la clase <code>ZipArchive</code>:</p>
<pre class="brush: php; title: ; notranslate">function comprimir_zip($origen, $destino){
    $zip = new ZipArchive();
    if ($zip-&gt;open($destino, ZIPARCHIVE::CREATE)!==TRUE) {
        die(&quot;Error al crear el archivo&quot;);
    }
    $zip-&gt;addFile($origen, &quot;/&quot;.basename($origen));
    $zip-&gt;close();
}</pre>
<h3>Verificar la existencia de las librerías</h3>
<p>Esta es una manera sencilla de verificar si PHP fue compilado con soporte para estas librerías:</p>
<pre class="brush: php; title: ; notranslate">if( class_exists('ZipArchive') )
    echo &quot;ZIP: OK\n&quot;;
if( function_exists('bzwrite') )
    echo &quot;Bunzip: OK\n&quot;;
if( function_exists('gzwrite') )
    echo &quot;gzip: OK\n&quot;;</pre>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/ejemplo-comprimir-zip-bunzip-zlib-php/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Iniciar servicio en android después del boot</title>
		<link>http://casidiablo.net/iniciar-servicio-android-boot/</link>
		<comments>http://casidiablo.net/iniciar-servicio-android-boot/#comments</comments>
		<pubDate>Sun, 11 Jul 2010 18:08:00 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[ejemplos]]></category>
		<category><![CDATA[ide]]></category>
		<category><![CDATA[tip]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3839</guid>
		<description><![CDATA[Esta entrada, principalmente dedicada a mi mismo ya que se que se me va a olvidar cómo hacerlo, indica paso a paso como crear un servicio en Android que se ejecute al iniciar el sistema. Como sabemos, un servicio es un proceso que se ejecuta en background aun cuando ningún componente visual de nuestra aplicació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%253A%252F%252Fcasidiablo.net%252Finiciar-servicio-android-boot%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fcasidiablo.in%2FcJOgRT%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Iniciar%20servicio%20en%20android%20despu%C3%A9s%20del%20boot%22%20%7D);"></div>
<p>Esta entrada, principalmente dedicada a mi mismo ya que se que se me va a olvidar cómo hacerlo, indica paso a paso como crear un servicio en Android que se ejecute al iniciar el sistema. Como sabemos, un servicio es un proceso que se ejecuta en background aun cuando ningún componente visual de nuestra aplicación se encuentre activo.</p>
<p>La idea es más o menos sencilla: una vez que un sistema Android ha iniciado envía una acción broadcast llamada <code>android.intent.action.BOOT_COMPLETED</code>. La idea es crear un <code>BroadcastReceiver</code> que escuche este tipo de acciones e inicie el servicio que deseemos. Así pues, el primer paso es crear una clase que extienda <code>BroadcastReceiver</code>:</p>
<pre class="brush: java; title: ; notranslate">public class Recibidor extends BroadcastReceiver{
	@Override
	public void onReceive(Context context, Intent intent) {
		Intent servicio = new Intent();
		servicio.setAction(&quot;foo.bar.Servicio&quot;);
		context.startService(servicio);
	}
}</pre>
<p>Lo interesante aquí es que se ejecuta el método <code>startService</code> enviando como parámetro un <code>Intent</code> cuyo <em>action</em> es <em>&#8220;foo.bar.Servicio&#8221;</em>, el cual es el servicio que deseamos ejecutar. Dicho servicio es una clase que extiende de <code>Service</code>, y del cual debemos sobrescribir los métodos <code>onCreate</code> y <code>onStart</code>:</p>
<pre class="brush: java; title: ; notranslate">public class Servicio extends Service{

	private static final String TAG = &quot;EjemploServicioBoot&quot;;

	private Timer timer;

	@Override
	public IBinder onBind(Intent intent) {
		return null;
	}

	@Override
	public void onCreate(){
		super.onCreate();
		Log.d(TAG, &quot;Servicio creado&quot;);
		timer = new Timer();
	}

	@Override
	public void onStart(final Intent intent, final int startId){
		super.onStart(intent, startId);
		timer.scheduleAtFixedRate(new TimerTask() {
			@Override
			public void run() {
				Log.i(TAG, &quot;Se ejecuta la tarea&quot;);
			}
		}, 0, 15000);
	}
}</pre>
<p>En este caso, el servicio realiza una tarea muy simple: imprime en el log del sistema un mensaje. Básicamente tenemos un objeto tipo <code>Timer</code> que ejecutará una tarea; en <code>onCreate</code> simplemente iniciamos el objeto <code>Timer</code>, mientras que en <code>onStart</code> usamos el método <code>scheduleAtFixedRate</code> indicando que ejecutaremos dicha tarea cada 15 segundos.</p>
<p>Por último, debemos registrar en el archivo <code>AndroidManifest.xml</code> el <code>BroadcastReceiver</code> y el servicio:</p>
<pre class="brush: xml; highlight: [12,17]; title: ; notranslate">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;manifest xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
      package=&quot;foo.bar&quot; android:versionCode=&quot;1&quot; android:versionName=&quot;1.0&quot;&gt;
    &lt;application&gt;
        &lt;service android:name=&quot;.Servicio&quot;&gt;
        	&lt;intent-filter&gt;
        		&lt;action android:name=&quot;foo.bar.Servicio&quot;/&gt;
        	&lt;/intent-filter&gt;
        &lt;/service&gt;
        &lt;receiver android:name=&quot;.Recibidor&quot;&gt;
        	&lt;intent-filter&gt;
        		&lt;action android:name=&quot;android.intent.action.BOOT_COMPLETED&quot;/&gt;
        	&lt;/intent-filter&gt;
        &lt;/receiver&gt;
    &lt;/application&gt;
    &lt;uses-sdk android:minSdkVersion=&quot;3&quot; /&gt;
    &lt;uses-permission android:name=&quot;android.permission.RECEIVE_BOOT_COMPLETED&quot; /&gt;
&lt;/manifest&gt;</pre>
<p>En el manifest podemos ver que añadimos un elemento <code>service</code> dentro de <code>application</code>, para registrar nuestro servicio. Y lo más interesante se ve en las líneas 12 y 17, que es donde indicamos el tipo de mensaje que nuestro recibidor estará esperando antes de ejecutar la tarea e indicamos que la aplicación requiere permisos para conocer cuando el boot del sistema a finalizado.</p>
<p><a class="descargacodigo" href="http://casidiablo.net/descargar/Servicio+Android" title="Descargar código fuente del ejemplo">Descargar código fuente</a></p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/iniciar-servicio-android-boot/feed/</wfw:commentRss>
		<slash:comments>28</slash:comments>
		</item>
		<item>
		<title>Sorteo 4 e-books de Android</title>
		<link>http://casidiablo.net/sorteo-4-e-books-de-android/</link>
		<comments>http://casidiablo.net/sorteo-4-e-books-de-android/#comments</comments>
		<pubDate>Sun, 20 Jun 2010 00:50:47 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[off-topic]]></category>
		<category><![CDATA[ejemplos]]></category>
		<category><![CDATA[ide]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[programación]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3818</guid>
		<description><![CDATA[Mark Murhpy es uno de los personajes más conocidos en el mundo de Android y el autor de 4 excelentes libros: The Busy Coder&#8217;s Guide to Android Development, The Busy Coders Guide to Advanced Android Development, Android Programming Tutorials y Android Beyond Java. El valor de los cuatro libros es de $40 USD, el cual [...]]]></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%252Fsorteo-4-e-books-de-android%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fcasidiablo.in%2F9oc2Rg%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Sorteo%204%20e-books%20de%20Android%22%20%7D);"></div>
<p><img src="http://casidiablo.net/wordpress/wp-content/uploads/2010/06/android_development.png" alt="" title="android_development" width="120" height="147" style="float:left; margin: 5px;" /> <strong><a href="http://commonsware.com/">Mark Murhpy</a></strong> es uno de los personajes más conocidos en el mundo de Android y el autor de 4 excelentes libros: <a href="http://commonsware.com/Android/">The Busy Coder&#8217;s Guide to Android Development</a>, <a href="http://commonsware.com/AdvAndroid">The Busy Coders Guide to Advanced Android Development</a>, <a href="http://commonsware.com/AndTutorials">Android Programming Tutorials</a> y <em>Android Beyond Java</em>. El valor de los cuatro libros es de $40 USD, el cual es un precio bastante bajo para la calidad de los mismos.</p>
<p>Los ejemplos utilizados en los libros pueden ser descargados gratuitamente en el <a href="http://github.com/commonsguy">repositorio de Github</a>. Además de esto, <a href="http://stackoverflow.com/users/115145/commonsware">Mark es un usuario activo de StackOverflow.com</a>&#8230; ¿y qué con eso? Bueno, personalmente me ha resuelto bastantes dudas allí (¿qué mejor que tener un experto dispuesto a solucionarte dudas puntuales?). También se le ve en <a href="http://twitter.com/commonsguy">twitter</a> por si lo quieren seguir <img src='http://casidiablo.net/wordpress/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>En fin&#8230; Mark me ha enviado un cupón que permite subscribirse a su librería virtual por seis meses, y con la cual se puede acceder <strong>legalmente</strong> a todos sus contenidos. Los libros son actualizados regularmente cada mes o cada que sale una nueva versión del SDK. Además son distribuidos en formato PDF, EPUB o MOBI&#8230;</p>
<p>Así que pensé en sortear dicho cupón entre los lectores del blog que quisieran iniciarse en el mundo de <a href="http://casidiablo.net/tutorial-basico-android/">Android</a> (o que ya tengan experiencia pero quieran tener una referencia avanzada más directa). La verdad no sé que tanto pueda interesar a los lectores del blog el sorteo, pues no todos los que lo leen están interesados en la programación, pero no puedo dejar de compartir este valioso recurso con ustedes (tener en cuenta además que los libros están en inglés, por supuesto).</p>
<p>Así pues, si está interesado en adquirir estos títulos puede dejar un comentario indicando su interés, y si fuese posible la razón principal por la que desea aprender a desarrollar en esta plataforma (quisiera que el cupón se lo ganara alguien que realmente desea aprender del tema). El sorteo se realizará usando random.org (como habitualmente se hace) el día 2 de Julio (en honor al gran <a href="http://es.wikipedia.org/wiki/Andr%C3%A9s_Escobar">Andrés Escobar</a>&#8230; bueno, en realidad es coincidencia pero sí le tenía bastante aprecio).</p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/sorteo-4-e-books-de-android/feed/</wfw:commentRss>
		<slash:comments>41</slash:comments>
		</item>
		<item>
		<title>Introducción a la programación con Android</title>
		<link>http://casidiablo.net/tutorial-basico-android/</link>
		<comments>http://casidiablo.net/tutorial-basico-android/#comments</comments>
		<pubDate>Mon, 22 Mar 2010 06:15:05 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[ejemplos]]></category>
		<category><![CDATA[ide]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[tip]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3669</guid>
		<description><![CDATA[Esta pequeña entrada servirá como base para las siguientes, en las que iré poniendo mis experiencias con Android, un estupendo sistema operativo para dispositivos móviles basado en Linux, y que nos proporciona un completo SDK para desarrollar nuestras propias aplicaciones de una manera rápida y divertida. Aprenderemos a instalar/configurar el SDK y el plugin para [...]]]></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%252Ftutorial-basico-android%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fcasidiablo.in%2F90LU1T%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Introducci%C3%B3n%20a%20la%20programaci%C3%B3n%20con%20Android%22%20%7D);"></div>
<p style="text-align: justify;"><img style="float: left; margin: 4px;" title="casidiablo-android" src="http://casidiablo.net/wordpress/wp-content/uploads/2010/03/casidiablo-android-e1269234829904.png" alt="" />Esta pequeña entrada servirá como base para las siguientes, en las que iré poniendo mis experiencias con <a class="external" href="http://es.wikipedia.org/wiki/Android">Android</a>, un estupendo sistema operativo para dispositivos móviles basado en Linux, y que nos proporciona un completo SDK para desarrollar nuestras propias aplicaciones de una manera rápida y divertida.</p>
<p style="text-align: justify;">Aprenderemos a instalar/configurar el SDK y el plugin para Eclipse.  Haremos el típico Hola Mundo, y explicaré un poco sobre la metodología de programación para esta plataforma (que es sobre <a href="http://casidiablo.net">Java</a>). ¡Manos a la obra!</p>
<p style="text-align: justify;">
<h3>1. Instalar y configurar el SDK de android</h3>
<p style="text-align: justify;">Vamos a la página del <a href="http://developer.android.com/intl/de/sdk/index.html">Android SDK</a> y descargamos la versión para nuestro sistema operativo. Yo uso Gentoo Linux, pero los pasos son prácticamente idénticos en Windows y en Mac. La última versión al escribir esta entrada es <code>android-sdk_r05</code>. Una vez que hayamos descargado el archivo, lo descomprimimos, entramos a la carpeta que se crea y ejecutamos (en Linux):</p>
<p style="text-align: justify;">
<p><span id="more-3669"></span></p>
<div class="consola">tools/android</div>
<p>En Windows:</p>
<div class="consola">SDK Setup.exe</div>
<p>Veremos algo como esto:</p>
<p style="text-align: center;"><img class="size-full wp-image-3672 aligncenter" title="Pantallazo-Android SDK and AVD Manager" src="http://casidiablo.net/wordpress/wp-content/uploads/2010/03/Pantallazo-Android-SDK-and-AVD-Manager-.png" alt="" width="655" height="431" /></p>
<p style="text-align: justify;">Hacemos clic en <em>Available packages</em> y desplegamos el árbol que aparece bajo <em>Sites, Packages and Archives</em> para instalar el API sobre la(s) que deseamos trabajar, y una vez la(s) hayamos seleccionado hacemos clic en <em>Install Selected</em>. En este caso he seleccionado el API 7 (para la versión 2.1 de Android), la documentación del API 7, los ejemplos del API 7 y el SDK del API 4 (para la versión 1.6 de Android). Es importante elegir las APIs adecuadas teniendo el cuenta el tipo de dispositivo para el que estamos desarrollando la aplicación. Escogí en este caso el API 4 puesto que el equipo sobre el que pruebo los programas (<a href="http://www.htc.com/www/product/tattoo/overview.html">HTC Tattoo</a>) viene con Android 1.6 (Donut) [<a class="external" href="http://mundogeek.net/archivos/2010/03/19/versiones-de-android/">más información sobre las versiones y sus codenames</a>]. Por supuesto, si desarrollas con el API 4 tus programas tienen un 98% de probabilidades de correr sobre las versiones más recientes de Android sin modificación alguna.</p>
<p style="text-align: center;"><img class="size-full wp-image-3673 aligncenter" title="Pantallazo-Android SDK and AVD Manager -1" src="http://casidiablo.net/wordpress/wp-content/uploads/2010/03/Pantallazo-Android-SDK-and-AVD-Manager-1.png" alt="" width="655" height="431" /></p>
<p style="text-align: justify;">Una vez haya terminado de descargar e instalar las APIs podemos crear un dispositivo virtual sobre el que probaremos nuestras aplicaciones. Hacemos clic en <em>Virtual Devices</em> al lado izquierdo, luego sobre el botón <em>New&#8230;</em> y configuramos el dispositivo:</p>
<p style="text-align: center;"><img class="size-full wp-image-3674 aligncenter" title="nuevo-android" src="http://casidiablo.net/wordpress/wp-content/uploads/2010/03/nuevo-android.png" alt="" width="655" height="590" /></p>
<p style="text-align: justify;">Como puede apreciar en la imagen de arriba, debe poner un nombre al dispositivo, seleccionar el API sobre el que va a trabajar, darle un tamaño a la memoria ROM, escoger un tipo de pantalla y algunas configuraciones avanzadas que no se tratarán en este tutorial. Una vez tengamos esto, hacemos clic en <em>Create AVD</em> y si todo sale bien veremos algo como esto:</p>
<p style="text-align: center;"><img class="size-full wp-image-3675 aligncenter" title="Pantallazo-Android Virtual Devices Manager" src="http://casidiablo.net/wordpress/wp-content/uploads/2010/03/Pantallazo-Android-Virtual-Devices-Manager-.png" alt="" width="613" height="206" /></p>
<h3>2. Instalar y configurar el plugin para Eclipse</h3>
<p style="text-align: justify;">Para este paso, necesitaremos Eclipse 3.5 (Galileo, recomendado) o 3.4. Abrimos eclipse, vamos a la <em>Window -&gt; Install New Software&#8230;</em></p>
<p style="text-align: center;"><img class="size-full wp-image-3676 aligncenter" title="new-software" src="http://casidiablo.net/wordpress/wp-content/uploads/2010/03/new-software.png" alt="" width="561" height="328" /></p>
<p style="text-align: justify;">Hacemos clic en el botón <em>Add&#8230;</em> para añadir el repositorio de Android (<code>https://dl-ssl.google.com/android/eclipse/</code>):</p>
<p style="text-align: center;"><img class="size-full wp-image-3677 aligncenter" title="add" src="http://casidiablo.net/wordpress/wp-content/uploads/2010/03/add.png" alt="" width="600" height="563" /></p>
<p style="text-align: justify;">Clic en OK y ahora seleccionamos los plugins a instalar, y seguimos el proceso de instalación:</p>
<p style="text-align: center;"><img class="size-full wp-image-3678 aligncenter" title="Pantallazo-Install" src="http://casidiablo.net/wordpress/wp-content/uploads/2010/03/Pantallazo-Install-.png" alt="" width="705" height="666" /></p>
<p style="text-align: justify;">Una vez instalado, reiniciamos Eclipse y veremos que se han añadido algunos iconos extra en la barra de herramientas, y que además podemos crear proyectos para Android <img src='http://casidiablo.net/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h3>3. Hola Mundo en Android</h3>
<p style="text-align: justify;">Ahora vamos a crear un nuevo proyecto y aprender un poco más sobre cómo funcionan las aplicaciones para Android.  Hacemos clic en el botón de creación de proyectos Android (o <em>File&#8230; -&gt; New Project -&gt; Android Proyect</em>):</p>
<p style="text-align: center;"><img class="size-full wp-image-3679 aligncenter" title="nuevo-proyecto-android" src="http://casidiablo.net/wordpress/wp-content/uploads/2010/03/nuevo-proyecto-android.png" alt="" width="503" height="274" /></p>
<p style="text-align: justify;">Veremos el asistente de creación de proyectos para Android en donde debemos especificar: el nombre del proyecto (HolaParce), el API para el que vamos a desarrollar (1.6 en este caso), el nombre de la aplicación (Hola Parce en este caso), el nombre del paquete (se recomienda que sea un paquete nombrado con el estándar de Java, es decir, un dominio invertido), seleccionamos <em>Create Activity</em> y le damos un nombre (que cumpla las especificaciones de un nombre de clase en Java), y por último seleccionamos la versión mínima del API que deberán tener los dispositivos que corran nuestro aplicativo:</p>
<p style="text-align: center;"><img class="size-full wp-image-3680 aligncenter" title="android-parce" src="http://casidiablo.net/wordpress/wp-content/uploads/2010/03/android-parce.png" alt="" width="600" height="744" /></p>
<p style="text-align: justify;">¡Clic en Finish y listo! Ahora podemos probar la aplicación&#8230; hacemos clic derecho sobre el Proyecto, seleccionamos <em>Run as&#8230;</em> -&gt; <em>Android Application</em>. Se cargará el emulador y después de un par de minutos podremos ver nuestra aplicación:</p>
<p style="text-align: center;"><img class="size-full wp-image-3682   aligncenter" title="Pantallazo-5554:Pruebas" src="http://casidiablo.net/wordpress/wp-content/uploads/2010/03/Pantallazo-5554Pruebas.png" alt="" width="793" height="561" /></p>
<h3>4. Entendiendo el funcionamiento básico de las aplicaciones en Android</h3>
<p style="text-align: justify;">Las aplicaciones en Android funcionan bajo el esquema de &#8220;Actividades&#8221;. Una actividad presenta una interfaz gráfica (escrita en XML) que permite al usuario interactuar con la aplicación. Cada aplicación tiene varias actividades que se van mostrando al usuario según este las vaya necesitando. Una actividad llama a otra cuando sea necesario, y cada una de las actividades que se vayan mostrando se almacenan en una pila; es decir, cada vez que la aplicación lo requiera inserta una nueva actividad en la pila y, cuando esta ya no se necesite, se hace un push sobre esta lo cual deja en descubierto la actividad que estaba debajo. Importante leer <a class="external" href="http://developer.android.com/intl/de/guide/topics/fundamentals.html">esto para tener claro cada uno de los aspectos fundamentales de las aplicaciones Android</a>.</p>
<p style="text-align: justify;">Ahora, veremos detalladamente qué ocurrió en los pasos que seguimos arriba. Por ejemplo, al crear el proyecto se generan algunos archivos automáticamente. Veamos que hace cada uno de ellos&#8230;</p>
<p>Dentro del directorio <code>res</code> se han creado algunos subdirectorios:</p>
<ul>
<li style="text-align: justify;"><code>drawable-hdpi</code>, <code>drawable-mdpi</code>, <code>drawable-ldpi</code> en donde se almacenan las imágenes que va a utilizar nuestra aplicación. La diferencia entre ellas es que debemos colocar las imágenes que aparecerán según el tipo de pantalla del dispositivo. En <code>drawable-hdpi</code> se colocarán las imágenes para dispositivos con alta resolución (High) y en <code>drawable-ldpi</code> (Low) pondremos las imágenes para dispositivos con pantallas pequeñas.</li>
<li style="text-align: justify;"><code>values</code> contiene inicialmente el archivo <code>strings.xml</code>, que es donde declaramos las cadenas de texto que usará nuestra aplicación. No es obligatorio definir todas las cadenas de texto allí, pero es bastante recomendable hacerlo. En este caso simplemente contiene la definición de una cadena de texto (llamada <code>hello</code>), que es la que se muestra al ejecutar la aplicación:
<pre class="brush: xml; title: ; notranslate">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;resources&gt;
 &lt;string name=&quot;hello&quot;&gt;Hello World, HolaParce!&lt;/string&gt;
 &lt;string name=&quot;app_name&quot;&gt;Hola Parce&lt;/string&gt;
&lt;/resources&gt;
</pre>
</li>
<li style="text-align: justify;"><code>layout</code> contiene los archivos XML que representan interfaces gráficas. Si echamos un vistazo al archivo generado (<code>main.xml</code>) veremos algo como esto:
<pre class="brush: xml; title: ; notranslate">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;LinearLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
 android:orientation=&quot;vertical&quot;
 android:layout_width=&quot;fill_parent&quot;
 android:layout_height=&quot;fill_parent&quot;
 &gt;
&lt;TextView
 android:layout_width=&quot;fill_parent&quot;
 android:layout_height=&quot;wrap_content&quot;
 android:text=&quot;@string/hello&quot;
 /&gt;
&lt;/LinearLayout&gt;
</pre>
<p>De aquí podemos resaltar varias cosas:</p>
<ul>
<li style="text-align: justify;">Los layouts son XML estrictos, así que deben comenzar con el encabezado <code>&lt;?xml version="1.0" encoding="utf-8"?&gt;</code> y todas las etiquetas abiertas deben ser debidamente cerradas.</li>
<li style="text-align: justify;">Los <code>LinearLayout</code> representan contenedores de widgets (algo similar al <code>JPanel</code> de swing en Java). Es decir, es la manera de organizar cada grupo de elementos de la interfaz gráfica.</li>
<li style="text-align: justify;">En este caso, dentro del contenedor solo tenemos un <code>TextView</code> (que sería algo así como un <code>JLabel</code> de swing en Java).</li>
<li style="text-align: justify;">Sea cual sea el elemento que pongamos en el layout, debemos especificar su anchura (<code>android:layout_width</code>) y altura (<code>android:layout_height</code>). Para cada parámetro podemos usar el valor <code>fill_parent</code> o <code>wrap_content</code>. <code>fill_parent</code> hará que el widget ocupe todo el tamaño posible, mientras que <code>wrap_content</code> hará que ocupe el menos posible.</li>
<li style="text-align: justify;">El parámetro <code>android:text</code> permite asignar un texto al <code>TextView</code>. En este caso se usa <code>@string/hello</code> que indica que se usará una variable llamada <code>hello</code>. Esta variable puede ser encontrada en el archivo <code>strings.xml</code> dentro del directorio <code>values</code>. También podríamos especificar el texto directamente, por ejemplo: <code>android:text="Hola parcero!"</code></li>
</ul>
</li>
<li style="text-align: justify;">Como tal vez se dio cuenta, es posible editar los archivos XML gráficamente o con el editor de textos de Eclipse.</li>
</ul>
<p style="text-align: justify;">Dentro del directorio <code>gen</code> se encuentra un archivo llamado <code>R.java</code>. Este  archivo NO debemos modificarlo ya que es Eclipse quien se encargar de  poner el código allí dentro. Este archivo sirve básicamente para enlazar  las cosas que hagamos en XML con la programación en Java. Por ejemplo,  se crea una referencia a la variable hello creada en el archivo  <code>strings.xml</code>. Esto permite que podamos referenciar dicha variable desde  Java (esto se explica con más detalle abajo).</p>
<p style="text-align: justify;">Bajo el directorio <code>src</code> se creó un paquete y dentro de él un archivo en Java que es nuestra primera actividad (fíjese cómo la clase creada extiende la clase <code>Activity</code> del paquete <code>android.app</code>):</p>
<pre class="brush: java; title: ; notranslate">package net.casidiablo.holaparce;
import android.app.Activity;
import android.os.Bundle;
public class HolaParce extends Activity {
/** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}</pre>
<p style="text-align: justify;">Veamos en detalle cada línea:</p>
<ul style="text-align: justify;">
<li>Línea 1 define el nombre del paquete.</li>
<li>Líneas 2 y 3 importamos las clases que necesitamos para correr la actividad.</li>
<li>En la línea 4 podemos ver que la clase exitiende a <a class="external" href="http://developer.android.com/intl/de/reference/android/app/Activity.html"><code>Activity</code></a>.</li>
<li style="text-align: justify;">En la línea 7 redefinimos el método <code>onCreate</code> de la clase <code>Activity,</code> el cual es ejecutado al momento de iniciar la aplicación. Note que no es necesario tener un método <code>main</code>; en Android se define una actividad principal que será ejecutada al iniciar la aplicación (más adelante veremos donde se configura esto).</li>
<li style="text-align: justify;">En la línea 9 se usa el método <code>setContentView</code> que define cual de las interfaces gráficas creadas en el directorio layout serán usadas. Como parámetro usamos la variable <code>R.layout.main</code>. Esto es algo confuso al principio así que lea atentamente: <code>R</code>, como vimos anteriormente, es una clase generada por Eclipse automáticamente cada vez que creamos nuevos componentes para la aplicación; dentro de ella se crean clases estáticas con variables enteras que representan cada uno de estos componentes (<code>main.xml</code> es entonces una variable entera llamada <code>main</code>, dentro de la clase estática <code>layout</code>, que a su vez se encuentra dentro de la clase <code>R.java</code>). Por ejemplo, para usar la variable <code>hello</code> desde Java, tendríamos que usar una referencia de tipo <code>R.values.hello</code>.</li>
</ul>
<p style="text-align: justify;">Por último, tenemos el archivo <code>AndroidManifest.xml</code>. Todas las aplicaciones deben tener este archivo y no debe ser renombrado. En él se especifican las opciones generales del programa, como el paquete principal, la actividad que deberá ejecutarse al iniciar la aplicación (y deben incluirse allí TODAS las actividades que se van usar), el icono a usar, los permisos, etc.</p>
<pre class="brush: xml; title: ; notranslate">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;manifest xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
 package=&quot;net.casidiablo.holaparce&quot;
 android:versionCode=&quot;1&quot;
 android:versionName=&quot;1.0&quot;&gt;
 &lt;application android:icon=&quot;@drawable/icon&quot; android:label=&quot;@string/app_name&quot;&gt;
 &lt;activity android:name=&quot;.HolaParce&quot;
 android:label=&quot;@string/app_name&quot;&gt;
 &lt;intent-filter&gt;
 &lt;action android:name=&quot;android.intent.action.MAIN&quot; /&gt;
 &lt;category android:name=&quot;android.intent.category.LAUNCHER&quot; /&gt;
 &lt;/intent-filter&gt;
 &lt;/activity&gt;
&lt;/application&gt;
 &lt;uses-sdk android:minSdkVersion=&quot;4&quot; /&gt;
&lt;/manifest&gt;
</pre>
<h3>5. Operaciones avanzadas: acceder al dispositivo por consola y obtener una shell</h3>
<p style="text-align: justify;">Como sabemos, Android está basado en Linux, y como tal posee una interfaz de linea de comandos que podemos acceder usando las herramientas del sdk. Esto lo podemos hacer tanto para dispositivos virtuales, como el de este ejemplo, como para dispositivos reales. En este caso lo haremos con el dispositivo virtual que creamos para el ejemplo. Es tan sencillo como ejecutar esto en consola (en Linux):</p>
<p style="text-align: justify;">
<div class="consola">tools/adb -s emulator5554 shell</div>
</p>
<p style="text-align: justify;">Lo que hacemos con el comando anterior es indicarle al <code>adb</code> que queremos abrir una shell del dispositivo con serial emulator5554. Para ver los dispositivos conectados actualmente y sus seriales usamos el comando <code>adb devices</code>. Si todo va bien veríamos algo como esto:</p>
<p style="text-align: justify;">
<div class="consola">funtoo@larry tools % ./adb -s emulator-5554 shell<br />
# ls<br />
sqlite_stmt_journals<br />
cache<br />
sdcard<br />
etc<br />
system<br />
sys<br />
sbin<br />
proc<br />
init.rc<br />
init.goldfish.rc<br />
init<br />
default.prop<br />
data<br />
root<br />
dev</div>
</p>
<p style="text-align: justify;">Desde dicha shell podemos hacer bastantes cosas, pero la más interesante para mi, es poder usar el SQLite3 para acceder a las bases de datos de las aplicaciones que creemos, lo cual nos permite una depuración mucho más rápida.</p>
<p style="text-align: justify;">Eso es todo&#8230; espero les haya gustado. Cualquier comentario, duda o sugerencia no duden en comentarla.</p>
<h3>6. Links interesantes y fuentes de información</h3>
<ul>
<li><a class="external" href="http://developer.android.com/">Sitio oficial de Android para desarrolladores</a> (esta es prácticamente todo lo que vas a necesitar)</li>
<li><a class="external" href="http://www.xda-developers.com/">xda-developers, comunidad de desarrolladores de Android y Windows Mobile</a></li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/tutorial-basico-android/feed/</wfw:commentRss>
		<slash:comments>70</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>Lista de códigos de colores para bash</title>
		<link>http://casidiablo.net/colorear-salida-consola/</link>
		<comments>http://casidiablo.net/colorear-salida-consola/#comments</comments>
		<pubDate>Sun, 30 Aug 2009 21:30:08 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[colores]]></category>
		<category><![CDATA[consola]]></category>
		<category><![CDATA[ejemplos]]></category>
		<category><![CDATA[tip]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3209</guid>
		<description><![CDATA[Siempre olvido cómo generar salida coloreada en la consola, y por lo tanto pierdo tiempo buscando en Internet. Así que, aprovechando que tengo fresco dicho tema, mejor dejo un listado y las instrucciones con el ánimo de que sea útil para alguien (y para mi, por supuesto). Negro 0;30 Gris oscuro 1;30 Azul 0;34 Azul [...]]]></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%252Fcolorear-salida-consola%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Lista%20de%20c%C3%B3digos%20de%20colores%20para%20bash%22%20%7D);"></div>
<p style="text-align: justify;">Siempre olvido cómo generar salida coloreada en la consola, y por lo tanto pierdo tiempo buscando en Internet. Así que, aprovechando que tengo fresco dicho tema, mejor dejo un listado y las instrucciones con el ánimo de que sea útil para alguien (y para mi, por supuesto).</p>
<ul>
<li>Negro 0;30</li>
<li>Gris oscuro 1;30</li>
<li>Azul 0;34</li>
<li>Azul resaltado 1;34</li>
<li>Verde 0;32</li>
<li>Verde resaltado 1;32</li>
<li>Cian 0;36</li>
<li>Cyan resaltado 1;36</li>
<li>Rojo 0;31</li>
<li>Rojo resaltado 1;31</li>
<li>Púrpura 0;35</li>
<li>Púrpura resaltado 1;35</li>
<li>Café 0;33</li>
<li>Amarillo 1;33</li>
<li>Gris 0;37</li>
<li>Blanco 1;37</li>
</ul>
<p><br/></p>
<h3>Ejemplos&#8230;</h3>
<p>Si lo vas a probar usando el comando echo, debes ejecutarlo con el parámetro -e:</p>
<p><code>echo -e 'Esto es \e[0;31mrojo\e[0m y esto es \e[1;34mazul resaltado\e[0m'</code></p>
<p><strong>Resultado</strong>:  <img title="bash-colors" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/08/bash-colors.png" alt="bash-colors" width="261" height="14" /></p>
<p><code>echo -e 'Así se escribe \e[1;34mG\e[0m\e[1;31mo\e[0m\e[1;33mo\e[0m\e[1;34mg\e[0m\e[1;32ml\e[0m\e[1;31me\e[0m'</code></p>
<p><strong>Resultado</strong>: <img title="google" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/08/google.png" alt="google" width="150" height="16" /></p>
<p>Como puedes observar, se trata de poner lo que quieras colorear entre los caracteres de escape \e[CODIGOm y \e[0m.</p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/colorear-salida-consola/feed/</wfw:commentRss>
		<slash:comments>5</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 [...]]]></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%252Fnumeros-primos-java-biginteger%252F%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>
<pre class="brush: java; title: ; notranslate">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>
<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>
<pre class="brush: java; title: ; notranslate">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 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>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/numeros-primos-java-biginteger/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Buscar datos dentro de arreglos C# &#8211; Método Lineal</title>
		<link>http://casidiablo.net/buscar-elementos-dentro-array-csharp-metodo-lineal/</link>
		<comments>http://casidiablo.net/buscar-elementos-dentro-array-csharp-metodo-lineal/#comments</comments>
		<pubDate>Wed, 12 Nov 2008 16:52:01 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[C-Sharp]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[arreglos]]></category>
		<category><![CDATA[buscar]]></category>
		<category><![CDATA[ejemplos]]></category>
		<category><![CDATA[ejercicios]]></category>
		<category><![CDATA[lineal]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=2216</guid>
		<description><![CDATA[En el siguiente ejemplo se muestra cómo realizar búsquedas dentro de un arreglo de manera lineal. Ejemplo&#8230; Descargar código fuente]]></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%252Fbuscar-elementos-dentro-array-csharp-metodo-lineal%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Buscar%20datos%20dentro%20de%20arreglos%20C%23%20-%20M%C3%A9todo%20Lineal%22%20%7D);"></div>
<p>En el siguiente ejemplo se muestra cómo realizar búsquedas dentro de un <a href="http://casidiablo.net/arreglos-en-c-sharp/">arreglo</a> de manera lineal.</p>
<h3>Ejemplo&#8230;</h3>
<p style="text-align: center;"><img src="http://casidiablo.net/wordpress/wp-content/uploads/2008/11/busquedalineal.png" alt="busqueda lineal"/></p>
<p><span id="more-2216"></span></p>
<pre class="brush: csharp; title: ; notranslate">using System;
using System.Drawing;
using System.Windows.Forms;
namespace BusquedaLineal
{
   public class BusquedaLineal : Form
   {
      private Button botonBuscar;
      private TextBox cajaEntrada;
      private Label labelSalida;
      int[] a = { 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26,
                  28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50 };
      public BusquedaLineal()
      {
         InitializeComponent();
      }
      private void InitializeComponent()
      {
         this.botonBuscar = new Button();
         this.cajaEntrada = new TextBox();
         this.labelSalida = new Label();
         this.SuspendLayout();
         //
         // botonBuscar
         //
         this.botonBuscar.Location = new System.Drawing.Point(8, 8);
         this.botonBuscar.Name = &quot;botonBuscar&quot;;
         this.botonBuscar.TabIndex = 0;
         this.botonBuscar.Text = &quot;Buscar&quot;;
         this.botonBuscar.Click += new System.EventHandler(this.botonBuscar_Click);
         //
         // cajaEntrada
         //
         this.cajaEntrada.Location = new System.Drawing.Point(96, 9);
         this.cajaEntrada.Name = &quot;cajaEntrada&quot;;
         this.cajaEntrada.Size = new System.Drawing.Size(88, 20);
         this.cajaEntrada.TabIndex = 1;
         this.cajaEntrada.Text = &quot;&quot;;
         //
         // labelSalida
         //
         this.labelSalida.Location = new System.Drawing.Point(8, 40);
         this.labelSalida.Name = &quot;labelSalida&quot;;
         this.labelSalida.Size = new System.Drawing.Size(184, 23);
         this.labelSalida.TabIndex = 2;
         //
         // BusquedaLineal
         //
         this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
         this.ClientSize = new System.Drawing.Size(200, 69);
         this.Controls.AddRange(new Control[] {
                  this.labelSalida,
                  this.cajaEntrada,
                  this.botonBuscar});
         this.Name = &quot;BusquedaLineal&quot;;
         this.Text = &quot;BusquedaLineal&quot;;
         this.ResumeLayout(false);
      }
      static void Main()
      {
         Application.Run(new BusquedaLineal());
      }
      private void botonBuscar_Click( object sender,
         System.EventArgs e )
      {
         int datoBuscar = Int32.Parse( cajaEntrada.Text );
         int indiceElemento = BuscarLineal( a, datoBuscar );
         if ( indiceElemento != -1 )
            labelSalida.Text =
               &quot;Encontrado en el indice &quot; + indiceElemento;
         else
            labelSalida.Text = &quot;Valor no encontrado&quot;;
      } // fin del metodo botonBuscar_Click
      // buscar valor dentro del array
      public int BuscarLineal( int[] array, int dato )
      {
         for ( int n = 0; n &lt; array.Length; n++ )
         {
            if ( array[ n ] == dato )
               return n;
         }
         return -1;
      } // fin del metodo BusquedaLineal
   }
}</pre>
<p><a class="tooltip descargacodigo" title="Busqueda lineal en C#::Contiene archivo fuente .cs, proyecto para Visual Studio y Proyecto para Monodevelop" href="http://casidiablo.net/descargar/Busqueda+Lineal+C+Sharp">Descargar código fuente</a></p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/buscar-elementos-dentro-array-csharp-metodo-lineal/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Ordenar arreglos C# &#8211; Método burbuja</title>
		<link>http://casidiablo.net/ordenamiento-array-c-sharp-metodo-burbuja/</link>
		<comments>http://casidiablo.net/ordenamiento-array-c-sharp-metodo-burbuja/#comments</comments>
		<pubDate>Wed, 12 Nov 2008 15:48:32 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[C-Sharp]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[arreglos]]></category>
		<category><![CDATA[burbuja]]></category>
		<category><![CDATA[ejemplos]]></category>
		<category><![CDATA[ejercicios]]></category>
		<category><![CDATA[ordenar]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=2212</guid>
		<description><![CDATA[En el siguiente ejemplo se muestra cómo realizar el ordenamiento de arreglos de enteros, usando el método burbuja en C#. Ejemplo&#8230; Resultado&#8230; Valores de los items originales 54 6 4 8 10 12 89 68 45 37 Valores de los items en orden descendente 89 68 54 45 37 12 10 8 6 4 Descargar [...]]]></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%252Fordenamiento-array-c-sharp-metodo-burbuja%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Ordenar%20arreglos%20C%23%20-%20M%C3%A9todo%20burbuja%22%20%7D);"></div>
<p>En el siguiente ejemplo se muestra cómo realizar el ordenamiento de arreglos de enteros, usando el método burbuja en C#.</p>
<h3>Ejemplo&#8230;</h3>
<p><span id="more-2212"></span></p>
<pre class="brush: csharp; title: ; notranslate">using System;
public class OrdenamientoBurbuja
{
  static void Main()
  {
     int[] a =  { 54, 6, 4, 8, 10, 12, 89, 68, 45, 37 };
     string salida = &quot;Valores de los items originales\n&quot;;
     for ( int i = 0; i &lt; a.Length; i++ )
        salida += &quot;   &quot; + a[ i ];
     // ordenar elementos del arreglo
     OrdenarBurbuja( a );
     salida += &quot;\n\nValores de los items en orden descendente\n&quot;;
     for ( int i = 0; i &lt; a.Length; i++ )
        salida += &quot;   &quot; + a[ i ];
     Console.WriteLine(salida);
  } // fin del metodo main
  // ordenar elementos de un arreglo con el metodo burbuja
  static public void OrdenarBurbuja( int[] b )
  {
     for ( int pasadas = 1; pasadas &lt; b.Length; pasadas++ ) // pasadas
        for ( int i = 0; i &lt; b.Length - 1; i++ )
           if ( b[ i ] &gt; b[ i + 1 ] )      // comparar
              intercambio( b, i );         // intercambiar
  }
  // intercambio de dos elementos en un arreglo
  static public void intercambio( int[] c, int primero )
  {
     int temp;      // variable temporal para el intercambio
     temp = c[ primero ];
     c[ primero ] = c[ primero + 1 ];
     c[ primero + 1 ] = temp;
  }
}</pre>
<p><strong>Resultado&#8230;</strong></p>
<div class="consola">Valores de los items originales<br />
   54   6   4   8   10   12   89   68   45   37</p>
<p>Valores de los items en orden descendente<br />
   89   68   54   45   37   12   10   8   6   4</p></div>
<p><a class="tooltip descargacodigo" title="Método burbuja en C#::Contiene archivo fuente .cs, proyecto para Visual Studio y Proyecto para Monodevelop" href="http://casidiablo.net/descargar/Ordenar+Arreglo+Metodo+Burbuja">Descargar código fuente</a></p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/ordenamiento-array-c-sharp-metodo-burbuja/feed/</wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
		<item>
		<title>Ejemplos básicos de manipulación de arreglos en C#</title>
		<link>http://casidiablo.net/ejercicios-basicos-manejo-arreglos-c-sharp/</link>
		<comments>http://casidiablo.net/ejercicios-basicos-manejo-arreglos-c-sharp/#comments</comments>
		<pubDate>Mon, 10 Nov 2008 21:00:42 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[C-Sharp]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[arreglos]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[ejemplos]]></category>
		<category><![CDATA[ejercicios]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=2191</guid>
		<description><![CDATA[Ejemplos básicos de manipulación de arreglos en C# Sumar elementos de un array Sinopsis: hacer la sumatoria de los elementos de un arreglo. Resultado&#8230; Suma de todos los elementos del array: 55 Descargar código fuente Creacion de histogramas Sinopsis: crear un histograma (barras a base de asteriscos) a partir de unos datos. Resultado&#8230; Elemento Valor [...]]]></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%252Fejercicios-basicos-manejo-arreglos-c-sharp%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Ejemplos%20b%C3%A1sicos%20de%20manipulaci%C3%B3n%20de%20arreglos%20en%20C%23%22%20%7D);"></div>
<p>Ejemplos básicos de manipulación de arreglos en C#</p>
<h3>Sumar elementos de un array</h3>
<p><strong>Sinopsis</strong>: hacer la sumatoria de los elementos de un arreglo.</p>
<pre class="brush: csharp; title: ; notranslate">using System;
class SumarArreglo
{
  // metodo Main
  static void Main( string[] args )
  {
     int[] a = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
     int total = 0;
     for ( int i = 0; i &lt; a.Length; i++ )
        total += a[ i ];
     Console.WriteLine( &quot;Suma de todos los elementos del array: &quot; + total);
  } // fin de Main
} // fin de la clase SumarArreglo</pre>
<p><strong>Resultado&#8230;</strong></p>
<div class="consola">Suma de todos los elementos del array: 55</div>
<p><a class="tooltip descargacodigo" title="Suma de elementos de arreglos en C#::Contiene archivo fuente .cs, proyecto para Visual Studio y Proyecto para Monodevelop" href="http://casidiablo.net/descargar/Sumar+Arreglo+C+Sharp">Descargar código fuente</a></p>
<h3>Creacion de histogramas</h3>
<p><strong>Sinopsis</strong>: crear un histograma (barras a base de asteriscos) a partir de unos datos.<span id="more-2191"></span></p>
<pre class="brush: csharp; title: ; notranslate">using System;
class Histograma
{
  // metodo Main
  static void Main( string[] args )
  {
     int[] n = { 19, 3, 15, 7, 11, 9, 13, 5, 17, 1 };
     string salida = &quot;Elemento\tValor\tHistograma\n&quot;;
     // construir salida
     for ( int i = 0; i &lt; n.Length; i++ )
     {
        salida += &quot;\n&quot; + i + &quot;\t\t\t&quot; + n[ i ] + &quot;\t\t&quot;;
        for ( int j = 1; j &lt;= n[ i ]; j++ ) // imprimir una barra
           salida += &quot;*&quot;;
     }
     Console.WriteLine( salida);
  } // fin Main
} // fin de la clase Histograma</pre>
<p><strong>Resultado&#8230;</strong></p>
<div class="consola">Elemento	Valor	Histograma</p>
<p>0			19		*******************<br />
1			3		***<br />
2			15		***************<br />
3			7		*******<br />
4			11		***********<br />
5			9		*********<br />
6			13		*************<br />
7			5		*****<br />
8			17		*****************<br />
9			1		*</p></div>
<p><a class="tooltip descargacodigo" title="Histogramas en C#::Contiene archivo fuente .cs, proyecto para Visual Studio y Proyecto para Monodevelop" href="http://casidiablo.net/descargar/Histograma+C+Sharp">Descargar código fuente</a></p>
<h3>Estadisticas de notas de estudiantes</h3>
<p><strong>Sinopsis</strong>: apartir de un arreglo de notas (puntajes) identificar la frecuencia de cada una de ellas entre todos los estudiantes.</p>
<pre class="brush: csharp; title: ; notranslate">using System;
class EncuestaEstudiantes
{
  // metodo Main
  static void Main( string[] args )
  {
     int[] respuestas = { 1, 2, 6, 4, 8, 5, 9, 7, 8, 10, 1,
        6, 3, 8, 6, 10, 3, 8, 2, 7, 6, 5, 7, 6, 8, 6, 7,
        5, 6, 6, 5, 6, 7, 5, 6, 4, 8, 6, 8, 10 };

     int[] frecuencia = new int[ 11 ];
     string salida = &quot;&quot;;

     // incrementar la frecuecia de para cada respuesta
     for ( int j = 0; j &lt; respuestas.Length; j++ )
        ++frecuencia[ respuestas[ j ] ];

     salida += &quot;Puntaje\tFrecuencia\n&quot;;

     // resultados
     for ( int puntaje = 1; puntaje &lt; frecuencia.Length; puntaje++ )
        salida += puntaje + &quot;\t\t&quot; + frecuencia[ puntaje ] + &quot;\n&quot;;

     Console.WriteLine( salida);

  } // fin Main

} // fin de la clase EncuestaEstudiantes</pre>
<p><strong>Resultado&#8230;</strong></p>
<div class="consola">Puntaje	Frecuencia<br />
1		2<br />
2		2<br />
3		2<br />
4		2<br />
5		5<br />
6		11<br />
7		5<br />
8		7<br />
9		1<br />
10		3</div>
<p><a class="tooltip descargacodigo" title="Encuesta Estudiantes en C#::Contiene archivo fuente .cs, proyecto para Visual Studio y Proyecto para Monodevelop" href="http://casidiablo.net/descargar/Estudiantes+C+Sharp">Descargar código fuente</a></p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/ejercicios-basicos-manejo-arreglos-c-sharp/feed/</wfw:commentRss>
		<slash:comments>43</slash:comments>
		</item>
	</channel>
</rss>

