<?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 &#187; How to</title>
	<atom:link href="http://blog.ilikeblues.com/category/software/how-to/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.ilikeblues.com</link>
	<description>Mind your Software</description>
	<lastBuildDate>Wed, 28 Jul 2010 12:56:36 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
		<atom:link rel="next" href="http://blog.ilikeblues.com/category/software/how-to/feed/?page=2" />

		<item>
		<title>CSS: resetear los estilos de navegador por defecto</title>
		<link>http://blog.ilikeblues.com/2010/07/css-resetear-los-estilos-de-navegador-por-defecto/</link>
		<comments>http://blog.ilikeblues.com/2010/07/css-resetear-los-estilos-de-navegador-por-defecto/#comments</comments>
		<pubDate>Wed, 07 Jul 2010 12:17:19 +0000</pubDate>
		<dc:creator>ilikeblues</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[How to]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Trucos]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[browser inconsistencies]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[css reset]]></category>
		<category><![CDATA[inconsistencias en navegadores]]></category>
		<category><![CDATA[navegador]]></category>
		<category><![CDATA[reset]]></category>
		<category><![CDATA[reset styles]]></category>
		<category><![CDATA[resetear css]]></category>
		<category><![CDATA[resetear estilos]]></category>
		<category><![CDATA[resetear estilos por defecto]]></category>
		<category><![CDATA[resetear hoja de estilos]]></category>

		<guid isPermaLink="false">http://blog.ilikeblues.com/?p=446</guid>
		<description><![CDATA[La siguiente hoja CSS permite resetear los estilos por defecto del navegador que estés usando. Con esto podemos evitar las inconsistencias en la presentación del sitio web en distintos navegadores.

html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, font, img, ins, [...]


Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2010/03/ajax-convertir-html-a-objeto-dom/' rel='bookmark' title='Permanent Link: AJAX: Convertir HTML a objeto DOM'>AJAX: Convertir HTML a objeto DOM</a></li>
<li><a href='http://blog.ilikeblues.com/2010/04/slider-con-css3-puro-y-funcionalidad-de-back-button/' rel='bookmark' title='Permanent Link: Slider con CSS3 puro y funcionalidad de Back Button'>Slider con CSS3 puro y funcionalidad de Back Button</a></li>
<li><a href='http://blog.ilikeblues.com/2010/06/css-crear-reflejos-en-navegadores-con-soporte-webkit/' rel='bookmark' title='Permanent Link: CSS: crear reflejos en navegadores con soporte WebKit'>CSS: crear reflejos en navegadores con soporte WebKit</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>La siguiente hoja CSS permite resetear los estilos por defecto del navegador que estés usando. Con esto podemos evitar las inconsistencias en la presentación del sitio web en distintos navegadores.</p>
<pre class="brush: css">
html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, font, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td {
margin: 0;
padding: 0;
border: 0;
outline: 0;
font-size: 100%;
vertical-align: baseline;
background: transparent;
}
body {
line-height: 1;
}
ol, ul {
list-style: none;
}
blockquote, q {
quotes: none;
}
blockquote:before, blockquote:after,
q:before, q:after {
content: &#039;&#039;;
content: none;
}

/* remember to define focus styles! */
:focus {
outline: 0;
}

/* remember to highlight inserts somehow! */
ins {
text-decoration: none;
}
del {
text-decoration: line-through;
}

/* tables still need &#039;cellspacing=&quot;0&quot;&#039; in the markup */
table {
border-collapse: collapse;
border-spacing: 0;
}
</pre>
<p>Vía | <a href="http://www.webspeaks.in/2010/07/25-incredibly-useful-css-tricks-you.html">http://www.webspeaks.in</a></p>


<p>Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2010/03/ajax-convertir-html-a-objeto-dom/' rel='bookmark' title='Permanent Link: AJAX: Convertir HTML a objeto DOM'>AJAX: Convertir HTML a objeto DOM</a></li>
<li><a href='http://blog.ilikeblues.com/2010/04/slider-con-css3-puro-y-funcionalidad-de-back-button/' rel='bookmark' title='Permanent Link: Slider con CSS3 puro y funcionalidad de Back Button'>Slider con CSS3 puro y funcionalidad de Back Button</a></li>
<li><a href='http://blog.ilikeblues.com/2010/06/css-crear-reflejos-en-navegadores-con-soporte-webkit/' rel='bookmark' title='Permanent Link: CSS: crear reflejos en navegadores con soporte WebKit'>CSS: crear reflejos en navegadores con soporte WebKit</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.ilikeblues.com/2010/07/css-resetear-los-estilos-de-navegador-por-defecto/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Crear elementos DOM &#8211; HTML dinámicamente usando jQuery</title>
		<link>http://blog.ilikeblues.com/2010/05/crear-elementos-dom-html-dinamicamente-usando-jquery/</link>
		<comments>http://blog.ilikeblues.com/2010/05/crear-elementos-dom-html-dinamicamente-usando-jquery/#comments</comments>
		<pubDate>Mon, 10 May 2010 07:49:57 +0000</pubDate>
		<dc:creator>ilikeblues</dc:creator>
				<category><![CDATA[How to]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[ajax asíncrono]]></category>
		<category><![CDATA[dinámicamente]]></category>
		<category><![CDATA[dom]]></category>
		<category><![CDATA[elemento]]></category>
		<category><![CDATA[elemento dinámico]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://blog.ilikeblues.com/?p=349</guid>
		<description><![CDATA[Echando un vistazo a este artículo sobre cómo añadir un objeto iframe dinámicamente, veo que la técnica es válida para cualquier objeto HTML que queramos añadir al DOM.
El código para crear un elemento iframe sería:


$(&#039;&#60;iframe /&#62;&#039;);

También podemos crearlo con atributos:


$(&#039;&#60;iframe id=&#34;myFrame&#34; name=&#34;myFrame&#34;&#62;&#039;);

Para terminar, podemos insertarlo en el DOM:


$(&#039;&#60;iframe id=&#34;myFrame&#34; name=&#34;myFrame&#34;&#62;&#039;)
   .appendTo(&#039;body&#039;);

El contenido del [...]


Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2010/04/ajax-jquery-elementos-html-dinamicos/' rel='bookmark' title='Permanent Link: AJAX + jQuery: elementos HTML dinámicos'>AJAX + jQuery: elementos HTML dinámicos</a></li>
<li><a href='http://blog.ilikeblues.com/2010/05/peticion-ajax-usando-jquery/' rel='bookmark' title='Permanent Link: Cómo realizar una petición AJAX usando jQuery'>Cómo realizar una petición AJAX usando jQuery</a></li>
<li><a href='http://blog.ilikeblues.com/2010/03/ajax-convertir-html-a-objeto-dom/' rel='bookmark' title='Permanent Link: AJAX: Convertir HTML a objeto DOM'>AJAX: Convertir HTML a objeto DOM</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Echando un vistazo a este <a href="http://www.itrickz.co.cc/2010/05/dynamically-create-iframes-using-jquery.html" target="_blank">artículo sobre cómo añadir un objeto iframe dinámicamente</a>, veo que la técnica es válida para cualquier objeto HTML que queramos añadir al DOM.</p>
<p>El código para crear un elemento iframe sería:</p>
<pre class="brush: javascript">

$(&#039;&lt;iframe /&gt;&#039;);
</pre>
<p>También podemos crearlo con atributos:</p>
<pre class="brush: javascript">

$(&#039;&lt;iframe id=&quot;myFrame&quot; name=&quot;myFrame&quot;&gt;&#039;);
</pre>
<p>Para terminar, podemos insertarlo en el DOM:</p>
<pre class="brush: javascript">

$(&#039;&lt;iframe id=&quot;myFrame&quot; name=&quot;myFrame&quot;&gt;&#039;)
   .appendTo(&#039;body&#039;);
</pre>
<p>El contenido del iframe se fija a través de su atributo &#8220;source&#8221;:</p>
<pre class="brush: javascript">
$(&#039;&lt;iframe /&gt;&#039;)
   .attr(&#039;src&#039;, &#039;http://www.google.com&#039;);
</pre>
<p>En los comentarios del mismo artículo, alguien sugiere, además, esta otra manera de hacerlo:</p>
<pre class="brush: javascript">

$(&#039;&lt;iframe /&gt;&#039;, {
   name: &#039;myFrame&#039;,
   id:   &#039;myFrame&#039;,
   ...
}).appendTo(&#039;body&#039;);
</pre>
<p>Personalmente, prefiero la segunda&#8230;</p>
<p>Vía | <a href="http://www.itrickz.co.cc/2010/05/dynamically-create-iframes-using-jquery.html">http://www.itrickz.co.cc</a></p>


<p>Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2010/04/ajax-jquery-elementos-html-dinamicos/' rel='bookmark' title='Permanent Link: AJAX + jQuery: elementos HTML dinámicos'>AJAX + jQuery: elementos HTML dinámicos</a></li>
<li><a href='http://blog.ilikeblues.com/2010/05/peticion-ajax-usando-jquery/' rel='bookmark' title='Permanent Link: Cómo realizar una petición AJAX usando jQuery'>Cómo realizar una petición AJAX usando jQuery</a></li>
<li><a href='http://blog.ilikeblues.com/2010/03/ajax-convertir-html-a-objeto-dom/' rel='bookmark' title='Permanent Link: AJAX: Convertir HTML a objeto DOM'>AJAX: Convertir HTML a objeto DOM</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.ilikeblues.com/2010/05/crear-elementos-dom-html-dinamicamente-usando-jquery/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Usar jQuery para comprobar si existe un elemento</title>
		<link>http://blog.ilikeblues.com/2010/05/usar-jquery-para-comprobar-si-existe-un-elemento/</link>
		<comments>http://blog.ilikeblues.com/2010/05/usar-jquery-para-comprobar-si-existe-un-elemento/#comments</comments>
		<pubDate>Fri, 07 May 2010 07:58:46 +0000</pubDate>
		<dc:creator>ilikeblues</dc:creator>
				<category><![CDATA[How to]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[comprobar elemento]]></category>
		<category><![CDATA[comprobar existencia]]></category>
		<category><![CDATA[dom]]></category>
		<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://blog.ilikeblues.com/?p=341</guid>
		<description><![CDATA[Tal como dice la especificación, la propiedad &#8220;length&#8221; en  jQuery devuelve la cantidad de objetos que responden al selector utilizado.
De manera que podemos utilizar el código:

$(&#34;#id&#34;).length

&#8230;  
para determinar si existe algún elemento con el identificador &#8220;id&#8221; en el DOM.
Ejemplo de código:

if ($(&#34;#id&#34;).length) {
   $(&#34;#id&#34;).text(&#34;Hello!&#34;);
}

Vía &#124; http://eisabainyo.net


Relacionados:AJAX + jQuery: elementos HTML dinámicos
Cómo realizar [...]


Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2010/04/ajax-jquery-elementos-html-dinamicos/' rel='bookmark' title='Permanent Link: AJAX + jQuery: elementos HTML dinámicos'>AJAX + jQuery: elementos HTML dinámicos</a></li>
<li><a href='http://blog.ilikeblues.com/2010/05/peticion-ajax-usando-jquery/' rel='bookmark' title='Permanent Link: Cómo realizar una petición AJAX usando jQuery'>Cómo realizar una petición AJAX usando jQuery</a></li>
<li><a href='http://blog.ilikeblues.com/2010/05/crear-elementos-dom-html-dinamicamente-usando-jquery/' rel='bookmark' title='Permanent Link: Crear elementos DOM &#8211; HTML dinámicamente usando jQuery'>Crear elementos DOM &#8211; HTML dinámicamente usando jQuery</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Tal como dice <a href="http://api.jquery.com/length/" target="_blank">la especificación</a>, la propiedad &#8220;length&#8221; en  jQuery devuelve la cantidad de objetos que responden al selector utilizado.</p>
<p>De manera que podemos utilizar el código:</p>
<pre class="brush: javascript">
$(&quot;#id&quot;).length
</pre>
<p>&#8230;  </p>
<p>para determinar si existe algún elemento con el identificador &#8220;id&#8221; en el DOM.</p>
<p>Ejemplo de código:</p>
<pre class="brush: javascript">
if ($(&quot;#id&quot;).length) {
   $(&quot;#id&quot;).text(&quot;Hello!&quot;);
}
</pre>
<p>Vía | <a href="http://eisabainyo.net/weblog/2010/05/07/how-to-check-if-div-exists-in-jquery/" target="_blank">http://eisabainyo.net</a></p>


<p>Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2010/04/ajax-jquery-elementos-html-dinamicos/' rel='bookmark' title='Permanent Link: AJAX + jQuery: elementos HTML dinámicos'>AJAX + jQuery: elementos HTML dinámicos</a></li>
<li><a href='http://blog.ilikeblues.com/2010/05/peticion-ajax-usando-jquery/' rel='bookmark' title='Permanent Link: Cómo realizar una petición AJAX usando jQuery'>Cómo realizar una petición AJAX usando jQuery</a></li>
<li><a href='http://blog.ilikeblues.com/2010/05/crear-elementos-dom-html-dinamicamente-usando-jquery/' rel='bookmark' title='Permanent Link: Crear elementos DOM &#8211; HTML dinámicamente usando jQuery'>Crear elementos DOM &#8211; HTML dinámicamente usando jQuery</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.ilikeblues.com/2010/05/usar-jquery-para-comprobar-si-existe-un-elemento/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cómo realizar una petición AJAX usando jQuery</title>
		<link>http://blog.ilikeblues.com/2010/05/peticion-ajax-usando-jquery/</link>
		<comments>http://blog.ilikeblues.com/2010/05/peticion-ajax-usando-jquery/#comments</comments>
		<pubDate>Thu, 06 May 2010 08:17:28 +0000</pubDate>
		<dc:creator>ilikeblues</dc:creator>
				<category><![CDATA[How to]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[ajax asíncrono]]></category>
		<category><![CDATA[dom]]></category>
		<category><![CDATA[get]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[html dinámico]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[petición]]></category>
		<category><![CDATA[petición asíncrona]]></category>
		<category><![CDATA[post]]></category>
		<category><![CDATA[xmlhttprequest]]></category>

		<guid isPermaLink="false">http://blog.ilikeblues.com/?p=336</guid>
		<description><![CDATA[Podemos utilizar jQuery para realizar peticiones AJAX a un servidor y actualizar el contenido web dinámicamente.
Este es el código que necesitamos para hacer un GET:

$.get(&#34;profile.php&#34;, { username: &#34;rob&#34; },
   function(response){
      // put the HTML content of profile.php into a div with id = &#34;profile_page&#34;
     [...]


Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2010/04/ajax-jquery-elementos-html-dinamicos/' rel='bookmark' title='Permanent Link: AJAX + jQuery: elementos HTML dinámicos'>AJAX + jQuery: elementos HTML dinámicos</a></li>
<li><a href='http://blog.ilikeblues.com/2010/05/crear-elementos-dom-html-dinamicamente-usando-jquery/' rel='bookmark' title='Permanent Link: Crear elementos DOM &#8211; HTML dinámicamente usando jQuery'>Crear elementos DOM &#8211; HTML dinámicamente usando jQuery</a></li>
<li><a href='http://blog.ilikeblues.com/2010/03/ajax-convertir-html-a-objeto-dom/' rel='bookmark' title='Permanent Link: AJAX: Convertir HTML a objeto DOM'>AJAX: Convertir HTML a objeto DOM</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Podemos utilizar <a href="http://jquery.com/" target="_blank">jQuery</a> para realizar peticiones AJAX a un servidor y actualizar el contenido web dinámicamente.</p>
<p>Este es el código que necesitamos para hacer un GET:</p>
<pre class="brush: javascript">
$.get(&quot;profile.php&quot;, { username: &quot;rob&quot; },
   function(response){
      // put the HTML content of profile.php into a div with id = &quot;profile_page&quot;
      $(&quot;#profile_page&quot;).html(response);
   }
);
</pre>
<p>Este código realiza una petición de tipo &#8220;GET&#8221; al mismo servidor en que se encuentra la página cargada, con un único parámetro &#8220;uername&#8221;, y utiliza el HTML devuelto para construir el contenido de un elemento cuyo identificador es &#8220;profile_page&#8221;.</p>
<p>De la misma manera podemos hacer una petición &#8220;POST&#8221;:</p>
<pre class="brush: javascript">
$.post(&quot;login.php&quot;, { username: &quot;rob&quot;, password: &quot;secret&quot; },
   function(response){
      if (response == &quot;good&quot;){
         alert(&quot;You have logged in successfully.&quot;);
      }else{
         alert(&quot;Invalid username/password&quot;);
      }
   }
);
</pre>
<p>En este caso, la respuesta será &#8220;good&#8221; si el login se ejecutó correctamente.</p>
<p>Vía | <a href="http://lovehateubuntu.blogspot.com/2010/05/ajax-in-5-minutes-using-jquery.html" target="_blank">http://lovehateubuntu.blogspot.com</a></p>


<p>Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2010/04/ajax-jquery-elementos-html-dinamicos/' rel='bookmark' title='Permanent Link: AJAX + jQuery: elementos HTML dinámicos'>AJAX + jQuery: elementos HTML dinámicos</a></li>
<li><a href='http://blog.ilikeblues.com/2010/05/crear-elementos-dom-html-dinamicamente-usando-jquery/' rel='bookmark' title='Permanent Link: Crear elementos DOM &#8211; HTML dinámicamente usando jQuery'>Crear elementos DOM &#8211; HTML dinámicamente usando jQuery</a></li>
<li><a href='http://blog.ilikeblues.com/2010/03/ajax-convertir-html-a-objeto-dom/' rel='bookmark' title='Permanent Link: AJAX: Convertir HTML a objeto DOM'>AJAX: Convertir HTML a objeto DOM</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.ilikeblues.com/2010/05/peticion-ajax-usando-jquery/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AJAX + jQuery: elementos HTML dinámicos</title>
		<link>http://blog.ilikeblues.com/2010/04/ajax-jquery-elementos-html-dinamicos/</link>
		<comments>http://blog.ilikeblues.com/2010/04/ajax-jquery-elementos-html-dinamicos/#comments</comments>
		<pubDate>Tue, 06 Apr 2010 15:41:52 +0000</pubDate>
		<dc:creator>ilikeblues</dc:creator>
				<category><![CDATA[How to]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[dynamic html]]></category>
		<category><![CDATA[dynamic html elements]]></category>
		<category><![CDATA[elementos html dinámicos]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[html dinámico]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[live query]]></category>
		<category><![CDATA[livequery]]></category>

		<guid isPermaLink="false">http://blog.ilikeblues.com/?p=293</guid>
		<description><![CDATA[Existe un plugin para jQuery que permite manejar eventos que se producen sobre elementos HTML añadidos dinámicamente (por ejemplo, después de una petición AJAX).
El plugin se llama &#8220;live query&#8220;. Veamos un ejemplo sencillo.
Supongamos que partimos del siguiente código:

$(document).ready(function() {
   $(&#34;.content&#34;).hover(
      function() {
       [...]


Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2010/05/peticion-ajax-usando-jquery/' rel='bookmark' title='Permanent Link: Cómo realizar una petición AJAX usando jQuery'>Cómo realizar una petición AJAX usando jQuery</a></li>
<li><a href='http://blog.ilikeblues.com/2010/05/crear-elementos-dom-html-dinamicamente-usando-jquery/' rel='bookmark' title='Permanent Link: Crear elementos DOM &#8211; HTML dinámicamente usando jQuery'>Crear elementos DOM &#8211; HTML dinámicamente usando jQuery</a></li>
<li><a href='http://blog.ilikeblues.com/2010/03/ajax-convertir-html-a-objeto-dom/' rel='bookmark' title='Permanent Link: AJAX: Convertir HTML a objeto DOM'>AJAX: Convertir HTML a objeto DOM</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Existe un plugin para <a href="http://jquery.com/" target="_blank">jQuery</a> que permite manejar eventos que se producen sobre elementos HTML añadidos dinámicamente (por ejemplo, después de una petición AJAX).</p>
<p>El plugin se llama &#8220;<a href="http://brandonaaron.net/code" target="_blank">live query</a>&#8220;. Veamos un ejemplo sencillo.</p>
<p>Supongamos que partimos del siguiente código:</p>
<pre class="brush: javascript">
$(document).ready(function() {
   $(&quot;.content&quot;).hover(
      function() {
         $(this).stop().animate({paddingLeft: &#039;+100px&#039;}, 1000);
      }
     ,function() {
         $(this).stop().animate({paddingLeft: &#039;10px&#039;}, 1000);
      });
   });
</pre>
<p>Para aplicarlo a elementos añadidos dinámicamente tendríamos que ejecutar el código:</p>
<pre class="brush: javascript">
function callWheneverTheElementsAreLoaded() {
   $(&quot;.content&quot;).livequery(function() {
      $(this).hover(
         function() {
            $(this).stop().animate({paddingLeft: &#039;+100px&#039;}, 1000);
         }
        ,function() {
            $(this).stop().animate({paddingLeft: &#039;10px&#039;}, 1000);
         });
      },
      function() {
         // unbind the mouseover and mouseout events
         $(this)
            .unbind(&#039;mouseover&#039;)
            .unbind(&#039;mouseout&#039;);
      });
}
</pre>
<p>tras la adición de los mismos al HTML.</p>
<p>Nótese que la llamada a livequery admite dos parámetros:</p>
<ol>
<li>función callback que queremos añadir a los elementos nuevos</li>
<li>función callback a ejecutar cuando los elementos sean eliminados</li>
</ol>
<p>Nota: por supuesto, es necesario añadir la librería live query al html después de la librería jQuery:</p>
<pre class="brush: html">
&lt;!doctype html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;scripts/jquery-1.4.2.min.js&quot;&gt;
&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;scripts/jquery.livequery-1.1.1/jquery.livequery.min.js&quot;&gt;
&lt;/script&gt;
etc...
</pre>
<p>personalizando para cada caso los paths y/o nombres de ficheros, etc.</p>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">$(document).ready(function() {</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">$(&#8221;.content&#8221;).hover(</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">function() {</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">$(this).stop().animate({paddingLeft: &#8216;+100px&#8217;}, 1000);</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">}</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">,function() {</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">$(this).stop().animate({paddingLeft: &#8216;10px&#8217;}, 1000);</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">});</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">})</div>


<p>Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2010/05/peticion-ajax-usando-jquery/' rel='bookmark' title='Permanent Link: Cómo realizar una petición AJAX usando jQuery'>Cómo realizar una petición AJAX usando jQuery</a></li>
<li><a href='http://blog.ilikeblues.com/2010/05/crear-elementos-dom-html-dinamicamente-usando-jquery/' rel='bookmark' title='Permanent Link: Crear elementos DOM &#8211; HTML dinámicamente usando jQuery'>Crear elementos DOM &#8211; HTML dinámicamente usando jQuery</a></li>
<li><a href='http://blog.ilikeblues.com/2010/03/ajax-convertir-html-a-objeto-dom/' rel='bookmark' title='Permanent Link: AJAX: Convertir HTML a objeto DOM'>AJAX: Convertir HTML a objeto DOM</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.ilikeblues.com/2010/04/ajax-jquery-elementos-html-dinamicos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AJAX: Convertir HTML a objeto DOM</title>
		<link>http://blog.ilikeblues.com/2010/03/ajax-convertir-html-a-objeto-dom/</link>
		<comments>http://blog.ilikeblues.com/2010/03/ajax-convertir-html-a-objeto-dom/#comments</comments>
		<pubDate>Tue, 30 Mar 2010 12:16:28 +0000</pubDate>
		<dc:creator>ilikeblues</dc:creator>
				<category><![CDATA[How to]]></category>
		<category><![CDATA[Objective-C / iPhone]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[convertir]]></category>
		<category><![CDATA[dom]]></category>
		<category><![CDATA[dom object]]></category>
		<category><![CDATA[domparser]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[objeto dom]]></category>
		<category><![CDATA[xmlhttprequest]]></category>

		<guid isPermaLink="false">http://blog.ilikeblues.com/?p=272</guid>
		<description><![CDATA[Podemos convertir una respuesta en HTML (text/html) a un objeto DOM XML (text/xml) usando el siguiente código JavaScript:


&#60;!doctype html&#62;
&#60;html&#62;
   &#60;head&#62;
   &#60;/head&#62;
   &#60;body onload=&#34;init();&#34;&#62;
      &#60;script language=&#34;JavaScript&#34;&#62;

/**
 * ilikeblues.com (C)
 */

var req = new XMLHttpRequest();

function loaded() {
      var text = req.responseText;

 [...]


Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2010/04/ajax-jquery-elementos-html-dinamicos/' rel='bookmark' title='Permanent Link: AJAX + jQuery: elementos HTML dinámicos'>AJAX + jQuery: elementos HTML dinámicos</a></li>
<li><a href='http://blog.ilikeblues.com/2010/05/crear-elementos-dom-html-dinamicamente-usando-jquery/' rel='bookmark' title='Permanent Link: Crear elementos DOM &#8211; HTML dinámicamente usando jQuery'>Crear elementos DOM &#8211; HTML dinámicamente usando jQuery</a></li>
<li><a href='http://blog.ilikeblues.com/2010/05/peticion-ajax-usando-jquery/' rel='bookmark' title='Permanent Link: Cómo realizar una petición AJAX usando jQuery'>Cómo realizar una petición AJAX usando jQuery</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Podemos convertir una respuesta en HTML (text/html) a un objeto DOM XML (text/xml) usando el siguiente código JavaScript:</p>
<p>
<pre class="brush: javascript">
&lt;!doctype html&gt;
&lt;html&gt;
   &lt;head&gt;
   &lt;/head&gt;
   &lt;body onload=&quot;init();&quot;&gt;
      &lt;script language=&quot;JavaScript&quot;&gt;

/**
 * ilikeblues.com (C)
 */

var req = new XMLHttpRequest();

function loaded() {
      var text = req.responseText;

      var domObject = (new DOMParser()).parseFromString(text, &quot;text/xml&quot;);
      /* do with DOM object whatever you want... */
      domObject.getElementsByTagName(&quot;loquesea&quot;);
      ...
}

function init() {
   var url = &quot;http://loquesea.com&quot;;

   req.open(&quot;GET&quot;, url, true);

   req.onload = loaded;
   req.send(null);
}

      &lt;/script&gt;
   &lt;/body&gt;
&lt;/html&gt;
</pre>


<p>Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2010/04/ajax-jquery-elementos-html-dinamicos/' rel='bookmark' title='Permanent Link: AJAX + jQuery: elementos HTML dinámicos'>AJAX + jQuery: elementos HTML dinámicos</a></li>
<li><a href='http://blog.ilikeblues.com/2010/05/crear-elementos-dom-html-dinamicamente-usando-jquery/' rel='bookmark' title='Permanent Link: Crear elementos DOM &#8211; HTML dinámicamente usando jQuery'>Crear elementos DOM &#8211; HTML dinámicamente usando jQuery</a></li>
<li><a href='http://blog.ilikeblues.com/2010/05/peticion-ajax-usando-jquery/' rel='bookmark' title='Permanent Link: Cómo realizar una petición AJAX usando jQuery'>Cómo realizar una petición AJAX usando jQuery</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.ilikeblues.com/2010/03/ajax-convertir-html-a-objeto-dom/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Aplicación Offline para iPhone</title>
		<link>http://blog.ilikeblues.com/2010/03/aplicacion-offline-para-iphone/</link>
		<comments>http://blog.ilikeblues.com/2010/03/aplicacion-offline-para-iphone/#comments</comments>
		<pubDate>Mon, 29 Mar 2010 12:46:13 +0000</pubDate>
		<dc:creator>ilikeblues</dc:creator>
				<category><![CDATA[How to]]></category>
		<category><![CDATA[Objective-C / iPhone]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Trucos]]></category>
		<category><![CDATA[aplicación]]></category>
		<category><![CDATA[application]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[offline]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://blog.ilikeblues.com/?p=259</guid>
		<description><![CDATA[Ya son varios los artículos que he leído acerca del tema de creación de aplicaciones Web Offline para iPhone  (aquí el último) y, generalmente, dejan de lado un tema importante, obviándolo o dándolo por supuesto, que suele dar quebraderos de cabeza (al menos a mí me los ha dado).
El tema es que, es imprescindible configurar [...]


Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2009/07/iphone-sdk-registrar-una-clase-como-observador-de-un-evento/' rel='bookmark' title='Permanent Link: iPhone SDK: Registrar una clase como observador de un evento'>iPhone SDK: Registrar una clase como observador de un evento</a></li>
<li><a href='http://blog.ilikeblues.com/2008/02/utilizacion-de-gprofgcov-para-obtencion-de-datos-de-cobertura-i/' rel='bookmark' title='Permanent Link: Utilización de gprof/gcov para obtención de datos de cobertura (I)'>Utilización de gprof/gcov para obtención de datos de cobertura (I)</a></li>
<li><a href='http://blog.ilikeblues.com/2008/03/aplicacion-rcp-en-pantalla-completa/' rel='bookmark' title='Permanent Link: Aplicación RCP en pantalla completa'>Aplicación RCP en pantalla completa</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Ya son varios los artículos que he leído acerca del tema de creación de aplicaciones Web Offline para iPhone  (<a href="http://sixrevisions.com/web-development/html5-iphone-app/" target="_blank">aquí</a> el último) y, generalmente, dejan de lado un tema importante, obviándolo o dándolo por supuesto, que suele dar quebraderos de cabeza (al menos a mí me los ha dado).</p>
<p>El tema es que, es imprescindible configurar correctamente el servidor en que está colgada la aplicación para que, al cargarla en el iPhone, éste la &#8220;cachee&#8221; adecuadamente.</p>
<p>El &#8220;quid&#8221;: el fichero declarado como manifest debe ser interpretado por el servidor con el MIME type &#8220;text/cache-manifest&#8221;. En otro caso, por ejemplo &#8220;text/plain&#8221;, al intentar abrir la aplicación en ausencia de conexión, obtendremos un error.</p>
<p>Si el servidor es Apache (no conozco ninguno más, al fin y al cabo, soy desarrollador, no administrador) es relativamente sencillo. Necesitamos un fichero .htaccess en la misma carpeta en que se encuentre la aplicación, con el sigueinte contenido:</p>
<pre class="brush: css">
AddType text/cache-manifest .manifest
</pre>
<p>Por supuesto el fichero manifest deberá tener la extensión &#8220;.manifest&#8221;, en otro caso la directiva no sirve para nada.</p>
<p>Además, el servidor Apache debe estar correctamente configurado para que interprete nuestro fichero .htaccess.</p>


<p>Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2009/07/iphone-sdk-registrar-una-clase-como-observador-de-un-evento/' rel='bookmark' title='Permanent Link: iPhone SDK: Registrar una clase como observador de un evento'>iPhone SDK: Registrar una clase como observador de un evento</a></li>
<li><a href='http://blog.ilikeblues.com/2008/02/utilizacion-de-gprofgcov-para-obtencion-de-datos-de-cobertura-i/' rel='bookmark' title='Permanent Link: Utilización de gprof/gcov para obtención de datos de cobertura (I)'>Utilización de gprof/gcov para obtención de datos de cobertura (I)</a></li>
<li><a href='http://blog.ilikeblues.com/2008/03/aplicacion-rcp-en-pantalla-completa/' rel='bookmark' title='Permanent Link: Aplicación RCP en pantalla completa'>Aplicación RCP en pantalla completa</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.ilikeblues.com/2010/03/aplicacion-offline-para-iphone/feed/</wfw:commentRss>
		<slash:comments>5</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;;
    [...]


Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2010/05/javascript-comprobar-si-navegador-soporta-webkit/' rel='bookmark' title='Permanent Link: Javascript: comprobar si navegador soporta WebKit'>Javascript: comprobar si navegador soporta WebKit</a></li>
<li><a href='http://blog.ilikeblues.com/2008/02/utilizacion-de-gprofgcov-para-obtencion-de-datos-de-cobertura-i/' rel='bookmark' title='Permanent Link: Utilización de gprof/gcov para obtención de datos de cobertura (I)'>Utilización de gprof/gcov para obtención de datos de cobertura (I)</a></li>
<li><a href='http://blog.ilikeblues.com/2010/03/asistentejevweb-v1-0-released/' rel='bookmark' title='Permanent Link: AsistenteJeVWeb v1.0 released'>AsistenteJeVWeb v1.0 released</a></li>
</ol>]]></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>


<p>Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2010/05/javascript-comprobar-si-navegador-soporta-webkit/' rel='bookmark' title='Permanent Link: Javascript: comprobar si navegador soporta WebKit'>Javascript: comprobar si navegador soporta WebKit</a></li>
<li><a href='http://blog.ilikeblues.com/2008/02/utilizacion-de-gprofgcov-para-obtencion-de-datos-de-cobertura-i/' rel='bookmark' title='Permanent Link: Utilización de gprof/gcov para obtención de datos de cobertura (I)'>Utilización de gprof/gcov para obtención de datos de cobertura (I)</a></li>
<li><a href='http://blog.ilikeblues.com/2010/03/asistentejevweb-v1-0-released/' rel='bookmark' title='Permanent Link: AsistenteJeVWeb v1.0 released'>AsistenteJeVWeb v1.0 released</a></li>
</ol></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>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 [...]


Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2010/03/aplicacion-offline-para-iphone/' rel='bookmark' title='Permanent Link: Aplicación Offline para iPhone'>Aplicación Offline para iPhone</a></li>
<li><a href='http://blog.ilikeblues.com/2009/01/c-excepcion-en-construtor-o-destructor/' rel='bookmark' title='Permanent Link: C++: excepción en construtor o destructor'>C++: excepción en construtor o destructor</a></li>
</ol>]]></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>


<p>Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2010/03/aplicacion-offline-para-iphone/' rel='bookmark' title='Permanent Link: Aplicación Offline para iPhone'>Aplicación Offline para iPhone</a></li>
<li><a href='http://blog.ilikeblues.com/2009/01/c-excepcion-en-construtor-o-destructor/' rel='bookmark' title='Permanent Link: C++: excepción en construtor o destructor'>C++: excepción en construtor o destructor</a></li>
</ol></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>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 [...]


Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2008/10/expresiones-regulares-c/' rel='bookmark' title='Permanent Link: Expresiones regulares C'>Expresiones regulares C</a></li>
<li><a href='http://blog.ilikeblues.com/2008/02/utilizacion-de-gprofgcov-para-obtencion-de-datos-de-cobertura-i/' rel='bookmark' title='Permanent Link: Utilización de gprof/gcov para obtención de datos de cobertura (I)'>Utilización de gprof/gcov para obtención de datos de cobertura (I)</a></li>
<li><a href='http://blog.ilikeblues.com/2008/02/utilizacion-de-gprofgcov-cobertura-de-ramas-y-ii/' rel='bookmark' title='Permanent Link: Utilización de gprof/gcov: cobertura de ramas (y II)'>Utilización de gprof/gcov: cobertura de ramas (y II)</a></li>
</ol>]]></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>


<p>Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2008/10/expresiones-regulares-c/' rel='bookmark' title='Permanent Link: Expresiones regulares C'>Expresiones regulares C</a></li>
<li><a href='http://blog.ilikeblues.com/2008/02/utilizacion-de-gprofgcov-para-obtencion-de-datos-de-cobertura-i/' rel='bookmark' title='Permanent Link: Utilización de gprof/gcov para obtención de datos de cobertura (I)'>Utilización de gprof/gcov para obtención de datos de cobertura (I)</a></li>
<li><a href='http://blog.ilikeblues.com/2008/02/utilizacion-de-gprofgcov-cobertura-de-ramas-y-ii/' rel='bookmark' title='Permanent Link: Utilización de gprof/gcov: cobertura de ramas (y II)'>Utilización de gprof/gcov: cobertura de ramas (y II)</a></li>
</ol></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>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 [...]


Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2008/02/utilizacion-de-gprofgcov-para-obtencion-de-datos-de-cobertura-i/' rel='bookmark' title='Permanent Link: Utilización de gprof/gcov para obtención de datos de cobertura (I)'>Utilización de gprof/gcov para obtención de datos de cobertura (I)</a></li>
</ol>]]></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>


<p>Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2008/02/utilizacion-de-gprofgcov-para-obtencion-de-datos-de-cobertura-i/' rel='bookmark' title='Permanent Link: Utilización de gprof/gcov para obtención de datos de cobertura (I)'>Utilización de gprof/gcov para obtención de datos de cobertura (I)</a></li>
</ol></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, [...]


Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2008/02/utilizacion-de-gprofgcov-cobertura-de-ramas-y-ii/' rel='bookmark' title='Permanent Link: Utilización de gprof/gcov: cobertura de ramas (y II)'>Utilización de gprof/gcov: cobertura de ramas (y II)</a></li>
<li><a href='http://blog.ilikeblues.com/2009/05/aspectj-aplicado-sobre-una-libreria-jar/' rel='bookmark' title='Permanent Link: AspectJ aplicado sobre una librería jar'>AspectJ aplicado sobre una librería jar</a></li>
<li><a href='http://blog.ilikeblues.com/2010/03/aplicacion-offline-para-iphone/' rel='bookmark' title='Permanent Link: Aplicación Offline para iPhone'>Aplicación Offline para iPhone</a></li>
</ol>]]></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>


<p>Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2008/02/utilizacion-de-gprofgcov-cobertura-de-ramas-y-ii/' rel='bookmark' title='Permanent Link: Utilización de gprof/gcov: cobertura de ramas (y II)'>Utilización de gprof/gcov: cobertura de ramas (y II)</a></li>
<li><a href='http://blog.ilikeblues.com/2009/05/aspectj-aplicado-sobre-una-libreria-jar/' rel='bookmark' title='Permanent Link: AspectJ aplicado sobre una librería jar'>AspectJ aplicado sobre una librería jar</a></li>
<li><a href='http://blog.ilikeblues.com/2010/03/aplicacion-offline-para-iphone/' rel='bookmark' title='Permanent Link: Aplicación Offline para iPhone'>Aplicación Offline para iPhone</a></li>
</ol></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>
	</channel>
</rss>
