<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Bits y Bytes</title>
	<atom:link href="http://ivanator.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://ivanator.wordpress.com</link>
	<description>Desarrollo de software, agilismo y Java</description>
	<lastBuildDate>Sat, 24 Sep 2011 11:13:33 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='ivanator.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Bits y Bytes</title>
		<link>http://ivanator.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://ivanator.wordpress.com/osd.xml" title="Bits y Bytes" />
	<atom:link rel='hub' href='http://ivanator.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Escribir lapso temporal en java</title>
		<link>http://ivanator.wordpress.com/2010/07/28/escribir-lapso-temporal-en-java/</link>
		<comments>http://ivanator.wordpress.com/2010/07/28/escribir-lapso-temporal-en-java/#comments</comments>
		<pubDate>Wed, 28 Jul 2010 16:13:50 +0000</pubDate>
		<dc:creator>Iván Párraga García</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[logging]]></category>

		<guid isPermaLink="false">http://ivanator.wordpress.com/?p=435</guid>
		<description><![CDATA[A veces necesario poder calcular el tiempo de ejecución de una parte del código. Ello puede ser porque estemos perfilando una aplicación o porque simplemente queramos dejar constancia de ello en algún fichero de log o en alguna consola de debugging. En particular es algo que necesito muy a menudo así que lo tengo encapsulado [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ivanator.wordpress.com&amp;blog=6092394&amp;post=435&amp;subd=ivanator&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>A veces necesario poder calcular el tiempo de ejecución de una parte del código. Ello puede ser porque estemos perfilando una aplicación o porque simplemente queramos dejar constancia de ello en algún fichero de log o en alguna consola de debugging.</p>
<p>En particular es algo que necesito muy a menudo así que lo tengo encapsulado en el siguiente método estática en una clase de utilidades:</p>
<pre>public class Time {
	/**
	 * @param initial Initial time in milliseconds.
	 * @return a message with the shape: "xxx seconds (YYY millis)"
	 */
	public static String getLapseTimeMessage(long initial) {
		TimeUnit secondsUnit = TimeUnit.SECONDS;
		TimeUnit millisUnit = TimeUnit.MILLISECONDS;

		long timeLapse = System.currentTimeMillis() - initial;
		long seconds = secondsUnit.convert(timeLapse, millisUnit);
		long millis = millisUnit.convert(timeLapse, millisUnit);

		return seconds + " seconds (" + millis + " millis)";
	}
	../..
}</pre>
<p>Una clase cliente la utilizaría como sigue:</p>
<pre>
long initial = 0;
if (logger.isDebugEnabled()) {
	initial = System.currentTimeMillis();
}

Parser parser=new ParserFactory().makeParser();
String text=this.programText;
this.program=parser.parse(text);//ParseException, IOException

logger.debug("Javascript parser needed " + Time.getLapseTimeMessage(initial));
</pre>
<p>Que dejaría una traza como la siguiente:</p>
<pre>
Javascript parser needed 1 seconds (1542 millis)
</pre>
<p>Obviamente esta es una aproximación muy básica que puede ser mejorada y más parametrizada, pero para casos sencillos cumple su cometido.</p>
<br /> Tagged: <a href='http://ivanator.wordpress.com/tag/java/'>Java</a>, <a href='http://ivanator.wordpress.com/tag/logging/'>logging</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ivanator.wordpress.com/435/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ivanator.wordpress.com/435/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ivanator.wordpress.com/435/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ivanator.wordpress.com/435/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/ivanator.wordpress.com/435/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/ivanator.wordpress.com/435/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/ivanator.wordpress.com/435/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/ivanator.wordpress.com/435/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ivanator.wordpress.com/435/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ivanator.wordpress.com/435/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ivanator.wordpress.com/435/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ivanator.wordpress.com/435/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ivanator.wordpress.com/435/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ivanator.wordpress.com/435/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ivanator.wordpress.com&amp;blog=6092394&amp;post=435&amp;subd=ivanator&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://ivanator.wordpress.com/2010/07/28/escribir-lapso-temporal-en-java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">ivanator</media:title>
		</media:content>
	</item>
		<item>
		<title>Oferta laboral: buscamos javeros</title>
		<link>http://ivanator.wordpress.com/2010/03/20/oferta-laboral-buscamos-javeros/</link>
		<comments>http://ivanator.wordpress.com/2010/03/20/oferta-laboral-buscamos-javeros/#comments</comments>
		<pubDate>Fri, 19 Mar 2010 23:32:35 +0000</pubDate>
		<dc:creator>Iván Párraga García</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://ivanator.wordpress.com/?p=430</guid>
		<description><![CDATA[Buscamos javeros para nuestro equipo. Si alguien está interesado, que no dude en decirme algo. Podéis encontrar la descripción del puesto completo en Infojobs en esta oferta. Estraído literalmente de dicha oferta: Buscamos programador Java con experiencia en J2EE para ampliar nuestro equipo IT, compuesto actualmente por 9 personas. El candidato se incorporará a un subequipo de [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ivanator.wordpress.com&amp;blog=6092394&amp;post=430&amp;subd=ivanator&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Buscamos javeros para nuestro equipo. Si alguien está interesado, que no dude en decirme algo. Podéis encontrar la descripción del puesto completo en Infojobs en <a href="https://www.infojobs.net/barcelona/desarrollador-java-j2ee/of-i632216023309420006153500372827" target="_blank">esta oferta</a>.</p>
<p>Estraído literalmente de dicha oferta:</p>
<blockquote><p>Buscamos programador Java con experiencia en J2EE para ampliar nuestro equipo IT, compuesto actualmente por 9 personas.</p>
<p>El candidato se incorporará a un subequipo de 3 personas dirigido por un arquitecto senior y trabajará en la ampliación funcional de una de nuestras aplicaciones propietarias, clave en la estrategia de la empresa.</p>
<p>Todo nuestro desarrollo (2 aplicaciones propietarias líderes en España y latinoamerica en el ámbito de la Investigación de Mercados) se basa en J2EE + MySQL.</p>
<p>Ofrecemos:</p>
<ul>
<li>remuneración en función de conocimientos técnicos y experiencia demostrable</li>
<li>formación a cargo de la empresa</li>
</ul>
<p>Aspectos destacados del trabajo en Netquest:</p>
<ol>
<li>Muy buen clima laboral.</li>
<li>Nos esforzamos por desarrollar software de calidad.</li>
<li>Aspiramos a convertir nuestra tecnología, lider en España y latinoamérica, en una de las tres mejores del mundo en su ámbito.</li>
</ol>
</blockquote>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ivanator.wordpress.com/430/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ivanator.wordpress.com/430/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ivanator.wordpress.com/430/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ivanator.wordpress.com/430/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/ivanator.wordpress.com/430/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/ivanator.wordpress.com/430/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/ivanator.wordpress.com/430/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/ivanator.wordpress.com/430/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ivanator.wordpress.com/430/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ivanator.wordpress.com/430/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ivanator.wordpress.com/430/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ivanator.wordpress.com/430/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ivanator.wordpress.com/430/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ivanator.wordpress.com/430/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ivanator.wordpress.com&amp;blog=6092394&amp;post=430&amp;subd=ivanator&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://ivanator.wordpress.com/2010/03/20/oferta-laboral-buscamos-javeros/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">ivanator</media:title>
		</media:content>
	</item>
		<item>
		<title>JLabel editable</title>
		<link>http://ivanator.wordpress.com/2010/02/24/jlabel-editable/</link>
		<comments>http://ivanator.wordpress.com/2010/02/24/jlabel-editable/#comments</comments>
		<pubDate>Tue, 23 Feb 2010 23:00:23 +0000</pubDate>
		<dc:creator>Iván Párraga García</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Swing]]></category>

		<guid isPermaLink="false">http://ivanator.wordpress.com/?p=424</guid>
		<description><![CDATA[Los JLabel son elementos no editables. Lo cual tiene sentido. Están pensadas para mostrar información, posiblemente, etiquetando otro elemento. En la aplicación que estoy construyendo queremos que unos componentes personalizados sirvan para mostrar información pero a su vez permitan editarla y queremos diferenciar claramente si el componente está en modo edición o no. En definitiva [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ivanator.wordpress.com&amp;blog=6092394&amp;post=424&amp;subd=ivanator&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Los JLabel son elementos no editables. Lo cual tiene sentido. Están pensadas para mostrar información, posiblemente, etiquetando otro elemento.</p>
<p>En la aplicación que estoy construyendo queremos que unos componentes personalizados sirvan para mostrar información pero a su vez permitan editarla y queremos diferenciar claramente si el componente está en modo edición o no. En definitiva queremos tener etiquetas que bajo según qué circunstancias se puedan editar. Puesto que el JLabel no nos brinda esta opción, hemos tenido que trabajar un poco más y crear un componente personalizado.</p>
<p>El truco consistente en tener un componente, por ejemplo un <em>JPanel</em>, con un <em>layout </em>del tipo <em>CardLayout</em> con dos &#8216;cartas&#8217; una de las cuales muestra una <em>JLabel </em>de toda la vida y otra un <em>JTextField</em>. El componente aporta la lógica para cambiar la carta en respuesta a ciertas interacciones del usuario. Si mantenemos el contenido de los dos componentes de forma coherente, tenemos la ilusión que la etiqueta se convierte en un campo de texto cuando entramos en modo edición y al revés al salir de este modo.</p>
<p>El siguiente código muestra una versión incipiente (pero funcional) de este &#8216;etiqueta editable&#8217;. Para entrar en modo edición hacemos doble click en la etiqueta y para salir del estado de edición pulsamos RETURN para confirmar los cambios o ESCAPE para cancelarlos.</p>
<p>Tomadlo como una prueba de concepto (que es lo que es) y no como una clase terminada con calidad industrial.</p>
<pre>public class EditableLabel extends JPanel {
	/** The user is editing the component (JTextField is shown at the moment) */
	private boolean editing;

	/** The confirm edition key is Return */
	private static final int confirmKeyCode = KeyEvent.VK_ENTER;

	/** The cancel edition key is Return */
	private static final int cancelKeyCode = KeyEvent.VK_ESCAPE;

	/** The value which holds this component */
	private String value;

	// graphical components

	private CardLayout cl;
	private JPanel pnlCards;
	private static final String TEXT_FIELD = "text field";
	private JTextField textField;
	private static final String LABEL = "label";
	private JLabel label;

	public EditableLabel(String initialText) {
		this.value = initialText;

		cl = new CardLayout();
		pnlCards = new JPanel(cl);
		textField = new JTextField();
		label = new JLabel(initialText);
		pnlCards.add(textField, TEXT_FIELD);
		pnlCards.add(label, LABEL);
		cl.show(pnlCards, LABEL);
		add(pnlCards);

		// register the listeners
		label.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				// if double click, set edition mode
				if (e.getClickCount() == 2) {
					startEdition();
				}
			}
		});

		textField.addKeyListener(new KeyAdapter() {
			@Override
			public void keyReleased(KeyEvent e) {
				if (e.getKeyCode() == confirmKeyCode) {
					/* confirmation key pressed, so changing to non-edition
					 * and confirm changes */
					confirmEdition();
				} else if (e.getKeyCode() == cancelKeyCode) {
					/* cancel key pressed, so changing to non edition and
					 * cancel the changes */
					cancelEdition();
				}
			}
		});
	}

	private void startEdition() {
		cl.show(pnlCards, TEXT_FIELD);
		textField.setText(value);
		textField.requestFocus();
		textField.selectAll();
	}

	private void cancelEdition() {
		textField.setText(value);
		cl.show(pnlCards, LABEL);
	}

	private void confirmEdition() {
		value = textField.getText();
		label.setText(value);
		cl.show(pnlCards, LABEL);
	}

	/**
	 * @return the value
	 */
	public String getValue() {
		return value;
	}

	/**
	 * @param value the value to set
	 */
	public void setValue(String value) {
		this.value = value;
	}

	/**
	 * @return returns true if the component is currently showing the text
	 *  field or false otherwise.
	 */
	public boolean isEditing() {
		return editing;
	}
}</pre>
<br /> Tagged: <a href='http://ivanator.wordpress.com/tag/java/'>Java</a>, <a href='http://ivanator.wordpress.com/tag/swing/'>Swing</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ivanator.wordpress.com/424/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ivanator.wordpress.com/424/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ivanator.wordpress.com/424/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ivanator.wordpress.com/424/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/ivanator.wordpress.com/424/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/ivanator.wordpress.com/424/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/ivanator.wordpress.com/424/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/ivanator.wordpress.com/424/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ivanator.wordpress.com/424/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ivanator.wordpress.com/424/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ivanator.wordpress.com/424/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ivanator.wordpress.com/424/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ivanator.wordpress.com/424/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ivanator.wordpress.com/424/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ivanator.wordpress.com&amp;blog=6092394&amp;post=424&amp;subd=ivanator&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://ivanator.wordpress.com/2010/02/24/jlabel-editable/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">ivanator</media:title>
		</media:content>
	</item>
		<item>
		<title>Trasteando con las JToolTip en Swing</title>
		<link>http://ivanator.wordpress.com/2010/02/23/trasteando-con-las-jtooltip-en-swing/</link>
		<comments>http://ivanator.wordpress.com/2010/02/23/trasteando-con-las-jtooltip-en-swing/#comments</comments>
		<pubDate>Mon, 22 Feb 2010 23:01:49 +0000</pubDate>
		<dc:creator>Iván Párraga García</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Swing]]></category>

		<guid isPermaLink="false">http://ivanator.wordpress.com/?p=413</guid>
		<description><![CDATA[En esta entrada no voy a descubrir nada nuevo porque no soy un experto en Swing, pero son un par de detallitos que me han hecho perder algunos minutos. La aplicación en la que estoy trabajando es un cliente Swing con componentes personalizados para construir una vista similar a diagramas de flujo. Estos componentes heredan [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ivanator.wordpress.com&amp;blog=6092394&amp;post=413&amp;subd=ivanator&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://ivanator.files.wordpress.com/2010/02/componente3.png"></a>En esta entrada no voy a descubrir nada nuevo porque no soy un experto en Swing, pero son un par de detallitos que me han hecho perder algunos minutos.</p>
<p>La aplicación en la que estoy trabajando es un cliente Swing con componentes personalizados para construir una vista similar a diagramas de flujo. Estos componentes heredan de <em>JPanel</em> son más o menos complejos y sobrescriben los métodos de pintado como <em>paintComponent</em>. A su vez tienen componentes anidados y áreas &#8216;blancas&#8217; que forman parte del componente <em>Swing </em>pero que en realidad para el usuario no forman parte del mismo. El siguiente diagrama lo ilustra un poco:</p>
<p><a href="http://ivanator.files.wordpress.com/2010/02/componente3.png"><img class="alignnone" title="componente" src="http://ivanator.files.wordpress.com/2010/02/componente3.png?w=478&#038;h=432" alt="" width="478" height="432" /></a></p>
<h1>Mostrar el <em>tooltip</em> únicamente cuando el ratón está en determinadas partes del componente</h1>
<p>Como sabemos la clase <em>JComponent</em> define el método <em>setToolTipText(String tooltip)</em> que permite establecer la <em>tooltip</em>, el &#8216;problema&#8217; es que esta se establece para todo el componente. En mi ejemplo, yo sólo quiero que se muestre si el usuario posa el ratón en el diamante, ya que para él el resto del componente forma parte del fondo. Si no hacemos nada más, al poner el ratón en cualquier parte del componente se mostrará el <em>tooltip</em>.</p>
<p>La solución consiste en sobrescribir el método <em>getToolTipText(MouseEvent event)</em> para que devuelva <em>null</em> cuando las coordenadas del ratón (en el espacio de coordenadas del componente) están fuera del área para la que queremos mostrar el <em>tooltip</em>. El siguiendo <em>snipet</em> de código muestra la sobrescritura del método en mi componente personalizado: si estamos dentro del área definida por el rombo (calculado en un método auxiliar) entonces se muestra el <em>tooltip</em> establecido previamente con <em>setToolTipText</em> sino, devolvemos un <em>null</em> y por tanto no se renderizará el <em>tooltip</em>.</p>
<pre>/**
* If the mouse is outside the diamond, don't show the tooltip.
*/
@Override
public String getToolTipText(MouseEvent event) {
    if (isInDiamond(event.getX(), event.getY())) {
        return getToolTipText();
    } else {
        return null;
    }
}</pre>
<h1>Tooltip multilínea</h1>
<p>Aunque parezca sorprendente, la implementación por defecto del tooltip no soporta directamente multilíneas, así pues, si le pasamos un <em>String</em> que contenga retornos de carro en el método <em>setToolTipText</em>, éstos serán ignorados vilmente y se pintarán todas las líneas seguidas. Para solucionar ésto hay dos soluciones: una pesada y elegante y otra inmediata pero algo fea.</p>
<p>Empecemos por la segunda. Muchos componentes <em>Swing</em> tienen soporte para HTML. El <em>tooltip</em> también. Si asignamos un <em>String</em> que empiece por <em>&lt;html&gt;</em> el componente asumirá que le estamos pasando código HTML y lo renderizará como tal. El truco consiste pues, en sustituir todos los caracteres &#8216;\n&#8217; por el <em>String &lt;br/&gt;</em>. Por ejemplo:</p>
<pre>String strMultiLinea = ...
setToolTipText("&lt;html&gt;" + strMultiLinea.replaceAll("\n", "&lt;br/&gt;") + "&lt;/html&gt;");</pre>
<p>Rápido y funciona, pero es feo. La solución elegante consiste en implementar nuestro propio <em>tooltip</em> que soporte esta característica. Esto debemos hacerlo en dos pasos:</p>
<ol>
<li>Implementar nuestra clase <em>tooltip</em> personalizada heredando de <em>javax.swing.JToolTip,</em></li>
<li>Diciéndole al componente que debe usar nuestra propia implementación sobrescribiendo el método <em>createToolTip </em>para que devuelva una instancia de nuestra clase.</li>
</ol>
<br /> Tagged: <a href='http://ivanator.wordpress.com/tag/java/'>Java</a>, <a href='http://ivanator.wordpress.com/tag/swing/'>Swing</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ivanator.wordpress.com/413/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ivanator.wordpress.com/413/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ivanator.wordpress.com/413/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ivanator.wordpress.com/413/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/ivanator.wordpress.com/413/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/ivanator.wordpress.com/413/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/ivanator.wordpress.com/413/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/ivanator.wordpress.com/413/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ivanator.wordpress.com/413/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ivanator.wordpress.com/413/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ivanator.wordpress.com/413/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ivanator.wordpress.com/413/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ivanator.wordpress.com/413/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ivanator.wordpress.com/413/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ivanator.wordpress.com&amp;blog=6092394&amp;post=413&amp;subd=ivanator&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://ivanator.wordpress.com/2010/02/23/trasteando-con-las-jtooltip-en-swing/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">ivanator</media:title>
		</media:content>

		<media:content url="http://ivanator.files.wordpress.com/2010/02/componente3.png" medium="image">
			<media:title type="html">componente</media:title>
		</media:content>
	</item>
		<item>
		<title>Capturar excepciones en el AWT Thread de una aplicación Swing</title>
		<link>http://ivanator.wordpress.com/2010/02/20/capturar-excepciones-en-el-awt-thread-de-una-aplicacion-swing-4/</link>
		<comments>http://ivanator.wordpress.com/2010/02/20/capturar-excepciones-en-el-awt-thread-de-una-aplicacion-swing-4/#comments</comments>
		<pubDate>Sat, 20 Feb 2010 15:50:13 +0000</pubDate>
		<dc:creator>Iván Párraga García</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[logging]]></category>
		<category><![CDATA[Swing]]></category>

		<guid isPermaLink="false">http://ivanator.wordpress.com/?p=396</guid>
		<description><![CDATA[En java podemos clasificar las excepciones en dos tipos, las “checked” y las que no son “not-checked” (perdonad, pero no sé cómo traducirlo satisfactoriamente). Los métodos que lanzan excepciones del primer tipo ( cheched ) fuerzan al cliente de dicho métodos a tratarlas con un bloque try/catch o a lanzarlas para que sea un antecesor [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ivanator.wordpress.com&amp;blog=6092394&amp;post=396&amp;subd=ivanator&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<div>
<div>
<p style="margin-bottom:.5cm;text-align:left;">En java podemos clasificar las excepciones en dos tipos, las “checked” y las que no son “not-checked” (perdonad, pero no sé cómo traducirlo satisfactoriamente).</p>
</div>
<p>Los métodos que lanzan excepciones del primer tipo  <span style="font-style:normal;">(</span> <em>cheched</em> <span style="font-style:normal;">)</span> fuerzan al cliente de dicho métodos a tratarlas con un bloque  <em>try/catch</em> <span style="font-style:normal;">o a lanzarlas para que sea un antecesor en la pilla de llamadas quien las trate. En última instancia la excepción alcanza el método principal</span> <em>main,</em> <span style="font-style:normal;">que si no la gestiona la &#8216;lanza&#8217; al sistema operativo y la aplicación muere con el volcado de pila del lugar donde se produjo.</span></p>
<p><span style="font-style:normal;">Las excepciones</span> <em>not-checked</em> <span style="font-style:normal;">no tienen esta restricción: ni es obligatorio capturarlas, ni el método cliente tiene que declarar explícitamente su lanzamiento mediante una cláusula</span> <em>throws</em> <span style="font-style:normal;">en su signatura.</span></p>
<p><span style="font-style:normal;">Las excepciones</span> <em>not-checked</em> <span style="font-style:normal;">son todas aquellas que heredan de la clase</span> <em>RuntimeException</em> <span style="font-style:normal;">. Así pues, si un método puede lanzar</span> <em>NullPointerException</em> <span style="font-style:normal;">o</span> <em>IllegalArgumentException</em> <span style="font-style:normal;">(entre otras), no está obligado a declararlo en su signatura ni el cliente a gestionar la excepción. De todos modos, si se produce, su propagación sigue la misma política: van escalando la pila de llamadas hasta que alguien las trate.</span></p>
<p><span style="font-style:normal;">A la hora de programar una aplicación somos muy conscientes de las excepciones</span> <em>checked</em> <span style="font-style:normal;">porque su no gestión es un error en tiempo de compilación, sin embargo para las excepciones</span> <em>not checked</em> <span style="font-style:normal;">no tenemos más remedio que prever su posibilidad y hacer la gestión correspondiente donde corresponda. No obstante es posible que mientras estamos desarrollando o depurando no hayamos previsto una situación que desencadene el lanzamiento de una excepción de este tipo (típicamente se nos puede escapar alguna</span> <em>NullPointerException</em> <span style="font-style:normal;">). En estos casos (y siempre en general) es útil tener un bloque</span> <em>catch</em> <span style="font-style:normal;">que capture el &#8216;resto&#8217; de excepciones que el programador no previó e intentar hacer algo útil y más elegante que acabar la aplicación abruptamente (como por ejemplo guardar información en los</span> <em>logs</em> <span style="font-style:normal;">que nos permita depurar o hacer un diagnóstico del problema).</span></p>
<p><span style="font-style:normal;">¿Cómo y dónde ponemos este bloque “ captura el resto de excepciones”? En aplicaciones con un solo hilo de ejecución es muy fácil: en el</span> <em>main</em> <span style="font-style:normal;">como ilustra el siguiente ejemplo.</span></p>
<pre>public static void main(String[] args) {
try {
	// mi super-programa
} catch (Throwable e) {
	logger.debug("Unexpected exception!", e);
}</pre>
<p>¿Pero qué pasa en una aplicación multi-hilo? En este caso el  <em>main</em> <span style="font-style:normal;">creará varios hilos que tendrán su propia pila de llamadas por lo que cualquier excepción producida y no capturada en cualquiera de esos hilos no podrá ser capturada por el</span> <em>catch</em> <span style="font-style:normal;">del ejemplo anterior.</span></p>
<p><span style="font-style:normal;">En particular, las aplicaciones</span> <em>Swing</em> <span style="font-style:normal;">son siempre multi-hilo. El código de programación de todos los</span> <em>listeners</em> <span style="font-style:normal;">de gestión de eventos producidos por los diferentes elementos de la GUI, se ejecuta dentro del</span> <em>event dispatch thread</em> <span style="font-style:normal;">(el hilo de gestión de eventos) también conocido como “AWT” Thread y que no es el mismo en el que se ejecuta el</span> <em>main</em> <span style="font-style:normal;">del programa.</span></p>
<p><span style="font-style:normal;">¿Qué pasa si se produce una excepción</span> <em>not-checked</em> <span style="font-style:normal;">en este hilo? Pues que si no lo hemos previsto en el código y no hay ningún</span> <em>catch</em> <span style="font-style:normal;">que la capture, se pierde irremediablemente. Afortunadamente existe una solución que expondré a continuación y que también está explicada  <a href="http://www.javaspecialists.eu/archive/Issue081.html">en este post</a>.</span></p>
<p><span style="font-style:normal;">La API estándar de Java ofrece la clase</span> <em>ThreadGroup</em> <span style="font-style:normal;">. Cuando creamos un</span> <em>thread</em> <span style="font-style:normal;">podemos hacer que pertenezca a una instancia de esta clase. Dicha clase tiene un método con la siguiente signatura:</span></p>
<p class="código-western">void uncaughtException(Thread t, Throwable e)</p>
<p>que es llamado por la máquina virtual de forma automática cuando cualquiera de los  <em>threads</em> <span style="font-style:normal;">que forman parte de ese grupo lanza una excepción que nadie captura. Cuando un hilo se crea dentro de un grupo, todos los hilos que pueda crear ese hilo también pertenecen al mismo grupo.</span></p>
<p><span style="font-style:normal;">Ahora ya tenemos todos los elementos que solucionan nuestro problema:</span></p>
<ol>
<li><span style="font-style:normal;">Creamos una subclase de</span> <em>ThreadGroup</em> <span style="font-style:normal;">que sobrescriba el método</span> <em>uncaughtException</em> <span style="font-style:normal;">para que haga algo útil en nuestro programa.</span></li>
<li><span style="font-style:normal;">En el</span> <em>main</em> <span style="font-style:normal;">construimos una instancia de la clase que acabamos de construir.</span></li>
<li><span style="font-style:normal;">Creamos un</span> <em>thread</em> <span style="font-style:normal;">que se encarga de montar toda la GUI que forma parte del grupo recién instanciado.</span></li>
</ol>
<p><span style="font-style:normal;">Con esto conseguimos que todos los</span> <em>threads</em> <span style="font-style:normal;">interesantes de nuestro programa pertenezcan al grupo que es capaz de gestionar las excepciones no capturadas.</span></p>
<p><span style="font-style:normal;">Nuestro</span> <em>ThreadGroup</em> <span style="font-style:normal;">podría tener el siguiente aspecto:</span></p>
<pre>class HandleExceptionGroup extends ThreadGroup {
	private static Logger logger = Logger.getLogger(ExceptionGroup.class);

	public HandleExceptionGroup() {
		super("ExceptionGroup");
	}

	@Override
	public void uncaughtException(Thread t, Throwable e) {
		String msg =
			"GUI produced an unexpected exception (thread: " + t.getName() + ") ";

		logger.warn(msg, e);
	}
}</pre>
<p style="margin-bottom:0;text-align:left;">y el  <em>main</em> de la clase principal:</p>
<pre>public static void main(String[] args) {
        HandleExceptionGroup threadGroup = new HandleExceptionGroup();
	new Thread(threadGroup, "Main Thread"){
		@Override
		public void run() {
			// aquí construyo la GUI
		}
	}.start();
}</pre>
</div>
<br /> Tagged: <a href='http://ivanator.wordpress.com/tag/java/'>Java</a>, <a href='http://ivanator.wordpress.com/tag/logging/'>logging</a>, <a href='http://ivanator.wordpress.com/tag/swing/'>Swing</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ivanator.wordpress.com/396/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ivanator.wordpress.com/396/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ivanator.wordpress.com/396/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ivanator.wordpress.com/396/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/ivanator.wordpress.com/396/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/ivanator.wordpress.com/396/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/ivanator.wordpress.com/396/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/ivanator.wordpress.com/396/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ivanator.wordpress.com/396/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ivanator.wordpress.com/396/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ivanator.wordpress.com/396/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ivanator.wordpress.com/396/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ivanator.wordpress.com/396/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ivanator.wordpress.com/396/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ivanator.wordpress.com&amp;blog=6092394&amp;post=396&amp;subd=ivanator&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://ivanator.wordpress.com/2010/02/20/capturar-excepciones-en-el-awt-thread-de-una-aplicacion-swing-4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">ivanator</media:title>
		</media:content>
	</item>
		<item>
		<title>Monitorizar JBoss con Cacti (de JMX a SNMP)</title>
		<link>http://ivanator.wordpress.com/2010/01/30/monitorizar-jboss-con-cacti-de-jmx-a-snmp/</link>
		<comments>http://ivanator.wordpress.com/2010/01/30/monitorizar-jboss-con-cacti-de-jmx-a-snmp/#comments</comments>
		<pubDate>Sat, 30 Jan 2010 01:46:18 +0000</pubDate>
		<dc:creator>Iván Párraga García</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Cacti]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JBoss]]></category>
		<category><![CDATA[JMX]]></category>
		<category><![CDATA[Monitorización]]></category>
		<category><![CDATA[SNMP]]></category>

		<guid isPermaLink="false">http://ivanator.wordpress.com/?p=370</guid>
		<description><![CDATA[Descárgate este artículo como PDF aquí. Introducción Cuando tenemos una aplicación desplegada en producción o cuando estamos realizando pruebas de carga o de estrés, una de las cosas que necesitamos hacer es monitorizar diferentes parámetros de la misma y del servidor de aplicaciones que la contiene. Estos parámetros pueden incluir, por ejemplo, la evolución de [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ivanator.wordpress.com&amp;blog=6092394&amp;post=370&amp;subd=ivanator&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<div>
<div>
<p style="margin-bottom:.5cm;text-align:left;">Descárgate este artículo como <a href="http://ivanator.files.wordpress.com/2010/01/monitorizar_jboss_con_cacti_v1-0.pdf">PDF aquí</a>.</p>
</div>
<h1 class="western">Introducción</h1>
<p>Cuando tenemos una aplicación desplegada en producción o cuando estamos realizando pruebas de carga o de estrés, una de las cosas que necesitamos hacer es monitorizar diferentes parámetros de la misma y del servidor de aplicaciones que la contiene. Estos parámetros pueden incluir, por ejemplo, la evolución de la memoria, el número de sesiones, etcétera.</p>
<p>En este artículo explicaré cómo configurar  <a href="http://www.jboss.org/">JBoss</a> para que comunique diferentes métricas que sean leídas y analizadas por la herramienta <a href="http://www.cacti.net/">Cacti</a>.</p>
<h1 class="western">SNMP y JMX</h1>
<p><a href="http://en.wikipedia.org/wiki/Snmp">SNMP</a> y  <a href="http://java.sun.com/javase/technologies/core/mntr-mgmt/javamanagement/">JMX</a> son las siglas de dos protocolos de monitorización de recursos. El primero es un protocolo genérico, y bien conocido por nuestros queridos compañeros de sistemas, y el segundo es el protocolo propio de la tecnología Java.</p>
<p>Puesto que SNMP es un protocolo más antiguo, que aplica a todo tipo de componentes hardware (como un router) o servicios software (por ejemplo, un servidor web) y que es bien conocido por los profesionales que tienen que administrar estas infraestructuras, tiene una gran cantidad de herramientas y gestores que permiten trabajar con él. Estas herramientas en general sólo capturan información para ser analizada, pero el protocolo también permite la modificación de ciertos parámetros. JMX es algo parecido pero aplicado a la máquina virtual y a los servicios Java.</p>
<p>Puesto que tanto las herramientas como los profesionales que tienen que administrar recursos están más acostumbrados a trabajar con SNMP que con JMX (que pueden llegar a ignorarlo por completo), una posible solución pasa por poder exportar la información proporcionada mediante JMX al protocolo SNMP. El presente artículo intenta explicar básicamente esto: cómo una fuente JMX (nuestro querido JBoss) puede integrarse con una herramienta de gestión SNMP (Cacti).</p>
<p>No entraré a explicar los detalles de los dos protocolos porque, entro otras cosas, ni soy un experto en los mismos ni es relevante para el objetivo de este tutorial. Si queréis más información sólo hay que seguir los enlaces que voy proporcionando. Aquello que vayamos necesitando lo iré explicando a lo largo del tutorial.</p>
<p>A modo de resumen ( <a href="http://es.wikipedia.org/wiki/SNMP">y extraído de la wikipedia</a>):</p>
<blockquote><p>“Una red administrada a través de SNMP consiste de tres componentes claves:</p></blockquote>
<ul>
<li>
<blockquote><p>dispositivos administrados;</p></blockquote>
</li>
<li>
<blockquote><p>agentes;</p></blockquote>
</li>
<li>
<blockquote><p>sistemas administradores de red (NMS’s).</p></blockquote>
</li>
</ul>
<blockquote><p>Un dispositivo administrado es un nodo de red que contiene un agente SNMP y reside en una red administrada. Estos recogen y almacenan información de administración, la cual es puesta a disposición de los NMS’s usando SNMP. Los dispositivos administrados, a veces llamados elementos de red, pueden ser routers, servidores de acceso, switches, bridges, hubs, computadores o impresoras.</p></blockquote>
<blockquote><p>Un agente es un módulo de software de administración de red que reside en un dispositivo administrado. Un agente posee un conocimiento local de información de administración (memoria libre, número de paquetes IP recibidos, rutas, etcétera), la cual es traducida a un formato compatible con SNMP y organizada en jerarquías.</p></blockquote>
<blockquote><p>Un NMS ejecuta aplicaciones que supervisan y controlan a los dispositivos administrados. Los NMS’s proporcionan el volumen de recursos de procesamiento y memoria requeridos para la administración de la red. Uno o más NMS’s deben existir en cualquier red administrada.”</p></blockquote>
<h1 class="western">Entorno y herramientas</h1>
<p>Partiendo de la descripción anterior de infraestructura SNMP, nuestro dispositivo administrado será JBoss, nuestro agente una aplicación desplegada en JBoss que se llama “SNMP adaptor” y nuestro NMS será Cacti.</p>
<p><img style="text-align:left;" src="http://ivanator.files.wordpress.com/2010/01/sbres_1264815854_2__.png?w=482&#038;h=216" border="0" alt="" vspace="15" width="482" height="216" /></p>
<p>Los lectores de este blog sin duda conocen qué es JBoss, uno de los servidores de aplicaciones JEE open source más conocidos, sin embargo, es más posible que no estén tan familiarizados con el resto de herramientas ni en tareas de monitorización. Esto último suele pasar porque es muy habitual que este tipo de tareas las realicen perfiles técnicos más orientados a sistemas (lo cual me parece correcto); un desarrollador no debería preocuparse de mirar si los  <em>logs</em> del Apache tienen cosas raras o de si una máquina debería ampliar su sistema de ficheros porque en los últimos meses se ha aumentado mucho su necesidad de espacio.</p>
<p>El problema suele ser que los perfiles de sistemas dan un trato &#8216;especial&#8217; a los servidores Java. Esto se debe a que la administración de estos servicios es un poco diferente al resto de cosas a las que están acostumbrados (archivos de configuración XML vs. texto plano, máquina virtual vs. ejecución nativa, JMX vs. SNMP, etc.). Consecuencia de esta realidad, que yo me he encontrado en más de un sitio, los desarrolladores hemos tenido que aprender algunas cosas de sistemas.</p>
<p>En este artículo trabajaré con una versión virgen de  <a href="http://www.ubuntu.com/">Ubuntu 9.10</a> y explicaré paso a paso lo siguiente:</p>
<ul>
<li>cómo instalar JBoss,</li>
<li>cómo instalar Cacti,</li>
<li>configurar JBoss para exportar métricas mediante SNMP y</li>
<li>configurar Cacti para monitorizar estas métricas.</li>
</ul>
<h1 class="western">Instalar JBoss</h1>
<p>Aquí no dedicaremos mucho tiempo (entiendo que todo el mundo tiene esta fase superada). Primero instalamos el JDK de Sun con el gestor de paquetes:</p>
<pre>apt-get install sun-java6-jdk</pre>
<p>A continuación descargamos el JBoss AS de  <a href="http://www.jboss.org/jbossas/downloads/">http://www.jboss.org/jbossas/downloads/</a> (en el momento de escribir este tutorial la última versión estable, y que yo voy a usar, es la 5.1.0-GA).</p>
<p>La instalación es sencilla y básicamente consiste en descomprimir el  <em>bundle</em>, establecer los permisos adecuados y, opcionalmente, configurar el script de arranque en  <em>init.d</em> <span style="font-style:normal;">. En mi caso instalo el servidor en /opt/jboss pero no es demasiado relevante. Me referiré al directorio raíz de JBoss como JBOSS_HOME.</span></p>
<p><span style="font-style:normal;">Recordemos que para poner en marcha el servidor se hace mediante el script JBOSS_HOME/bin/run.sh y que si no le pasamos ningún parámetro por defecto arranca la configuración</span> <em>default</em> <span style="font-style:normal;">.</span></p>
<p><span style="font-style:normal;">Pongamoslo en marcha para ver si todo funciona correctamente. En el</span> <em>log</em> <span style="font-style:normal;">debería aparecer una línea del tipo</span></p>
<pre>15:50:56,747 INFO [ServerImpl] JBoss (Microcontainer) [5.1.0.GA (build: SVNTag=JBoss_5_1_0_GA date=200905221053)] Started in 1m:41s:932ms</pre>
<p style="font-style:normal;">
<p style="font-style:normal;">y deberíamos poder acceder a la consola de administración del mismo en el puerto 8080 de la máquina:</p>
<p style="font-style:normal;">
<h1 class="western" style="font-style:normal;"><img style="text-align:left;" src="http://ivanator.files.wordpress.com/2010/01/sbres_1264815854_3__.png?w=323&#038;h=272" border="0" alt="" vspace="15" width="323" height="272" /></h1>
<h1 class="western" style="font-style:normal;">Instalar Cacti</h1>
<p style="font-style:normal;">En un entorno productivo, si se está usando Cacti para monitorizar los sistemas (como es el caso en mi empresa), obviamente serán los chicos de sistemas los que lo tendrán montado y configurado. En nuestra prueba de concepto lo instalaremos en la misma máquina desde cero y con la inestimable ayuda de nuestro querido gestor de paquetes de Ubuntu.</p>
<p class="código-western" style="font-style:normal;">apt-get install cacti</p>
<p style="font-style:normal;">
<p style="font-style:normal;">Cacti es una aplicación PHP que almacena la información que necesita en una base de datos MySQL por lo que tiene como dependencias importantes: el servidor MySQL, el Apache y, obviamente, el PHP. Si tenemos una instalación limpia, el gestor de paquetes nos pedirá datos de configuración de estos componentes (como por ejemplo el passwor de root del MySQL).</p>
<p style="font-style:normal;">A continuación el script de instalación nos irá haciendo una serie de preguntas y como no queremos pelearnos con la configuración avanzada de Cacti, cogeremos el camino fácil:</p>
<ul>
<li>
<p style="font-style:normal;">¿Qué servidor web quieres?</p>
<ul>
<li>
<p style="font-weight:normal;"><span style="font-style:normal;">Apache 2</span> <span style="font-style:normal;">.</span></p>
</li>
</ul>
</li>
<li>
<p style="font-style:normal;">Configure database for cacti with dbconfig-common? (que traducido sería, ¿quieres que te configure yo automáticamente la base de datos o prefieres hacerlo tú a mano)</p>
<ul>
<li>
<p style="font-weight:normal;"><span style="font-style:normal;">Sí</span> <span style="font-style:normal;">.</span></p>
</li>
</ul>
</li>
<li>
<p style="font-style:normal;font-weight:normal;">Dame la contraseña de root de MySQL parara que te pueda crear la base de datos.</p>
</li>
<li>
<p style="font-style:normal;font-weight:normal;">Dame la contraseña que quieres que utilice para el usuario de Cacti en la base de datos.</p>
<ul>
<li>
<p style="font-style:normal;font-weight:normal;">DATABASE_CACTI_PASSWORD (obviamente, aquí ponemos el que estimemos oportuno).</p>
</li>
</ul>
</li>
</ul>
<p style="font-style:normal;font-weight:normal;">
<p style="font-weight:normal;"><span style="font-style:normal;">Aún no ha acabado la instalación pero el resto lo haremos directamente desde la aplicación web. Si todo ha ido bien, tendremos un Apache 2 corriendo con un flamante Cacti instalado en la ruta</span> <a href="http://localhost/cacti"><span style="font-style:normal;">http://localhost/cacti</span></a> <span style="font-style:normal;">que nos llevará al asistente de configuración:</span></p>
<p style="font-weight:normal;"><span style="font-style:normal;"><br />
</span></p>
<p style="font-style:normal;font-weight:normal;"><img style="text-align:left;" src="http://ivanator.files.wordpress.com/2010/01/sbres_1264815854_4__.png?w=323&#038;h=275" border="0" alt="" vspace="15" width="323" height="275" /></p>
<p style="font-style:normal;font-weight:normal;">El asistente es muy sencillo y básicamente no requiere explicación: la siguiente pantalla nos pregunta el tipo de instalación (nueva) y la última nos muestra las rutas a la diferentes herramientas que necesita preguntándonos confirmación (configuración que nos parecerá estupenda, por supuesto).</p>
<p style="font-style:normal;font-weight:normal;">
<p><img style="text-align:left;" src="http://ivanator.files.wordpress.com/2010/01/sbres_1264815854_5__.png?w=323&#038;h=460" border="0" alt="" vspace="15" width="323" height="460" /><br />
<span style="font-style:normal;"><span style="font-weight:normal;"> </span></span></p>
<p><span style="font-style:normal;"><span style="font-weight:normal;">Si todo ha ido bien, al finalizar el asistente, seremos redirigidos a la pantalla de</span></span> <em><span style="font-weight:normal;">login</span></em> <span style="font-style:normal;"><span style="font-weight:normal;">de Cacti, sin embargo, en ningún punto anterior hemos sido preguntados por usuario o contraseña administrativa (las contraseñas que hemos introducido anteriormente se referían al usuario en la base de datos pero no a la aplicación propiamente dicha). Para entrar utilizaremos los valores por defecto que tanto para el usuario como para la contraseña son “ admin” y seremos redirigidos a otra pantalla que nos obliga a decidir una contraseña algo más segura. Nos referiremos a esta contraseña como ADMIN_CACTI_PASSWORD.</span></span></p>
<p><span style="font-style:normal;"><span style="font-weight:normal;"><br />
</span></span></p>
<p style="font-style:normal;font-weight:normal;"><img style="text-align:left;" src="http://ivanator.files.wordpress.com/2010/01/sbres_1264815854_6__.png?w=323&#038;h=281" border="0" alt="" vspace="15" width="323" height="281" /></p>
<p style="font-style:normal;font-weight:normal;">En este punto ya hemos acabado de configurar Cacti y por fin entramos en la página principal de la aplicación.</p>
<p style="font-style:normal;font-weight:normal;">
<p style="font-style:normal;font-weight:normal;"><img style="text-align:left;" src="http://ivanator.files.wordpress.com/2010/01/sbres_1264815854_7__.png?w=385&#038;h=378" border="0" alt="" vspace="15" width="385" height="378" /></p>
<p style="font-style:normal;font-weight:normal;">Cacti es una herramienta muy poderosa, pero no es el propósito de este artículo explicar todo lo que puede hacer, así que sólo explicaré unas nociones. La interfaz se divide en dos secciones principales representadas por las dos pestañas del margen superior izquierdo: la consola y los gráficos. La consola permite lleva a cabo todas las tareas de configuración (añadir dispositivos SNMP, crear nuevos informes, etc.). La sección gráficos muestra los informes. Efectivamente, Cacti presenta la información como gráficos a lo largo del tiempo (por ejemplo, uso de la memoria a lo largo de la última media hora).</p>
<p style="font-style:normal;font-weight:normal;">
<p style="font-style:normal;font-weight:normal;"><img style="text-align:left;" src="http://ivanator.files.wordpress.com/2010/01/sbres_1264815854_8__.png?w=646&#038;h=479" border="0" alt="" vspace="15" width="646" height="479" /></p>
<p style="font-style:normal;font-weight:normal;">Una única instancia de Cacti puede monitorizar toda la infraestructura de una red. Sólo hay que añadir los agentes en cada uno de los dispositivos y luego configurar Cacti para que los escuche. Los diferentes dispositivos se ven en el árbol de la izquierda. En la configuración básica que tenemos montada sólo estamos monitorizando algunos parámetros básicos de la máquina local.</p>
<p style="font-style:normal;font-weight:normal;">El marco superior nos permite seleccionar el marco temporal de los gráficos que estamos visualizando. Por defecto Cacti nos muestra algunos parámetros locales interesantes, el uso de memoria, de CPU, etc. Nuestro objetivo es añadir nuevos gráficos como: tamaño del heap del JBoss o número de sesiones de la aplicación X.</p>
<p style="font-style:normal;font-weight:normal;">Los gráficos, además, son elementos interactivos que permiten redefinir el periodo temporal que están mostrando a golpe de ratón (zoom-in y zoom-out) o exportar los datos en formato CSV para trabajar con ellos en cualquier herramienta que nos interese (como por ejemplo OpenOffice Calc o Microsoft Excel).</p>
<h1 class="western">Configurar JBoss para exportar datos por SMMP</h1>
<p>En este punto ya tenemos una configuración básica de JBoss y de Cacti. El siguiente paso es hacer que JBoss sea capaz de producir métricas en el protocolo SNMP. Por suerte, va a ser bastante sencillo.</p>
<p>La manera de hacerlo será convertir los datos que de forma nativa ya está generando en JMX a SNMP. Pero, ¿qué información está exportando por JMX? Muy sencillo, lo podemos ver directamente en la consola JMX de JBoss que está accesible en  <a href="http://localhost:8080/jmx-console/">http://localhost:8080/jmx-console/</a></p>
<p><img style="text-align:left;" src="http://ivanator.files.wordpress.com/2010/01/sbres_1264815854_9__.png?w=423&#038;h=389" border="0" alt="" vspace="15" width="423" height="389" /></p>
<p>Para más información sobre la API JMX de JBoss, podéis ir al  <a href="http://docs.jboss.org/jbossas/jboss4guide/r2/html/ch2.chapter.html">propio manual</a> o echarle un ojo a  <a href="http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=monitorizarJBossJMX">este interesante tutorial</a> que propone otras alternativas de monitorización con herramientas Java.</p>
<p>Ahora que sabemos qué podemos monitorizar, ¿cómo lo exportamos a SNMP? Fácil, desplegaremos una aplicación que viene con el propio JBoss: el SNMP Adaptor.</p>
<p>Esta aplicación viene desplegada únicamente en la configuración de servidor  <em>all</em> <span style="font-style:normal;">, así que si estamos utilizando otra (como la</span> <em>default</em> <span style="font-style:normal;">o una personalizada), tendremos que desplegarla donde corresponda. En mi caso, que estoy usando la configuración</span> <em>default,</em> <span style="font-style:normal;">haría lo siguiente:</span></p>
<pre>cp -fR JBOSS_HOME/server/all/deploy/snmp-adaptor.sar JBOSS_HOME/server/default/deploy</pre>
<p style="font-style:normal;">Desde este mismo momento ya estamos produciendo datos SNMP para algunos parámetros que vienen configurados por defecto, como por ejemplo, la cantidad de memoria libre. Para comprobar que está funcionando usaremos un cliente SNMP de línea de comandos:</p>
<pre>snmpwalk -v 1 -c public localhost:1161 .1.2.3.4.1</pre>
<p>a lo que JBoss debería responder con algo parecido a:</p>
<pre>iso.2.3.4.1.1 = INTEGER: 60
iso.2.3.4.1.2 = Gauge32: 97540696
iso.2.3.4.1.3 = Gauge32: 530907136
iso.2.3.4.1.4 = INTEGER: 0
End of MIB</pre>
<p>El  <em>snmpwalk</em> <span style="font-style:normal;">es un cliente simple, que recibe los parámetros de dónde buscar el agente (en</span> <em>localhost</em> <span style="font-style:normal;">en el puerto 1161) y qué información buscar, la identificada por .1.2.3.4.1. Los identificadores SNMP (</span> <em>oid</em> <span style="font-style:normal;">&#8216;s) son un acuerdo entre el agente y los clientes SNMP y tienen estructurar jerárquica. La respuesta que nos ha dado el servidor es el conjunto de todos los parámetros que está produciendo que &#8216;cuelgan&#8217; del identificador.1.2.3.4.1.</span></p>
<p><span style="font-style:normal;">Cada uno de estos parámetros y su mapeo con el identificador SNMP lo podemos encontrar en archivo de configuración del SNMP Adaptor que se encuentra en el fichero XML siguiente: JBOSS_HOME/server/all/deploy/snmp-adaptor.sar/attributes.xml. Básicamente sirve para configurar un parámetro JMX con un identificador SNMP. Por ejemplo, los cuatro parámetros que hemos visto en el ejemplo se corresponden con esta entrada:</span></p>
<pre>&lt;attribute-mappings&gt;
  &lt;!-- basic system information --&gt;
  &lt;mbean name="jboss.system:type=ServerInfo" oid-prefix=".1.2.3.4.1"&gt;
    &lt;attribute name="ActiveThreadCount" oid=".1"/&gt;
    &lt;attribute name="FreeMemory" oid=".2"/&gt;
    &lt;attribute name="MaxMemory" oid=".3"/&gt;
  &lt;/mbean&gt;
../..
&lt;/attribute-mappings&gt;</pre>
<p style="font-style:normal;">
<p style="font-style:normal;">Como vemos por un lado estamos identificando el bean JMX y los atributos del mismo que producen la información y por otro el identificador SNMP que queremos vincularle. En la siguiente captura de pantalla del cliente, podemos ver parte de este bean:</p>
<p style="font-style:normal;">
<p><img style="text-align:left;" src="http://ivanator.files.wordpress.com/2010/01/sbres_1264815854_10__.png?w=460&#038;h=255" border="0" alt="" vspace="15" width="460" height="255" /><br />
<span style="font-style:normal;"> </span></p>
<p><span style="font-style:normal;">Obviamente podemos modificar libremente el fichero para quitar o añadir los bean y atributos que queramos.</span></p>
<h2 class="western"><span style="font-style:normal;">Exportar información de sesión para una aplicación web por SNMP</span></h2>
<p><span style="font-style:normal;">Un ejemplo de información interesante a monitorizar es la asociada a las sesiones de las aplicaciones desplegadas en el servidor. Estos parámetros no están configurados por defecto porque el bean JMX que los exporta depende del nombre del contexto de la aplicación desplegada.</span></p>
<p><span style="font-style:normal;">Con la configuración por defecto de JBoss tenemos desplegadas una serie de aplicaciones web, una de ellas es la propia consola JMX. La usaremos como ejemplo. Así pues, para monitorizar una selección de parámetros relacionados con la sesión para la aplicación jmx-console añadiríamos el siguiente fragmento XML al archivo de configuración del SNMP Adaptor. En negrita he marcado el nombre del bean, que, como vemos, incluye el nombre del la aplicación (del contexto) cuyos parámetros queremos exportar. Los</span> <em>oid</em> <span style="font-style:normal;">elegidos son arbitrarios.</span></p>
<pre>&lt;mbean name=" <strong>jboss.web:host=localhost,path=/jmx-console,type=Manager</strong>" oid-prefix=".1.2.3.4.5"&gt;
  &lt;!-- Number of active sessions at this moment --&gt;
  &lt;attribute name="activeSessions" oid=".1"/&gt;

  &lt;!-- Average time an expired session had been alive --&gt;
  &lt;attribute name="sessionAverageAliveTime" oid=".2"/&gt;

  &lt;!-- longest time an expired session had been alive --&gt;
  &lt;attribute name="sessionMaxAliveTime" oid=".3"/&gt;

  &lt;!-- Total number of sessions created by this manager --&gt;
  &lt;attribute name="sessionCounter" oid=".4"/&gt;

  &lt;!-- Number of sessions that expired ( doesn't include explicit invalidations ) --&gt;
  &lt;attribute name="expiredSessions" oid=".5"/&gt;

  &lt;!-- Number of sessions we rejected due to maxActive beeing reached --&gt;
  &lt;attribute name="rejectedSessions" oid=".6"/&gt;

  &lt;!-- Maximum number of active sessions so far --&gt;
  &lt;attribute name="maxActive" oid=".7"/&gt;

  &lt;!-- Number of duplicated session ids generated --&gt;
  &lt;attribute name="duplicates" oid=".8"/&gt;

  &lt;!-- Time spent doing housekeeping and expiration --&gt;
  &lt;attribute name="processingTime" oid=".9"/&gt;
&lt;/mbean&gt;</pre>
<p>Al igual que antes, hacemos una petición desde la línea de comandos para ver si todo ha ido bien:</p>
<pre>snmpwalk -v 1 -c public localhost:1161 .1.2.3.4.5</pre>
<p>para lo que deberíamos obtener una respuesta similar a lo siguiente:</p>
<pre>iso.2.3.4.5.1 = INTEGER: 1
iso.2.3.4.5.2 = INTEGER: 92
iso.2.3.4.5.3 = INTEGER: 92
iso.2.3.4.5.4 = INTEGER: 2
iso.2.3.4.5.5 = INTEGER: 1
iso.2.3.4.5.6 = INTEGER: 0
iso.2.3.4.5.7 = INTEGER: 1
iso.2.3.4.5.8 = INTEGER: 0
iso.2.3.4.5.9 = Gauge32: 0
End of MIB</pre>
<h1 class="western" style="font-style:normal;">Configurar el Cacti para monitorizar el JBoss</h1>
<p style="font-style:normal;">Cacti es capaz de monitorizar cualquier fuente SNMP. Básicamente hay que añadir los diferentes hosts y dispositivos con la consola administrativa de la interfaz web y luego definir las las gráficas que se quieren graficar sobre los diferentes servicios SNMP que tengan cada uno de esos dispositivos.</p>
<p style="font-style:normal;">La tarea anterior puede ser más o menos tediosa (que no complicada), afortunadamente el propio Cacti viene con una serie de gráficas que permiten configurar a golpe de ratón servicios típicos. Por ejemplo, la siguiente captura de pantalla muestra alguna de las posibilidades: Console → New Graphs → Create.</p>
<p style="font-style:normal;">
<p style="font-style:normal;"><img style="text-align:left;" src="http://ivanator.files.wordpress.com/2010/01/sbres_1264815854_11__.png?w=491&#038;h=367" border="0" alt="" vspace="15" width="491" height="367" /></p>
<p style="font-style:normal;">Además de los informes que vienen incluidos con esta distribución en Internet pueden encontrarse para cualquier tipo de dispositivo que se nos pueda ocurrir. La distribución de estos informes se hace mediante lo que Cacti denomina  <em>templates</em> (plantillas). Estas plantillas son unos ficheros XML que llevan la configuración SNMP de los diferentes dispositivos y además la información para que Cacti pueda crear los gráficos prediseñados. Así pues, si tenemos un router de la marca  <em>Acme</em> modelo  <em>Roadrunner</em>, sólo tenemos que buscar un poco en la página de Cacti o googlear un poco porque seguro que alguien ha creado la plantilla.</p>
<p style="font-style:normal;">Como podéis ver en la captura de pantalla anterior, la propia interfaz administrativa tiene dos enlaces que nos permiten importar y exportar plantillas respectivamente.</p>
<p><span style="font-style:normal;">JBoss no iba a ser menos, así que existen al menos un par de plantillas proporcionadas por la comunidad. Una de ellas puede descargarse desde directamente desde desde  <a href="http://forums.cacti.net/about16322.html">este hilo</a> en los foros de Cacti. El autor ha proporcionado una plantilla que grafica directamente los parámetros que vienen en la configuración por defecto del “SNMP Adaptor” de JBoss.</span></p>
<p><span style="font-style:normal;">Para instalarla sólo tenemos que  <a href="http://forums.cacti.net/download.php?id=6941">descargarla</a> e importarla mediante la interfaz gráfica. Si todo va bien, Cacti nos muestra un informe con todas las entidades procesadas que ha podido importar de la plantilla tal y como se muestra en la siguiente captura.</span></p>
<p><span style="font-style:normal;"><br />
</span></p>
<p><img style="text-align:left;" src="http://ivanator.files.wordpress.com/2010/01/sbres_1264815854_12__.jpg?w=491&#038;h=402" border="0" alt="" vspace="15" width="491" height="402" /></p>
<p>No hace falta entrar en los detalles, pero básicamente se ha configurado un nuevo agente SNMP, diferentes parámetros producidos por el mismo y tres definiciones de gráficas construidas a partir de estos parámetros. Ahora sólo faltaría construir nuevas gráficas usando estas definiciones para poder monitorizar el JBoss. Para ello deberemos:</p>
<ol>
<li>Construir un nuevo dispositivo administrado que se corresponda con el JBoss.</li>
<li>Configurar las gráficas asociadas.</li>
</ol>
<p>Para construir un nuevo dispositivo administrado, hacemos click en “Devices” y en el frame superior del área central (que actúa como filtro de los dispositivos listados) hacemos click en “Add” que nos lleva una pantalla de configuración de dispositivo.</p>
<p><img style="text-align:left;" src="http://ivanator.files.wordpress.com/2010/01/sbres_1264815854_13__.jpg?w=491&#038;h=317" border="0" alt="" width="491" height="317" /></p>
<p>En la pantalla de configuración del dispositivo seleccionamos los siguientes parámetros:</p>
<ul>
<li>
<p style="font-weight:normal;">Configuración general</p>
<ul>
<li><strong>Description</strong>: un nombre significativo para identificar el servidor JBoss.</li>
<li><strong>Hostname</strong>: el nombre de la máquina o su IP.</li>
<li><strong>Host template</strong> <span style="font-weight:normal;">: aquí es donde tenemos que seleccionar el “JBoss SNMP Adaptor” que acabamos de importar.</span></li>
</ul>
</li>
<li><span style="font-weight:normal;">La siguiente sección “ Availability / Reachibility options” se refiere al mecanismo que debe usar Cacti para determinar que el host sigue vivo. Cuando el mecanismo seleccionado le indica que el host no está ahí, el</span> <em><span style="font-weight:normal;">poller</span></em> <span style="font-style:normal;"><span style="font-weight:normal;">de Cacti (el subsistema que interroga al agente SNMP en el dispositivo) deja de recoger datos para ese dispositivo. Los parámetros por defecto basados en</span></span> <em><span style="font-weight:normal;">ping</span></em> <span style="font-style:normal;"><span style="font-weight:normal;">ya me parecen correctos para esta prueba de concepto, pero sentíos libres de adaptarlos a vuestro entorno.</span></span></li>
<li><span style="font-style:normal;"><span style="font-weight:normal;">Configuración SNMP que debe coincidir con la configurada en el SNMP Adaptor</span></span>
<ul>
<li><strong><span style="font-style:normal;">SNMP version</span></strong> <span style="font-style:normal;"><span style="font-weight:normal;">: 1</span></span></li>
<li><strong><span style="font-style:normal;">SNMP community</span></strong> <span style="font-style:normal;"><span style="font-weight:normal;">: public</span></span></li>
<li><strong><span style="font-style:normal;">SNMP Port</span></strong> <span style="font-style:normal;"><span style="font-weight:normal;">: 1161 (¡ojo el puerto por defecto es 161!)</span></span></li>
<li><span style="font-style:normal;"><span style="font-weight:normal;">Y el resto de parámetros tal y como estén o prefiráis.</span></span></li>
</ul>
</li>
</ul>
</div>
<div>
<p><img style="text-align:left;" src="http://ivanator.files.wordpress.com/2010/01/sbres_1264815854_14__.jpg?w=642&#038;h=635" border="0" alt="" vspace="15" width="642" height="635" /><br />
<span style="font-style:normal;"><span style="font-weight:normal;"> </span></span></p>
<p><span style="font-style:normal;"><span style="font-weight:normal;">Si no ha habido ningún problema y Cacti ha podido comprobar que el servidor está vivo, éste nos redirige a la misma página de edición del servidor pero con un mensaje de</span></span> <em><span style="font-weight:normal;">feedback</span></em> <span style="font-style:normal;"><span style="font-weight:normal;">informando de ello y con nuevas opciones entre las que se nos propone la creación de gráficos asociados al dispositivo.</span></span></p>
<p><span style="font-style:normal;"><span style="font-weight:normal;"><br />
</span></span></p>
<p><img style="text-align:left;" src="http://ivanator.files.wordpress.com/2010/01/sbres_1264815854_15__.jpg?w=491&#038;h=380" border="0" alt="" vspace="15" width="491" height="380" /><br />
<span style="font-style:normal;"><span style="font-weight:normal;"> </span></span></p>
<p><span style="font-style:normal;"><span style="font-weight:normal;">Hacemos caso de la sugerencia y seguimos el link “Create Graphs for this Host”, que nos lleva a una pantalla que nos permite seleccionar los gráficos a seleccionar de entre los configurados en la plantilla para este tipo de dispositivo. Los seleccionamos todos y pulsamos “create”.</span></span></p>
<p><span style="font-style:normal;"><span style="font-weight:normal;"><br />
</span></span></p>
<p><img style="text-align:left;" src="http://ivanator.files.wordpress.com/2010/01/sbres_1264815854_16__.jpg?w=642&#038;h=348" border="0" alt="" vspace="15" width="642" height="348" /><br />
<span style="font-style:normal;"><span style="font-weight:normal;"> </span></span></p>
<p><span style="font-style:normal;"><span style="font-weight:normal;">En este momento los gráficos han empezado a procesarse, sin embargo, si vamos a la sección “graphs” no están visibles. Esto se debe a que para verlos debemos incluirlo en un árbol de gráficos (que es lo que muestra la pantalla “Graphs”) . Para ello hacemos click en “Graph Trees” en la pantalla “Console”,  sección “Management” y usamos el asistente para incluir los diferentes gráficos.</span></span></p>
<p><span style="font-style:normal;"><span style="font-weight:normal;">No nos vamos a complicar, así que aprovechamos el “default tree” para añadir los nuevos gráficos. Paso a paso:</span></span></p>
<ol>
<li>
<p style="font-weight:normal;"><span style="font-style:normal;">Click en “Default Tree”</span></p>
</li>
<li>
<p style="font-weight:normal;"><span style="font-style:normal;">Añadir un nodo que contendrá todos los gráficos de JBoss</span></p>
<ol>
<li>
<p style="font-weight:normal;"><span style="font-style:normal;">Click en “Add” y configurar los siguientes parámetros:</span></p>
<ol>
<li><span style="font-style:normal;"><span style="font-weight:normal;">Parent Item: [root]</span></span></li>
<li><span style="font-style:normal;"><span style="font-weight:normal;">Tree Item Type: Header</span></span></li>
<li><span style="font-style:normal;"><span style="font-weight:normal;">Title: JBoss in localhost</span></span></li>
</ol>
</li>
</ol>
</li>
<li><span style="font-style:normal;"><span style="font-weight:normal;">Añadir un nodo de tipo gráfico para cada uno de los gráficos:</span></span>
<ol>
<li><span style="font-style:normal;"><span style="font-weight:normal;">Click en “Add” al lado del nombre del nodo y configurar los siguientes parámetros:</span></span>
<ol>
<li><span style="font-style:normal;"><span style="font-weight:normal;">Parent Item: JBoss in localhost</span></span></li>
<li><span style="font-style:normal;"><span style="font-weight:normal;">Graph: cada uno de los diferentes gráficos de JBoss</span></span></li>
</ol>
</li>
</ol>
</li>
</ol>
</div>
<div>
<p><img style="text-align:left;" src="http://ivanator.files.wordpress.com/2010/01/sbres_1264815854_17__.jpg?w=642&#038;h=188" border="0" alt="" vspace="15" width="642" height="188" /><br />
<span style="font-style:normal;"><span style="font-weight:normal;"> </span></span></p>
<p><span style="font-style:normal;"><span style="font-weight:normal;">Al terminar de añadir los gráficos, por fin podemos ir a la sección “Graphs” y empezar a disfrutar de nuestra nueva monitorización. Ahora sólo habrá que tener un poco de paciencia para que el</span></span> <em><span style="font-weight:normal;">poller</span></em> <span style="font-style:normal;"><span style="font-weight:normal;">de Cacti recoja suficientes datos para que los gráficos aporten información útil.</span></span></p>
<h2 class="western">Monitorizar información de sesión para una aplicación web</h2>
<p>La configuración de los gráficos precedentes ha sido más o menos sencilla porque la plantilla que hemos descargado nos lo ha dado todo hecho, ¿pero qué pasa si queremos graficar otros parámetros SNMP exportados por JBoss (o por cualquier otro dispositivo)? Pues que tenemos que usar la interfaz para crear bastante fácilmente esos nuevos gráficos.</p>
<p>Como ejemplo vamos a construir un gráfico que se genere a partir del número de sesiones activas en cada momento. Si recordáis, en una sección precedente explicamos cómo hacer que JBoss exportara estos datos por SNMP para la aplicación jmx-console. Utilizaremos el mismo ejemplo, así que el  <em>oid</em> SNMP del número de sesiones activas se corresponde con .1.2.3.4.5.1</p>
<p>El proceso es sencillo:</p>
<ol>
<li>Crear la definición del nuevo gráfico.</li>
<li>Crear un gráfico del nuevo tipo en el dispositivo JBoss.</li>
<li>Añadir el gráfico al árbol de gráficos.</li>
</ol>
<p>Para crear el gráfico en la sección “Console”, clickaremos en el enlace “New graphs”. Nos aseguramos de tener seleccionado el dispositivo correspondiente al JBoss en el desplegable “Host” y la opción “SNMP – Generic OID Template” en el desplegable “Create”. A continuación pulsamos el botón “Create”.</p>
<p><img style="text-align:left;" src="http://ivanator.files.wordpress.com/2010/01/sbres_1264815854_18__.jpg?w=642&#038;h=256" border="0" alt="" vspace="15" width="642" height="256" /></p>
<p>A continuación introducimos los parámetros de configuración del gráfico basado en SNMP tal y como muestra la siguiente captura. Todo son parámetros descriptivos del gráfico generado excepto el  <em>oid</em> <span style="font-style:normal;">del parámetro que queremos graficar (en nuestro caso el que se corresponde con el número de sesiones exportado por el JBoss).</span></p>
<p><span style="font-style:normal;"><br />
</span></p>
<p><img style="text-align:left;" src="http://ivanator.files.wordpress.com/2010/01/sbres_1264815854_19__.jpg?w=642&#038;h=377" border="0" alt="" vspace="15" width="642" height="377" /><br />
<span style="font-style:normal;"> </span></p>
<p><span style="font-style:normal;">Cuando le damos al botón “create” han pasado tres cosas:</span></p>
<ol>
<li><span style="font-style:normal;">Se ha creado la definición del gráfico.</span></li>
<li><span style="font-style:normal;">Se ha vinculado un gráfico de este tipo en el dispositivo JBoss.</span></li>
<li><span style="font-style:normal;">Se ha creado un</span> <em>datasource</em> <span style="font-style:normal;">de tipo “SNMP – Generic OID” que utiliza el</span> <em>poller</em> <span style="font-style:normal;">para obtener los datos que generan el gráfico.</span></li>
</ol>
<p><span style="font-style:normal;">Ahora ya sólo falta añadir el gráfico a nuestro árbol de gráficos por defecto tal y como hicimos con el resto de gráficos que venían con la plantilla de JBoss.</span></p>
<p><span style="font-style:normal;">Una vez lo hemos hecho, vemos nuestro gráfico justo al resto en la vista “graphs” tal y como muestra la siguiente captura.</span></p>
<p><span style="font-style:normal;"><br />
</span></p>
<h1 class="western"><img style="text-align:left;" src="http://ivanator.files.wordpress.com/2010/01/sbres_1264815854_20__.jpg?w=642&#038;h=408" border="0" alt="" vspace="15" width="642" height="408" /><br />
<span style="font-style:normal;"> </span></h1>
<h1 class="western"><span style="font-style:normal;">¿Qué hemos visto?</span></h1>
<p><span style="font-style:normal;">A modo de resumen:</span></p>
<ol>
<li><span style="font-style:normal;">JMX es el protocolo de monitorización nativo de Java.</span></li>
<li><span style="font-style:normal;">SNMP es un protocolo de monitorización de recursos en red.</span></li>
<li><span style="font-style:normal;">Hay más herramientas SNMP que JMX y los profesionales de sistemas se sienten más cómodos con SNMP.</span></li>
<li><span style="font-style:normal;">JBoss exporta de manera nativa su estado mediante JMX.</span></li>
<li><span style="font-style:normal;">JBoss proporciona una aplicación que hace la traducción de JMX a SNMP (un agente SNMP) que se denomina “SNMP Adaptor”</span></li>
<li><span style="font-style:normal;">Cacti es una poderosa herramienta de monitorización SNMP.</span></li>
<li><span style="font-style:normal;">La comunidad ha creado plantillas para monitorizar en Cacti los aspectos básicos de JBoss (la configuración por defecto de la aplicación “SNMP Adaptor”).</span></li>
<li><span style="font-style:normal;">Podemos configurar tanto JBoss como Cacti para monitorizar otros aspectos aspectos que nos interesen de nuestro servidor de aplicaciones o de nuestras aplicaciones.</span></li>
</ol>
</div>
<br /> Tagged: <a href='http://ivanator.wordpress.com/tag/cacti/'>Cacti</a>, <a href='http://ivanator.wordpress.com/tag/java/'>Java</a>, <a href='http://ivanator.wordpress.com/tag/jboss/'>JBoss</a>, <a href='http://ivanator.wordpress.com/tag/jmx/'>JMX</a>, <a href='http://ivanator.wordpress.com/tag/monitorizacion/'>Monitorización</a>, <a href='http://ivanator.wordpress.com/tag/snmp/'>SNMP</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ivanator.wordpress.com/370/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ivanator.wordpress.com/370/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ivanator.wordpress.com/370/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ivanator.wordpress.com/370/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/ivanator.wordpress.com/370/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/ivanator.wordpress.com/370/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/ivanator.wordpress.com/370/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/ivanator.wordpress.com/370/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ivanator.wordpress.com/370/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ivanator.wordpress.com/370/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ivanator.wordpress.com/370/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ivanator.wordpress.com/370/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ivanator.wordpress.com/370/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ivanator.wordpress.com/370/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ivanator.wordpress.com&amp;blog=6092394&amp;post=370&amp;subd=ivanator&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://ivanator.wordpress.com/2010/01/30/monitorizar-jboss-con-cacti-de-jmx-a-snmp/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">ivanator</media:title>
		</media:content>

		<media:content url="http://ivanator.files.wordpress.com/2010/01/sbres_1264815854_2__.png" medium="image" />

		<media:content url="http://ivanator.files.wordpress.com/2010/01/sbres_1264815854_3__.png" medium="image" />

		<media:content url="http://ivanator.files.wordpress.com/2010/01/sbres_1264815854_4__.png" medium="image" />

		<media:content url="http://ivanator.files.wordpress.com/2010/01/sbres_1264815854_5__.png" medium="image" />

		<media:content url="http://ivanator.files.wordpress.com/2010/01/sbres_1264815854_6__.png" medium="image" />

		<media:content url="http://ivanator.files.wordpress.com/2010/01/sbres_1264815854_7__.png" medium="image" />

		<media:content url="http://ivanator.files.wordpress.com/2010/01/sbres_1264815854_8__.png" medium="image" />

		<media:content url="http://ivanator.files.wordpress.com/2010/01/sbres_1264815854_9__.png" medium="image" />

		<media:content url="http://ivanator.files.wordpress.com/2010/01/sbres_1264815854_10__.png" medium="image" />

		<media:content url="http://ivanator.files.wordpress.com/2010/01/sbres_1264815854_11__.png" medium="image" />

		<media:content url="http://ivanator.files.wordpress.com/2010/01/sbres_1264815854_12__.jpg" medium="image" />

		<media:content url="http://ivanator.files.wordpress.com/2010/01/sbres_1264815854_13__.jpg" medium="image" />

		<media:content url="http://ivanator.files.wordpress.com/2010/01/sbres_1264815854_14__.jpg" medium="image" />

		<media:content url="http://ivanator.files.wordpress.com/2010/01/sbres_1264815854_15__.jpg" medium="image" />

		<media:content url="http://ivanator.files.wordpress.com/2010/01/sbres_1264815854_16__.jpg" medium="image" />

		<media:content url="http://ivanator.files.wordpress.com/2010/01/sbres_1264815854_17__.jpg" medium="image" />

		<media:content url="http://ivanator.files.wordpress.com/2010/01/sbres_1264815854_18__.jpg" medium="image" />

		<media:content url="http://ivanator.files.wordpress.com/2010/01/sbres_1264815854_19__.jpg" medium="image" />

		<media:content url="http://ivanator.files.wordpress.com/2010/01/sbres_1264815854_20__.jpg" medium="image" />
	</item>
		<item>
		<title>Botones no funcionan en Eclipse Galileo tras actualizar a Ubuntu 9.10</title>
		<link>http://ivanator.wordpress.com/2009/11/02/botones-no-funcionan-en-eclipse-galileo-tras-actualizar-a-ubuntu-9-10/</link>
		<comments>http://ivanator.wordpress.com/2009/11/02/botones-no-funcionan-en-eclipse-galileo-tras-actualizar-a-ubuntu-9-10/#comments</comments>
		<pubDate>Mon, 02 Nov 2009 10:18:06 +0000</pubDate>
		<dc:creator>Iván Párraga García</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://ivanator.wordpress.com/?p=326</guid>
		<description><![CDATA[El viernes pasado antes de irme para casa dejé el Ubuntu 9.04 del trabajo actualizando a la recién estrenada y flamante versión 9.10. Al llegar esta mañana a la oficina acabé el proceso de instalación (no, Synaptic, no me borres mi configuración del MySQL, bueno Synaptic te dejo que me cambies la versión del Firefox, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ivanator.wordpress.com&amp;blog=6092394&amp;post=326&amp;subd=ivanator&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>El viernes pasado antes de irme para casa dejé el Ubuntu 9.04 del trabajo actualizando a la recién estrenada y flamante versión 9.10. Al llegar esta mañana a la oficina acabé el proceso de instalación (no, Synaptic, no me borres mi configuración del MySQL, bueno Synaptic te dejo que me cambies la versión del Firefox, etc, descarga kernel, compila y rebota) e iba a ponerme manos a la obra con la nueva iteración recién estrenada, cuando al ir a configurar un nuevo proyecto Java para la nueva branch del repositorio, los botones de mi Eclipse Galileo se manifestaron en huelga.</p>
<p>Los botones están ahí, pero no funcionan, es decir al hacer click sobre ellos la acción asociada no se ejecuta. Yo tengo el Eclipse instalado descargándolo directamente de su web y no de los paquetes de la distribución. Los compañeros que están usando el Eclipse de la distribución no han experimentado problemas.</p>
<p>Googleando un poco he encontrado rápidamente la solución en <a href="http://www.norio.be/blog/2009/10/problems-eclipse-buttons-ubuntu-910">este post</a>. Aparentemente es un bug de Eclipse en la biblioteca de gestión de ventanas GTK que será resuelto en próximas versiones. Por el momento tenemos un workaround para seguir trabajando con la versión actual arrancando Eclipse mediante el siguiente scrtipt:</p>
<pre>
#!/bin/sh
export GDK_NATIVE_WINDOWS=1
/PATH_AL_ECLIPSE/eclipse
</pre>
<br /> Tagged: Eclipse, Ubuntu <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ivanator.wordpress.com/326/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ivanator.wordpress.com/326/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ivanator.wordpress.com/326/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ivanator.wordpress.com/326/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/ivanator.wordpress.com/326/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/ivanator.wordpress.com/326/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/ivanator.wordpress.com/326/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/ivanator.wordpress.com/326/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ivanator.wordpress.com/326/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ivanator.wordpress.com/326/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ivanator.wordpress.com/326/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ivanator.wordpress.com/326/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ivanator.wordpress.com/326/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ivanator.wordpress.com/326/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ivanator.wordpress.com&amp;blog=6092394&amp;post=326&amp;subd=ivanator&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://ivanator.wordpress.com/2009/11/02/botones-no-funcionan-en-eclipse-galileo-tras-actualizar-a-ubuntu-9-10/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">ivanator</media:title>
		</media:content>
	</item>
		<item>
		<title>Configurar log4j para JUnit</title>
		<link>http://ivanator.wordpress.com/2009/05/25/configurar-log4j-para-junit-suites/</link>
		<comments>http://ivanator.wordpress.com/2009/05/25/configurar-log4j-para-junit-suites/#comments</comments>
		<pubDate>Mon, 25 May 2009 12:44:23 +0000</pubDate>
		<dc:creator>Iván Párraga García</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[JUnit]]></category>
		<category><![CDATA[logging]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://ivanator.wordpress.com/?p=319</guid>
		<description><![CDATA[Es muy habitual que a la hora de programar nuestras aplicaciones utilicemos algún tipo de librería de log. Tradicionalmente hay dos familias log4j (la pionera) y la nativa de Java (java.util.logging) que vino un poco después &#8220;inspirándose&#8221; bastante en la filosofía del proyecto de Apache. Personalmente soy usuario de log4j por varios motivos: estuvo disponible [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ivanator.wordpress.com&amp;blog=6092394&amp;post=319&amp;subd=ivanator&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Es muy habitual que a la hora de programar nuestras aplicaciones utilicemos algún tipo de librería de log. Tradicionalmente hay dos familias <a href="http://logging.apache.org/log4j/1.2/index.html" target="_blank">log4j</a> (la pionera) y la nativa de Java (<a href="http://java.sun.com/javase/6/docs/api/java/util/logging/package-summary.html" target="_self">java.util.logging</a>) que vino un poco después &#8220;inspirándose&#8221; bastante en la filosofía del proyecto de Apache.</p>
<p>Personalmente soy usuario de log4j por varios motivos: estuvo disponible antes, es el logging nativo de mi servidor de aplicaciones habitual (JBoss) y me gusta más <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Por otro lado, mi manera habitual de desarrollo es TDD, así que el IDE pasa una parte importante del tiempo ejecutando suites de tests JUnit.</p>
<p>Cualquiera de los frameworks de <em>logging</em> que utilicemos tiene el concepto de <em>appender</em> que es el destino en el que se escriben los mensajes. Destinos habituales suelen ser la consola o un fichero, por ejemplo. La configuración de los <em>appenders</em> de una aplicación se suele hacer durante el <em>bootstrap</em> (o la inicialización, si lo preferís) de la misma. Sin embargo cuando estamos corriendo tests, dicha inicialización no se produce así que perdemos todos los mensajes de <em>logging</em> que, si alguien se molestó en escribirlos, seguro que son muy útiles (especialmente cuando estamos desarrollando).</p>
<p>En &#8220;modo desarrollo&#8221; seguramente tenemos suficiente con una configuración básica en el que todos los mensajes se redirijan a la consola (que obviamente puede estar integrada en nuestro IDE). En el caso de log4j existe el método estático</p>
<pre>org.apache.log4j.BasicConfigurator.configure()</pre>
<p>que hace precisamente eso (creo recordar que java.util.logging tiene un mecanismo análogo). Ahora sólo resta saber dónde hacer la llamada al método. Obviamente no tiene sentido que lo pongamos en cada <em>TestCase</em>. Como en general agrupamos los diferentes <em>tests</em> en suites, parece que este es un buen lugar para configurarlo. Por ejemplo:</p>
<pre>@RunWith(Suite.class)
@Suite.SuiteClasses(value={
    nq.quota.QuotaTest.class,
    nq.quota.FrequencyTest.class,
    })
public class AllTests {
<strong>    @BeforeClass</strong>
    public static void startup() {
        <strong>BasicConfigurator.configure();</strong>
    }
}</pre>
<p>En el código precedente se ve la configuración de una test suite con JUnit 4 y etiquetamos un método de inicialización como <em>@BeforeClass</em> para asegurarnos que se ejecuta una única vez y antes de que la suite lance todos los tests configurados.</p>
<p>Esta misma idea puede utilizarse para configurar todos aquellos compartidos por los diferentes tests: variables de entorno, conexiones a bases de datos, etc.</p>
<pre></pre>
<br /> Tagged: JUnit, logging, TDD <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ivanator.wordpress.com/319/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ivanator.wordpress.com/319/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ivanator.wordpress.com/319/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ivanator.wordpress.com/319/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/ivanator.wordpress.com/319/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/ivanator.wordpress.com/319/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/ivanator.wordpress.com/319/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/ivanator.wordpress.com/319/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ivanator.wordpress.com/319/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ivanator.wordpress.com/319/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ivanator.wordpress.com/319/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ivanator.wordpress.com/319/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ivanator.wordpress.com/319/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ivanator.wordpress.com/319/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ivanator.wordpress.com&amp;blog=6092394&amp;post=319&amp;subd=ivanator&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://ivanator.wordpress.com/2009/05/25/configurar-log4j-para-junit-suites/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">ivanator</media:title>
		</media:content>
	</item>
		<item>
		<title>Bug con el tracker en Ubuntu 9.04 &#8211; Jaunty Jackalope</title>
		<link>http://ivanator.wordpress.com/2009/05/24/bug-con-el-tracker-en-ubuntu-9-04/</link>
		<comments>http://ivanator.wordpress.com/2009/05/24/bug-con-el-tracker-en-ubuntu-9-04/#comments</comments>
		<pubDate>Sun, 24 May 2009 17:35:01 +0000</pubDate>
		<dc:creator>Iván Párraga García</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Jaunty Jackalope]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://ivanator.wordpress.com/?p=315</guid>
		<description><![CDATA[Como sabéis soy bastante pro-Ubuntu. Me parece un gran entorno de escritorio y de desarrollo y sólo cambio a otros (y dentro de una máquina virtual, por supuesto) ante la falta de sensibilidad de algunos fabricantes de dispositivos (Apple, TomTom, Logitech, por citar algunos) que te obligan a utilizar software no compatible con Linux para [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ivanator.wordpress.com&amp;blog=6092394&amp;post=315&amp;subd=ivanator&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Como sabéis soy bastante pro-Ubuntu. Me parece un gran entorno de escritorio y de desarrollo y sólo cambio a otros (y dentro de una máquina virtual, por supuesto) ante la falta de sensibilidad de algunos fabricantes de dispositivos (Apple, TomTom, Logitech, por citar algunos) que te obligan a utilizar software no compatible con Linux para utilizar las características avanzadas de dichos dispositivos. También es lamentable que para utilizar algunas páginas web (especialmente de la administración pública) tengas que recorrer al Internet Explorar. Pero bueno, esto es otra guerra.</p>
<p>Hace poco se lanzó la versió Ubuntu 9.04 (alias Jaunty Jackalope) e hice el upgrade hace unas semanas. Los upgrades de Ubuntu también dan gusto: todo se hace de manera automática, no pierdes el control sobre tus cofiguraciones propias (ficheros de configuración de servicios como MySQL, Samba, etc.) y todo funciona correctamente.</p>
<p>No obstante venía observando que a la que la máquina llevaba un rato encendida, se me disparaba el uso de una de las CPU, el ordenador no paraba de rascar disco duro y se recalentaba que daba gusto, de hecho hasta incluso llegar a colgarse en alguna ocasión. La verdad es que hace unos meses le metí mano al hardware del portátil y le metí un disco mucho mayor (como estaba metido en temas de formación necesitaba tener instaladas unas cuantas máquinas virtuales simultáneamente) y mucho más rápido y, que por tanto, se calentaba más y pensé que a lo mejor no había sido muy buena idea&#8230; Pero no tenía sentido, porque no había tenido ningún problema antes con el Ubuntu 8.10 y al arrancarlo ahora en modo Windows (sí, soy culpable, tengo una partición nativa Windows para casos de urgencia) tampoco había problema.</p>
<p>Tirando de <em>top</em> en un momento que se disparaba el uso vi que había un proceso comiéndose una CPU entera y accediendo sospechosamente al disco: <em>tracker-indexer</em>. Este proceso se corresponde con la utilidad <em>tracker</em> que es algo parecido al <em>locate</em> de toda la vida, un proceso que analiza el disco, e indexa su contenido para tener un acceso rápido en las búsquedas. Me sorprendió un poco porque creía haberlo desinstalarlo hace mucho tiempo (desde luego no aperecía como antes en la interfaz <em>gnome</em>) y además había instalado el <a href="http://desktop.google.com/es/linux/" target="_blank"><em>Google Desktop</em></a> que es un software análogo pero que personalmente me gusta más.</p>
<p>En cualquier caso, el <em>tracker</em> no debería comerse una CPU y llevar el portátil hasta la extenuación por calor del disco duro. Googleando un poco se ve que es un <em>bug</em> conocido en la nueva versión de Ubuntu. La verdad es que no me he molestado mucho en mirar si tiene solución, porque, como he dicho, es un software que no utilizo, así que simplemente he abierto el Synaptic, he buscado el paquete asociado y lo he desinstalado efectivamente y todo solucionado.</p>
<p>Por cierto, con una instalación &#8220;limpia&#8221; deJaunty Jackalope, el <em>tracker</em> no vien pre-instalado.</p>
<br /> Tagged: Jaunty Jackalope, Ubuntu <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ivanator.wordpress.com/315/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ivanator.wordpress.com/315/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ivanator.wordpress.com/315/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ivanator.wordpress.com/315/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/ivanator.wordpress.com/315/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/ivanator.wordpress.com/315/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/ivanator.wordpress.com/315/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/ivanator.wordpress.com/315/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ivanator.wordpress.com/315/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ivanator.wordpress.com/315/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ivanator.wordpress.com/315/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ivanator.wordpress.com/315/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ivanator.wordpress.com/315/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ivanator.wordpress.com/315/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ivanator.wordpress.com&amp;blog=6092394&amp;post=315&amp;subd=ivanator&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://ivanator.wordpress.com/2009/05/24/bug-con-el-tracker-en-ubuntu-9-04/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">ivanator</media:title>
		</media:content>
	</item>
		<item>
		<title>Teclas de función y modificadores no funcionan en VMware Workstation 6.5 en Ubuntu 8.10</title>
		<link>http://ivanator.wordpress.com/2009/03/08/teclas-de-funcion-y-modificadores-no-funcionan-en-vmware-workstation-65-en-ubuntu-810/</link>
		<comments>http://ivanator.wordpress.com/2009/03/08/teclas-de-funcion-y-modificadores-no-funcionan-en-vmware-workstation-65-en-ubuntu-810/#comments</comments>
		<pubDate>Sun, 08 Mar 2009 18:42:21 +0000</pubDate>
		<dc:creator>Iván Párraga García</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[VMware]]></category>

		<guid isPermaLink="false">http://ivanator.wordpress.com/?p=306</guid>
		<description><![CDATA[Mi estación de trabajo es un Ubuntu 8.10 workstation. Estoy muy contento con el sistema operativo tanto para desarrollo como para el resto de tareas que necesito hacer con un ordenador (ofimática, multimedia, internet, etc.). Sigo teniendo un arranque dual con el Windows XP que venía preinstalado en mi portátil (no me dejaron elegir ), [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ivanator.wordpress.com&amp;blog=6092394&amp;post=306&amp;subd=ivanator&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Mi estación de trabajo es un Ubuntu 8.10 workstation. Estoy muy contento con el sistema operativo tanto para desarrollo como para el resto de tareas que necesito hacer con un ordenador (ofimática, multimedia, internet, etc.). Sigo teniendo un arranque dual con el Windows XP que venía preinstalado en mi portátil (no me dejaron elegir <img src='http://s2.wp.com/wp-includes/images/smilies/icon_razz.gif' alt=':-P' class='wp-smiley' /> ), aunque la verdad es que no suelo arrancar casi nunca la partición con el sistemas operativo de Microsoft.</p>
<p>De todos modos para algunas herramientas muy concretas todavía no he podido librarme al 100% del Windows. Para no tener que estar reiniciando la máquina continuamente, tengo una máquina virtual con una imagen de XP que arranco cuando me hace falta usar alguna de estas herramientas. También utilizo máquinas virtuales para hacer pruebas varias y para poder poder provisionar rápidamente máquinas.</p>
<p>En su momento evalué varias máquinas virtuales, incluyendo <a href="http://www.virtualbox.org/">VirtualBox</a> (un proyecto open source muy interesante) y <a href="http://www.vmware.com/es/">VMware</a>. Finalmente, por facilidad de instalación y mantenimiento y por estabilidad en huéspedes Windows me decanté por la segunda.</p>
<p>Todo perfecto. El 95% del trabajo en Linux y cuando necesitaba sin remedio Windows, arrancaba la máquina virtual y listo.</p>
<p>El problema surgió tras una actualización de Ubuntu (aunque no sabría decir cuál concreta causó el problema): cuando arrancaba las máquinas virtuales, habían dejado de funcionar las teclas especiales, teclas tales como las flechas, el pad numérico, Inicio, Fin, etc.</p>
<p>Tras googlear un poco, ha resultado que la solución es bastante sencilla. Sólo hay que modificar el fichero de configuración del VMware, que en Ubuntu está en <em>/etc/vmware/config </em>para añadir la línea siguiente<em>:</em></p>
<pre>xkeymap.nokeycodeMap = "true"<em>
</em></pre>
<p>Me ha funcionado tanto con huéspedes Windows como Ubuntu.</p>
<p>ACTUALIZACIÓN:</p>
<p>La solución anterior aparentemente funcionaba bien pero la tecla <em>ALT GR</em> seguía sin funcionar. Investigando un poco más he encontrado la siguiente solución que sí que ha funcionado para todas las teclas. Consiste en establecer un mapeo manual de todas las teclas. Así pues, en el mismo fichero de configuración, borramos la línea anterior y añadimos las siguientes:</p>
<pre>xkeymap.keycode.108 = 0x138 # Alt_R
xkeymap.keycode.106 = 0x135 # KP_Divide
xkeymap.keycode.104 = 0x11c # KP_Enter
xkeymap.keycode.111 = 0x148 # Up
xkeymap.keycode.116 = 0x150 # Down
xkeymap.keycode.113 = 0x14b # Left
xkeymap.keycode.114 = 0x14d # Right
xkeymap.keycode.105 = 0x11d # Control_R
xkeymap.keycode.118 = 0x152 # Insert
xkeymap.keycode.119 = 0x153 # Delete
xkeymap.keycode.110 = 0x147 # Home
xkeymap.keycode.115 = 0x14f # End
xkeymap.keycode.112 = 0x149 # Prior
xkeymap.keycode.117 = 0x151 # Next
xkeymap.keycode.78 = 0x46 # Scroll_Lock
xkeymap.keycode.127 = 0x100 # Pause
xkeymap.keycode.133 = 0x15b # Meta_L
xkeymap.keycode.134 = 0x15c # Meta_R
xkeymap.keycode.135 = 0x15d # Menu</pre>
<br /> Tagged: Ubuntu, VMware <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ivanator.wordpress.com/306/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ivanator.wordpress.com/306/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ivanator.wordpress.com/306/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ivanator.wordpress.com/306/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/ivanator.wordpress.com/306/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/ivanator.wordpress.com/306/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/ivanator.wordpress.com/306/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/ivanator.wordpress.com/306/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ivanator.wordpress.com/306/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ivanator.wordpress.com/306/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ivanator.wordpress.com/306/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ivanator.wordpress.com/306/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ivanator.wordpress.com/306/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ivanator.wordpress.com/306/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ivanator.wordpress.com&amp;blog=6092394&amp;post=306&amp;subd=ivanator&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://ivanator.wordpress.com/2009/03/08/teclas-de-funcion-y-modificadores-no-funcionan-en-vmware-workstation-65-en-ubuntu-810/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">ivanator</media:title>
		</media:content>
	</item>
	</channel>
</rss>
