<?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</title>
	<atom:link href="http://casidiablo.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://casidiablo.net</link>
	<description>Blog de Java, Programación y Linux</description>
	<lastBuildDate>Mon, 08 Mar 2010 03:41:21 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>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 foto [...]]]></description>
			<content:encoded><![CDATA[
<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>


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

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

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

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

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


	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/area/" rel="tag nofollow">area</a>, <a href="http://casidiablo.net/tag/awt/" rel="tag nofollow">awt</a>, <a href="http://casidiablo.net/tag/ide/" rel="tag nofollow">ide</a>, <a href="http://casidiablo.net/tag/java/" rel="tag nofollow">java</a>, <a href="http://casidiablo.net/tag/jpoupmenu/" rel="tag nofollow">jpoupmenu</a>, <a href="http://casidiablo.net/tag/linux/" rel="tag nofollow">linux</a>, <a href="http://casidiablo.net/tag/mac/" rel="tag nofollow">mac</a>, <a href="http://casidiablo.net/tag/notificacion/" rel="tag nofollow">notificacion</a>, <a href="http://casidiablo.net/tag/system-tray/" rel="tag nofollow">system tray</a>, <a href="http://casidiablo.net/tag/systray/" rel="tag nofollow">systray</a>, <a href="http://casidiablo.net/tag/windows/" rel="tag nofollow">Windows</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/systray-java-ejemplo/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Convertir XML a Array en PHP</title>
		<link>http://casidiablo.net/parser-xml-php/</link>
		<comments>http://casidiablo.net/parser-xml-php/#comments</comments>
		<pubDate>Tue, 02 Feb 2010 06:10:35 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[dom]]></category>
		<category><![CDATA[parser]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[xml]]></category>
		<category><![CDATA[xml2array]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3614</guid>
		<description><![CDATA[
PHP posee una completa API para la manipulación de archivos XML. Sin embargo, algunas veces queremos hacer cosas muy simples y no vale la pena construir manualmente un script que sirva de parser de un archivo XML. En esos casos, podemos hacer uso de una función llamada xml2array.
La idea es bastante simple: le pasamos como [...]]]></description>
			<content:encoded><![CDATA[
<p style="text-align: justify;">PHP posee una <a href="http://www.php.net/manual/en/book.xml.php">completa API para la manipulación de archivos XML</a>. Sin embargo, algunas veces queremos hacer cosas muy simples y no vale la pena construir manualmente un script que sirva de parser de un archivo XML. En esos casos, podemos hacer uso de una función llamada <a href="http://www.bin-co.com/php/scripts/xml2array/">xml2array</a>.</p>
<p style="text-align: justify;">La idea es bastante simple: le pasamos como argumento el string de un archivo XML y nos retorna un array asociativo con los datos del mismo. Los pasos son los siguientes:</p>
<p style="text-align: justify;">
<h3>0. Descargar la función</h3>
<p style="text-align: justify;">Lo primero es <a href="http://www.bin-co.com/php/scripts/xml2array/">descargar la función de aquí</a>. Copias el código PHP y lo pones en un archivo con nombre xml2array.php</p>
<p style="text-align: justify;">
<h3>1. Ejecutar la función [ejemplo]</h3>
<p style="text-align: justify;">Debemos usar la función <a href="http://php.net/manual/en/function.file-get-contents.php"><code>file_get_contents</code></a> para obtener el string con el XML que pasaremos como parámetro a la función. Suponiendo que tenemos este archivo XML:</p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: xml;">&lt;?xml version=&quot;1.0&quot; encoding=&quot;iso-8859-1&quot;?&gt;
&lt;distros type=&quot;linux&quot;&gt;
    &lt;nombre id=&quot;1&quot;&gt;Gentoo&lt;/nombre&gt;
    &lt;nombre id=&quot;2&quot;&gt;Arch&lt;/nombre&gt;
    &lt;nombre id=&quot;3&quot;&gt;Exherbo&lt;/nombre&gt;
&lt;/distros&gt;</pre>
<p><!--INFOLINKS_ON--></p>
<p style="text-align: justify;">Podríamos usar xml2array así:</p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: php; highlight: [4];">&lt;?php
require(&quot;xml2array.php&quot;);
$contenido = file_get_contents('datos.xml');
$resultado = xml2array($contenido);
var_dump($resultado);
?&gt;</pre>
<p><!--INFOLINKS_ON--><br />
El resultado sería el dump del array:<span id="more-3614"></span><br />
<!--INFOLINKS_OFF-->
<pre class="brush: php;">array(2) {
  [&quot;distros&quot;]=&gt;
  array(1) {
    [&quot;nombre&quot;]=&gt;
    array(6) {
      [0]=&gt;
      string(6) &quot;Gentoo&quot;
      [1]=&gt;
      string(4) &quot;Arch&quot;
      [&quot;0_attr&quot;]=&gt;
      array(1) {
        [&quot;id&quot;]=&gt;
        string(1) &quot;1&quot;
      }
      [&quot;1_attr&quot;]=&gt;
      array(1) {
        [&quot;id&quot;]=&gt;
        string(1) &quot;2&quot;
      }
      [2]=&gt;
      string(7) &quot;Exherbo&quot;
      [&quot;2_attr&quot;]=&gt;
      array(1) {
        [&quot;id&quot;]=&gt;
        string(1) &quot;3&quot;
      }
    }
  }
  [&quot;distros_attr&quot;]=&gt;
  array(1) {
    [&quot;type&quot;]=&gt;
    string(5) &quot;linux&quot;
  }
}</pre>
<p><!--INFOLINKS_ON--></p>
<p style="text-align: justify;">Veamos un ejemplo un poco más avanzado. Vamos a procesar un documento XML que proporciona Mercado Libre con productos a la venta; además vamos a mostrar un listado HTML con dichos productos:</p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: php;">&lt;?php
require(&quot;xml2array.php&quot;);
$contenido = file_get_contents('http://www.mercadolibre.com.co/jm/searchXml?as_categ_id=1648');
$resultado = xml2array($contenido);
$items = $resultado['response']['listing']['items']['item'];
foreach($items as $item)
    if(isset($item['title'])){
        echo &quot;&lt;p&gt;&lt;a href='{$item['link']}'&gt;&quot;;
        echo &quot;&lt;img src='{$item['image_url']}'/&gt;&lt;br/&gt;&quot;;
        echo &quot;&lt;b&gt;{$item['title']}&lt;/b&gt;&lt;/a&gt;&lt;br&gt;&quot;;
        echo &quot;&lt;em&gt;{$item['subtitle']}&lt;/em&gt;&lt;br&gt;&quot;;
        echo &quot;&lt;em&gt;{$item['currency']}&lt;/em&gt; {$item['price']}&lt;/p&gt;&quot;;
    }
?&gt;</pre>
<p><!--INFOLINKS_ON--></p>
<p style="text-align: justify;">Ejecutando el ejemplo anterior obtendremos algo como lo siguiente:</p>
<p style="text-align: center;"><img src="http://casidiablo.net/wordpress/wp-content/uploads/2010/02/php-mercado-libre.png" alt="" title="php-mercado-libre" width="512" height="259" class="alignnone size-full wp-image-3620" /></p>
<p style="text-align: justify;">
<h3>Descarga de los ejemplos</h3>
</p>
<p style="text-align: justify;">Puedes descargar los archivos usados en los ejemplos anteriores. Ten en cuenta que la versión de la función que está en la descarga es la última a la fecha (1 de febrero de 2010). Aunque funciona muy bien, los autores tienden a actualizarla, así que podrías echar un vistazo a la página oficial en busca de nuevas versiones.</p>
<p style="text-align: justify;"><a href="http://casidiablo.net/descargar/Ejemplo+Xml2Array" class="descargacodigo">Descargar código fuente</a></p>


	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/dom/" rel="tag nofollow">dom</a>, <a href="http://casidiablo.net/tag/parser/" rel="tag nofollow">parser</a>, <a href="http://casidiablo.net/tag/php/" rel="tag nofollow">PHP</a>, <a href="http://casidiablo.net/tag/programacion/" rel="tag nofollow">programación</a>, <a href="http://casidiablo.net/tag/xml/" rel="tag nofollow">xml</a>, <a href="http://casidiablo.net/tag/xml2array/" rel="tag nofollow">xml2array</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/parser-xml-php/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Reorganización en las Certificaciones de Sun</title>
		<link>http://casidiablo.net/cambio-certificaciones-sun-oracle-java/</link>
		<comments>http://casidiablo.net/cambio-certificaciones-sun-oracle-java/#comments</comments>
		<pubDate>Mon, 01 Feb 2010 12:56:48 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[noticias]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3609</guid>
		<description><![CDATA[
Luego de la adquisición de Sun por parte de Oracle es obvio que comencemos a ver muchos cambios. Hay uno en especial que me parece bastante importante y es la reorganización de las certificaciones de Sun. Lo primero es que ahora, es necesario tener el certificado básico de Java para poder acceder a las demás [...]]]></description>
			<content:encoded><![CDATA[
<p style="text-align: justify;">Luego de la <a href="http://www.oracle.com/us/sun/index.htm">adquisición de Sun por parte de Oracle</a> es obvio que comencemos a ver muchos cambios. Hay uno en especial que me parece bastante importante y es la <strong>reorganización de las certificaciones de Sun</strong>. Lo primero es que ahora, es necesario tener el certificado básico de <a href="http://casidiablo.net">Java</a> para poder acceder a las demás certificaciones. Además hay más certificaciones y con un enfoque un poco más específico.</p>
<p style="text-align: justify;">Este es un <strong>esquema del antiguo modelo</strong> de certificaciones de Sun:</p>
<p style="text-align: center;"><img class="size-full wp-image-3610 aligncenter" title="sun_cert_hierarchy_old" src="http://casidiablo.net/wordpress/wp-content/uploads/2010/02/sun_cert_hierarchy_old.png" alt="" width="608" height="203" /></p>
<p>Este es el nuevo esquema de Oracle/Sun:</p>
<p style="text-align: center;"><img class="size-full wp-image-3611 aligncenter" title="sun_cert_hierarchy_new" src="http://casidiablo.net/wordpress/wp-content/uploads/2010/02/sun_cert_hierarchy_new.png" alt="" width="609" height="558" /></p>
<p style="text-align: justify;">Como pueden apreciar, con la combinación de algunas de estas certificaciones se logra un &#8220;Master&#8221;.</p>
<p style="text-align: justify;">De momento parece bien&#8230; aunque leo lo siguiente:</p>
<p style="text-align: justify; padding-left: 30px;"><em><strong>Available only in United States, Australia, Canada, Belgium, Czech Republic, Germany, Hungary, Hong Kong, Italy, Luxembourg, Netherlands, Singapore, Spain, Switzerland, United Kingdom.</strong></em><em><strong> </strong></em></p>
<p style="text-align: justify;">Es decir, los que vivimos en Latinoamérica tendremos que esperar un poco <img src='http://casidiablo.net/wordpress/wp-includes/images/smilies/icon_mrgreen.gif' alt=':mrgreen:' class='wp-smiley' />  ¿qué les parece el cambio?</p>

No hay etiquetas para esta entrada.]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/cambio-certificaciones-sun-oracle-java/feed/</wfw:commentRss>
		<slash:comments>6</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[Debian]]></category>
		<category><![CDATA[Fedora]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[bsd]]></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 querer que [...]]]></description>
			<content:encoded><![CDATA[
<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>
<p><!--INFOLINKS_OFF-->
<pre class="brush: bash;">#!/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>
<p><!--INFOLINKS_ON--></p>
<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>
<p><!--INFOLINKS_OFF-->
<pre class="brush: bash;">#!/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>
<p><!--INFOLINKS_ON--></p>
<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>
<p><!--INFOLINKS_OFF-->
<pre class="brush: bash;">#!/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>
<p><!--INFOLINKS_ON--></p>
<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>
<p><!--INFOLINKS_OFF-->
<pre class="brush: bash;">#!/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><!--INFOLINKS_ON--></p>
<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>
<p><!--INFOLINKS_OFF-->
<pre class="brush: bash;">#!/bin/bash
FOO=
: ${FOO?&quot;No existe la variable FOO&quot;}
echo &quot;esto si se va a imprimir&quot;</pre>
<p><!--INFOLINKS_ON--></p>
<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>
<p><!--INFOLINKS_OFF-->
<pre class="brush: bash;">#!/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><!--INFOLINKS_ON--></p>
<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>
<p><!--INFOLINKS_OFF-->
<pre class="brush: bash;">#!/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><!--INFOLINKS_ON--></p>
<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>
<p><!--INFOLINKS_OFF-->
<pre class="brush: bash;">#!/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>
<p><!--INFOLINKS_ON--></p>
<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>
<p><!--INFOLINKS_OFF-->
<pre class="brush: bash;">#!/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>
<p><!--INFOLINKS_ON--></p>
<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>


	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/comandos/" rel="tag nofollow">comandos</a>, <a href="http://casidiablo.net/tag/linux/" rel="tag nofollow">linux</a>, <a href="http://casidiablo.net/tag/script/" rel="tag nofollow">script</a>, <a href="http://casidiablo.net/tag/shell/" rel="tag nofollow">shell</a>, <a href="http://casidiablo.net/tag/unix/" rel="tag nofollow">unix</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/codigos-de-shell-script-utiles/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Tip rápido: dumps de MySQL compatibles con versiones anteriores</title>
		<link>http://casidiablo.net/mysqldump-compatible-mysql4/</link>
		<comments>http://casidiablo.net/mysqldump-compatible-mysql4/#comments</comments>
		<pubDate>Fri, 22 Jan 2010 13:40:17 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[tips]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[tip]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3529</guid>
		<description><![CDATA[
MySQL nos permite hacer &#8220;dumps&#8221; de una base de datos que básicamente es una copia de la base de datos pero en un script SQL listo para ejecutar. Cuando tenemos distintas versiones de MySQL es común obtener errores como este al intentar restaurar un &#8216;backup&#8217;:

ERROR 1064 at line XX: You have an error in your [...]]]></description>
			<content:encoded><![CDATA[
<p style="text-align: justify;">MySQL nos permite hacer &#8220;dumps&#8221; de una base de datos que básicamente es una copia de la base de datos pero en un script SQL listo para ejecutar. Cuando tenemos distintas versiones de MySQL es común obtener errores como este al intentar restaurar un &#8216;backup&#8217;:</p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: plain; pad-line-numbers: false; toolbar: false;">ERROR 1064 at line XX: You have an error in your SQL syntax.  Check the manual that corresponds to your MySQL server version for the right syntax to use near 'ENGINE=MyISAM DEFAULT CHARSET=latin1' at line 8</pre>
<p><!--INFOLINKS_ON--></p>
<p style="text-align: justify;">Para evitar esto es necesario indicar al mysqldump que queremos crear un script SQL compatible con versiones anteriores. Por ejemplo, para hacer un backup en MySQL 5 que sea compatible con MySQL 4 ejecutamos mysqldump así:</p>
<div class="consola">mysqldump -uusuario -ppassword nombre_bd &#8211;compatible=mysql40 &gt; script_compatible.sql</div>
<p>¡Es todo! Espero les sea de utilidad.</p>


	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/howto/" rel="tag nofollow">howto</a>, <a href="http://casidiablo.net/tag/mysql/" rel="tag nofollow">MySQL</a>, <a href="http://casidiablo.net/tag/tip/" rel="tag nofollow">tip</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/mysqldump-compatible-mysql4/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>¡Hemos vuelto! ¡Y con muchos cambios!</title>
		<link>http://casidiablo.net/hemos-vuelto-y-con-muchos-cambios/</link>
		<comments>http://casidiablo.net/hemos-vuelto-y-con-muchos-cambios/#comments</comments>
		<pubDate>Wed, 20 Jan 2010 13:47:41 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[noticias]]></category>
		<category><![CDATA[off-topic]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3564</guid>
		<description><![CDATA[
¡Hola querido lector! Comenzamos el año con nuevos cambios en el blog que, aunque lo tengo un poco descuidado, no puedo dejarlo a un lado porque es el proyecto al que más le tengo cariño. Hay varias cosas por contar, así que seré breve para no aburrirlos.
Temas&#8230;
Los que siguen el blog desde hace tiempo sabrán [...]]]></description>
			<content:encoded><![CDATA[
<p style="text-align: justify;">¡Hola querido lector! Comenzamos el año con nuevos cambios en el blog que, aunque lo tengo un poco descuidado, no puedo dejarlo a un lado porque es el proyecto al que más le tengo cariño. Hay varias cosas por contar, así que seré breve para no aburrirlos.</p>
<h3>Temas&#8230;</h3>
<p style="text-align: justify;">Los que siguen el blog desde hace tiempo sabrán que este fue un espacio en donde se hablaba un poco de programación y algo de Linux (tips y howtos más que nada). Los temas siguen y seguirán siendo parecidos, aunque como habrán notado <strong>hemos</strong> puesto algunas cosas un poquito más avanzadas, que no son tan bien recibidas como los tips rápidos pero que <strong>tenemos</strong> la necesidad de compartir dichos conocimientos. Por supuesto, intentaremos publicar entradas más agradables y con más frecuencia.</p>
<h3>Nuevo integrante en el blog&#8230;</h3>
<p style="text-align: justify;">Algunos ya lo habrán notado&#8230; hay un nuevo integrante en el blog: Cortex. Y como él es algo tímido y no se ha querido presentar formalmente, tendrá que aguantarse la descripción que le daré: Cortex es un geek-linuxero-paisa-9fan bastante inteligente y un excelente amigo. Ya ha escrito algunos artículos que, como comentaba anteriormente, son un poco más avanzados de lo que solía poner antes (<a href="http://casidiablo.net/usando-b43-para-tarjetas-inalambricas-bcm4312-en-linux/">Usando b43 para tarjetas inalámbricas BCM43xx en Linux</a>, <a href="../../trabajando-con-el-kernel-linux-i/">Trabajando con el Kernel Linux (I)</a> y (<a href="http://casidiablo.net/trabajando-con-el-kernel-linux-ii/">II</a>)). Qué más puedo decir de él&#8230; es como el Chuck Norris Linuxero de Medellín&#8230; es de los que configura el kernel de Linux con los ojos cerrados&#8230; de los que navegan por internet solo con netcat&#8230; de los que usan un teclado con solo dos teclas (1 y 0)&#8230; etc. Es todo un personaje&#8230; <a class="external" href="http://twitter.com/c0rtex">este es su twitter</a> para los que quieran seguirlo.</p>
<h3>Nueva plantilla&#8230;</h3>
<p style="text-align: justify;">La plantilla anterior es bastante bonita, llena de detalles e imágenes elegantes (el autor es un genio). Pero ya estaba algo cansado de muchas cosas: el blog era demasiado lento, tenía muchos scripts sueltos, muchas imágenes separadas, además la columna del contenido era demasiado angosta por lo que algunos de los códigos que pongo no se veían bien.</p>
<p style="text-align: justify;">Así que he puesto una plantilla mucho más limpia, liviana, donde uso imágenes en sprites para reducir el número de peticiones al servidor, con menos scripts y efectos especiales, etc. Algo más simple, y en donde lo más importante es el contenido. He cambiado muchos de los estilos con los que se mostraba el contenido y ahora se ve un poco más limpio y bonito que antes. Además <strong>he quitado los anuncios publicitarios de Adsense del contenido para los que lleguen a través del feed</strong>. Échale un vistazo y nos cuentas <img src='http://casidiablo.net/wordpress/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<h3>Un sitio profesional para los video tutoriales: <a title="Video tutoriales sobre Java y Linux" href="http://casidiablo.tv/">casidiablo.TV</a></h3>
<p style="text-align: justify;">Se ha adquirido un nuevo dominio para la sección de video tutoriales: <a href="http://casidiablo.tv/">http://casidiablo.tv.</a> Tal vez ya hayas visto esa sección, y si no te invito a que la visites. El diseño es bastante bueno, no tiene desperdicio y la idea es seguir &#8216;produciendo&#8217; algunos video tutoriales sobre Linux y programación. Por supuesto, si has creado algún tipo de material multimedia y quieres compartirlo, no dudes en contactarnos.</p>
<p style="text-align: center;"><a href="http://casidiablo.tv"><img title="casidiablo.tv" src="http://casidiablo.net/wordpress/wp-content/uploads/2010/01/casidiablo.tv_.png" alt="casidiablo.tv" /></a></p>
<p style="text-align: justify;">
<h3>Regalos para los lectores&#8230;</h3>
<p style="text-align: justify;">Les anticipo que estoy planeando realizar algún tipo de sorteo entre los lectores fieles del blog. Ya hace más o menos 4 años que comenzó este proyecto y no he hecho algo de ese estilo, así que ya viene siendo hora. De momento se me ocurre regalar camisetas, posillos o termos como este, por ejemplo:</p>
<p style="text-align: center;"><img title="regalos" src="http://casidiablo.net/wordpress/wp-content/uploads/2010/01/regalos.jpg" alt="regalos" /></p>
<p style="text-align: justify;">Claro, todo a su debido tiempo y cuando estemos un poco mejor  monetariamente <img src='http://casidiablo.net/wordpress/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p style="text-align: justify;">Eso es todo por el momento. Esperamos que les guste el cambio y si tienen alguna sugerencia no duden en comentar.</p>

No hay etiquetas para esta entrada.]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/hemos-vuelto-y-con-muchos-cambios/feed/</wfw:commentRss>
		<slash:comments>25</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[FreeBSD]]></category>
		<category><![CDATA[bsd]]></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[
<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>


	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/bsd/" rel="tag nofollow">bsd</a>, <a href="http://casidiablo.net/tag/freebsd/" rel="tag nofollow">FreeBSD</a>, <a href="http://casidiablo.net/tag/linux/" rel="tag nofollow">linux</a>, <a href="http://casidiablo.net/tag/netbsd/" rel="tag nofollow">netbsd</a>, <a href="http://casidiablo.net/tag/openbsd/" rel="tag nofollow">openbsd</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/montar-particione-bsd-linux/feed/</wfw:commentRss>
		<slash:comments>5</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 on [...]]]></description>
			<content:encoded><![CDATA[
<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 &#8217;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>


	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/bsd/" rel="tag nofollow">bsd</a>, <a href="http://casidiablo.net/tag/freebsd/" rel="tag nofollow">FreeBSD</a>, <a href="http://casidiablo.net/tag/linux/" rel="tag nofollow">linux</a>, <a href="http://casidiablo.net/tag/netbsd/" rel="tag nofollow">netbsd</a>, <a href="http://casidiablo.net/tag/openbsd/" rel="tag nofollow">openbsd</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/mount-freebsd-partition-slice-linux/feed/</wfw:commentRss>
		<slash:comments>3</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 para [...]]]></description>
			<content:encoded><![CDATA[
<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>


	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/bsd/" rel="tag nofollow">bsd</a>, <a href="http://casidiablo.net/tag/freebsd/" rel="tag nofollow">FreeBSD</a>, <a href="http://casidiablo.net/tag/grub/" rel="tag nofollow">grub</a>, <a href="http://casidiablo.net/tag/how-to/" rel="tag nofollow">how-to</a>, <a href="http://casidiablo.net/tag/linux/" rel="tag nofollow">linux</a>, <a href="http://casidiablo.net/tag/tips/" rel="tag nofollow">tips</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/modificar-grub-iniciar-bsd/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
	</channel>
</rss>
