<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ilikeblues</title>
	<atom:link href="http://blog.ilikeblues.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.ilikeblues.com</link>
	<description>Mind your Software</description>
	<lastBuildDate>Wed, 03 Mar 2010 13:43:15 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Conversión de archivos de audio en linux</title>
		<link>http://blog.ilikeblues.com/2010/02/conversion-de-archivos-de-audio-en-linux/</link>
		<comments>http://blog.ilikeblues.com/2010/02/conversion-de-archivos-de-audio-en-linux/#comments</comments>
		<pubDate>Wed, 24 Feb 2010 11:25:53 +0000</pubDate>
		<dc:creator>ilikeblues</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Trucos]]></category>
		<category><![CDATA[audio conversor]]></category>
		<category><![CDATA[conversión audio]]></category>
		<category><![CDATA[conversor audio]]></category>
		<category><![CDATA[flac]]></category>
		<category><![CDATA[mp3]]></category>
		<category><![CDATA[ogg]]></category>
		<category><![CDATA[wav]]></category>

		<guid isPermaLink="false">http://blog.ilikeblues.com/?p=212</guid>
		<description><![CDATA[La herramienta SoX, multiplataforma, permite realizar varias operaciones muy interesantes sobre ficheros de audio:

Obtener información:
 $ sox fichero.wav

Reproducir audio:
$ play fichero.wav

Grabar archivo:
$ rec -r 8000 -c 1 fichero.wav
 → graba con un muestreo de 8 kbps y a un canal (la extensión determina el formato).
Convertir:
$ sox fichero.wav fichero.ogg
 → convierte el fichero del formato &#8220;wav&#8221; [...]]]></description>
			<content:encoded><![CDATA[<p>La herramienta <a href="http://sox.sourceforge.net/" target="_blank">SoX</a>, multiplataforma, permite realizar varias operaciones muy interesantes sobre ficheros de audio:</p>
<ul>
<li><strong>Obtener información</strong>:
<pre class="brush: php"> $ sox fichero.wav</pre>
</li>
<li><strong>Reproducir audio</strong>:
<pre class="brush: php">$ play fichero.wav</pre>
</li>
<li><strong>Grabar archivo</strong>:
<pre class="brush: php">$ rec -r 8000 -c 1 fichero.wav</pre>
<p> → graba con un muestreo de 8 kbps y a un canal (la extensión determina el formato).</li>
<li><strong>Convertir</strong>:
<pre class="brush: php">$ sox fichero.wav fichero.ogg</pre>
<p> → convierte el fichero del formato &#8220;wav&#8221; a &#8220;ogg&#8221;</li>
<li><strong>Acelerar</strong>:
<pre class="brush: php">$ sox fichero.wav acelerado.wav speed 2.0</pre>
</li>
<li><strong>Recortar</strong>:
<pre class="brush: php">$ sox fichero.wav recortado.wav trim 60 10</pre>
<p> → devuelve los 10 segundos posteriores al primer minuto.</li>
<li><strong>Escuchar podcast</strong>:
<pre class="brush: php">$ play http://dondesea.com/ficheros/audio/podcast.mp3</pre>
</li>
</ul>
<p>La instalación de Ubuntu es muy sencilla:</p>
<p><strong><span style="font-family: Courier New,Courier,mono; color: #000000;">$ sudo apt-get install sox libsox-fmt-all</span></strong></p>
<p><span style="color: #000000;">Para otras plataformas:</span> <a href="http://sox.sourceforge.net/" target="_blank">http://sox.sourceforge.net</a><span style="color: #000000;"> </span></p>
<p>La reproducción, grabado y/o conversión desde/hacia mp3 requiere de la <a href="http://lame.sourceforge.net/" target="_blank">librería lame</a>.</p>
<p>Via | <a href="http://bitelia.com/2010/02/comando-linux-sox-manipula-archivos-de-audio" target="_blank">http://bitelia.com</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ilikeblues.com/2010/02/conversion-de-archivos-de-audio-en-linux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Subversion: ignorar ficheros</title>
		<link>http://blog.ilikeblues.com/2010/02/subversion-ignorar-ficheros/</link>
		<comments>http://blog.ilikeblues.com/2010/02/subversion-ignorar-ficheros/#comments</comments>
		<pubDate>Wed, 10 Feb 2010 11:29:43 +0000</pubDate>
		<dc:creator>ilikeblues</dc:creator>
				<category><![CDATA[CVS]]></category>
		<category><![CDATA[ignorar ficheros]]></category>
		<category><![CDATA[ignore files]]></category>
		<category><![CDATA[propset]]></category>
		<category><![CDATA[subversion]]></category>
		<category><![CDATA[svn]]></category>
		<category><![CDATA[svn:ignore]]></category>

		<guid isPermaLink="false">http://blog.ilikeblues.com/?p=190</guid>
		<description><![CDATA[Para forzar a SVN a que ignore ciertos ficheros, como pueden ser los resultados de la compilación (objetos .o) es necesario establecer la propiedad &#8220;svn:ignore&#8221; en todas las carpetas donde queremos ignorarlos.
Para un proyecto con múltiples carpetas que contienen este tipo de ficheros lo más sencillo es:
$ svn propset svn:ignore -F $HOME/ignore_file . -R
donde -R [...]]]></description>
			<content:encoded><![CDATA[<p>Para forzar a SVN a que ignore ciertos ficheros, como pueden ser los resultados de la compilación (objetos .o) es necesario establecer la propiedad &#8220;svn:ignore&#8221; en todas las carpetas donde queremos ignorarlos.</p>
<p>Para un proyecto con múltiples carpetas que contienen este tipo de ficheros lo más sencillo es:</p>
<p><strong style="font-family: Courier New,Courier,mono; font-size: 1em;">$ svn propset svn:ignore -F $HOME/ignore_file . -R</strong></p>
<p>donde -R indica que se haga de manera recursiva desde &#8220;.&#8221; (el directorio actual) y -F indica que se tomen las reglas de exclusión del fichero inficado.</p>
<p>El contenido del fichero ignore_file podría ser, por ejemplo:</p>
<pre class="brush: bash">
*.o
*.so
*.exe
</pre>
<p>Con esto quedaráin excluidos los ficheros objeto, las librerías compartidas y los ejecutables (suponiendo que todos tengan nombres acabados en .exe).</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ilikeblues.com/2010/02/subversion-ignorar-ficheros/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google Wave Invitations</title>
		<link>http://blog.ilikeblues.com/2010/01/google-wave-invitations/</link>
		<comments>http://blog.ilikeblues.com/2010/01/google-wave-invitations/#comments</comments>
		<pubDate>Tue, 19 Jan 2010 07:39:25 +0000</pubDate>
		<dc:creator>ilikeblues</dc:creator>
				<category><![CDATA[Trucos]]></category>
		<category><![CDATA[google wave]]></category>
		<category><![CDATA[google wave invitations]]></category>
		<category><![CDATA[invitación google wave]]></category>
		<category><![CDATA[invitaciones google wave]]></category>

		<guid isPermaLink="false">http://blog.ilikeblues.com/?p=186</guid>
		<description><![CDATA[Tengo 7 invitaciones para Google Wave. Las primeros en solicitarlas a través de comentarios en este post, recibirán una.
Para ello es necesario que indiquen correctamente la dirección de email al escribir el comentario (no es necesario publicarlo en el texto).
Cerraré los comentarios cuando ya no queden invitaciones.
I &#8216;ve got 7 new invitations to Google Wave. [...]]]></description>
			<content:encoded><![CDATA[<p>Tengo 7 invitaciones para Google Wave. Las primeros en solicitarlas a través de comentarios en este post, recibirán una.</p>
<p>Para ello es necesario que indiquen correctamente la dirección de email al escribir el comentario (no es necesario publicarlo en el texto).</p>
<p>Cerraré los comentarios cuando ya no queden invitaciones.</p>
<hr />I &#8216;ve got 7 new invitations to Google Wave. Please, leave a comment on this post in order to get one.</p>
<p>Do not forget to fulfill the email field in the comment form.</p>
<p>Comments on the post will be closed where there are no invitations left to be sent.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ilikeblues.com/2010/01/google-wave-invitations/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>VT6656 Driver para Ubuntu Karmic Koala</title>
		<link>http://blog.ilikeblues.com/2009/11/vt6656-driver-para-ubuntu-karmic-koala/</link>
		<comments>http://blog.ilikeblues.com/2009/11/vt6656-driver-para-ubuntu-karmic-koala/#comments</comments>
		<pubDate>Fri, 06 Nov 2009 12:18:30 +0000</pubDate>
		<dc:creator>ilikeblues</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Trucos]]></category>
		<category><![CDATA[driver vt6656]]></category>
		<category><![CDATA[driver vt6656 ubuntu]]></category>
		<category><![CDATA[driver vt6656 ubuntu karmic]]></category>
		<category><![CDATA[driver vt6656 ubuntu karmic koala]]></category>
		<category><![CDATA[vt6656]]></category>
		<category><![CDATA[vt6656 karmic]]></category>
		<category><![CDATA[vt6656 karmic koala]]></category>

		<guid isPermaLink="false">http://blog.ilikeblues.com/?p=170</guid>
		<description><![CDATA[Tal como sugieren en el thread del bug correspondiente, VT6656 wireless chipset is unsupported, la solución para conseguir que funcione la tarjeta (o adaptador USB) wifi con chipset VT6656 es compilar la versión &#8220;staging&#8221; del driver, incluído en la versión del kernel 2.6.32-rc6.
En mi último viaje a Japón compré un Kohjinsha SC3 que monta este [...]]]></description>
			<content:encoded><![CDATA[<p>Tal como sugieren en el thread del bug correspondiente, <a href="https://bugs.launchpad.net/ubuntu/+source/linux/+bug/162671">VT6656 wireless chipset is unsupported</a>, la solución para conseguir que funcione la tarjeta (o adaptador USB) wifi con chipset VT6656 es compilar la versión &#8220;staging&#8221; del driver, incluído en la versión del <a href="http://www.kernel.org/pub/linux/kernel/v2.6/testing/linux-2.6.32-rc6.tar.bz2">kernel 2.6.32-rc6</a>.</p>
<p>En mi último <a href="http://viajes.ilikeblues.com/fotos/japan-04-09/">viaje a Japón</a> compré un Kohjinsha SC3 que monta este chipset. Así que he generado un pequeño paquete que permite compilar e instalar el driver en <a href="http://www.ubuntu.com">Ubuntu 9.10 (Karmic Koala)</a>.</p>
<p>Podéis descargar los fuentes aquí:</p>
<p><a href="http://blog.ilikeblues.com/wp-content/uploads/driver_staging_vt6656.tgz">driver_staging_vt6656.tgz</a></p>
<p>Al descomprimirlo generará una carpeta llamada &#8220;driver&#8221;. Basta con hacer (dentro de la carpeta generada):</p>
<pre class="brush: php">
$ sudo make install
</pre>
<p>para que se añada el driver al arranque de Ubuntu. Si ejecutamos:</p>
<pre class="brush: php">
$ modprobe vntwusb
</pre>
<p>el driver se cargará y podremos conectar a la red usando nuestra tarjeta wifi con chipset VT6656.</p>
<p>Por último decir que, tal como indican en el <a href="https://bugs.launchpad.net/ubuntu/+source/linux/+bug/162671">thread relacionado con el bug</a>, <strong>sólo funciona la encriptación WPA2. No funcionan ni WPA ni la mixta (WPA+WPA2)</strong>.</p>
<p>Que lo disfrutéis.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ilikeblues.com/2009/11/vt6656-driver-para-ubuntu-karmic-koala/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Javascript: comprobar si es el navegador de iPhone</title>
		<link>http://blog.ilikeblues.com/2009/10/javascript-comprobar-si-es-el-navegador-de-iphone/</link>
		<comments>http://blog.ilikeblues.com/2009/10/javascript-comprobar-si-es-el-navegador-de-iphone/#comments</comments>
		<pubDate>Tue, 20 Oct 2009 13:00:31 +0000</pubDate>
		<dc:creator>ilikeblues</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[javascript comprobar navegador iphone]]></category>
		<category><![CDATA[navegador iphone]]></category>

		<guid isPermaLink="false">http://blog.ilikeblues.com/?p=168</guid>
		<description><![CDATA[El siguiente código Javascript comprueba si el navegador actual es el de iPhone:

function iPhoneCheck() {
    var agent = navigator.userAgent.toLowerCase();
    var iphone = (agent.indexOf(&#039;iphone&#039;)!=-1);
    if (iphone) {
        return true;
    } else {
      [...]]]></description>
			<content:encoded><![CDATA[<p>El siguiente código Javascript comprueba si el navegador actual es el de iPhone:</p>
<p><pre class="brush: javascript">
function iPhoneCheck() {
    var agent = navigator.userAgent.toLowerCase();
    var iphone = (agent.indexOf(&#039;iphone&#039;)!=-1);
    if (iphone) {
        return true;
    } else {
        return false;
    }
}
</pre>
</p>
<p>Vía: <a href="http://blog.unijimpe.net/detectar-browser-iphone/">http://blog.unijimpe.net/detectar-browser-iphone/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ilikeblues.com/2009/10/javascript-comprobar-si-es-el-navegador-de-iphone/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Conexión a Base de Datos Safari-JavaScript</title>
		<link>http://blog.ilikeblues.com/2009/10/conexion-a-base-de-datos-safari-javascript/</link>
		<comments>http://blog.ilikeblues.com/2009/10/conexion-a-base-de-datos-safari-javascript/#comments</comments>
		<pubDate>Mon, 19 Oct 2009 14:39:48 +0000</pubDate>
		<dc:creator>ilikeblues</dc:creator>
				<category><![CDATA[How to]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[safari]]></category>
		<category><![CDATA[safari javascript database access]]></category>
		<category><![CDATA[safari javascript satabase access]]></category>
		<category><![CDATA[safari offline application]]></category>
		<category><![CDATA[safari persistent information]]></category>

		<guid isPermaLink="false">http://blog.ilikeblues.com/?p=164</guid>
		<description><![CDATA[Para realizar la conexión a una base de datos  mediante Javascript, podemos utilizar el siguiente código:

try {
   if (!window.openDatabase) {
      alert(&#039;not supported&#039;);
   } else {
      var shortName = &#039;mydatabase&#039;;
      var version = &#039;1.0&#039;;
    [...]]]></description>
			<content:encoded><![CDATA[<p>Para realizar la conexión a una base de datos  mediante Javascript, podemos utilizar el siguiente código:</p>
<pre class="brush: javascript">
try {
   if (!window.openDatabase) {
      alert(&#039;not supported&#039;);
   } else {
      var shortName = &#039;mydatabase&#039;;
      var version = &#039;1.0&#039;;
      var displayName = &#039;My Important Database&#039;;
      var maxSize = 65536; // in bytes
      var mydb = openDatabase(shortName, version, displayName, maxSize);

      // You should have a database instance in mydb.
   }
} catch(e) {
   // Error handling code goes here.
   if (e == 2) {
      // Version number mismatch.
      alert(&quot;Invalid database version.&quot;);
   } else {
      alert(&quot;Unknown error &quot;+e+&quot;.&quot;);
   }
   return;
}

alert(&quot;Database is: &quot;+mydb);
</pre>
<p>Con esto, sin más que implementar las transacciones necesarias, podemos hacer persistente la información cargada durante la sesión para su uso posterior.</p>
<p>Estas bases de datos se pueden utilizar para la implementación de aplicaciones Offline mediante Safari.</p>
<p>Para eliminar estas bases de datos creadas por aplicaciones web, basta con ir a la sección &#8220;Safari&#8221; de los ajustes del iPhone.</p>
<p>Vía: <a href="http://devworld.apple.com/safari/library/documentation/iPhone/Conceptusal/SafariJSDatabaseGuide/UsingtheJavascriptDatabase/UsingtheJavascriptDatabase.html">Safari Client-Side Storage and Offline Applications Programming Guide</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ilikeblues.com/2009/10/conexion-a-base-de-datos-safari-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AsistenteJeVWeb v0.1 released</title>
		<link>http://blog.ilikeblues.com/2009/08/asistentejevweb-v0-1-released/</link>
		<comments>http://blog.ilikeblues.com/2009/08/asistentejevweb-v0-1-released/#comments</comments>
		<pubDate>Mon, 10 Aug 2009 21:15:27 +0000</pubDate>
		<dc:creator>ilikeblues</dc:creator>
				<category><![CDATA[AsistenteJeVWeb]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[iPod Touch]]></category>
		<category><![CDATA[safari]]></category>
		<category><![CDATA[日本語]]></category>

		<guid isPermaLink="false">http://blog.ilikeblues.com/?p=143</guid>
		<description><![CDATA[Publicada la verión 0.1 del AsistenJeVWeb.
La información se puede consultar online o hacerla persistente utilizamdo el instalador del siguiente enlace.
Enlace: AsistenteJeVWeb.
]]></description>
			<content:encoded><![CDATA[<p>Publicada la verión 0.1 del AsistenJeVWeb.</p>
<p>La información se puede consultar online o hacerla persistente utilizamdo el instalador del siguiente enlace.</p>
<p>Enlace: <a href="http://blog.ilikeblues.com/wp-content/uploads/AsistenteJeVWeb/installer.html">AsistenteJeVWeb</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ilikeblues.com/2009/08/asistentejevweb-v0-1-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iPhone SDK: Registrar una clase como observador de un evento</title>
		<link>http://blog.ilikeblues.com/2009/07/iphone-sdk-registrar-una-clase-como-observador-de-un-evento/</link>
		<comments>http://blog.ilikeblues.com/2009/07/iphone-sdk-registrar-una-clase-como-observador-de-un-evento/#comments</comments>
		<pubDate>Mon, 06 Jul 2009 06:10:49 +0000</pubDate>
		<dc:creator>ilikeblues</dc:creator>
				<category><![CDATA[How to]]></category>
		<category><![CDATA[Objective-C / iPhone]]></category>
		<category><![CDATA[evento]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[observador]]></category>
		<category><![CDATA[sdk]]></category>

		<guid isPermaLink="false">http://blog.ilikeblues.com/?p=96</guid>
		<description><![CDATA[
[[NSNotificationCenter defaultCenter]
      addObserver:self
      selector:@selector(onDataChangeEvent:)
      name:@&#34;dataChangeEvent&#34;
      object:nil];

La clase que contiene este código:

Recibirá notificaciones de disparo del evento &#8220;dataChangeEvent&#8221;.
Debe implementar el método &#8220;onDataChagneEvent&#8221;.

Cuando algún otro objeto dispare el evento, las instancias de esta clase recibirán la notificación [...]]]></description>
			<content:encoded><![CDATA[<pre class="brush: c">
[[NSNotificationCenter defaultCenter]
      addObserver:self
      selector:@selector(onDataChangeEvent:)
      name:@&quot;dataChangeEvent&quot;
      object:nil];
</pre>
<p>La clase que contiene este código:</p>
<ol>
<li>Recibirá notificaciones de disparo del evento &#8220;dataChangeEvent&#8221;.</li>
<li>Debe implementar el método &#8220;onDataChagneEvent&#8221;.</li>
</ol>
<p>Cuando algún otro objeto dispare el evento, las instancias de esta clase recibirán la notificación y ejecutarán el método especificado.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ilikeblues.com/2009/07/iphone-sdk-registrar-una-clase-como-observador-de-un-evento/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AspectJ aplicado sobre una librería jar</title>
		<link>http://blog.ilikeblues.com/2009/05/aspectj-aplicado-sobre-una-libreria-jar/</link>
		<comments>http://blog.ilikeblues.com/2009/05/aspectj-aplicado-sobre-una-libreria-jar/#comments</comments>
		<pubDate>Tue, 12 May 2009 09:38:32 +0000</pubDate>
		<dc:creator>ilikeblues</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[aspectj]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[test]]></category>

		<guid isPermaLink="false">http://blog.ilikeblues.com/?p=87</guid>
		<description><![CDATA[El problema inicial es el siguiente: tenemos una aplicación java bajo prueba, formada por un conjunto de ficheros &#8220;jar&#8221;, de cuyo código conocemos algunos (o todos los) interfaces públicos.
A efectos prácticos, supongamos un único fichero jar llamado &#8220;underTest.jar&#8221; (los resultados son extensibles) y la clase que contiene el método &#8220;main&#8221; es &#8220;MainClass&#8221;, dentro del paquete [...]]]></description>
			<content:encoded><![CDATA[<p>El problema inicial es el siguiente: tenemos una aplicación java bajo prueba, formada por un conjunto de ficheros &#8220;jar&#8221;, de cuyo código conocemos algunos (o todos los) interfaces públicos.</p>
<p>A efectos prácticos, supongamos un único fichero jar llamado &#8220;underTest.jar&#8221; (los resultados son extensibles) y la clase que contiene el método &#8220;main&#8221; es &#8220;MainClass&#8221;, dentro del paquete &#8220;mainpack&#8221;:</p>
<pre class="brush: java">
public class MainClass {
public MainClass() {
}

/**
* @param args
*/
public static void main(String[] args) {
System.out.println(&quot;Ejecutando el main...&quot;);
}

}
</pre>
<p>Así, el comando para ejecutar la aplicación sería:</p>
<pre class="brush: java">
java -classpath underTest.jar mainpack.MainClass
</pre>
<p>El resultado de la ejecución sería:</p>
<pre class="brush: java">
Ejecutando el main...
</pre>
<p>En este caso, podemos utilizar <a href="http://eclipse.org/aspectj">AspectJ</a> para insertar puntos de ruptura, logear información de ejecución, de performance, etc.</p>
<p>Vamos con la prueba de concepto.</p>
<p>En primer lugar, vamos a crear una librería (jar) con los &#8220;aspectos&#8221; a utilizar. En este caso, algo muy simple: una clase que traza la entrada y la salida del método &#8220;main&#8221; de nuestra aplicación.</p>
<p>El código sería:</p>
<pre class="brush: java">
public aspect ProfilingAspect {

pointcut mainMethod() : execution(static * *.main(..));

before() : mainMethod()
{
System.out.println(&quot;Entrando al main...&quot;);
}

after() : mainMethod()
{
System.out.println(&quot;Saliendo del main...&quot;);
}

}
</pre>
<p>Podemos usar <a href="http://www.eclipse.org/">eclipse</a> para crear un proyecto de tipo <a href="http://eclipse.org/aspectj">AspectJ</a>, compilarlo y generar un fichero jar con soporte para AspectJ (echar un vistazo a las Cheat Sheets de eclipse con el <a href="http://www.eclipse.org/ajdt/">plugin AJDT</a>).</p>
<p>Supongamos que el fichero jar creado con el &#8220;aspecto&#8221; anterior es mainAspect.jar.</p>
<p>El siguiente paso sería modificar el comando utilizado para ejecutar la aplicación:</p>
<pre class="brush: java">
java
-classpath $ASPECTJ_HOME/aspectjweaver.jar:$ASPECTJ_HOME/aspectjrt.jar:.
-Djava.system.class.loader=org.aspectj.weaver.loadtime.WeavingURLClassLoader
-Daj.class.path=mainAspect.jar:underTest.jar
-Daj.aspect.path=mainAspect.jar
mainpack.MainClass
</pre>
<p>Donde $ASPECTJ_HOME apunta al directorio de instalación de las librerías de AspectJ (aspectjweaver.jar y aspectjrt.jar) en la máquina. Con esto el resultado de la ejecución sería:</p>
<pre class="brush: java">
Entrando al main...
Ejecutando el main...
Saliendo del main...
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.ilikeblues.com/2009/05/aspectj-aplicado-sobre-una-libreria-jar/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Usar un pool de threads para atender peticiones a un socket servidor</title>
		<link>http://blog.ilikeblues.com/2009/05/usar-un-pool-de-threads-para-un-socket-servidor/</link>
		<comments>http://blog.ilikeblues.com/2009/05/usar-un-pool-de-threads-para-un-socket-servidor/#comments</comments>
		<pubDate>Fri, 08 May 2009 12:11:25 +0000</pubDate>
		<dc:creator>ilikeblues</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[socket]]></category>
		<category><![CDATA[thread]]></category>

		<guid isPermaLink="false">http://blog.ilikeblues.com/?p=84</guid>
		<description><![CDATA[Un pequeño ejemplo de cómo construir un pool de threads para atender las peticiones de conexión que se realicen a un socket servidor:

class NetworkService {
    private final ServerSocket serverSocket;
    private final ExecutorService pool;

    public NetworkService(int port, int poolSize) throws IOException {
      [...]]]></description>
			<content:encoded><![CDATA[<p>Un pequeño ejemplo de cómo construir un pool de threads para atender las peticiones de conexión que se realicen a un socket servidor:</p>
<pre class="brush: java">
class NetworkService {
    private final ServerSocket serverSocket;
    private final ExecutorService pool;

    public NetworkService(int port, int poolSize) throws IOException {
      serverSocket = new ServerSocket(port);
      pool = Executors.newFixedThreadPool(poolSize);
    }

    public void serve() {
      try {
        for (;;) {
          pool.execute(new Handler(serverSocket.accept()));
        }
      } catch (IOException ex) {
        pool.shutdown();
      }
    }
  }

  class Handler implements Runnable {
    private final Socket socket;
    Handler(Socket socket) { this.socket = socket; }
    public void run() {
      // read and service request
    }
 }
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.ilikeblues.com/2009/05/usar-un-pool-de-threads-para-un-socket-servidor/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C++: excepción en construtor o destructor</title>
		<link>http://blog.ilikeblues.com/2009/01/c-excepcion-en-construtor-o-destructor/</link>
		<comments>http://blog.ilikeblues.com/2009/01/c-excepcion-en-construtor-o-destructor/#comments</comments>
		<pubDate>Wed, 14 Jan 2009 09:29:55 +0000</pubDate>
		<dc:creator>ilikeblues</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[auto_ptr]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[constructor]]></category>
		<category><![CDATA[destructor]]></category>

		<guid isPermaLink="false">http://blog.ilikeblues.com/?p=75</guid>
		<description><![CDATA[Cuando un constructor de clase lanza una excepción, los destructores para todos los objetos locales (objetos que forman parte de la clase que se está construyendo) son llamados. Si uno de los destructores llamados lanza una excepción, el método terminate será ejecutado.
En general, no se debería lanzar una excepción durante la ejecución de un constructor [...]]]></description>
			<content:encoded><![CDATA[<p>Cuando un constructor de clase lanza una excepción, los destructores para todos los objetos locales (objetos que forman parte de la clase que se está construyendo) son llamados. Si uno de los destructores llamados lanza una excepción, el método <strong>terminate</strong> será ejecutado.</p>
<p>En general, no se debería lanzar una excepción durante la ejecución de un constructor sin hacer un <strong>catch</strong> de la misma y llevar a acabo una <em>&#8220;limpieza&#8221;</em> de los recursos utilizados por la clase. Una solución sencilla podría ser utilizar el constructor por defecto para crear los miembros <em>&#8220;seguros&#8221;</em> de la clase y después llamar a un método de inicialización para los <em>&#8220;no seguros&#8221;</em>, incluyendo el <strong>exception handling</strong> en éste.</p>
<p>Veamos un ejemplo sencillo. Supongamos que tenemos el siguiente código:</p>
<pre class="brush: cpp">
class Employee {
   ...
   Image * m_pImage;
   AudioClip * m_pAudio;
};

Employee(..., string image, string audio) : ..., m_pImage(NULL), m_pAudio(NULL)
{
   ...
   m_pImage = new Image(image);
   m_pAudio = new AudioClip(audio); // throw point
}
</pre>
<p>Si el código &#8220;new AudioClip(audio)&#8221; lanza una excepción, el flujo de control sale del constructor y se produce un memory leak. El destructor sólo sería llamado si el objeto hubiera sido completamente construido, pero no ha sido así.</p>
<p>Entonces, la manera correcta de implementar ese constructor sería:</p>
<p class="Program">
<pre class="brush: cpp">
Employee(..., string image, string audio) : ..., m_pImage(NULL), m_pAudio(NULL)
{
   ...
   try {
      m_pImage = new Image(image);
      m_pAudio = new AudioClip(audio);
   }
   catch(...)
   {
      delete m_pImage;
      delete m_pAudio;
      throw;
   }
}
</pre>
<p>De manera que, si se levanta una excepción, los recursos reservados son liberados y se vuelve a despachar la excepción para que notificar al objeto que intentaba construir esta clase.</p>
<p>Esta solución es buena, funciona bien, excepto en el caso de que tengamos punteros constantes como miembros de la clase:</p>
<pre class="brush: cpp">
class Employee {
   ...
   Image * const m_pImage;
   AudioClip * const m_pAudio;
};
</pre>
<p>Estos miembros deben ser incializados por el incializador de miembros propio de la clase, donde no podemos poner bloques <em>try&#8230; catch</em>.</p>
<p>En este caso, podríamos utilizar la clase auto_ptr&lt;&gt; (o similar) como wrapper para los punteros, de manera que se conviertan en objetos locales a nuestra clase:</p>
<pre class="brush: cpp">
class Employee {
   ...
   auto_ptr&lt;image&gt; m_pImage;
   auto_ptr&lt;audioClip&gt; m_pAudio;
};
</pre>
<p>Como ya se ha dicho, si ocurre una excepción durante la ejecución del constructor, se ejecutan los destructores de todos los miembros locales a la clase. Es decir, se llamaría al destructor de auto_ptr&lt;&gt;, el cual libera, de la manera adecuada, todos los recursos reservados.</p>
<p>[Fuente: <a href="http://progtutorials.tripod.com/cpp2.htm#_Toc50821286">http://progtutorials.tripod.com</a>]</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ilikeblues.com/2009/01/c-excepcion-en-construtor-o-destructor/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GNUmakefile para Objective-C y Objective-C++</title>
		<link>http://blog.ilikeblues.com/2008/12/gnumakefile-para-objective-c-y-objective-c/</link>
		<comments>http://blog.ilikeblues.com/2008/12/gnumakefile-para-objective-c-y-objective-c/#comments</comments>
		<pubDate>Mon, 22 Dec 2008 14:09:52 +0000</pubDate>
		<dc:creator>ilikeblues</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://blog.ilikeblues.com/?p=70</guid>
		<description><![CDATA[Construir el makefile para un proyecto Objective-C en el framework de GNUstep es muy sencillo.
Basta con añadir algunas directivas de inclusión de ficheros y la lista de ficheros de código:

include $(GNUSTEP_MAKEFILES)/common.make

APP_NAME = edictParser
edictParser_APPLICATION_ICON = icon.png
edictParser_RESOURCE_FILES = icon.png
edictParser_OBJC_FILES = main.m

include $(GNUSTEP_MAKEFILES)/application.make

Para el caso de querer utilizar código C++, sustituimos la línea:

edictParser_OBJC_FILES = main.m

por:

edictParser_OBJCC_FILES = main.mm

Y un [...]]]></description>
			<content:encoded><![CDATA[<p>Construir el makefile para un proyecto Objective-C en el framework de GNUstep es muy sencillo.</p>
<p>Basta con añadir algunas directivas de inclusión de ficheros y la lista de ficheros de código:</p>
<pre class="brush: c">
include $(GNUSTEP_MAKEFILES)/common.make

APP_NAME = edictParser
edictParser_APPLICATION_ICON = icon.png
edictParser_RESOURCE_FILES = icon.png
edictParser_OBJC_FILES = main.m

include $(GNUSTEP_MAKEFILES)/application.make
</pre>
<p>Para el caso de querer utilizar código C++, sustituimos la línea:</p>
<pre class="brush: c">
edictParser_OBJC_FILES = main.m
</pre>
<p>por:</p>
<pre class="brush: c">
edictParser_OBJCC_FILES = main.mm
</pre>
<p>Y un pequeño truco para no tener que modificar el makefile cada vez que añadimos un fichero de código:</p>
<pre class="brush: c">
edictParser_OBJCC_FILES = $(shell ls -c1 *.mm)
</pre>
<p>[Nótese que la extensión para los ficheros Objective-C++ es mm.]</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ilikeblues.com/2008/12/gnumakefile-para-objective-c-y-objective-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sustitución de cadenas en SQL</title>
		<link>http://blog.ilikeblues.com/2008/11/66/</link>
		<comments>http://blog.ilikeblues.com/2008/11/66/#comments</comments>
		<pubDate>Tue, 11 Nov 2008 15:19:18 +0000</pubDate>
		<dc:creator>ilikeblues</dc:creator>
				<category><![CDATA[Trucos]]></category>

		<guid isPermaLink="false">http://blog.ilikeblues.com/?p=66</guid>
		<description><![CDATA[Esto es relativamente sencillo:

UPDATE [nombre_tabla] SET [nombre_campo] =
REPLACE([nombre_campo],&#039;[cadena_actual]&#039;,&#039;[cadena_nueva]&#039;);

Por ejemplo:

UPDATE articulo SET cuerpo =
REPLACE(cuerpo,&#039;à&#039;,&#039;á&#039;);

]]></description>
			<content:encoded><![CDATA[<p>Esto es relativamente sencillo:</p>
<pre class="brush: sql">
UPDATE [nombre_tabla] SET [nombre_campo] =
REPLACE([nombre_campo],&#039;[cadena_actual]&#039;,&#039;[cadena_nueva]&#039;);
</pre>
<p>Por ejemplo:</p>
<pre class="brush: sql">
UPDATE articulo SET cuerpo =
REPLACE(cuerpo,&#039;à&#039;,&#039;á&#039;);
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.ilikeblues.com/2008/11/66/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Establecer el &#8220;locale&#8221; para una aplicación C/C++</title>
		<link>http://blog.ilikeblues.com/2008/10/establecer-el-locale-para-una-aplicacion-cc/</link>
		<comments>http://blog.ilikeblues.com/2008/10/establecer-el-locale-para-una-aplicacion-cc/#comments</comments>
		<pubDate>Thu, 09 Oct 2008 09:15:17 +0000</pubDate>
		<dc:creator>ilikeblues</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[locale]]></category>

		<guid isPermaLink="false">http://blog.ilikeblues.com/?p=62</guid>
		<description><![CDATA[A veces puede ser conveniente establecer el &#8220;locale&#8221; de la manera adecuada en una aplicación.
Por ejemplo, si vamos a utilizar expresiones regulares con caracteres no-ASCII (como la ñ o los caracteres acentuados).
Para establecer el locale, podemos utilizar el código:

const char* locstr = setlocale(LC_ALL, &#34;es_ES.UTF8&#34;);

if (locstr == NULL) {
   printf(&#34;SETLOCALE ERROR!\n&#34;);
}

[Consultar API para setlocale.]
Si [...]]]></description>
			<content:encoded><![CDATA[<p>A veces puede ser conveniente establecer el &#8220;locale&#8221; de la manera adecuada en una aplicación.</p>
<p>Por ejemplo, si vamos a utilizar <a href="http://blog.ilikeblues.com/?p=50">expresiones regulares</a> con caracteres no-ASCII (como la ñ o los caracteres acentuados).</p>
<p>Para establecer el locale, podemos utilizar el código:</p>
<pre class="brush: c">
const char* locstr = setlocale(LC_ALL, &quot;es_ES.UTF8&quot;);

if (locstr == NULL) {
   printf(&quot;SETLOCALE ERROR!\n&quot;);
}
</pre>
<p>[Consultar API para <a href="http://linux.die.net/man/3/setlocale">setlocale</a>.]</p>
<p>Si como ejemplo, buscamos la expresión regular &#8220;ñ&#8221; dentro de la cadena &#8220;este año es muy frío&#8221;, obtendremos un resultado diferente, dependiendo del locale definido:</p>
<ol>
<li>Si se ha definido el locale &#8220;es&#8221;:
<pre class="brush: c">
start offset: 6
end offset:  8
</pre>
</li>
<li>Si el locale es, por ejemplo, &#8220;us&#8221;:
<pre class="brush: c">
start offset: 6
end offset:  7
</pre>
</li>
</ol>
<p>Ya conocemos los problemas que presenta C/C++ para tratar caracteres unicode. Pero, al menos, podemos hacer búsquedas y sustituciones de una manera más fiable si el locale definido es el adecuado.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ilikeblues.com/2008/10/establecer-el-locale-para-una-aplicacion-cc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Expresiones regulares C</title>
		<link>http://blog.ilikeblues.com/2008/10/expresiones-regulares-c/</link>
		<comments>http://blog.ilikeblues.com/2008/10/expresiones-regulares-c/#comments</comments>
		<pubDate>Thu, 09 Oct 2008 08:54:37 +0000</pubDate>
		<dc:creator>ilikeblues</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[regex]]></category>

		<guid isPermaLink="false">http://blog.ilikeblues.com/?p=50</guid>
		<description><![CDATA[A continuación código de ejemplo que muestra cómo buscar expresiones regulares en cadenas de texto:

regex_t regex;
const int MAXMATCHES = 1;

regmatch_t matches[MAXMATCHES];

const char* str = &#34;Look inside this string...&#34;;
const char* patt = &#34;side&#34;;

size_t size = MAXMATCHES;

int cflags = REG_EXTENDED&#124;REG_ICASE;
int eflags = cflags;

int result = 0;
int rescomp = regcomp(&#38;amp;amp;amp;amp;regex, patt, cflags);
if (rescomp == 0) {
   [...]]]></description>
			<content:encoded><![CDATA[<p>A continuación código de ejemplo que muestra cómo buscar expresiones regulares en cadenas de texto:</p>
<pre class="brush: c">
regex_t regex;
const int MAXMATCHES = 1;

regmatch_t matches[MAXMATCHES];

const char* str = &quot;Look inside this string...&quot;;
const char* patt = &quot;side&quot;;

size_t size = MAXMATCHES;

int cflags = REG_EXTENDED|REG_ICASE;
int eflags = cflags;

int result = 0;
int rescomp = regcomp(&amp;amp;amp;amp;amp;regex, patt, cflags);
if (rescomp == 0) {
   result = regexec((const regex_t*)&amp;amp;amp;amp;amp;regex, str, size, matches, eflags);
}
if (result == REG_NOMATCH) {
   printf(&quot;NOT MATCHED!&quot;);
} else {

   for (int i = 0;i &lt; MAXMATCHES;i++) {
      regoff_t startOff = matches[i].rm_so;
      regoff_t endOff   = matches[i].rm_eo;

      if (startOff != -1) {
         printf(&quot;start offset:  %i&quot;, startOff);
         printf(&quot;end offset:   &quot;%i, endOff);
      }
   }
}
</pre>
<p>Este código imprimirá en el terminal la siguiente salida:</p>
<pre class="brush: c">
start offset: 7
end offset:  11
</pre>
<p>Es decir, delimita el trozo de cadena que &#8220;machea&#8221; la expresión regular.</p>
<p>[En este enlace se puede consultar cómo construir <a href="http://www.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap09.html">expresiones regulares POSIX</a>.]</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ilikeblues.com/2008/10/expresiones-regulares-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FTP recursivo</title>
		<link>http://blog.ilikeblues.com/2008/09/ftp-recursivo/</link>
		<comments>http://blog.ilikeblues.com/2008/09/ftp-recursivo/#comments</comments>
		<pubDate>Fri, 12 Sep 2008 10:33:01 +0000</pubDate>
		<dc:creator>ilikeblues</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Trucos]]></category>
		<category><![CDATA[ftp]]></category>
		<category><![CDATA[recursivo]]></category>

		<guid isPermaLink="false">http://blog.ilikeblues.com/?p=35</guid>
		<description><![CDATA[Hacer un FTP recursivo utilizando el cliente en línea de comando puede ser un infierno. El comando mget sólo toma los ficheros del directorio actual. Con lo cual hay que navegar &#8220;a mano&#8221; a través de las carpetas para ir tomando los ficheros y colocarlos en el lugar adecuado.
La solución es utilizar el comando wget:
$ [...]]]></description>
			<content:encoded><![CDATA[<p>Hacer un FTP recursivo utilizando el cliente en línea de comando puede ser un infierno. El comando mget sólo toma los ficheros del directorio actual. Con lo cual hay que navegar &#8220;a mano&#8221; a través de las carpetas para ir tomando los ficheros y colocarlos en el lugar adecuado.</p>
<p>La solución es utilizar el comando wget:</p>
<p style="font-size: 1.2em"><code>$ wget -r --user=nombre-usuario --password=pass ftp://nombre-dominio:puerto/path</code></p>
<p>Por ejemplo:</p>
<p style="font-size: 1.2em"><b><code>$ wget -r --user=ilikeblues --password=cutrepass ftp://midominio.com/micarpeta</code></b></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ilikeblues.com/2008/09/ftp-recursivo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Singleton en Java</title>
		<link>http://blog.ilikeblues.com/2008/08/singleton-en-java/</link>
		<comments>http://blog.ilikeblues.com/2008/08/singleton-en-java/#comments</comments>
		<pubDate>Mon, 18 Aug 2008 10:20:35 +0000</pubDate>
		<dc:creator>ilikeblues</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Trucos]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[singleton]]></category>

		<guid isPermaLink="false">http://blog.ilikeblues.com/?p=33</guid>
		<description><![CDATA[[Este artículo es una traducción de Singleton in Java - the proper way.]
Existen dos formas comunes de implementar una clase singleton en Java, que son: utilizar una instancia &#8220;public static final&#8221; o bien utilizar el método de &#8220;static factory&#8221; (podéis ver ejemplos en la wikipedia).
Sin embargo, existe un tercer método. Probablemente, este es el mejor, [...]]]></description>
			<content:encoded><![CDATA[<p>[Este artículo es una traducción de <a href="http://electrotek.wordpress.com/2008/08/06/singleton-in-java-the-proper-way/">Singleton in Java - the proper way</a>.]</p>
<p>Existen dos formas comunes de implementar una clase singleton en Java, que son: utilizar una instancia &#8220;public static final&#8221; o bien utilizar el método de &#8220;static factory&#8221; (podéis ver ejemplos <a href="http://en.wikipedia.org/wiki/Singleton_pattern">en la wikipedia</a>).</p>
<p>Sin embargo, existe un tercer método. Probablemente, este es el mejor, si se usa una versión de Java superior a la 1.5.</p>
<p>Se puede utilizar un &#8220;enum&#8221; . De esta manera, se obtinene la funcionalidad del Singleton de una manera muy sencilla, además de que no se necesita implementar la serialización, ya viene &#8220;de fábrica&#8221;:</p>
<pre class="brush: java">
package electro;

public enum YourSingleton {
   INSTANCE;

   public void doStuff(String stuff) {
      System.out.println(&quot;Doing &quot; + stuff);
   }
}
</pre>
<p>Así, podemos utilizarla completamente seguros de que es singleton:</p>
<pre class="brush: java">
YourSingleton.INSTANCE.doStuff(&quot;some stuff&quot;);
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.ilikeblues.com/2008/08/singleton-en-java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Configuración proxy en Ubuntu</title>
		<link>http://blog.ilikeblues.com/2008/05/configuracion-proxy-en-ubuntu/</link>
		<comments>http://blog.ilikeblues.com/2008/05/configuracion-proxy-en-ubuntu/#comments</comments>
		<pubDate>Mon, 12 May 2008 10:58:27 +0000</pubDate>
		<dc:creator>ilikeblues</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Trucos]]></category>
		<category><![CDATA[apt-get]]></category>
		<category><![CDATA[proxy]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://blog.ilikeblues.com/?p=29</guid>
		<description><![CDATA[Trabajar con máquinas Ubuntu en un entorno con proxy puede ser un poco molesto, sobre todo a la hora de actualizar el sistema operativo o utilizar aplicaciones que realizan conexiones a Internet y no permiten una configuración proxy rápida e intuitiva.
Los navegadores suelen ser fáciles de configurar. Sin embargo,¿cómo hacer para que, por ejemplo, apt-get [...]]]></description>
			<content:encoded><![CDATA[<p>Trabajar con máquinas Ubuntu en un entorno con proxy puede ser un poco molesto, sobre todo a la hora de actualizar el sistema operativo o utilizar aplicaciones que realizan conexiones a Internet y no permiten una configuración proxy rápida e intuitiva.</p>
<p>Los navegadores suelen ser fáciles de configurar. Sin embargo,¿cómo hacer para que, por ejemplo, apt-get funcione correctamente?</p>
<p>Es bastante sencillo: sólo hay que añadir estas líneas al final del fichero <em><strong>/etc/profile</strong></em>:</p>
<p><strong>http_proxy=http://{nombre_de_usuario}:{contraseña}@{proxy_server}:{puerto_proxy}/<br />
export http_proxy</strong></p>
<p>Por ejemplo:</p>
<p><strong>http_proxy=http://pepito:grillo@proxy.midominio.com:8080/<br />
export http_proxy</strong></p>
<p>Reboot y listo. <strong>apt-get</strong>, y el resto de aplicaciones que hacen conexiones de tipo http a internet, funcionando correctamente.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ilikeblues.com/2008/05/configuracion-proxy-en-ubuntu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Más de 30 libros gratis online&#8230;</title>
		<link>http://blog.ilikeblues.com/2008/04/mas-de-30-libros-gratis-online/</link>
		<comments>http://blog.ilikeblues.com/2008/04/mas-de-30-libros-gratis-online/#comments</comments>
		<pubDate>Wed, 23 Apr 2008 07:27:53 +0000</pubDate>
		<dc:creator>ilikeblues</dc:creator>
				<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://blog.ilikeblues.com/?p=28</guid>
		<description><![CDATA[Libros sobre administración, programción, etc. Todos online y todos gratis.
Espero que lo disfrutéis&#8230;
http://www.bgoncalves.com/notes/2008/04/20/30-free-online-books/
]]></description>
			<content:encoded><![CDATA[<p>Libros sobre administración, programción, etc. Todos online y todos gratis.</p>
<p>Espero que lo disfrutéis&#8230;</p>
<p><a href="http://www.bgoncalves.com/notes/2008/04/20/30-free-online-books/">http://www.bgoncalves.com/notes/2008/04/20/30-free-online-books/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ilikeblues.com/2008/04/mas-de-30-libros-gratis-online/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Aplicación RCP en pantalla completa</title>
		<link>http://blog.ilikeblues.com/2008/03/aplicacion-rcp-en-pantalla-completa/</link>
		<comments>http://blog.ilikeblues.com/2008/03/aplicacion-rcp-en-pantalla-completa/#comments</comments>
		<pubDate>Fri, 07 Mar 2008 08:14:42 +0000</pubDate>
		<dc:creator>ilikeblues</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Trucos]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[rcp]]></category>

		<guid isPermaLink="false">http://blog.ilikeblues.com/?p=27</guid>
		<description><![CDATA[En Eclipse 3.4, es posible abrir un Shell SWT en modo &#8220;pantalla completa&#8221;. ¡Ojo! &#8220;pantalla completa&#8221; no es lo mismo que &#8220;maximizado&#8221;, cosa que ya se podía hacer en versiones anteriores de SWT (y, por tanto, de Eclipse).
El código:

fullScreenAction = new Action(&#34;Full Screen&#34;) {
   {
      setId(&#34;fullscreen&#34;);
   [...]]]></description>
			<content:encoded><![CDATA[<p>En Eclipse 3.4, es posible abrir un Shell SWT en modo &#8220;pantalla completa&#8221;. ¡Ojo! &#8220;pantalla completa&#8221; no es lo mismo que &#8220;maximizado&#8221;, cosa que ya se podía hacer en versiones anteriores de SWT (y, por tanto, de Eclipse).</p>
<p>El código:</p>
<pre class="brush: java">
fullScreenAction = new Action(&quot;Full Screen&quot;) {
   {
      setId(&quot;fullscreen&quot;);
      setActionDefinitionId(&quot;mypluginid&quot; + &quot;fullscreen&quot;);
   } //$NON-NLS-1$

   public void run() {
      // grab an IWorkbenchWindow and fullscreen it
      window.getShell().setFullScreen(true);
   }
};
</pre>
<p>Es muy simple. Para más información, tenéis este <a href="http://mea-bloga.blogspot.com/2008/02/full-screen-your-rcp-applications.html">post</a>.</p>
<p>[Este post es una traduccion de <a href="http://eclipse.dzone.com/tips/full-screen-your-rcp-applicati">este otro</a>, publicado en <a href="http://www.dzone.com">dzone</a>.]</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ilikeblues.com/2008/03/aplicacion-rcp-en-pantalla-completa/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Llamadas a funciones estáticas externas en C</title>
		<link>http://blog.ilikeblues.com/2008/02/llamadas-a-funciones-estaticas-externas-en-c/</link>
		<comments>http://blog.ilikeblues.com/2008/02/llamadas-a-funciones-estaticas-externas-en-c/#comments</comments>
		<pubDate>Wed, 27 Feb 2008 11:09:47 +0000</pubDate>
		<dc:creator>ilikeblues</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[How to]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[acceso]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[estático]]></category>
		<category><![CDATA[función]]></category>

		<guid isPermaLink="false">http://blog.ilikeblues.com/?p=25</guid>
		<description><![CDATA[Sí, sí, ya lo sé. ¿Por qué querría alguien hacer una llamada a una función declarada como estática desde otro módulo?
Si una función se ha declarado estática para restringir el acceso a la misma, para no incluirla en el API del módulo, ¿por qué &#8220;bypassear&#8221; la funcionalidad y acceder a ella?
En mi caso, la respuesta [...]]]></description>
			<content:encoded><![CDATA[<p>Sí, sí, ya lo sé. ¿Por qué querría alguien hacer una llamada a una función declarada como estática desde otro módulo?</p>
<p>Si una función se ha declarado estática para restringir el acceso a la misma, para no incluirla en el API del módulo, ¿por qué &#8220;bypassear&#8221; la funcionalidad y acceder a ella?</p>
<p>En mi caso, la respuesta es sencilla: pruebas unitarias. ¿Cómo hacer pruebas unitarias de estas rutinas?</p>
<p>La respuesta es, creando punteros a estas rutinas, accesibles desde otros módulos. Y puesto que cualquier solución implica cambios en los módulos a probar, en el ejemplo a continuación trataré de ser lo menos &#8220;intrusivo&#8221; posible.</p>
<p>Supongamos el módulo stfunc.c:</p>
<pre class="brush: c">
#include &lt;stdio.h&gt;
static int funcprintf(const char* str) {
   return printf(str);
}
</pre>
<p>Para probar esta rutina, tenemos esta otra, en otro fichero diferente (main.c):</p>
<pre class="brush: c">
int main() {
   int a = funcprintf(&quot;Loquesea&quot;);
   return a;
}
</pre>
<p>Si intentamos compilar, obtenemos el error &#8220;undefined reference to `funcprintf&#8217;&#8221;.</p>
<p>Así pues, vamos a crear un puntero a esta rutina para permitir el acceso a la misma desde el módulo de prueba. Creamos un fichero llamado ptrdefs.h:</p>
<pre class="brush: c">
#ifndef _PTRDEFS_H
#define _PTRDEFS_H
int (*fpointer)(const char*) = &amp;funcprintf;
#endif
</pre>
<p>Y modificamos los ficheros anteriores de esta manera:<br />
Fichero stfunc.c:</p>
<pre class="brush: c">
#include &lt;stdio.h&gt;

static int funcprintf(const char* str) {
   return printf(str);
}

#ifdef UNIT_TESTING
#include
&lt;ptrdefs.h&gt;
#endif
</pre>
<p>Fichero main.c:</p>
<pre class="brush: c">
int main() {
   int a = fpointer(&quot;Loquesea&quot;);

   return a;
}
</pre>
<p>Con esto, basta añadir la opción -DUNIT_TESTING para tener acceso a la rutina.</p>
<p>Por tro lado, el fichero ptrdefs.h sólo estará disponible para los tests unitarios. Esto evita el acceso indeseado.</p>
<p>[Código completo del ejemplo: <a href="http://blog.ilikeblues.com/wp-content/uploads/2008/02/static.tgz" title="Código completo del resultado">static.tgz</a>]</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ilikeblues.com/2008/02/llamadas-a-funciones-estaticas-externas-en-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sobrecarga de métodos en Java</title>
		<link>http://blog.ilikeblues.com/2008/02/sobrecarga-de-metodos-en-java/</link>
		<comments>http://blog.ilikeblues.com/2008/02/sobrecarga-de-metodos-en-java/#comments</comments>
		<pubDate>Thu, 07 Feb 2008 13:38:39 +0000</pubDate>
		<dc:creator>ilikeblues</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[overloading]]></category>

		<guid isPermaLink="false">http://blog.ilikeblues.com/?p=23</guid>
		<description><![CDATA[Este artículo es una traducción no literal de Java Method Overloading Explained, publicado por Adam Thomas.
Para empezar, una breve reseña acerca de la sobrecarga de métodos. Decimos que un método ha sido &#8220;sobrecargado&#8221; cuando han sido creados múltiples métodos con el mismo nombre, pero especificando distintos argumentos (en número o tipo).
Como ejemplo veamos este trozo [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Este artículo es una traducción <em>no literal</em> de <a href="http://caffeineinducedcoding.blogspot.com/2008/02/java-method-overloading-explained.html">Java Method Overloading Explained</a></strong>, publicado por Adam Thomas.</p>
<p>Para empezar, una breve reseña acerca de la sobrecarga de métodos. Decimos que un método ha sido &#8220;sobrecargado&#8221; cuando han sido creados múltiples métodos con el mismo nombre, pero especificando distintos argumentos (en número o tipo).</p>
<p>Como ejemplo veamos este trozo de código:</p>
<pre class="brush: java">
class Dog {
   public static void main(String[] args) {
      bark();    // prints &quot;no param&quot;
      bark(100); // prints &quot;with param&quot;
   }

   public static void bark() {
      System.out.println(&quot;no param&quot;);
   }

   public static void bark(int decibels) {
      System.out.println(&quot;with param&quot;);
   }
}
</pre>
<p>En este caso, se ejecuta un método u otro dependiendo de si se especifica un parámetro en la llamado o no.</p>
<p>Supongamos ahora una situación como la siguiente:</p>
<pre class="brush: java">
class Animal {}

class Dog extends Animal {}

class TestOverload {
   public static void main (String[] args) {
      Animal a1 = new Animal();
      Animal a2 = new Dog();
      Dog d = new Dog();
      makeSound(a1);
      makeSound(a2);
      makeSound(d);
   }

   public static void makeSound(Animal a) {
      System.out.println(&quot;Making animal sound&quot;);
   }

   public static void makeSound(Dog d) {
      System.out.println(&quot;Making dog sound&quot;);
   }
}
</pre>
<p>A priori, podríamos pensar que la salida es:</p>
<pre><code><span style="font-size: 11px">
Making animal sound
Making dog sound
Making dog sound
</span></code></pre>
<p>Sin embargo, la salida es:</p>
<pre><code><span style="font-size: 11px">
Making animal sound
Making animal sound
Making dog sound
</span></code></pre>
<p>La razón es que Java determina qué versión del método sobrecargado va a ser llamada en <strong>tiempo de compilación</strong>.</p>
<p>Así pues, aunque a referencia <em>a2 </em>apunta a una instancia del objeto <em>Dog</em>, el compilador utiliza una referencia de tipo <em>Animal </em>para determinar cual de los métodos será llamado.</p>
<p>A continuación un ejemplo de lo <em>peligroso</em> que puede llegar a resultar esto. Un ejemplo en que la salida del programa no permite distinguir cual de los métodos está siendo ejecutado:</p>
<pre class="brush: java">
class Animal {
   public void doMakeNoise() {
      System.out.println(&quot;Making animal noise&quot;);
   }
}

class Dog extends Animal {}

class TestOverload {
   public static void main (String[] args) {
      Animal a1 = new Animal();
      Animal a2 = new Dog();
      Dog d = new Dog();
      makeSound(a1);
      makeSound(a2);
      makeSound(d);
   }
   public static void makeSound(Animal a) {
      a.doMakeNoise();
   }
   public static void makeSound(Dog d) {
      d.doMakeNoise();
   }
}
</pre>
<p>La salida sería:</p>
<pre><code><span style="font-size: 11px">
Making animal noise
Making animal noise
Making animal noise
</span></code></pre>
<p>Esto se debe al polimorfismo y la llamada a <em>doMakeNoise </em>añadida en cada uno de los métodos <em>makeSound</em>.</p>
<p>Evidentemente, esto no es un problema si la funcionalidad final es la misma (pero en este caso se necesitaría una reorganización de código).</p>
<p>Lo importante, en cualquier caso, es tener en mente que Java determina el método sobrecargado a ejecutar en <strong>tiempo de compilación</strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ilikeblues.com/2008/02/sobrecarga-de-metodos-en-java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Utilización de gprof/gcov: cobertura de ramas (y II)</title>
		<link>http://blog.ilikeblues.com/2008/02/utilizacion-de-gprofgcov-cobertura-de-ramas-y-ii/</link>
		<comments>http://blog.ilikeblues.com/2008/02/utilizacion-de-gprofgcov-cobertura-de-ramas-y-ii/#comments</comments>
		<pubDate>Tue, 05 Feb 2008 08:04:31 +0000</pubDate>
		<dc:creator>ilikeblues</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[How to]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[branch]]></category>
		<category><![CDATA[cobertura]]></category>
		<category><![CDATA[gcc]]></category>
		<category><![CDATA[gcov]]></category>
		<category><![CDATA[gprof]]></category>
		<category><![CDATA[ramas]]></category>

		<guid isPermaLink="false">http://blog.ilikeblues.com/?p=18</guid>
		<description><![CDATA[Continuando con la temática del post anterior, vamos a ver en este caso, como chequear la cobertura lógica en bloques de código con condiciones de acceso más o menos complejas.
Supongamos el siguiente fichero de código main.c:

En este caso, el script de compilación y ejecución será compexec.sh:

Nótese como la herramienta gcov ha sido ejecutada con las [...]]]></description>
			<content:encoded><![CDATA[<p>Continuando con la temática del <a href="http://blog.ilikeblues.com/?p=6" title="Utilización gcov/gprof (I)">post anterior</a>, vamos a ver en este caso, como chequear la cobertura lógica en bloques de código con condiciones de acceso más o menos complejas.</p>
<p>Supongamos el siguiente fichero de código main.c:</p>
<p><a href="http://blog.ilikeblues.com/wp-content/uploads/2008/02/gcov_mainc.png" title="main.c"><img src="http://blog.ilikeblues.com/wp-content/uploads/2008/02/gcov_mainc.png" alt="main.c" /></a></p>
<p>En este caso, el script de compilación y ejecución será compexec.sh:</p>
<p><a href="http://blog.ilikeblues.com/wp-content/uploads/2008/02/gcov_compexecsh.png" title="compexec.sh"><img src="http://blog.ilikeblues.com/wp-content/uploads/2008/02/gcov_compexecsh.png" alt="compexec.sh" /></a></p>
<p>Nótese como la herramienta gcov ha sido ejecutada con las opciones -b y -c. Según &#8220;man gcov&#8221;:</p>
<ol>
<li>-b<br />
&#8211;branch-probabilities<br />
Write branch frequencies to the output file, and write branch summary info to the standard output.  This option allows you to see how often each branch in your program was taken. Unconditional branches will not be shown, unless the -u option is given.</li>
<li>-c<br />
&#8211;branch-counts<br />
Write branch frequencies as the number of branches taken, rather than the percentage of branches taken.</li>
</ol>
<p>Es decir, pedimos a la herramienta que devuelva información sobre ejecución de las &#8220;ramas lógicas&#8221;, dando como resultado el fichero main.c.gcov:</p>
<p><a href="http://blog.ilikeblues.com/wp-content/uploads/2008/02/gcov_bc_output.png" title="main.c.gcov"><img src="http://blog.ilikeblues.com/wp-content/uploads/2008/02/gcov_bc_output.png" alt="main.c.gcov" /></a></p>
<p>Aquí podemos ver información, aunque un tanto críptica, sobre la ejecución de dos bloques if-else. Como puede verse, cada uno de ellos presenta cuatro ramas, numeradas de &#8220;branch 0&#8243; a &#8220;branch 3&#8243;. Veamos a continuación la explicación de estos datos:</p>
<p>Supongamos la condición:</p>
<pre class="brush: c">
if (a || b) {
   x;
} else {
   y;
}
</pre>
<p>Esta condición (o combinación de condiciones) da lugar a 4 ramas, que se corresponden con las posibles combinaciones de valores booleanos de las dos variables:</p>
<p>a  b<br />
&#8212;-<br />
0  0<br />
0  1<br />
1  0<br />
1  1</p>
<p>Podemos reescribir esta condición como:</p>
<pre class="brush: c">
if (a == false) {
   // Branch 0
   if (b == false) {
      // Branch 2
      y;
   } else {
      // Branch 3;
      x;
   }
} else {
   // Branch 1
   x;
}
</pre>
<p>Supongamos ahora la condición:</p>
<pre class="brush: c">
if (a &amp;&amp; b) {
   x;
} else {
   y;
}
</pre>
<p>Como antes, esta condición (o combinación de condiciones) da lugar a 4 ramas, que se corresponden con las posibles combinaciones de valores booleanos de las dos variables:</p>
<p>a  b<br />
&#8212;-<br />
1  1<br />
1  0<br />
0  1<br />
0  0</p>
<p>Podemos reescribir esta condición como:</p>
<pre class="brush: c">
if (a == true) {
   // Branch 0
   if (b == true) {
      // Branch 2
      x;
   } else {
      // Branch 3;
      y;
   }
} else {
   // Branch 1
   y;
}
</pre>
<p>En cualquiera de los casos anteriores, la herramienta gcov (con las opciones -bc) nos devuelve el número de veces que cada una de las ramas nombradas más arriba ha sido ejecutada.</p>
<p>Si se omite la opción -c, los resultados son porcentajes, de manera que la suma de las ejecuciones de todas las ramas deberá ser el 100 %.</p>
<p>Además, se puede deducir que, en cualquiera de los casos:</p>
<p>1.- (nº de ejecuciones de rama 0) + (nº ejecuciones rama 1) = (nº ejecuciones<br />
del if</p>
<p>2.- (nº ejec rama 2) + (nº ejec rama 3) = (nº ejec rama 1)</p>
<p>En conclusión, podemos deducir qué líneas de código y ramas lógicas han sido ejecutadas y añadir/modificar los test cases necesarios para alcanzar la cobertura deseada.</p>
<p>[<a href="http://blog.ilikeblues.com/wp-content/uploads/2008/02/gpc_branch.zip" title="Código completo y resultados">Código completo y resultados.</a>]</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ilikeblues.com/2008/02/utilizacion-de-gprofgcov-cobertura-de-ramas-y-ii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Utilización de gprof/gcov para obtención de datos de cobertura (I)</title>
		<link>http://blog.ilikeblues.com/2008/02/utilizacion-de-gprofgcov-para-obtencion-de-datos-de-cobertura-i/</link>
		<comments>http://blog.ilikeblues.com/2008/02/utilizacion-de-gprofgcov-para-obtencion-de-datos-de-cobertura-i/#comments</comments>
		<pubDate>Mon, 04 Feb 2008 08:28:35 +0000</pubDate>
		<dc:creator>ilikeblues</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[How to]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[cobertura]]></category>
		<category><![CDATA[gcc]]></category>
		<category><![CDATA[gcov]]></category>
		<category><![CDATA[gprof]]></category>

		<guid isPermaLink="false">http://blog.ilikeblues.com/?p=6</guid>
		<description><![CDATA[Vamos a ver, en unos pasos muy simples, cómo utilizar las herramientas gprof/gcov (integradas con el compilador gcc) para obtener información de cobertura de ejecución de una aplicación. Los resultados son aplicables a cualquier entorno en que dispongamos de estas herramientas (Linux, windows+cygwin, MacOSX+Xcode, etc).
Para empezar el código fuente, main.c:
    
A continuación, [...]]]></description>
			<content:encoded><![CDATA[<p>Vamos a ver, en unos pasos muy simples, cómo utilizar las herramientas gprof/gcov (integradas con el compilador gcc) para obtener información de cobertura de ejecución de una aplicación. Los resultados son aplicables a cualquier entorno en que dispongamos de estas herramientas (Linux, windows+cygwin, MacOSX+Xcode, etc).</p>
<p>Para empezar el código fuente, main.c:</p>
<p><a href="http://blog.ilikeblues.com/wp-content/uploads/2008/02/gcov_mainc.png" title="main.c">    </a><a href="http://blog.ilikeblues.com/wp-content/uploads/2008/02/gcov_simple_main.png" title="main.c"><img src="http://blog.ilikeblues.com/wp-content/uploads/2008/02/gcov_simple_main.png" alt="main.c" /></a></p>
<p>A continuación, las instrucciones de compilación y ejecución, compexec.sh:</p>
<p><a href="http://blog.ilikeblues.com/wp-content/uploads/2008/02/gcov_compexec.png" title="compexec.sh"><img src="http://blog.ilikeblues.com/wp-content/uploads/2008/02/gcov_compexec.png" alt="compexec.sh" /></a><a href="http://blog.ilikeblues.com/wp-content/uploads/2008/02/gcov_compexecsh.png" title="compexec.sh"> </a></p>
<p>Como se puede apreciar, son tres las opciones añadidas al compilador/linkador para obtener los resultados esperados:</p>
<ol>
<li>-pgEsto es lo que dice &#8220;man gcc&#8221; acerca de esta opción:
<p>&#8220;<em>Generate extra code to write profile information suitable for the analysis program gprof.  You must use this option when compiling the source files you want data about, and you must also use it when linking.</em>&#8221;</p>
<p>Es decir, prepara el ejecutable para generar información suscpetible de ser utilizada por gprof para obtener información de &#8220;profiling&#8221;. Tras la ejecución de la aplicación generada con esta opción, se crea el fichero gmon.out.</li>
<li>-ftest-coverage</li>
<li>-fprofile-arcsEstas dos opciones son las que indican al compilador que, durante la ejecución de la aplicación, debe generarse información de cobertura.
<p>[La salida "man gcc" para estas opciones es demasiado larga para incluirla aquí, pero puede verse en <a href="http://bama.ua.edu/cgi-bin/man-cgi?gcc" title="man gcc">este enlace</a>.]</p>
<p>El ejecutable compilado/linkado con estas opciones genera los ficheros main.gcno y main.gcda, que contienen los datos utilizados por gcov para generar información &#8220;legible&#8221; de cobertura.</li>
</ol>
<p>Así pues, una vez ejecutada la aplicación y obtenidos estos ficheros, basta con ejecutar el comando gcov:</p>
<p>$ gcov main.c</p>
<p>(tal como se ha incluido en el fichero compexec.sh) y como resultado se obtiene el fichero main.c.gcov:</p>
<p><a href="http://blog.ilikeblues.com/wp-content/uploads/2008/02/gcov_output.png" title="main.c.gcov"><img src="http://blog.ilikeblues.com/wp-content/uploads/2008/02/gcov_output.png" alt="main.c.gcov" /></a></p>
<p>El fichero de resultados muestra el número de veces que un statement ha sido ejecutado.</p>
<p>Las instrucciones marcadas con &#8220;#####&#8221; son aquellas no cubiertas por la ejecución de la aplicación.</p>
<p>[<a href="http://blog.ilikeblues.com/wp-content/uploads/2008/02/gpc.zip" title="Código completo y resultados">Código completo y resultados.</a>]</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ilikeblues.com/2008/02/utilizacion-de-gprofgcov-para-obtencion-de-datos-de-cobertura-i/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Eclipse Test and Performance Tools Platform Review</title>
		<link>http://blog.ilikeblues.com/2008/02/eclipse-test-and-performance-tools-platform-review/</link>
		<comments>http://blog.ilikeblues.com/2008/02/eclipse-test-and-performance-tools-platform-review/#comments</comments>
		<pubDate>Fri, 01 Feb 2008 08:52:22 +0000</pubDate>
		<dc:creator>ilikeblues</dc:creator>
				<category><![CDATA[Reviews]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[review]]></category>
		<category><![CDATA[test]]></category>
		<category><![CDATA[tools]]></category>

		<guid isPermaLink="false">http://blog.ilikeblues.com/?p=3</guid>
		<description><![CDATA[As part of the R&#38;D department in my company, I spend some of my time in  quest for tools to make our developer&#8217;s life easier.
As soon as you go back to a previously written line of code (to read, check  or even rewrite it&#8230;), you are entering the &#8220;maintenance mode&#8221;. That&#8217;s the  [...]]]></description>
			<content:encoded><![CDATA[<p>As part of the R&amp;D department in my company, I spend some of my time in  quest for tools to make our developer&#8217;s life easier.</p>
<p>As soon as you go back to a previously written line of code (to read, check  or even rewrite it&#8230;), you are entering the &#8220;maintenance mode&#8221;. That&#8217;s the  reason why code maintainability is so important in software engineering. And,  since mainly working on pseudo real-time systems (such as wireless sensor  networks), performance in our tools is another important point.</p>
<p>So, TPTP eclipse plugin is a very useful tool for us. We integrate it in our  projects from the very beginning of the development process.</p>
<p>From my point of view these are the strong TPTP plugin points:</p>
<ol>
<li>Code Analyzer: it is fast, intuitive and highly configurable. A newbie will  not spend more than five minutes to adapt it to his needs and correctly use  it.</li>
<li>The &#8220;Quick Fix&#8221; functionality: in most cases, the solution proposed is  pretty good.</li>
<li>The Profiling tool: though mainly interested in execution time and method  coverage, I stated that this plugin covers many other useful  functionalities.</li>
</ol>
<p>On the other hand, there are some features that, of course from my point of  view, should be improved.</p>
<p>Most of our application prototypes are being deployed as  <strong>RCPs</strong>. And RCPs profiling executions are not completely working  in all of our different development environments. In fact, Eclipse Europa  environment and last TPTP plugin version (4.4) has been the first to give some  information about that kind of applications (maybe due to unsatisfied  dependencies in our previous environments).</p>
<p>In conclusion, some improvements in executions profiling will make this so  helpful plugin be an indispensable tool for Java developers and SW  engineers.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ilikeblues.com/2008/02/eclipse-test-and-performance-tools-platform-review/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
