<?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; linux</title>
	<atom:link href="http://casidiablo.net/tag/linux/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>Construir aplicaciones Android desde la línea de comandos</title>
		<link>http://casidiablo.net/desarrollo-programas-android-consola/</link>
		<comments>http://casidiablo.net/desarrollo-programas-android-consola/#comments</comments>
		<pubDate>Sun, 09 May 2010 21:45:22 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[ide]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3776</guid>
		<description><![CDATA[Emacs es algo adictivo sin duda&#8230; a tal punto que a veces prefiero programar todo desde la línea de comandos en vez de usar un IDE como Eclipse o Netbans. En esta entrada, que sin duda es de esas que me sirve solo a mi y a unos pocos más, se detalla el proceso de [...]]]></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%252Fdesarrollo-programas-android-consola%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fcasidiablo.in%2Fb2O28Q%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Construir%20aplicaciones%20Android%20desde%20la%20l%C3%ADnea%20de%20comandos%22%20%7D);"></div>
<p style="float: left;"><img class="alignnone size-full wp-image-3781" title="android-open" src="http://casidiablo.net/wordpress/wp-content/uploads/2010/05/android-open.png" alt="android consola" width="166" height="200" /></p>
<p style="text-align: justify;"><a href="http://www.gnu.org/software/emacs/">Emacs</a> es algo adictivo sin duda&#8230; a tal punto que a veces prefiero programar todo desde la línea de comandos en vez de usar un IDE como Eclipse o Netbans. En esta entrada, que sin duda es de esas que me sirve solo a mi y a unos pocos más, se detalla el proceso de compilación e instalación de aplicaciones para Android sin usar más que el SDK y una línea de comandos. Esta guía es aplicable para cualquier sistema operativo, pero yo lo haré en mi equipo que corre <a href="http://www.funtoo.org/">Funtoo Linux</a>.</p>
<p style="text-align: justify;">
<h3>0. Configuración del entorno de trabajo</h3>
</p>
<p style="text-align: justify;">Lo primero es tener el SDK instalado, lo cual está explicado aquí: <a href="http://casidiablo.net/tutorial-basico-android/">Introducción a la programación con Android</a>. Una vez hayamos instalado y configurado el SDK (incluyendo la adición del directorio tools al path del sistema) y tengamos un proyecto que compilar podemos iniciar el proceso de compilación. Es posible también crear el proyecto desde la línea de comandos así:</p>
<div class="consola">android create project -t 1 -p /tmp/ejemplo -k net.casidiablo.ejemplo -a Ejemplo</div>
<p style="text-align: justify;">Donde <code>-t 1</code> es el id de la plataforma para la que vamos a desarrollar la aplicación (el target). Se puede usar el comando <code>android list targets</code> para ver el listado de targets disponibles. <code>-p</code> indica la ruta de creación del proyecto y -a el nombre de la actividad inicial.</p>
<p style="text-align: justify;">
<h3>1. Compilación</h3>
</p>
<p style="text-align: justify;">Es posible usar Ant para compilar y empaquetar todo automáticamente&#8230; pero me gusta hacer cada cosa y saber qué está pasando por debajo. Así que haremos todo manualmente. El siguiente comando generará el archivo <code>R.java</code> (si no sabes de lo que hablo: <a href="../../tutorial-basico-android/">Introducción a  la programación con Android</a>):</p>
<div class="consola">aapt p -m -J src -M AndroidManifest.xml -S res -I $ANDROID_DIR/android.jar</div>
<ul>
<li><code>p</code> = package</li>
<li><code>-m -j src</code> indicar el directorio de los archivos fuente</li>
<li><code>-M</code> indicar la ubicación del manifiesto</li>
<li><code>-S</code> indicar la ubicación del directorio de recursos</li>
<li><code>-I $ANDROID_DIR/android.jar</code> añade el paquete android.jar al classpath del proyecto. Importante: en mi caso <code>$ANDROID_DIR</code> apunta a <code>/opt/android/platforms/<strong>android-4</strong>/</code> y en el path del sistema se encuentra incluido <code>/opt/android/platforms/android-4/tools/</code> Es importante tener en cuenta que NO se usa la base del SDK como antiguamente se hacía, sino el correspondiente directorio bajo <em>platforms</em>.</li>
</ul>
<p>Ahora sí vamos a generar los archivos <code>.class</code> (por supuesto, es necesario tener el JDK de Java instalado):</p>
<div class="consola">javac -encoding ascii -target 1.5 -d bin -bootclasspath $ANDROID_DIR/android.jar src/net/casidiablo/ejemplo/*.java</div>
<p>Esto básicamente genera archivos .class en el directorio bin. Si la aplicación usara librerías de terceros, se debería agregar el parámetro <code>-classpath=libs/*.jar</code></p>
<p>Puesto que los archivos .class están generados para la JVM, es necesario convertirlos a archivos para la Dalvik VM:</p>
<div class="consola">dx &#8211;dex &#8211;output=bin/classes.dex bin # si existieran librerías externas se añade libs/*.jar</div>
<p>Ahora empaquetamos los recursos:</p>
<div class="consola">aapt p -f -M AndroidManifest.xml -S res/ -I $ANDROID_DIR/android.jar -F bin/ejemplo.ap_</div>
<p>Ahora empaquetamos usando los bytecodes de Dalvik que creamos (classes.dex) para generar el paquete final:</p>
<div class="consola">apkbuilder bin/ejemplo.apk -z bin/ejemplo.ap_ -f bin/classes.dex -rf src -rj libs</div>
<p>Finalmente podemos instalarlo tal como escribí en <a href="http://casidiablo.net/android-desde-linux/">Manipulación de smartphones con Android desde la consola de Linux</a>:</p>
<div class="consola">adb install bin/ejemplo.apk</div>
<p>Links interesantes: <a href="http://asantoso.wordpress.com/2009/09/15/how-to-build-android-application-package-apk-from-the-command-line-using-the-sdk-tools-continuously-integrated-using-cruisecontrol/">How to build Android application package (.apk) from the command line using the SDK tools + continuously integrated using CruiseControl</a> y <a href="http://benlynn.blogspot.com/2009/01/developing-android-without-eclipse-or.html">Developing Android without Eclipse or Ant</a></p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/desarrollo-programas-android-consola/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Capturar la pantalla de un dispositivo corriendo Android</title>
		<link>http://casidiablo.net/screenshots-smartphone-android/</link>
		<comments>http://casidiablo.net/screenshots-smartphone-android/#comments</comments>
		<pubDate>Sat, 27 Mar 2010 12:22:27 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[dalvik debug monitor]]></category>
		<category><![CDATA[ddms]]></category>
		<category><![CDATA[htc hero]]></category>
		<category><![CDATA[htc tattoo]]></category>
		<category><![CDATA[screenshot]]></category>
		<category><![CDATA[sdk]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3755</guid>
		<description><![CDATA[Este es un pequeño tip mediante el cual les mostraré cómo capturar la pantalla de un smartphone corriendo Android. Para ello haremos uso del Dalvik Debug Monitor, que se incluye con el SDK de Android. Para instalar el SDK debes seguir los pasos que explico en esta entrada. Además, es necesario configurar la conexión USB [...]]]></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%252Fscreenshots-smartphone-android%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fcasidiablo.in%2FbHqFBP%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Capturar%20la%20pantalla%20de%20un%20dispositivo%20corriendo%20Android%22%20%7D);"></div>
<p style="text-align: justify;">Este es un pequeño tip mediante el cual les mostraré cómo capturar la pantalla de un smartphone corriendo Android. Para ello haremos uso del Dalvik Debug Monitor, que se incluye con el SDK de Android. Para instalar el SDK debes seguir los pasos que explico en <a href="http://casidiablo.net/tutorial-basico-android/">esta entrada</a>. Además, es necesario configurar la conexión USB del smartphone; si usas Linux deberás seguir <a href="http://casidiablo.net/android-desde-linux/">estos pasos</a>.</p>
<p style="text-align: justify;">Una vez tengamos instalado y configurado el SDK, basta con conectar el móvil, abrir la herramienta <code>ddms</code> (que se encuentra dentro del directorio tools del SDK), y veremos algo como esto:</p>
<p style="text-align: center;"><img class="size-full wp-image-3762 aligncenter" title="ddms-android" src="http://casidiablo.net/wordpress/wp-content/uploads/2010/03/ddms-android.png" alt="" width="600" height="444" /></p>
<p style="text-align: justify;">Ahora basta con seleccionar nuestro dispositivo en el panel izquierdo y presionar <em>Ctrl+S</em> (o ir al menu <em>Device</em> -&gt; <em>Screen capture&#8230;</em>).  Veremos una ventana con la captura y tenemos la opción de guardar la imagen como PNG, por ejemplo:</p>
<p style="text-align: center;"><img class="size-full wp-image-3763 aligncenter" title="hammer-smashed-head" src="http://casidiablo.net/wordpress/wp-content/uploads/2010/03/hammer-smashed-head.png" alt="" width="320" height="240" /></p>
<p>¡Eso es todo <img src="http://casidiablo.net/wordpress/wp-includes/images/smilies/icon_kiss.gif" />! Si tiene alguna duda o sugerencia, no dude en comentar.</p>
<div class="nota"><strong>Nota:</strong> Existe una aplicación creada por <a class="external" href="http://twitter.com/koush">Koush</a> que se ejecuta desde el Android y que permite hacer esto (más información <a class="external" href="http://www.koushikdutta.com/search/label/Klaxon">aquí</a>). El problema es que necesita privilegios de root en el smartphone <img src='http://casidiablo.net/wordpress/wp-includes/images/smilies/icon_mrgreen.gif' alt=':mrgreen:' class='wp-smiley' /> </div>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/screenshots-smartphone-android/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Manipulación de smartphones con Android desde la consola de Linux</title>
		<link>http://casidiablo.net/android-desde-linux/</link>
		<comments>http://casidiablo.net/android-desde-linux/#comments</comments>
		<pubDate>Tue, 23 Mar 2010 06:27:01 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[consola]]></category>
		<category><![CDATA[how-to]]></category>
		<category><![CDATA[htc hero]]></category>
		<category><![CDATA[htc tattoo]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[tip]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3701</guid>
		<description><![CDATA[En esta entrada aprenderemos a manipular dispositivos móviles que tengan Android instalado a través de la consola en Linux. Esto es útil al momento de instalar aplicaciones, navegar entre los directorios del equipo, depurar las base de datos, etc. Además, no hay ningún fabricante de móviles (al menos que yo conozca) que proporcione herramientas 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%252Fandroid-desde-linux%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fcasidiablo.in%2FciD5bK%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Manipulaci%C3%B3n%20de%20smartphones%20con%20Android%20desde%20la%20consola%20de%20Linux%22%20%7D);"></div>
<p style="text-align: justify;"><img style="float: left; margin: 4px;" title="android-tux" src="http://casidiablo.net/wordpress/wp-content/uploads/2010/03/android-tux.png" alt="" width="176" height="200" />En esta entrada aprenderemos a<strong> manipular dispositivos móviles que tengan Android instalado a través de la consola en Linux.</strong> Esto es útil al momento de instalar aplicaciones, navegar entre los directorios del equipo, depurar las base de datos, etc. Además, no hay ningún fabricante de móviles (al menos que yo conozca) que proporcione herramientas para controlar los dispositivos desde Linux. En mi caso, tengo un HTC Tattoo el cual solo puede ser manipulado desde Windows usando HTC Sync <img src='http://casidiablo.net/wordpress/wp-includes/images/smilies/icon_cry.gif' alt=':cry:' class='wp-smiley' /> </p>
<p style="text-align: justify;">Con el HTC Tattoo y la mayoría de los smartphones con Android es posible usar la opción de almacenamiento en Linux sin ningún tipo de configuración especial. Simplemente se conecta el equipo, se ejecuta la aplicación <em>Connect to PC</em> y se selecciona <em>Disk Drive</em> con lo cual podremos acceder a la memoria SD. Pero, para realizar operaciones avanzadas necesitaremos seguir estos pasos:</p>
<p style="text-align: justify;">
<h3>1. Instalar el SDK de Android</h3>
<p style="text-align: justify;">La instalación y configuración de Android se explica en la anterior entrada: <strong><a href="http://casidiablo.net/tutorial-basico-android/">Introducción a la programación con Android</a></strong>.</p>
<p style="text-align: justify;">
<h3>2. Configurar el path del SDK</h3>
<p style="text-align: justify;">Para trabajar cómodamente con los comandos que nos proporciona el SDK, ejecutaremos el siguiente comando (reemplazando la ruta del SDK por la tuya):</p>
<p style="text-align: justify;">
<pre class="brush: bash; title: ; notranslate">echo &quot;export PATH=$PATH:/ruta/del/sdk/tools&quot;
source ~/.bashrc</pre>
<h3>3. Instalar la máquina virtual de Java</h3>
<p style="text-align: justify;">Recomiendo usar los instaladores de la página de Sun. También puedes hacerlo desde los repositorios de tu distro.</p>
<p style="text-align: justify;">
<h3>4. Crear una regla en udev</h3>
<p style="text-align: justify;">Debemos ahora crear una regla en udev para que al momento de conectar el dispositivo lo podamos usar con el SDK de Android. Así que creamos y editamos como root el archivo <code>/etc/udev/rules.d/99-android.rules</code> y dentro ponemos:</p>
<pre class="brush: python; title: ; notranslate">SUBSYSTEM==&quot;usb&quot;, ATTRS{idVendor}==&quot;0bb4&quot;, SYMLINK+=&quot;android_adb&quot;, MODE=&quot;0666&quot;</pre>
<p style="text-align: justify;">Note que estoy usando el idVendor 0bb4 que es el correspondiente al HTC Tattoo. Para conocer el de su smartphone, debe conectarlo y usar el comando <code>lsusb</code>.</p>
<p style="text-align: justify;">
<h3>5. Conectarse al dispositivo</h3>
<p style="text-align: justify;">Conectamos el smartphone (sí, tenía que estar desconectado <img src='http://casidiablo.net/wordpress/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  ), y seleccionamos la opción HTC Sync&#8230; por supuesto, vamos a obtener un error que dice que no encontró el HTC Sync en el PC&#8230; lo bueno es que con esto se activa el modo depuración del USB, el cual nos permitirá conectarnos desde la terminal de Linux. Primero debemos mirar si se reconoce el dispositivo ejecutando este comando:</p>
<p style="text-align: justify;">
<div class="consola">adb devices</div>
<p style="text-align: justify;">Si todo sale bien, veremos algo como esto:</p>
<p style="text-align: justify;">
<div class="consola">* daemon not running. starting it now *<br />
* daemon started successfully *<br />
List of devices attached<br />
HT9A3LG11652    device</div>
<p style="text-align: justify;">HT9A3LG11652 es el nombre de mi dispositivo; este nombre nos permitirá referenciarlo al momento de ejecutar comandos sobre el desde CLI de Linux. Veamos qué podemos hacer ahora que tenemos el smartphone conectado&#8230;</p>
<pre class="brush: bash; title: ; notranslate">adb -s HT9A3LG11652 shell #ejecutar una shell
adb -s HT9A3LG11652 push archivo_local archivo_destino #copiar un archivo al smartphone
adb -s HT9A3LG11652 pull archivo_remoto archivo_local #copiar un archivo desde el smartphone
adb -s HT9A3LG11652 shell rm -r /system/sd/archivo #borrar archivos del smartphone
adb -s HT9A3LG11652 install nombre_aplicacion.apk #instalar aplicaciones
adb -s HT9A3LG11652 uninstall nombre.paquete #desinstalar aplicaciones</pre>
<p>Eso es todo por ahora&#8230; cualquier duda, comentario o sugerencia es bienvenido. ¡Hasta la próxima!</p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/android-desde-linux/feed/</wfw:commentRss>
		<slash:comments>9</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>Vino oficial de Debian</title>
		<link>http://casidiablo.net/vino-oficial-de-debian/</link>
		<comments>http://casidiablo.net/vino-oficial-de-debian/#comments</comments>
		<pubDate>Tue, 16 Feb 2010 23:54:14 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[Debian]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[off-topic]]></category>
		<category><![CDATA[vino]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3647</guid>
		<description><![CDATA[Esta pequeña entrada la pongo porque me pareció bastante curioso&#8230; se trata de un vino oficial de Debian que, por cierto, se ve delicioso. Según me cuentan, el vino lo presentaron en el Debconf que se hizo en extremadura españa. Aunque la foto de la derecha me deja algo desconcertado&#8230; ¿por qué le toman la [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fcasidiablo.net%252Fvino-oficial-de-debian%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fcasidiablo.in%2FaHkubO%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Vino%20oficial%20de%20Debian%22%20%7D);"></div>
<p>Esta pequeña entrada la pongo porque me pareció bastante curioso&#8230; se trata de un vino oficial de Debian que, por cierto, se ve delicioso. Según me cuentan, el vino lo presentaron en el <a href="http://www.debian.org/News/2009/20090722">Debconf que se hizo en extremadura españa</a>.</p>
<p align="center"><img src="http://casidiablo.net/wordpress/wp-content/uploads/2010/02/debian-vino.jpg" title="debian vino" width="300" height="450" /><a href="http://www.flickr.com/photos/aigarius/3745140041/"><img src="http://casidiablo.net/wordpress/wp-content/uploads/2010/02/vino-debian.jpg" title="vino debian" width="300" height="450" /></a></p>
<p>Aunque la foto de la derecha me deja algo desconcertado&#8230; ¿por qué le toman la foto al lado de un Mac Book? En fin&#8230; <a href="http://www.cafe-libertad.de/shop/essen-trinken/wein-rum/debian-wein.html?id=271&#038;category=17&#038;___store=english&#038;___from_store=espanol">puedes adquirir tu propio vino por 5.8 euros</a> más costes de envío (supongo).</p>
<p> Gracias a petox que me lo envió por correo <img src='http://casidiablo.net/wordpress/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Más información: http://wiki.debian.org/DebianWine</p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/vino-oficial-de-debian/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Usando el System Tray desde Java</title>
		<link>http://casidiablo.net/systray-java-ejemplo/</link>
		<comments>http://casidiablo.net/systray-java-ejemplo/#comments</comments>
		<pubDate>Mon, 15 Feb 2010 13:55:04 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[ejercicios en java]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[area]]></category>
		<category><![CDATA[awt]]></category>
		<category><![CDATA[ide]]></category>
		<category><![CDATA[jpoupmenu]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[notificacion]]></category>
		<category><![CDATA[system tray]]></category>
		<category><![CDATA[systray]]></category>
		<category><![CDATA[Windows]]></category>

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

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

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

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

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

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/systray-java-ejemplo/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Códigos de shell script útiles en cualquier programa</title>
		<link>http://casidiablo.net/codigos-de-shell-script-utiles/</link>
		<comments>http://casidiablo.net/codigos-de-shell-script-utiles/#comments</comments>
		<pubDate>Wed, 27 Jan 2010 03:23:46 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[Arch Linux]]></category>
		<category><![CDATA[bsd]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[Fedora]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[gentoo]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[comandos]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[unix]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3588</guid>
		<description><![CDATA[A continuación voy a poner algunos snippets de código de shell script que me han sido siempre útiles cuando escribo algún script. La mayoríá funcinoan en cualquier shell de Unix, aunque algunos requieren que sean ejecutados por Bash. Evitar que usuarios sin privilegios ejecuten el script Algunos scripts realizan tareas administrativas por lo cual podríamos [...]]]></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%252Fcodigos-de-shell-script-utiles%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22C%C3%B3digos%20de%20shell%20script%20%C3%BAtiles%20en%20cualquier%20programa%22%20%7D);"></div>
<p style="text-align: justify;"><img src="http://casidiablo.net/wordpress/wp-content/uploads/2010/01/bash.png" alt="shell script" title="shell script" width="80" height="80" style="float:left;padding:5px;" />A continuación voy a poner algunos snippets de código de shell script que me han sido siempre útiles cuando escribo algún script. La mayoríá funcinoan en cualquier shell de Unix, aunque algunos requieren que sean ejecutados por <strong>Bash</strong>.</p>
<h3>Evitar que usuarios sin privilegios ejecuten el script</h3>
<p style="text-align: justify;">Algunos scripts realizan tareas administrativas por lo cual podríamos querer que solo el usuario root ejecute el script. En ese caso podemos usar algo como esto:</p>
<pre class="brush: bash; title: ; notranslate">#!/bin/bash
if [[ $EUID -ne 0 ]]; then
echo &quot;Este script debe ser ejecutado por el usuario root&quot; 1&gt;&amp;2
    exit 1
fi</pre>
<h3>Permitir la ejecución del script solo a un usuario específico</h3>
<p style="text-align: justify;">De manera similar al código anterior, podríamos querer que solo un usuario específico ejecute el script. Lo hacemos así:</p>
<pre class="brush: bash; title: ; notranslate">#!/bin/bash
AUTHORIZED_USER=&quot;usuario_permitido&quot;
if [ $USER != $AUTHORIZED_USER ]; then
    echo &quot;Este script debe ser ejecutado por el usuario $AUTHORIZED_USER&quot; 1&gt;&amp;2
    exit 1
fi</pre>
<h3>Verificar que un servicio/proceso se está ejecutando</h3>
<p style="text-align: justify;">Si queremos saber si existen procesos de algún servicio o programa ejecutándose podríamos usar este script (en este caso verifica que el demonio de Apache esté corriendo):</p>
<p><span id="more-3588"></span></p>
<pre class="brush: bash; title: ; notranslate">#!/bin/sh
SERVICE='httpd'
if ps ax | grep -v grep | grep $SERVICE &gt; /dev/null
then
    echo &quot;El servicio $SERVICE esta ejecutandose&quot;
else
    echo &quot;Chanfle! El servicio $SERVICE esta detenido&quot;
fi</pre>
<h3>Verificar que una variable esté asignada/tenga datos</h3>
<p style="text-align: justify;">Hay bastantes maneras de hacer esto en shell script&#8230; la que considero más sencilla y concisa es esta:</p>
<pre class="brush: bash; title: ; notranslate">#!/bin/bash
FOO=
: ${FOO:?&quot;No existe la variable FOO o no tiene datos&quot;}
echo &quot;esto nunca se va a imprimir&quot;</pre>
<p style="text-align: justify;">El anterior script verifica si una variable existe y tiene datos; si esto no se cumple, el script se cierra. Podemos usar esta variación en donde solo comprobamos que la variable exista, sin importar si tiene datos o no:</code></p>
<pre class="brush: bash; title: ; notranslate">#!/bin/bash
FOO=
: ${FOO?&quot;No existe la variable FOO&quot;}
echo &quot;esto si se va a imprimir&quot;</pre>
<h3>Crear un archivo de bloqueo</h3>
<p style="text-align: justify;">A veces debemos asegurarnos que el script no se ejecute dos o más veces simultáneas. Para ello podemos hacer uso de los archivos de bloqueo. Esta es una versión sencilla de un script que nos permite hacer esto:</p>
<pre class="brush: bash; title: ; notranslate">#!/bin/bash
lockfile=/var/lock/loquesea.lock
if [ ! -e $lockfile ]; then
   touch $lockfile
   echo &quot;hago muchas cosas importantes aqui&quot;
   rm $lockfile
else
   echo &quot;ya hay otro proceso corriendo&quot;
fi</pre>
<p style="text-align: justify;">En este caso, se verifica que el archivo loquesea.lock exista. En caso de que exista, el script NO ejecuta sus tareas. Si no existe, crea el archivo, ejecuta las tareas que deba ejecutar y lo elimina.</p>
<p style="text-align: justify;">Pero, esto no es del todo fiable. ¿Qué pasaría si mientras nuestro script se está ejecutando es cerrado abruptamente (con Ctrl^c por ejemplo)? En ese caso el archivo de bloqueo no se borraría, y por lo tanto, no nos permitiría ejecutar el script de nuevo.</p>
<p style="text-align: justify;">Para cubrir esos casos, podríamos hacer uso del comando <strong><code>trap</code></strong> que nos permite ejecutar comandos en caso que nuestro script termine de manera inesperada. Esta es una versión más avanzada que además guarda dentro del archivo de bloqueo el PID del script que lo ejecuta:</p>
<pre class="brush: bash; title: ; notranslate">#!/bin/bash
lockfile=/var/lock/loquesea.lock
if ( set -o noclobber; echo &quot;$$&quot; &gt; &quot;$lockfile&quot;) 2&gt; /dev/null;
then
    trap 'rm -f &quot;$lockfile&quot;; exit $?' INT TERM EXIT
    echo &quot;hago muchas cosas aqui tranquilamente&quot;
    rm -f &quot;$lockfile&quot;
    trap - INT TERM EXIT
else
    echo &quot;Ya hay otro proceso de este script ejecutandose&quot;
    echo &quot;corriendo con el PID: $(cat $lockfile)&quot;
fi</pre>
<p style="text-align: justify;">Entendamos un poco mejor el comando <strong><code>trap</code></strong>. La sintaxis del mismo es básicamente esta: <code>trap <strong>comando</strong> signal [signal ...]</code>; donde signal es la señal de terminación que quieres atrapar. Si quieres ver una lista de los signals disponibles puedes ejecutar el comando kill -l. Para el caso anterior se usaron los signals <code><strong>INT</strong></code> (captura la terminación producida por un Ctrl^c), <code><strong>TERM</strong></code> (terminación producida por el comando kill) y <code><strong>EXIT</strong></code> (terminación normal de un script, bien sea porque ya no hay más líneas que ejecutar o porque se encuentra con el comando exit).</p>
<h3>Menú de opciones</h3>
<p style="text-align: justify;">Para hacer un menú en donde permitimos al usuario seleccionar una serie de opciones podemos usar el siguiente esquema:</p>
<pre class="brush: bash; title: ; notranslate">#!/bin/bash
clear
while :
do
 echo &quot; Escoja una opcion &quot;
 echo &quot;1. quien soy?&quot;
 echo &quot;2. cuanto espacio tengo&quot;
 echo &quot;3. que es esto?&quot;
 echo &quot;4. Salir&quot;
 echo -n &quot;Seleccione una opcion [1 - 4]&quot;
 read opcion
 case $opcion in
  1) echo &quot;este eres:&quot;;
     whoami;;
  2) echo &quot;tienes esto&quot;;
     df;;
  3) uname -r;;
  4) echo &quot;chao pues parcero&quot;;
     exit 1;;
  *) echo &quot;$opc es una opcion invalida. Es tan dificil?&quot;;
     echo &quot;Presiona una tecla para continuar...&quot;;
     read foo;;
esac
done</pre>
<h3>Pedir confirmación antes de ejecutar un script</h3>
<p>A veces es útil hacer que el usuario confirme la ejecución de un lote de sentencias, es decir, el típico mensaje que pide al usuario escribir <code><strong>yes</strong></code> o <code><strong>no</strong></code>. Esto lo podemos hacer así:</p>
<pre class="brush: bash; title: ; notranslate">#!/bin/bash
while true; do
    echo
    read -p &quot;esta seguro de hacer lo que sea que vaya a hacer &quot; yn
    case $yn in
        yes ) break;;
        no ) exit;;
        * ) echo &quot;por favor responda yes o no&quot;;;
    esac
done
echo &quot;si se ejecuta esto es que aceptaste&quot;
</pre>
<h3>Fuentes de información</h3>
<ul>
<li><a href="http://stackoverflow.com/">StackOverflow - La más valiosa sin duda alguna</a></li>
<li><a href="http://www.davidpashley.com/articles/writing-robust-shell-scripts.html">Writing Robust Bash Shell Scripts</a></li>
<li><a href="http://www.cyberciti.biz/tips/shell-root-user-check-script.html">nixCraft</a></li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/codigos-de-shell-script-utiles/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>Montar particiones/slices de *BSD en Linux</title>
		<link>http://casidiablo.net/montar-particione-bsd-linux/</link>
		<comments>http://casidiablo.net/montar-particione-bsd-linux/#comments</comments>
		<pubDate>Fri, 01 Jan 2010 05:03:03 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[bsd]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[gentoo]]></category>
		<category><![CDATA[kernel]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[netbsd]]></category>
		<category><![CDATA[openbsd]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3556</guid>
		<description><![CDATA[A veces es necesario trabajar con el sistema de archivos UFS (el que viene por defecto en FreeBSD, OpenBSD, NetBSD, etc.) desde Linux. En este pequeño artículo explicaré cómo configurar el kernel de tal manera que quede habilitado el soporte de lectura y escritura de UFS. Me enfocaré en FreeBSD, que es donde hice 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%252Fmontar-particione-bsd-linux%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Montar%20particiones%2Fslices%20de%20%2ABSD%20en%20Linux%22%20%7D);"></div>
<p style="text-align: center;"><img class="size-full wp-image-3547 aligncenter" title="tux_beastie" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/12/tux_beastie.png" alt="" width="450" height="243" /></p>
<p style="text-align: justify;">A veces es necesario trabajar con el sistema de archivos UFS (el que viene por defecto en FreeBSD, OpenBSD, NetBSD, etc.) desde Linux. En este pequeño artículo explicaré cómo configurar el kernel de tal manera que quede habilitado el soporte de lectura y escritura de UFS. Me enfocaré en FreeBSD, que es donde hice las pruebas.</p>
<p style="text-align: justify;">Tengamos en cuenta además que el esquema de particiones de FreeBSD es distinto al de Linux. Este solo necesita una &#8216;partición&#8217; primaria (llamadas slices en BSD) para administrar las particiones que utilizará el sistema, y cada una de esas particiones tiene un esquema de nombres en particular. Puesto que dicho esquema algunas veces no es soportado por nuestro kernel, activaremos también esta opción (de lo contrario solo podremos montar la raiz del sistema FreeBSD mas no sus particiones).</p>
<p style="text-align: justify;">
<h3>0. Preparando el kernel</h3>
<p style="text-align: justify;">Tal vez ya tengas soporte para UFS, pero para esta entrada asumiré que no es así.</p>
<p style="text-align: justify;">Así que, vamos a la configuración del kernel (en este momento estoy usando Linux kernel 2.6.32):</p>
<p><span id="more-3556"></span></p>
<div class="consola">cd /usr/src/linux<br />
make menuconfig</div>
<p style="text-align: justify;">Ahora, vamos a activar estas opciones:</p>
<div class="consola">-&gt; File systems<br />
-&gt; Miscellaneous filesystems<br />
&lt;*&gt; UFS file system support (read only)<br />
[*] UFS file system write support</div>
<p style="text-align: justify;">Verás algo como esto:</p>
<p style="text-align: center;"><img title="linux-kernel-menuconfig-ufs" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/12/linux-kernel-menuconfig-ufs.png" alt="linux-kernel-menuconfig-ufs" /></p>
<div class="nota"><strong>Importante:</strong> el soporte para escritura en UFS2 está en desarrollo y puede ser peligroso. Úsalo bajo tu propio riesgo <img src='http://casidiablo.net/wordpress/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </div>
<p style="text-align: justify;">Ahora, habilitaremos el soporte para FreeBSD disklabel:</p>
<div class="consola">-&gt; File systems<br />
-&gt; Partition Types<br />
[*] Advanced partition selection<br />
[*] PC BIOS (MSDOS partition tables) support<br />
[*]    BSD disklabel (FreeBSD partition tables)</div>
<p style="text-align: justify;">Verás algo como esto:</p>
<p style="text-align: center;"><img title="linux-kernel-menuconfig-ufs" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/12/linux-kernel-menuconfig-ufs-2.png" alt="linux-kernel-menuconfig-ufs" /></p>
<p style="text-align: justify;">Bien, con estas opciones habilitadas solo nos queda compilar e instalar el kernel:</p>
<div class="consola">make &amp;&amp; cp arch/x86_64/boot/bzImage /boot/kernel-2.6.32</div>
<div class="nota"><strong>Nota:</strong> Estoy asumiendo que ya te desenvuelves perfectamente con el kernel, es decir, que tienes experiencia compilando y configurándolo. Si no es el caso, deberías aprender: es divertido.</div>
<p style="text-align: justify;">
<h3>1. Buscando los nombres de las particiones</h3>
<p style="text-align: justify;">Cuando estamos trabajando con FreeBSD, los nombres que se asignan a las particiones son del tipo: /dev/ad0s3a. Pero, como estamos trabajando con Linux, en realidad seguiremos usando nombres del tipo /dev/sda* o /dev/hda*. Así que, gracias al soporte para FreeBSD Disklabel que hemos habilitado, podemos trabajar con los nombres convencionales:</p>
<div class="consola">cat /proc/partitions</div>
<p style="text-align: justify;">Verás algo como esto:</p>
<div class="consola">major minor  #blocks  name<br />
8        0  244198584 sda<br />
8        1   41624383 sda1<br />
8        2  158497290 sda2<br />
8        3   39076695 sda3<br />
8        4    5000184 sda4<br />
8        5     524288 sda5<br />
8        6    4194304 sda6<br />
8        7    5223424 sda7<br />
8        8     524288 sda8<br />
8        9   28610391 sda9</div>
<p style="text-align: justify;">
<h3>2. Montando las particiones UFS</h3>
<p style="text-align: justify;">Para montar una partición UFS ejecutaremos el siguiente comando (supongamos que /dev/sda7 es una de las particiones *BSD):</p>
<div class="consola">mount -t ufs -o ufstype=ufs2 /dev/sda7 /media/freebsd</div>
<p style="text-align: justify;">Por supuesto, podemos añadir una entrada al archivo /etc/fstab para que la partición se monte automáticamente al iniciar el sistema operativo:</p>
<div class="consola">/dev/sda7        /media/freebsd    ufs        ufstype=ufs2    0 0</div>
<p style="text-align: justify;">¡Eso es todo! Si tienes algún problema o sugerencia no dudes en comentar.</p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/montar-particione-bsd-linux/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Mounting *BSD partitions/slices on Linux</title>
		<link>http://casidiablo.net/mount-freebsd-partition-slice-linux/</link>
		<comments>http://casidiablo.net/mount-freebsd-partition-slice-linux/#comments</comments>
		<pubDate>Fri, 01 Jan 2010 05:02:03 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[gentoo]]></category>
		<category><![CDATA[kernel]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[bsd]]></category>
		<category><![CDATA[netbsd]]></category>
		<category><![CDATA[openbsd]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3544</guid>
		<description><![CDATA[Some times it&#8217;s necessary to work with UFS (the default filesystem on FreeBSD, OpenBSD, NetBSD, etc.) from your linux box. Here I&#8217;ll explain how to do so by configuring your kernel in order to enable UFS read/write support. We&#8217;ll focus on FreeBSD. Also, as you should know, FreeBSD uses its own hard disk partition scheme [...]]]></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%252Fmount-freebsd-partition-slice-linux%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Mounting%20%2ABSD%20partitions%2Fslices%20on%20Linux%22%20%7D);"></div>
<p style="text-align: center;"><img class="size-full wp-image-3547 aligncenter" title="tux_beastie" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/12/tux_beastie.png" alt="" width="450" height="243" /></p>
<p style="text-align: justify;">Some times it&#8217;s necessary to work with UFS (the default filesystem on FreeBSD, OpenBSD, NetBSD, etc.) from your linux box. Here I&#8217;ll explain how to do so by configuring your kernel in order to enable UFS read/write support. We&#8217;ll focus on FreeBSD.</p>
<p style="text-align: justify;">Also, as you should know, FreeBSD uses its own hard disk partition scheme on your PC. It requires only one entry in the primary partition table of your disk and manages it similarly to DOS extended partitions, putting in its first sector a new partition table in BSD disklabel format. So we&#8217;ll enable support for reading these disklabels; otherwise we just will be able to mount the root &#8216;slice&#8217; of FreeBSD but not the partitions &#8216;inside&#8217;.</p>
<p style="text-align: justify;">
<h3>0. Preparing your kernel</h3>
</p>
<p style="text-align: justify;">You may already have support for UFS and BSD disklabel format, but I&#8217;ll assume that you have built your kernel by your self and/or don&#8217;t have those options enabled.</p>
<p style="text-align: justify;">So, let&#8217;s get into the menu configuration of your kernel (I&#8217;m using Linux kernel 2.6.32):</p>
<p><span id="more-3544"></span></p>
<div class="consola">cd /usr/src/linux<br />
make menuconfig</div>
<p style="text-align: justify;">Now, we are going to activate these options:</p>
<div class="consola">-&gt; File systems<br />
-&gt; Miscellaneous filesystems<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;*&gt; UFS file system support (read only)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[*] UFS file system write support</div>
<p style="text-align: justify;">It&#8217;ll look like this:</p>
<p style="text-align: center;"><img src="http://casidiablo.net/wordpress/wp-content/uploads/2009/12/linux-kernel-menuconfig-ufs.png" alt="linux-kernel-menuconfig-ufs" title="linux-kernel-menuconfig-ufs" />
</p>
<div class="nota"><strong>Important:</strong> write support for UFS2 is on development and could be dangerous. Use it at your own risk <img src='http://casidiablo.net/wordpress/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </div>
<p style="text-align: justify;">Now, we&#8217;ll enable the FreeBSD disklabel support:</p>
<div class="consola">-&gt; File systems<br />
&nbsp;&nbsp;&nbsp;&nbsp;-&gt; Partition Types<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[*] Advanced partition selection<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[*] PC BIOS (MSDOS partition tables) support<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[*]&nbsp;&nbsp;&nbsp;&nbsp;BSD disklabel (FreeBSD partition tables)</div>
<p style="text-align: justify;">It&#8217;ll look like this:</p>
<p style="text-align: center;"><img src="http://casidiablo.net/wordpress/wp-content/uploads/2009/12/linux-kernel-menuconfig-ufs-2.png" alt="linux-kernel-menuconfig-ufs" title="linux-kernel-menuconfig-ufs" />
</p>
<p style="text-align: justify;">OK&#8230; with these options enabled we just need to compile our kernel and install it:</p>
<div class="consola">make &amp;&amp; cp arch/x86_64/boot/bzImage /boot/kernel-2.6.32</div>
<div class="nota"><strong>Note:</strong> I&#8217;m assuming you already know how to work with the kernel&#8230; the line above will work fine for me, but some of you guys will use other kind of settings for your boot loader (for instance, those of you who use initramfs). In conclusion: I expect you know how to compile and configure your kernel for this kind of situations.</div>
<p style="text-align: justify;">
<h3>1. Looking for partitions names</h3>
</p>
<p style="text-align: justify;">When working with FreeBSD, the disks device names are like this: /dev/ad0s3a. But, as we are working with Linux, we&#8217;ll have the traditional /dev/sda* or /dev/hda* names. So, thanks to the FreeBSD Disklabel support that we&#8217;ve just added, we can do this in order to know the devices names:</p>
<div class="consola">cat /proc/partitions</div>
<p style="text-align: justify;">You&#8217;ll get something like this:</p>
<div class="consola">major minor  #blocks  name<br />
8        0  244198584 sda<br />
8        1   41624383 sda1<br />
8        2  158497290 sda2<br />
8        3   39076695 sda3<br />
8        4    5000184 sda4<br />
8        5     524288 sda5<br />
8        6    4194304 sda6<br />
8        7    5223424 sda7<br />
8        8     524288 sda8<br />
8        9   28610391 sda9</div>
<p style="text-align: justify;">
<h3>2. Mounting UFS</h3>
</p>
<p style="text-align: justify;">In order to mount a UFS partition you&#8217;ll need to type this (suppose /dev/sda7 is one of the *BSD partitions):</p>
<div class="consola">mount -t ufs -o ufstype=ufs2 /dev/sda7 /media/freebsd</div>
<p style="text-align: justify;">Of course, you can add an entry to your /etc/fstab file so the partition get mounted each time you boot your system:</p>
<div class="consola">/dev/sda7        /media/freebsd    ufs        ufstype=ufs2    0 0</div>
<p style="text-align: justify;">That&#8217;s it. Let me know if you have any problem. And sorry for my English, I&#8217;m just learning <img src='http://casidiablo.net/wordpress/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/mount-freebsd-partition-slice-linux/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Configurar GRUB y GRUB2 para cargar FreeBSD</title>
		<link>http://casidiablo.net/modificar-grub-iniciar-bsd/</link>
		<comments>http://casidiablo.net/modificar-grub-iniciar-bsd/#comments</comments>
		<pubDate>Thu, 31 Dec 2009 03:53:09 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[bsd]]></category>
		<category><![CDATA[grub]]></category>
		<category><![CDATA[how-to]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3534</guid>
		<description><![CDATA[Al instalar sistemas operativos adicionales a los que tenemos generalmente nos dan la opción de instalar un boot loader en el MBR. Esto sobre escribe nuestro anterior boot loader (GRUB o Lilo en la mayoría de los casos), así que es preferible no tocar el MBR. En este pequeño tip les mostraré cómo configurar GRUB [...]]]></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%252Fmodificar-grub-iniciar-bsd%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Configurar%20GRUB%20y%20GRUB2%20para%20cargar%20FreeBSD%22%20%7D);"></div>
<p style="text-align: justify;"><img style="float: left;" title="freebsd-linux" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/12/freebsd-linux.jpg" alt="linux freebsd" />Al instalar sistemas operativos adicionales a los que tenemos generalmente nos dan la opción de instalar un boot loader en el MBR. Esto sobre escribe nuestro anterior boot loader (GRUB o Lilo en la mayoría de los casos), así que es preferible no tocar el MBR.</p>
<p style="text-align: justify;">En este pequeño tip les mostraré cómo configurar GRUB para iniciar aquel hermoso sistema FreeBSD que acabas de instalar junto a tu Linux. La verdad es muy sencillo, lo único que debes hacer es añadir lo siguiente al archivo <strong>/boot/grub/menu.lst</strong>:</p>
<div class="consola">title  FreeBSD 8.0<br />
root   (hd0,a)<br />
kernel /boot/loader</div>
<p style="text-align: justify;">Una breve explicación:</p>
<ul>
<li style="text-align: justify;"><strong>title  FreeBSD 8.0 </strong>: Crea un nuevo ítem en el menú y le pone el título &#8216;FreeBSD 8.0&#8242; (en realidad puedes colocar lo que quieras).</li>
<li style="text-align: justify;"><strong>root   (hd0,a)</strong> : Seleccionamos la partición raíz donde se encuentra FreeBSD. En el ejemplo hd0 es el primer disco duro (hda en Linux). En GRUB hda es hd0. Así, por ejemplo, hda2 (segunda partición del primer disco) es hd0,1 en Grub. Además, recuerda que FreeBSD usa nombres del tipo a, b, c para representar los nombres de las particiones. Si tuvieras instalado FreeBSD en la tercera partición entonces tendrías que usar:<strong> root   (hd0,2,a)</strong></li>
<li style="text-align: justify;"><strong>kernel /boot/loader</strong> : Se usa para cargar la imagen de boot principal. FreeBSD usa /boot/loader para cargar el resto del kernel y OS.</li>
</ul>
<p style="text-align: justify;">
<h3>Actualizaci&oacute;n: entrada para GRUB2</h3>
</p>
<p style="text-align: justify;">Si est&aacute;s usando GRUB2 entonces deber&aacute;s modificar tu archivo <code>/boot/grub/grub.cfg</code> y a&ntilde;adir esto:</p>
<div class="consola">menuentry &#8220;FreeBSD 8.0&#8243; {<br />
	set root=(hd0,1,a)<br />
	chainloader +1<br />
}</div>
<p>Fuente: <a href="http://lists.freebsd.org/pipermail/freebsd-hackers/2004-May/006944.html">Lista de correo FreeBSD</a> | <a href="http://forums.freebsd.org/showthread.php?t=5918">Foros FreeBSD</a></p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/modificar-grub-iniciar-bsd/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
	</channel>
</rss>

