<?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; Software</title>
	<atom:link href="http://blog.ilikeblues.com/category/software/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/feed/?page=2" />

		<item>
		<title>Eclipse: Acceder a recursos de un plugin</title>
		<link>http://blog.ilikeblues.com/2010/07/eclipse-acceder-a-recursos-de-un-plugin/</link>
		<comments>http://blog.ilikeblues.com/2010/07/eclipse-acceder-a-recursos-de-un-plugin/#comments</comments>
		<pubDate>Wed, 28 Jul 2010 12:55:38 +0000</pubDate>
		<dc:creator>ilikeblues</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Trucos]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[acceder a ficheros del bundle]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[eclipse bundle resources]]></category>
		<category><![CDATA[eclipse platform]]></category>
		<category><![CDATA[eclipse plugin resources]]></category>
		<category><![CDATA[eclipse resources]]></category>
		<category><![CDATA[plugin resources]]></category>
		<category><![CDATA[recursos bundle]]></category>
		<category><![CDATA[recursos bundle eclipse]]></category>
		<category><![CDATA[recursos de un plugin]]></category>
		<category><![CDATA[recursos de un plugin eclipse]]></category>

		<guid isPermaLink="false">http://blog.ilikeblues.com/?p=449</guid>
		<description><![CDATA[A menudo resulta útil guardar ficheros (por ejemplo, de configuración) en el bundle y leerlos durante la ejecución de ciertas tareas de nuestro plugin. Para ello podemos utilizar el siguiente código (reemplazando el nombre del bundle, claro):

Bundle bundle = Platform.getBundle(&#34;com.ilikeblues.example.readfile&#34;);
URL fileURL = bundle.getEntry(&#34;files/test.txt&#34;);
File file = null;
try {
	file = new File(FileLocator.resolve(fileURL).toURI());
} catch (URISyntaxException e1) {
	e1.printStackTrace();
} catch [...]


Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2008/02/eclipse-test-and-performance-tools-platform-review/' rel='bookmark' title='Permanent Link: Eclipse Test and Performance Tools Platform Review'>Eclipse Test and Performance Tools Platform Review</a></li>
<li><a href='http://blog.ilikeblues.com/2010/07/java-uso-de-fichero-de-propiedades/' rel='bookmark' title='Permanent Link: Java: uso de fichero de Propiedades'>Java: uso de fichero de Propiedades</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>
</ol>]]></description>
			<content:encoded><![CDATA[<p>A menudo resulta útil guardar ficheros (por ejemplo, de configuración) en el bundle y leerlos durante la ejecución de ciertas tareas de nuestro plugin. Para ello podemos utilizar el siguiente código (reemplazando el nombre del bundle, claro):</p>
<pre class="brush: java">
Bundle bundle = Platform.getBundle(&quot;com.ilikeblues.example.readfile&quot;);
URL fileURL = bundle.getEntry(&quot;files/test.txt&quot;);
File file = null;
try {
	file = new File(FileLocator.resolve(fileURL).toURI());
} catch (URISyntaxException e1) {
	e1.printStackTrace();
} catch (IOException e1) {
	e1.printStackTrace();
}
</pre>
<p>Otra opción es utilizar la URL directamente:</p>
<p><span id="more-449"></span></p>
<pre class="brush: java">
URL url;
try {
        url = new URL(&quot;platform:/plugin/com.ilikeblues.rcp.plugin.filereader/files/test.txt&quot;);
	InputStream inputStream = url.openConnection().getInputStream();
	BufferedReader in = new BufferedReader(new InputStreamReader(inputStream));
	String inputLine;

	while ((inputLine = in.readLine()) != null) {
		System.out.println(inputLine);
	}

	in.close();

} catch (IOException e) {
	e.printStackTrace();
}
</pre>
<p>Con la segunda opción, además, se evita con la dependencia con la clase Platform.</p>
<p>Vía | <a href="http://www.vogella.de/blog/2010/07/06/reading-resources-from-plugin/">http://www.vogella.de/blog</a></p>


<p>Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2008/02/eclipse-test-and-performance-tools-platform-review/' rel='bookmark' title='Permanent Link: Eclipse Test and Performance Tools Platform Review'>Eclipse Test and Performance Tools Platform Review</a></li>
<li><a href='http://blog.ilikeblues.com/2010/07/java-uso-de-fichero-de-propiedades/' rel='bookmark' title='Permanent Link: Java: uso de fichero de Propiedades'>Java: uso de fichero de Propiedades</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>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.ilikeblues.com/2010/07/eclipse-acceder-a-recursos-de-un-plugin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java: usar enumeración en un switch</title>
		<link>http://blog.ilikeblues.com/2010/07/java-usar-enumeracion-en-un-switch/</link>
		<comments>http://blog.ilikeblues.com/2010/07/java-usar-enumeracion-en-un-switch/#comments</comments>
		<pubDate>Fri, 23 Jul 2010 06:34:02 +0000</pubDate>
		<dc:creator>ilikeblues</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[java enum]]></category>
		<category><![CDATA[java enum switch]]></category>
		<category><![CDATA[java enum switch statement]]></category>
		<category><![CDATA[java enumeración]]></category>
		<category><![CDATA[java enumeration]]></category>
		<category><![CDATA[java switch statement]]></category>

		<guid isPermaLink="false">http://blog.ilikeblues.com/?p=470</guid>
		<description><![CDATA[Como continuación de una entrada en la que comentaba como añadir un constructor y métodos a un enum Java, veamos cómo utilizar esta tipo de objetos en un switch:

private void processGender(Gender gender) {
   switch (gender) {
      case Male:
         // Código [...]


Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2010/07/enumeraciones-en-java/' rel='bookmark' title='Permanent Link: Enumeraciones en Java'>Enumeraciones en Java</a></li>
<li><a href='http://blog.ilikeblues.com/2008/02/sobrecarga-de-metodos-en-java/' rel='bookmark' title='Permanent Link: Sobrecarga de métodos en Java'>Sobrecarga de métodos en Java</a></li>
<li><a href='http://blog.ilikeblues.com/2010/07/orden-de-inicializacion-en-objetos-java/' rel='bookmark' title='Permanent Link: Orden de inicialización en Objetos Java'>Orden de inicialización en Objetos Java</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Como continuación de <a href="http://blog.ilikeblues.com/2010/07/enumeraciones-en-java/">una entrada</a> en la que comentaba como <a href="http://blog.ilikeblues.com/2010/07/enumeraciones-en-java/">añadir un constructor y métodos a un enum Java</a>, veamos cómo utilizar esta tipo de objetos en un switch:</p>
<pre class="brush: java">
private void processGender(Gender gender) {
   switch (gender) {
      case Male:
         // Código para el caso masculino
         break;
      case Female:
         // Código para el caso femenino
         break;
      default:
         // Esto es código inalcanzable, ya que
         // el switch lanzará una NullPointerException si gender == null
   }
}
</pre>
<p>Si utilizamos enums, más tarde o más temprano tendremos que usar una estructura de este tipo en la toma de decisiones.</p>
<p>Vía | <a href="http://javafact.com/?p=442">http://javafact.com</a></p>


<p>Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2010/07/enumeraciones-en-java/' rel='bookmark' title='Permanent Link: Enumeraciones en Java'>Enumeraciones en Java</a></li>
<li><a href='http://blog.ilikeblues.com/2008/02/sobrecarga-de-metodos-en-java/' rel='bookmark' title='Permanent Link: Sobrecarga de métodos en Java'>Sobrecarga de métodos en Java</a></li>
<li><a href='http://blog.ilikeblues.com/2010/07/orden-de-inicializacion-en-objetos-java/' rel='bookmark' title='Permanent Link: Orden de inicialización en Objetos Java'>Orden de inicialización en Objetos Java</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.ilikeblues.com/2010/07/java-usar-enumeracion-en-un-switch/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java: uso de fichero de Propiedades</title>
		<link>http://blog.ilikeblues.com/2010/07/java-uso-de-fichero-de-propiedades/</link>
		<comments>http://blog.ilikeblues.com/2010/07/java-uso-de-fichero-de-propiedades/#comments</comments>
		<pubDate>Thu, 22 Jul 2010 07:00:20 +0000</pubDate>
		<dc:creator>ilikeblues</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[fichero propiedades]]></category>
		<category><![CDATA[fichero propiedades java]]></category>
		<category><![CDATA[java properties]]></category>
		<category><![CDATA[java properties file]]></category>

		<guid isPermaLink="false">http://blog.ilikeblues.com/?p=467</guid>
		<description><![CDATA[El código que se muestra a continuación, lee el contenido de un fichero de propiedades y devuelve el valor de una de ellas:

Properties properties = new Properties();
FileInputStream in;
try {
   in = new FileInputStream(&#34;app.properties&#34;);
   properties.load(in);
   in.close();
} catch (Exception e) {
   System.out.println(e.getMessage());
}
return properties.getProperty(&#34;appcode&#34;);

Un ejemplo del fichero de propiedades:

appcode=50
email=admin@yahoo.com

Vía &#124; [...]


Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2008/02/sobrecarga-de-metodos-en-java/' rel='bookmark' title='Permanent Link: Sobrecarga de métodos en Java'>Sobrecarga de métodos en Java</a></li>
<li><a href='http://blog.ilikeblues.com/2010/07/orden-de-inicializacion-en-objetos-java/' rel='bookmark' title='Permanent Link: Orden de inicialización en Objetos Java'>Orden de inicialización en Objetos Java</a></li>
<li><a href='http://blog.ilikeblues.com/2010/07/enumeraciones-en-java/' rel='bookmark' title='Permanent Link: Enumeraciones en Java'>Enumeraciones en Java</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>El código que se muestra a continuación, lee el contenido de un fichero de propiedades y devuelve el valor de una de ellas:</p>
<pre class="brush: java">
Properties properties = new Properties();
FileInputStream in;
try {
   in = new FileInputStream(&quot;app.properties&quot;);
   properties.load(in);
   in.close();
} catch (Exception e) {
   System.out.println(e.getMessage());
}
return properties.getProperty(&quot;appcode&quot;);
</pre>
<p>Un ejemplo del fichero de propiedades:</p>
<pre class="brush: php">
appcode=50
email=admin@yahoo.com
</pre>
<p>Vía | <a href="http://seguide.blogspot.com/2010/07/java-property-file-usage.html">http://seguide.blogspot.com</a></p>


<p>Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2008/02/sobrecarga-de-metodos-en-java/' rel='bookmark' title='Permanent Link: Sobrecarga de métodos en Java'>Sobrecarga de métodos en Java</a></li>
<li><a href='http://blog.ilikeblues.com/2010/07/orden-de-inicializacion-en-objetos-java/' rel='bookmark' title='Permanent Link: Orden de inicialización en Objetos Java'>Orden de inicialización en Objetos Java</a></li>
<li><a href='http://blog.ilikeblues.com/2010/07/enumeraciones-en-java/' rel='bookmark' title='Permanent Link: Enumeraciones en Java'>Enumeraciones en Java</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.ilikeblues.com/2010/07/java-uso-de-fichero-de-propiedades/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Orden de inicialización en Objetos Java</title>
		<link>http://blog.ilikeblues.com/2010/07/orden-de-inicializacion-en-objetos-java/</link>
		<comments>http://blog.ilikeblues.com/2010/07/orden-de-inicializacion-en-objetos-java/#comments</comments>
		<pubDate>Wed, 21 Jul 2010 13:41:03 +0000</pubDate>
		<dc:creator>ilikeblues</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[initialization order]]></category>
		<category><![CDATA[java initialization order]]></category>
		<category><![CDATA[java objects initialization order]]></category>
		<category><![CDATA[objeto java]]></category>
		<category><![CDATA[orden inicialización java]]></category>
		<category><![CDATA[orden inicialización objetos]]></category>
		<category><![CDATA[orden inicialización objetos java]]></category>

		<guid isPermaLink="false">http://blog.ilikeblues.com/?p=461</guid>
		<description><![CDATA[En un post en DZONE, Daniel Schneller describe una situación que pone de manifiesto un comportamiento un tanto extraño, relacionado con el orden de inicialización de los objetos Java.
Daniel muestra el siguiente código Java:

package com.ds.test;

public class Upper {
   String upperString;

   public Upper() {
      Initializer.initialize(this);
   [...]


Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2010/07/enumeraciones-en-java/' rel='bookmark' title='Permanent Link: Enumeraciones en Java'>Enumeraciones en Java</a></li>
<li><a href='http://blog.ilikeblues.com/2008/08/singleton-en-java/' rel='bookmark' title='Permanent Link: Singleton en Java'>Singleton en Java</a></li>
<li><a href='http://blog.ilikeblues.com/2010/07/java-usar-enumeracion-en-un-switch/' rel='bookmark' title='Permanent Link: Java: usar enumeración en un switch'>Java: usar enumeración en un switch</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>En un post en <a href="http://www.dzone.com">DZONE</a>, Daniel Schneller describe una situación que pone de manifiesto un comportamiento un tanto extraño, relacionado con el orden de inicialización de los objetos Java.</p>
<p>Daniel muestra el siguiente código Java:</p>
<pre class="brush: java">
package com.ds.test;

public class Upper {
   String upperString;

   public Upper() {
      Initializer.initialize(this);
   }
}
</pre>
<pre class="brush: java">
package com.ds.test;

public class Lower extends Upper {

   String lowerString = null;

   public Lower() {
      super();
      System.out.println(&quot;Upper:  &quot; + upperString);
      System.out.println(&quot;Lower:  &quot; + lowerString);
   }

   public static void main(final String[] args) {
      new Lower();
   }
}
</pre>
<pre class="brush: java">
package com.ds.test;
public class Initializer {
   static void initialize(final Upper anUpper) {
      if (anUpper instanceof Lower) {
         Lower lower = (Lower) anUpper;
         lower.lowerString = &quot;lowerInited&quot;;
      }
      anUpper.upperString = &quot;upperInited&quot;;
   }
}
</pre>
<p>Este código, en contra de lo que podría parecer, produce esta salida:<br />
<span id="more-461"></span></p>
<pre class="brush: php">
Upper:  upperInited
Lower:  null;
</pre>
<p>Si efectuamos un pequeño cambio al código de la clase Lower:</p>
<pre class="brush: java">
package com.ds.test;

public class Lower extends Upper {

   String lowerString;

   public Lower() {
      super();
      System.out.println(&quot;Upper:  &quot; + upperString);
      System.out.println(&quot;Lower:  &quot; + lowerString);
   }

   public static void main(final String[] args) {
      new Lower();
   }
}
</pre>
<p>Obtenemos la salida correcta:</p>
<pre class="brush: php">
Upper:  upperInited
Lower:  lowerInited
</pre>
<p>Esto se debe a una diferencia en el flujo de inicialización del objeto Lower. Este es el orden de ejecución:</p>
<ol>
<li>main() llama al constructor de Lower.</li>
<li>La máquina virtual prepara una instancia de Lower. Esto significa que todos los campos son creados e inicializados con valores por defecto, es decir, null para referencias, false para booleanos, etc. En este paso, las asignaciones inline de los campos <strong>NO</strong> han tenido lugar todavía.</li>
<li>Se produce la llamada al super-constructor. Esto está incluido en la especificación de Java. Así que se llama al constructor de Upper, antes de cualquier otro paso.</li>
<li>El constructor de Upper realiza la llamada al método estático initialize() del objeto Initializer.</li>
<li>Este método inicializa las dos referencias de tipo String. Esto se debe al comportamiento, en cierto modo inadecuado, del &#8220;instanceof&#8221; (en <a href="http://www.dzone.com/links/how_evil_is_instanceof.html" target="_blank">este enlace</a> podemos leer acerca de los peligros de su uso). El caso es que, después de la ejecución, ambas referencias han dejado de ser null.</li>
<li>Termina la llamada a initialize() y al constructor de Upper.</li>
<li>Aquí viene la parte interesante: la construcción del objeto Lower continúa. Si no se ha añadido la asignación inline explícita (=null) en la declaración del campo lowerString, el constructor continúa con la ejecución normal, y saca por la salida estándar el valor de las dos cadenas.
<p>Sin embargo, si se añade la asignación inline explícita el flujo es diferente. Los inicializadores de variables se ejecutan después del super-constructor, pero antes del resto del constructor de la clase. De manera que la variable lowerString sería reasignada a null y se produciría la salida errónea indicada más arriba.</li>
</ol>
<p>El diseño en este caso es un poco complicado, y, desde luego, se debería evitar que la inicialización de variables de la clase Lower dependiese, en cualquier forma, de la de Upper. Sin embargo, el ejemplo es clarificador respecto a la importancia de conocer la manera en la que la máquina virtual Java inicializa las instancias de objetos.</p>
<p>Vía | <a href="http://www.dzone.com/links/r/java_object_initialization_order_know_your_jls.html">http://java.dzone.com</a></p>


<p>Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2010/07/enumeraciones-en-java/' rel='bookmark' title='Permanent Link: Enumeraciones en Java'>Enumeraciones en Java</a></li>
<li><a href='http://blog.ilikeblues.com/2008/08/singleton-en-java/' rel='bookmark' title='Permanent Link: Singleton en Java'>Singleton en Java</a></li>
<li><a href='http://blog.ilikeblues.com/2010/07/java-usar-enumeracion-en-un-switch/' rel='bookmark' title='Permanent Link: Java: usar enumeración en un switch'>Java: usar enumeración en un switch</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.ilikeblues.com/2010/07/orden-de-inicializacion-en-objetos-java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Enumeraciones en Java</title>
		<link>http://blog.ilikeblues.com/2010/07/enumeraciones-en-java/</link>
		<comments>http://blog.ilikeblues.com/2010/07/enumeraciones-en-java/#comments</comments>
		<pubDate>Tue, 20 Jul 2010 14:07:48 +0000</pubDate>
		<dc:creator>ilikeblues</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[constructor enum java]]></category>
		<category><![CDATA[enumeración java]]></category>
		<category><![CDATA[java enum]]></category>
		<category><![CDATA[java enum constructor]]></category>
		<category><![CDATA[java enum methods]]></category>
		<category><![CDATA[java enumeration]]></category>
		<category><![CDATA[métodos enum java]]></category>
		<category><![CDATA[métodos enumeración java]]></category>

		<guid isPermaLink="false">http://blog.ilikeblues.com/?p=458</guid>
		<description><![CDATA[En Java, los enums representan objetos con un conjunto discreto de posibles valores.
Estos valores pueden ser de cualquier tipo, enteros, cadenas, etc., pero en Java tenemos mecanismos que nos permiten representar estos valores de varias formas, de manera que se ajusten a la necesidad de cada caso.
La manera más sencilla de especificar un enum en [...]


Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2010/07/java-usar-enumeracion-en-un-switch/' rel='bookmark' title='Permanent Link: Java: usar enumeración en un switch'>Java: usar enumeración en un switch</a></li>
<li><a href='http://blog.ilikeblues.com/2008/08/singleton-en-java/' rel='bookmark' title='Permanent Link: Singleton en Java'>Singleton en Java</a></li>
<li><a href='http://blog.ilikeblues.com/2010/07/orden-de-inicializacion-en-objetos-java/' rel='bookmark' title='Permanent Link: Orden de inicialización en Objetos Java'>Orden de inicialización en Objetos Java</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>En Java, los enums representan objetos con un conjunto discreto de posibles valores.</p>
<p>Estos valores pueden ser de cualquier tipo, enteros, cadenas, etc., pero en Java tenemos mecanismos que nos permiten representar estos valores de varias formas, de manera que se ajusten a la necesidad de cada caso.</p>
<p>La manera más sencilla de especificar un enum en Java:</p>
<pre class="brush: java">
public enum Gender{
   Male, Female;
}
</pre>
<p>Pero es que, además de sus posibles valores, un enum puede tener constructores y métodos:</p>
<pre class="brush: java">
public enum Gender{
   Male(&quot;Masculino&quot;), Female(&quot;Femenino&quot;);

   private String spanish;

   // the constructor
   Gender(String spanish){
      this.spanish = spanish;
   }

   // a method
   public String toSpanish(){
      return this.spanish;
   }
}
</pre>
<p>De manera que podríamos usar este enum de la siguiente manera:</p>
<pre class="brush: java">
Person p = new Person();
p.setGender(Gender.Male);

String text = &quot;The person&#039;s gender in Spanish is: &quot; + p.getGender().toSpanish();
</pre>
<p>Con esto un enum es similar a una colección (Collection) en Java, con las siguientes diferencias:</p>
<ol>
<li>La máquina virtual inicializa todos los valores.</li>
<li>No se permite añadir o eliminar elementos en runtime.</li>
<li>Se accede a los objetos estáticamente.</li>
</ol>
<p>En el ejemplo, Gender representa a la colección, y se puede acceder a sus elementos sin necesidad de crear una instancia.</p>
<p>Vía | <a href="http://javafact.com/?p=442">http://javafact.com</a></p>


<p>Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2010/07/java-usar-enumeracion-en-un-switch/' rel='bookmark' title='Permanent Link: Java: usar enumeración en un switch'>Java: usar enumeración en un switch</a></li>
<li><a href='http://blog.ilikeblues.com/2008/08/singleton-en-java/' rel='bookmark' title='Permanent Link: Singleton en Java'>Singleton en Java</a></li>
<li><a href='http://blog.ilikeblues.com/2010/07/orden-de-inicializacion-en-objetos-java/' rel='bookmark' title='Permanent Link: Orden de inicialización en Objetos Java'>Orden de inicialización en Objetos Java</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.ilikeblues.com/2010/07/enumeraciones-en-java/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>jQuery: manejo de checkbox</title>
		<link>http://blog.ilikeblues.com/2010/07/jquery-manejo-de-checkbox/</link>
		<comments>http://blog.ilikeblues.com/2010/07/jquery-manejo-de-checkbox/#comments</comments>
		<pubDate>Mon, 19 Jul 2010 13:37:06 +0000</pubDate>
		<dc:creator>ilikeblues</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[checkbox]]></category>
		<category><![CDATA[checkbox deseleccionado]]></category>
		<category><![CDATA[checkbox seleccionado]]></category>
		<category><![CDATA[checked checkbox]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[unchecked checkbox]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://blog.ilikeblues.com/?p=451</guid>
		<description><![CDATA[Como comentan en la vía, la documentación de jQuery en la web oficial no siempre es tan completa como debería. Así que ahí van algunos de trozos de código que puede ayudar al maneja de los checkboxes:
Seleccionar/deseleccionar un checkbox:

// Seleccionar un checkbox
$(&#039;input[name=acheckbox]&#039;).attr(&#039;checked&#039;, true);

// Deseleccionar un checkbox
$(&#039;input[name=acheckbox]&#039;).attr(&#039;checked&#039;, false);

Seleccionar/deseleccionar todos los checkbox:

// Seleccionar todos los checkboxes
$(&#34;input:checkbox&#34;).attr(&#039;checked&#039;, true);

// [...]


Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2010/07/jquery-mejorar-rendimiento-en-selectores/' rel='bookmark' title='Permanent Link: jQuery: mejorar rendimiento en selectores'>jQuery: mejorar rendimiento en selectores</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/jquery-navegador-con-soporte-webkit/' rel='bookmark' title='Permanent Link: jQuery: navegador con soporte WebKit'>jQuery: navegador con soporte WebKit</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Como comentan en la vía, la documentación de jQuery en la web oficial no siempre es tan completa como debería. Así que ahí van algunos de trozos de código que puede ayudar al maneja de los checkboxes:</p>
<p><strong>Seleccionar/deseleccionar un checkbox</strong>:</p>
<pre class="brush: javascript">
// Seleccionar un checkbox
$(&#039;input[name=acheckbox]&#039;).attr(&#039;checked&#039;, true);

// Deseleccionar un checkbox
$(&#039;input[name=acheckbox]&#039;).attr(&#039;checked&#039;, false);
</pre>
<p><strong>Seleccionar/deseleccionar todos los checkbox</strong>:</p>
<pre class="brush: javascript">
// Seleccionar todos los checkboxes
$(&quot;input:checkbox&quot;).attr(&#039;checked&#039;, true);

// Deseleccionar todos los checkboxes
$(&quot;input:checkbox&quot;).attr(&#039;checked&#039;, false);
</pre>
<p><strong>Comprobar si un checkbox está seleccionado</strong>:<br />
<span id="more-451"></span></p>
<pre class="brush: javascript">
// Devuelve true si el checkbox está seleccionado, en otro caso devuelve false.
$(&#039;input[name=acheckbox]&#039;).is(&#039;:checked&#039;)
</pre>
<p><strong>Obtener la lista de checkboxes seleccionados</strong> (este es sólo uno de los posibles algoritmos que se pueden utilizar; valga como ejemplo):</p>
<pre class="brush: javascript">
// Extender jQuery con un método personalizado:
jQuery.fn.getCheckboxValues = function(){
    var values = [];
    var i = 0;
    this.each(function(){
        // guarda los valores en un array
        values[i++] = $(this).val();
    });
    // devuelve un array con los checkboxes seleccionados
    return values;
} 

var arr = $(&quot;input:checked&quot;).getCheckboxValues();
alert(arr); // esto muestra un pop-up con los checkboxes seleccionados
</pre>
<p>Vía | <a href="http://www.premiumbeat.com/tech-blog/jquery-and-checkboxes-the-complete-guide/?sms_ss=digg">http://www.premiumbeat.com</a></p>


<p>Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2010/07/jquery-mejorar-rendimiento-en-selectores/' rel='bookmark' title='Permanent Link: jQuery: mejorar rendimiento en selectores'>jQuery: mejorar rendimiento en selectores</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/jquery-navegador-con-soporte-webkit/' rel='bookmark' title='Permanent Link: jQuery: navegador con soporte WebKit'>jQuery: navegador con soporte WebKit</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.ilikeblues.com/2010/07/jquery-manejo-de-checkbox/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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>Diferencia entre ClassNotFoundException y NoClassDefFoundError</title>
		<link>http://blog.ilikeblues.com/2010/07/diferencia-entre-classnotfoundexception-y-noclassdeffounderror/</link>
		<comments>http://blog.ilikeblues.com/2010/07/diferencia-entre-classnotfoundexception-y-noclassdeffounderror/#comments</comments>
		<pubDate>Tue, 06 Jul 2010 11:01:49 +0000</pubDate>
		<dc:creator>ilikeblues</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[ClassNotFoundException]]></category>
		<category><![CDATA[diferencia]]></category>
		<category><![CDATA[excepción ClassNotFoundException en java]]></category>
		<category><![CDATA[excepción NoClassDefFoundError en java]]></category>
		<category><![CDATA[java.lang.ClassNotFoundException]]></category>
		<category><![CDATA[java.lang.ExceptionInInitializerError]]></category>
		<category><![CDATA[java.lang.NoClassDefFoundError]]></category>
		<category><![CDATA[máquina virtual]]></category>
		<category><![CDATA[NoClassDefFoundError]]></category>
		<category><![CDATA[virtual machine]]></category>

		<guid isPermaLink="false">http://blog.ilikeblues.com/?p=443</guid>
		<description><![CDATA[Es muy común confundir las excepciones ClassNotFoundException y NoClassDefFoundError en Java.
Yo personalmente, las he confundido muy a menudo. Así que agradezco sinceramente a Zen in the Art of IT la entrada al respecto.
Esto es, básicamente, lo que dice:
ClassNotFoundException: la clase no está en el classpath; esto puede deberse a que han sido definidos dos cargadores [...]


Relacionados:<ol><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/07/orden-de-inicializacion-en-objetos-java/' rel='bookmark' title='Permanent Link: Orden de inicialización en Objetos Java'>Orden de inicialización en Objetos Java</a></li>
<li><a href='http://blog.ilikeblues.com/2008/02/sobrecarga-de-metodos-en-java/' rel='bookmark' title='Permanent Link: Sobrecarga de métodos en Java'>Sobrecarga de métodos en Java</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Es muy común confundir las excepciones ClassNotFoundException y NoClassDefFoundError en Java.</p>
<p>Yo personalmente, las he confundido muy a menudo. Así que agradezco sinceramente a<a href="http://java-it-zen.blogspot.com/" target="_blank"> Zen in the Art of IT</a> la <a href="http://java-it-zen.blogspot.com/2010/05/classnotfoundexception-vs.html" target="_blank">entrada</a> al respecto.</p>
<p>Esto es, básicamente, lo que dice:</p>
<p><span id="more-443"></span><strong>ClassNotFoundException</strong>: la clase no está en el classpath; esto puede deberse a que han sido definidos dos cargadores (class loaders) diferentes, cada uno con diferente &#8220;visibilidad&#8221; (esto es bastante común cuando se trabaja con servidores de aplicaciones, donde no tienes un control sobre los class loaders que se van a utilizar), o simplemente que la clase no está en los paquetes incluidos en el classpath.</p>
<p><strong>NoClassDefFoundError</strong>: esta situación es muy diferente, y generalmente significa está presente en el classpath, pero ocurrió un error al leer la definición de la misma. A menudo esto se debe a una excepción en un bloque estático de inicialización o la instanciación de una variable estática. En ese caso, la máquina virtual lanza la excepción java.lang.ExceptionInInitializerError y &#8220;descarga&#8221; la definición de la clase, de manera que cualquier intento de acceder a ella da como resultado la excepción NoClassDefFoundError.</p>
<p>El siguiente código muestra estos comportamientos:</p>
<pre class="brush: java">
public class App {
  public static void main(String[] args) {
    try {
      App.class.getClassLoader().loadClass(&quot;NonExistent&quot;);
    } catch (Throwable e) {
      System.out.println(e.getClass().getName());
    }

    try {
      new BadStatic();
    } catch (Throwable e) {
      System.out.println(e.getClass().getName());
      System.out.println(e.getCause().getClass().getName());
    }

    try {
      new BadStatic();
    } catch (Throwable e) {
      System.out.println(e.getClass().getName());
    }

  }

}

package za.co.classNotFoundBadness;

public class BadStatic {

  static {
    if(true){
      throw new IllegalArgumentException(&quot;I am a bad static initialiser.&quot;);
    }
  }

  public BadStatic() {

  }

}
</pre>
<p>Este código da lugar a esta salida:</p>
<pre class="brush: php">
java.lang.ClassNotFoundException
First attempt:
java.lang.ExceptionInInitializerError
java.lang.IllegalArgumentException
Second attempt:
java.lang.NoClassDefFoundError
</pre>
<p>Vía | <a href="http://java-it-zen.blogspot.com/2010/05/classnotfoundexception-vs.html">http://java-it-zen.blogspot.com</a></p>


<p>Relacionados:<ol><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/07/orden-de-inicializacion-en-objetos-java/' rel='bookmark' title='Permanent Link: Orden de inicialización en Objetos Java'>Orden de inicialización en Objetos Java</a></li>
<li><a href='http://blog.ilikeblues.com/2008/02/sobrecarga-de-metodos-en-java/' rel='bookmark' title='Permanent Link: Sobrecarga de métodos en Java'>Sobrecarga de métodos en Java</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.ilikeblues.com/2010/07/diferencia-entre-classnotfoundexception-y-noclassdeffounderror/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jQuery: mejorar rendimiento en selectores</title>
		<link>http://blog.ilikeblues.com/2010/07/jquery-mejorar-rendimiento-en-selectores/</link>
		<comments>http://blog.ilikeblues.com/2010/07/jquery-mejorar-rendimiento-en-selectores/#comments</comments>
		<pubDate>Fri, 02 Jul 2010 12:39:14 +0000</pubDate>
		<dc:creator>ilikeblues</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Trucos]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[cadena]]></category>
		<category><![CDATA[chain]]></category>
		<category><![CDATA[chain selector]]></category>
		<category><![CDATA[dom]]></category>
		<category><![CDATA[encadenar selector]]></category>
		<category><![CDATA[guardar selector]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[save salector]]></category>
		<category><![CDATA[selector]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://blog.ilikeblues.com/?p=432</guid>
		<description><![CDATA[El siguiente código es correcto:

$(&#34;div#elem&#34;).hide();
$(&#34;div#elem&#34;).css(&#34;width&#34;,&#34;200&#34;);
$(&#34;div#elem&#34;).show();

Pero presenta un problema: cada vez que se especifica un selector, jQuery recorre todo el DOM en busca de los elementos correspondientes.
Tenemos dos posibles soluciones para mejorar el rendimiento. La primera es &#8220;encadenar&#8221; las llamadas:

$(&#34;div#elem&#34;).hide().css(&#34;width&#34;,&#34;200&#34;).show();

La segunda es guardar el objeto devuelto por jQuery en una variable:

var myElement = $(&#34;div#elem&#34;);
myElement.hide();
myElement.css(&#34;width&#34;,&#34;200&#34;);
myElement.show();

Esto también es [...]


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/07/jquery-manejo-de-checkbox/' rel='bookmark' title='Permanent Link: jQuery: manejo de checkbox'>jQuery: manejo de checkbox</a></li>
<li><a href='http://blog.ilikeblues.com/2010/05/jquery-navegador-con-soporte-webkit/' rel='bookmark' title='Permanent Link: jQuery: navegador con soporte WebKit'>jQuery: navegador con soporte WebKit</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>El siguiente código es correcto:</p>
<pre class="brush: javascript">
$(&quot;div#elem&quot;).hide();
$(&quot;div#elem&quot;).css(&quot;width&quot;,&quot;200&quot;);
$(&quot;div#elem&quot;).show();
</pre>
<p>Pero presenta un problema: cada vez que se especifica un selector, jQuery recorre todo el DOM en busca de los elementos correspondientes.</p>
<p>Tenemos dos posibles soluciones para mejorar el rendimiento. La primera es &#8220;encadenar&#8221; las llamadas:</p>
<pre class="brush: javascript">
$(&quot;div#elem&quot;).hide().css(&quot;width&quot;,&quot;200&quot;).show();
</pre>
<p>La segunda es guardar el objeto devuelto por jQuery en una variable:</p>
<pre class="brush: javascript">
var myElement = $(&quot;div#elem&quot;);
myElement.hide();
myElement.css(&quot;width&quot;,&quot;200&quot;);
myElement.show();
</pre>
<p>Esto también es aplicable al objeto &#8220;this&#8221;. Por ejemplo, para este loop:</p>
<pre class="brush: javascript">
$(&quot;div&quot;).each(function(i) {
   $(this).addClass(&quot;myClass&quot;);
   if($(this).hasClass(&quot;newClass&quot;) {
      $(this).addClass(&quot;anotherClass&quot;);
   }
});
</pre>
<p>Podríamos implementar algo como esto:</p>
<pre class="brush: javascript">
$(&quot;div&quot;).each(function(i) {
   var $this = $(this);
   $this.addClass(&quot;myClass&quot;);
   if($this.hasClass(&quot;newClass&quot;) {
      $this.addClass(&quot;anotherClass&quot;);
   }
});
</pre>
<p><em>Nota: la variable ha sido nombrada $this, en lugar de this, porque esta última es una palabra reservada.</em></p>
<p>Vía | <a href="http://www.thewebsqueeze.com/web-design-tutorials/improve-your-jquery-selectors-5-quick-tips.html">http://www.thewebsqueeze.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/07/jquery-manejo-de-checkbox/' rel='bookmark' title='Permanent Link: jQuery: manejo de checkbox'>jQuery: manejo de checkbox</a></li>
<li><a href='http://blog.ilikeblues.com/2010/05/jquery-navegador-con-soporte-webkit/' rel='bookmark' title='Permanent Link: jQuery: navegador con soporte WebKit'>jQuery: navegador con soporte WebKit</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.ilikeblues.com/2010/07/jquery-mejorar-rendimiento-en-selectores/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>SUID: permisos para otros usuarios</title>
		<link>http://blog.ilikeblues.com/2010/07/suid-permisos-para-otros-usuarios/</link>
		<comments>http://blog.ilikeblues.com/2010/07/suid-permisos-para-otros-usuarios/#comments</comments>
		<pubDate>Thu, 01 Jul 2010 08:48:09 +0000</pubDate>
		<dc:creator>ilikeblues</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Trucos]]></category>
		<category><![CDATA[command line]]></category>
		<category><![CDATA[permiso ejecución]]></category>
		<category><![CDATA[permisos]]></category>
		<category><![CDATA[permission]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[scripts]]></category>
		<category><![CDATA[shell script]]></category>
		<category><![CDATA[suid]]></category>
		<category><![CDATA[unix]]></category>

		<guid isPermaLink="false">http://blog.ilikeblues.com/?p=417</guid>
		<description><![CDATA[El bit SUID activado sobre un fichero indica que todo aquél que ejecute el archivo va a tener durante la ejecución los mismos privilegios que quién lo creó.
Supongamos. por ejemplo, que el usuario user1 crea un script &#8220;test.sh&#8221; que tiene como resultado una escritura sobre un fichero cuyo propietario es el mismo usuario.

#!/bin/bash
dt=`date`
echo $USER  [...]


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/2010/02/conversion-de-archivos-de-audio-en-linux/' rel='bookmark' title='Permanent Link: Conversión de archivos de audio en linux'>Conversión de archivos de audio en linux</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>El bit SUID activado sobre un fichero indica que todo aquél que ejecute el archivo va a tener durante la ejecución los mismos privilegios que quién lo creó.</p>
<p>Supongamos. por ejemplo, que el usuario user1 crea un script &#8220;test.sh&#8221; que tiene como resultado una escritura sobre un fichero cuyo propietario es el mismo usuario.</p>
<p><code><br />
#!/bin/bash<br />
dt=`date`<br />
echo $USER  $dt &gt;&gt; /home/user1/log<br />
echo "Updated the log file sucessfully."<br />
</code></p>
<p>Supongamos, además, que el usuario quiere dar permiso a otros usuarios para ejecutar este script. En este caso hay dos opciones:<br />
<span id="more-417"></span></p>
<ol>
<li>Dar permisos de lectura/escritura sobre el fichero /home/user1/log, con el inconveniente que esto conlleva (control de otros usuarios sobre el fichero);</li>
<li>Establecer el bit SUID sobre el script:</li>
</ol>
<pre class="brush: sh">
$ chmod u+s test.sh
</pre>
<p>Con esto, si listamos los ficheros test.sh y /home/user1/log</p>
<pre class="brush: sh">
$ ls -l test.sh log
-rwsr-xr-x  1 user1 user1 60 Jun 24 21:44 test.sh
-rw-r--r--  1 user1 user1 20 Jun 24 21:44 log
</pre>
<p>Con esto, cualquier usuario puede ejecutar el script sin tener acceso de escritura al fichero de log. Si, por ejemplo, ejecutamos con el usuario user2, podríamos tener un fichero de log como el que sigue:</p>
<pre class="brush: sh">
user1 Fri Jun 25 08:01:16 IST 2010
user2 Fri Jun 25 08:41:11 IST 2010
user2 Fri Jun 25 08:58:14 IST 2010
</pre>
<p>Este es, por ejemplo, el mecanismo utilizado para el comando passwd. Este comando, ejecutado por un usuario, modifica el fichero /etc/passwd, que sólo puede ser modificado por el usuario root.</p>
<p>Ojo, porque esta es una de las funcionalidades más peligrosas en entornos UNIX.</p>
<p>Vía | <a href="http://unix-school.blogspot.com/2010/06/what-is-suid.html">http://unix-school.blogspot.com</a><br />
Vía | <a href="http://www.mmc.igeofcu.unam.mx/LuCAS/Manuales-LuCAS/doc-unixsec/unixsec-html/node56.html">http://www.mmc.igeofcu.unam.mx</a></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/2010/02/conversion-de-archivos-de-audio-en-linux/' rel='bookmark' title='Permanent Link: Conversión de archivos de audio en linux'>Conversión de archivos de audio en linux</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.ilikeblues.com/2010/07/suid-permisos-para-otros-usuarios/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CSS: crear reflejos en navegadores con soporte WebKit</title>
		<link>http://blog.ilikeblues.com/2010/06/css-crear-reflejos-en-navegadores-con-soporte-webkit/</link>
		<comments>http://blog.ilikeblues.com/2010/06/css-crear-reflejos-en-navegadores-con-soporte-webkit/#comments</comments>
		<pubDate>Tue, 08 Jun 2010 09:14:47 +0000</pubDate>
		<dc:creator>ilikeblues</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Trucos]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[css reflection]]></category>
		<category><![CDATA[css reflejo]]></category>
		<category><![CDATA[css reflexión]]></category>
		<category><![CDATA[diseño web]]></category>
		<category><![CDATA[web design]]></category>
		<category><![CDATA[webkit]]></category>

		<guid isPermaLink="false">http://blog.ilikeblues.com/?p=403</guid>
		<description><![CDATA[El efecto &#8220;reflejo&#8221; es uno de los más interesantes que podemos crear usando WebKit.
Antes sólo era posible utilizando javascript (este es el método que utiliza, o al menos utilizaba, iWeb, para crear esos efectos).
El código a utilizar es:

&#60;br&#62;
-webkit-box-reflect: &#60;direction&#62; &#60;offset&#62; &#60;mask-box-image&#62;&#60;br&#62;


dónde indicamos la dirección en la que mostramos el reflejo, la distancia respecto al objeto [...]


Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2010/05/jquery-navegador-con-soporte-webkit/' rel='bookmark' title='Permanent Link: jQuery: navegador con soporte WebKit'>jQuery: navegador con soporte WebKit</a></li>
<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/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>
</ol>]]></description>
			<content:encoded><![CDATA[<p>El efecto &#8220;reflejo&#8221; es uno de los más interesantes que podemos crear usando WebKit.</p>
<p>Antes sólo era posible utilizando javascript (este es el método que utiliza, o al menos utilizaba, iWeb, para crear esos efectos).</p>
<p>El código a utilizar es:</p>
<p>
<pre class="brush: css">&lt;br&gt;
-webkit-box-reflect: &lt;direction&gt; &lt;offset&gt; &lt;mask-box-image&gt;&lt;br&gt;
</pre>
</p>
<p>dónde indicamos la dirección en la que mostramos el reflejo, la distancia respecto al objeto original y la máscara que se va a aplicar al reflejo, si es que se aplica alguna.</p>
<p>Ya que podemos crear gradientes usando WebKit, un buen ejemplo sería:</p>
<p><span id="more-403"></span></p>
<p>
<pre class="brush: css">&lt;br&gt;
#reflection {&lt;br&gt;
   font-size:24px;&lt;br&gt;
   color: #f00;&lt;br&gt;
   -webkit-box-reflect: below -5px -webkit-gradient(linear, left top, left bottom, from(transparent), to(rgba(100, 100, 100, 0.4)));&lt;br&gt;
}&lt;br&gt;
</pre>
</p>
<p>Y aquí el resultado:</p>
<p style="font-size:24px; color: #f00; -webkit-box-reflect: below 5px -webkit-gradient(linear, left top, left bottom, from(transparent), to(rgba(100, 100, 100, 0.4)));">Texto</p>
<p>
<p>Vía | <a href="http://webkit.org/blog/182/" mce_href="http://webkit.org/blog/182/css-reflections/">http://webkit.org/</a></p>
<p>Vía | <a href="http://www.dzone.com/links/r/impossible_things_with_css_now_possible_with_css3.html" mce_href="http://www.dzone.com/links/r/impossible_things_with_css_now_possible_with_css3.html">http://www.dzone.com/</a></p>


<p>Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2010/05/jquery-navegador-con-soporte-webkit/' rel='bookmark' title='Permanent Link: jQuery: navegador con soporte WebKit'>jQuery: navegador con soporte WebKit</a></li>
<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/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>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.ilikeblues.com/2010/06/css-crear-reflejos-en-navegadores-con-soporte-webkit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jQuery: navegador con soporte WebKit</title>
		<link>http://blog.ilikeblues.com/2010/05/jquery-navegador-con-soporte-webkit/</link>
		<comments>http://blog.ilikeblues.com/2010/05/jquery-navegador-con-soporte-webkit/#comments</comments>
		<pubDate>Fri, 28 May 2010 10:24:17 +0000</pubDate>
		<dc:creator>ilikeblues</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[browser]]></category>
		<category><![CDATA[check webkit]]></category>
		<category><![CDATA[chequeo]]></category>
		<category><![CDATA[chequeo navegador]]></category>
		<category><![CDATA[chequeo webkit]]></category>
		<category><![CDATA[comprobación]]></category>
		<category><![CDATA[comprobación webkit]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[jquery.browser]]></category>
		<category><![CDATA[jquery.support]]></category>
		<category><![CDATA[navegador]]></category>
		<category><![CDATA[webkit]]></category>

		<guid isPermaLink="false">http://blog.ilikeblues.com/?p=396</guid>
		<description><![CDATA[jQuery nos ofrece una alternativa sencilla, a la par que elegante, para la comprobación mediante código JavaScript del soporte de WebKit del navegador.
Para ello podemos utilizar el objeto jQuery.browser. Este objeto contiene los siguientes flags:

webkit (a partir de jQuery 1.4)
safari (obsoleto)
opera
msie
mozilla

De manera que para comprobar si el navegador soporta WebKit, podemos usar este código:

if($.browser.webkit) {
// [...]


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/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>
<li><a href='http://blog.ilikeblues.com/2009/10/javascript-comprobar-si-es-el-navegador-de-iphone/' rel='bookmark' title='Permanent Link: Javascript: comprobar si es el navegador de iPhone'>Javascript: comprobar si es el navegador de iPhone</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><a href="http://jquery.com/" target="_blank">jQuery</a> nos ofrece una alternativa sencilla, a la par que elegante, para la <a href="http://blog.ilikeblues.com/2010/05/javascript-comprobar-si-navegador-soporta-webkit/">comprobación mediante código JavaScript del soporte de WebKit del navegador</a>.</p>
<p>Para ello podemos utilizar el objeto <a href="http://api.jquery.com/jQuery.browser/#jQuery.browser.version2" target="_blank">jQuery.browser</a>. Este objeto contiene los siguientes flags:</p>
<ul>
<li>webkit (a partir de jQuery 1.4)</li>
<li>safari (obsoleto)</li>
<li>opera</li>
<li>msie</li>
<li>mozilla</li>
</ul>
<p>De manera que para comprobar si el navegador soporta WebKit, podemos usar este código:</p>
<pre class="brush: javascript">
if($.browser.webkit) {
// do something
}
</pre>
<p>De la misma manera se puede comprobar si el navegador es uno de los listados más arriba. Además, el objeto tiene un miembro &#8220;version&#8221; que permite añadir/filtrar código dependiendo del navegador y la versión del mismo. Ejemplo:</p>
<pre class="brush: javascript">
if($.browser.msie) {
   alert($.browser.version);
}
</pre>
<p>Ojo que, tal como indican en la web de la <a href="http://api.jquery.com/jQuery.browser/#jQuery.browser.version2" target="_blank">API de jQuery</a> el uso de este objeto está &#8220;deprecado&#8221;. En su lugar se debería usar <a href="http://api.jquery.com/jQuery.support/" target="_blank">jQuery.support</a>, para efectuar comprobaciones más complejas, individuales para cada funcionalidad que se desea chequear.  Con esto se puede activa/desactivar features de la web individualmente.</p>
<p>Sin embargo, aún teniendo en cuenta los riegos, el uso de <a href="http://api.jquery.com/jQuery.browser/#jQuery.browser.version2" target="_blank">jQuery.browser</a> es mucho más sencillo y más rápido de implementar.</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/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>
<li><a href='http://blog.ilikeblues.com/2009/10/javascript-comprobar-si-es-el-navegador-de-iphone/' rel='bookmark' title='Permanent Link: Javascript: comprobar si es el navegador de iPhone'>Javascript: comprobar si es el navegador de iPhone</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.ilikeblues.com/2010/05/jquery-navegador-con-soporte-webkit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Javascript: comprobar si navegador soporta WebKit</title>
		<link>http://blog.ilikeblues.com/2010/05/javascript-comprobar-si-navegador-soporta-webkit/</link>
		<comments>http://blog.ilikeblues.com/2010/05/javascript-comprobar-si-navegador-soporta-webkit/#comments</comments>
		<pubDate>Thu, 27 May 2010 09:56:45 +0000</pubDate>
		<dc:creator>ilikeblues</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[iPhone / iPod Touch]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[chrome]]></category>
		<category><![CDATA[comprobación javascript]]></category>
		<category><![CDATA[comprobación javascript android]]></category>
		<category><![CDATA[comprobación javascript iphone]]></category>
		<category><![CDATA[dashcode]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[móvil]]></category>
		<category><![CDATA[navegador]]></category>
		<category><![CDATA[safari]]></category>
		<category><![CDATA[soporte webkit]]></category>
		<category><![CDATA[webkit]]></category>
		<category><![CDATA[webkit support]]></category>

		<guid isPermaLink="false">http://blog.ilikeblues.com/?p=389</guid>
		<description><![CDATA[En realidad, el código para esta comprobación es muy similar al utilizado para chequear si el navegador pertenece a un dispositivo móvil (p.e. iPhone o Android), lo cual podemos aprovechar para redirigirlo a un sitio &#8220;mobile-friendly&#8221; o aplicar un theme más adecuado para la visualización en pantallas reducidas.
En el caso del soporte para WebKit, podemos [...]


Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2010/05/javascript-comprobar-si-el-dispositivo-es-android/' rel='bookmark' title='Permanent Link: Javascript: comprobar si el dispositivo es Android'>Javascript: comprobar si el dispositivo es Android</a></li>
<li><a href='http://blog.ilikeblues.com/2009/10/javascript-comprobar-si-es-el-navegador-de-iphone/' rel='bookmark' title='Permanent Link: Javascript: comprobar si es el navegador de iPhone'>Javascript: comprobar si es el navegador de iPhone</a></li>
<li><a href='http://blog.ilikeblues.com/2010/05/jquery-navegador-con-soporte-webkit/' rel='bookmark' title='Permanent Link: jQuery: navegador con soporte WebKit'>jQuery: navegador con soporte WebKit</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>En realidad, el código para esta comprobación es muy similar al utilizado para chequear si el navegador pertenece a un dispositivo móvil (p.e. <a href="http://blog.ilikeblues.com/2009/10/javascript-comprobar-si-es-el-navegador-de-iphone/">iPhone</a> o <a href="http://blog.ilikeblues.com/2010/05/javascript-comprobar-si-el-dispositivo-es-android/">Android</a>), lo cual podemos aprovechar para redirigirlo a un sitio &#8220;mobile-friendly&#8221; o aplicar un theme más adecuado para la visualización en pantallas reducidas.</p>
<p>En el caso del soporte para <a href="http://webkit.org/" target="_blank">WebKit</a>, podemos aplicar un comportamiento diferente si el navegador no soporta, por ejemplo, las transiciones, etc.</p>
<p>Código javascript:</p>
<pre class="brush: javascript">
//Initialize our user agent string to lower case.
var uagent = navigator.userAgent.toLowerCase();

var webkitSupport= &quot;webkit&quot;;
//**************************
// Detects if the current browser supports WebKit.
function DetectWebKit() {
   if (uagent.search(webkitSupport) &gt; -1)
      return true;
   else
      return false;
}
</pre>
<p>En el caso de aplicaciones generadas con Dashcode, esta comprobación puede ser suficiente.</p>
<p>Por ejemplo, la versión para móviles de este blog:</p>
<p><a href="http://blog.ilikeblues.com/iphone">http://blog.ilikeblues.com/iphone</a></p>
<p>se comporta correctamente en iPhone, Android, Chrome, etc.</p>


<p>Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2010/05/javascript-comprobar-si-el-dispositivo-es-android/' rel='bookmark' title='Permanent Link: Javascript: comprobar si el dispositivo es Android'>Javascript: comprobar si el dispositivo es Android</a></li>
<li><a href='http://blog.ilikeblues.com/2009/10/javascript-comprobar-si-es-el-navegador-de-iphone/' rel='bookmark' title='Permanent Link: Javascript: comprobar si es el navegador de iPhone'>Javascript: comprobar si es el navegador de iPhone</a></li>
<li><a href='http://blog.ilikeblues.com/2010/05/jquery-navegador-con-soporte-webkit/' rel='bookmark' title='Permanent Link: jQuery: navegador con soporte WebKit'>jQuery: navegador con soporte WebKit</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.ilikeblues.com/2010/05/javascript-comprobar-si-navegador-soporta-webkit/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Javascript: comprobar si el dispositivo es Android</title>
		<link>http://blog.ilikeblues.com/2010/05/javascript-comprobar-si-el-dispositivo-es-android/</link>
		<comments>http://blog.ilikeblues.com/2010/05/javascript-comprobar-si-el-dispositivo-es-android/#comments</comments>
		<pubDate>Tue, 25 May 2010 10:09:30 +0000</pubDate>
		<dc:creator>ilikeblues</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[iPhone / iPod Touch]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[comprobar dispositivo]]></category>
		<category><![CDATA[comprobar navegador]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[javascript comprobación]]></category>
		<category><![CDATA[navegador]]></category>
		<category><![CDATA[navegador móvil]]></category>

		<guid isPermaLink="false">http://blog.ilikeblues.com/?p=385</guid>
		<description><![CDATA[Con la reciente adquisición de mi HTC Desire, he estado probando el navegador que viene &#8220;de serie&#8221;, en concreto visitando este blog, y la versión que hice de este blog para iPhone.
En otro post indicaba cómo hacer la comprobación javascript para detectar si el navegador es de iPhone y redirigirlo al sitio adecuado.
He aquí el [...]


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/2009/10/javascript-comprobar-si-es-el-navegador-de-iphone/' rel='bookmark' title='Permanent Link: Javascript: comprobar si es el navegador de iPhone'>Javascript: comprobar si es el navegador de iPhone</a></li>
<li><a href='http://blog.ilikeblues.com/2009/10/conexion-a-base-de-datos-safari-javascript/' rel='bookmark' title='Permanent Link: Conexión a Base de Datos Safari-JavaScript'>Conexión a Base de Datos Safari-JavaScript</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Con la reciente <a href="http://blog.ilikeblues.com/2010/05/htc-desire-desempaquetado/">adquisición de mi HTC Desire</a>, he estado probando el navegador que viene &#8220;de serie&#8221;, en concreto visitando este blog, y la versión que hice de este blog para iPhone.</p>
<p>En <a href="http://blog.ilikeblues.com/2009/10/javascript-comprobar-si-es-el-navegador-de-iphone/">otro post</a> indicaba cómo hacer la <a href="http://blog.ilikeblues.com/2009/10/javascript-comprobar-si-es-el-navegador-de-iphone/">comprobación javascript para detectar si el navegador es de iPhone</a> y redirigirlo al sitio adecuado.</p>
<p>He aquí el código para comprobar si el dispositivo que estamos usando es Android y redirigirlo al mismo sitio que en caso de que sea iPhone, puesto que ambos navegadores soportan la salida generada usando Dashcode:</p>
<pre class="brush: javascript">
//Initialize our user agent string to lower case.
var uagent = navigator.userAgent.toLowerCase();

var deviceAndroid = &quot;android&quot;;
//**************************
// Detects if the current device is an Android OS-based device.
function DetectAndroid() {
   if (uagent.search(deviceAndroid) &gt; -1)
      return true;
   else
      return false;
}
</pre>
<p>Vía | <a href="http://www.hand-interactive.com/resources/detect-mobile-javascript.htm" target="_blank">http://www.hand-interactive.com</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/2009/10/javascript-comprobar-si-es-el-navegador-de-iphone/' rel='bookmark' title='Permanent Link: Javascript: comprobar si es el navegador de iPhone'>Javascript: comprobar si es el navegador de iPhone</a></li>
<li><a href='http://blog.ilikeblues.com/2009/10/conexion-a-base-de-datos-safari-javascript/' rel='bookmark' title='Permanent Link: Conexión a Base de Datos Safari-JavaScript'>Conexión a Base de Datos Safari-JavaScript</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.ilikeblues.com/2010/05/javascript-comprobar-si-el-dispositivo-es-android/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google I/O livestream en las oficinas de Madrid</title>
		<link>http://blog.ilikeblues.com/2010/05/google-io-livestream-en-las-oficinas-de-madrid/</link>
		<comments>http://blog.ilikeblues.com/2010/05/google-io-livestream-en-las-oficinas-de-madrid/#comments</comments>
		<pubDate>Thu, 20 May 2010 08:14:15 +0000</pubDate>
		<dc:creator>ilikeblues</dc:creator>
				<category><![CDATA[Eventos]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[adobe]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[google i/o]]></category>
		<category><![CDATA[google wave]]></category>
		<category><![CDATA[macbook]]></category>
		<category><![CDATA[macbook pro]]></category>
		<category><![CDATA[madrid]]></category>
		<category><![CDATA[mayo]]></category>
		<category><![CDATA[torre picasso]]></category>
		<category><![CDATA[vídeo]]></category>
		<category><![CDATA[vp8]]></category>
		<category><![CDATA[webm]]></category>

		<guid isPermaLink="false">http://blog.ilikeblues.com/?p=367</guid>
		<description><![CDATA[Ayer estuve en la retransmisión en vivo del la keynote de presentación del Google I/O, que ofrecieron (previa suscripción) en las oficinas de Google en Madrid (en Torre Picasso, planta 26, concretamente).
Hicieron un par de anuncios interesantes, como son:

la liberación del codec de vídeo VP8, y la presentacion de WebM,
la nueva versión de GWT, integrada [...]


Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2010/03/google-chrome-hackaton-madrid/' rel='bookmark' title='Permanent Link: Google Chrome Hackaton &#8211; Madrid'>Google Chrome Hackaton &#8211; Madrid</a></li>
<li><a href='http://blog.ilikeblues.com/2010/04/last-hunted-google-chrome-extension/' rel='bookmark' title='Permanent Link: last Hunted &#8211; Google Chrome Extension'>last Hunted &#8211; Google Chrome Extension</a></li>
<li><a href='http://blog.ilikeblues.com/2010/01/google-wave-invitations/' rel='bookmark' title='Permanent Link: Google Wave Invitations'>Google Wave Invitations</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-medium wp-image-369" title="torre_picasso" src="http://blog.ilikeblues.com/wp-content/uploads/2010/05/torre_picasso-225x300.jpg" alt="torre_picasso" width="225" height="300" />Ayer estuve en la retransmisión en vivo del la keynote de presentación del Google I/O, que ofrecieron (previa suscripción) en las oficinas de Google en Madrid (en Torre Picasso, planta 26, concretamente).</p>
<p>Hicieron un par de anuncios interesantes, como son:</p>
<ul>
<li>la liberación del codec de vídeo <a href="http://es.wikipedia.org/wiki/VP8" target="_blank">VP8</a>, y la presentacion de <a href="http://www.webmproject.org/" target="_blank">WebM</a>,</li>
<li>la nueva versión de <a href="http://code.google.com/webtoolkit/" target="_blank">GWT</a>, integrada con <a href="http://www.springsource.org/roo" target="_blank">roo</a> (que, según parece, puede dar mucho juego, al estilo Ruby on Rails),</li>
<li>la apertura de <a href="http://wave.google.com/" target="_blank">Wave</a> a todos los públicos, es decir, ya no requiere invitación (yo sigo pensando que la idea es interesante y acabará imponiéndose su uso, sobre todo en entornos de empresa).</li>
</ul>
<p><span id="more-367"></span>Pero lo cierto es que, exceptuando estos anuncios, la presentación fue un poco aburrida, quizás demasiado larga, con intervenciones que, a mi entender, no venían a cuento, como la de Terry McDonell y &#8220;su&#8221; revista <a href="http://sportsillustrated.cnn.com/" target="_blank">Sports Illustrated</a>, que, más que una demostración de lo que se puede hacer con HTML5, me pareció &#8220;una publicidad un tanto descarada&#8221;.</p>
<p>Quiero decir que está bien hacer una presentación &#8220;superficial&#8221; de las posibilidades del nuevo estándard, pero lo de la revista fueron casi 15 minutos dedicados en exclusiva. Como dice un compañero de curro &#8220;imagínate lo que Sports Illustrated invierte en publicidad con Google&#8230;&#8221;.</p>
<p>Por lo demás, debo decir que las comparaciones son odiosas: presentación en el comedor de la oficina, que todo sea dicho, contenía por sí sólo más tecnología que toda la empresa completa en la que trabajo, repleto de comida y bebida (soft, por supuesto) gratis, todo de colores, currantes con MacBooks. Y el futbolín en la recepción, claro, aunque este parecía más atrezzo que otra cosa&#8230;</p>
<p><em><strong>Nota</strong></em>: la foto es del edificio por fuera, porque nos pidieron amablemente que no hiciéramos fotos de la oficina.</p>


<p>Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2010/03/google-chrome-hackaton-madrid/' rel='bookmark' title='Permanent Link: Google Chrome Hackaton &#8211; Madrid'>Google Chrome Hackaton &#8211; Madrid</a></li>
<li><a href='http://blog.ilikeblues.com/2010/04/last-hunted-google-chrome-extension/' rel='bookmark' title='Permanent Link: last Hunted &#8211; Google Chrome Extension'>last Hunted &#8211; Google Chrome Extension</a></li>
<li><a href='http://blog.ilikeblues.com/2010/01/google-wave-invitations/' rel='bookmark' title='Permanent Link: Google Wave Invitations'>Google Wave Invitations</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.ilikeblues.com/2010/05/google-io-livestream-en-las-oficinas-de-madrid/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Colecciones Java Thread Safe</title>
		<link>http://blog.ilikeblues.com/2010/05/colecciones-java-thread-safe/</link>
		<comments>http://blog.ilikeblues.com/2010/05/colecciones-java-thread-safe/#comments</comments>
		<pubDate>Wed, 19 May 2010 11:28:18 +0000</pubDate>
		<dc:creator>ilikeblues</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[array]]></category>
		<category><![CDATA[bloqueo]]></category>
		<category><![CDATA[colecciones]]></category>
		<category><![CDATA[Concurrent Collections]]></category>
		<category><![CDATA[interbloqueos]]></category>
		<category><![CDATA[java.util.concurrent]]></category>
		<category><![CDATA[list]]></category>
		<category><![CDATA[map]]></category>
		<category><![CDATA[thread]]></category>
		<category><![CDATA[thread java]]></category>

		<guid isPermaLink="false">http://blog.ilikeblues.com/?p=361</guid>
		<description><![CDATA[El acceso concurrente a colecciones en Java era un tema espinoso, hasta que en la versión del JDK aparecieron las &#8220;Concurrent Collections&#8221;.
Tal como explican en este artículo, muchos programadores desconocen la existencia y/o el uso de estas colecciones, creadas especialmente para entornos multihilo, donde resulta fundamental evitar las condiciones de carrera.
CopyOnWriteArrayList
Es habitual encontrar escenarios en [...]


Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2008/08/singleton-en-java/' rel='bookmark' title='Permanent Link: Singleton en Java'>Singleton en Java</a></li>
<li><a href='http://blog.ilikeblues.com/2010/07/orden-de-inicializacion-en-objetos-java/' rel='bookmark' title='Permanent Link: Orden de inicialización en Objetos Java'>Orden de inicialización en Objetos Java</a></li>
<li><a href='http://blog.ilikeblues.com/2010/07/diferencia-entre-classnotfoundexception-y-noclassdeffounderror/' rel='bookmark' title='Permanent Link: Diferencia entre ClassNotFoundException y NoClassDefFoundError'>Diferencia entre ClassNotFoundException y NoClassDefFoundError</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>El acceso concurrente a colecciones en Java era un tema espinoso, hasta que en la versión del JDK aparecieron las &#8220;Concurrent Collections&#8221;.</p>
<p>Tal como explican en <a href="http://www.dzone.com/links/r/5_things_you_didnt_know_about_javautilconcurrent.html" target="_blank">este artículo</a>, muchos programadores desconocen la existencia y/o el uso de estas colecciones, creadas especialmente para entornos multihilo, donde resulta fundamental evitar las <a href="http://es.wikipedia.org/wiki/Condici%C3%B3n_de_carrera" target="_blank">condiciones de carrera</a>.</p>
<p style="font-size: 1.5em; font-weight: bold;">CopyOnWriteArrayList</p>
<p>Es habitual encontrar escenarios en los que muchos threads acceden a un array en modo lectura y algunos en modo escritura.</p>
<p><span id="more-361"></span>Hacer una copia de un <strong>ArrayList</strong> en Java es muy costoso computacionalmente (desde el punto de vista del tiempo y de la memoria), así como utilizar un &#8220;<strong>synchronized ArrayList</strong>&#8220;.</p>
<p>La solución la encontramos en la clase <strong>CopyOnWriteArrayList</strong>. El Javadoc dice que &#8220;se trata de una <strong>versión thread-safe de ArrayList</strong>, en la que las operaciones de modificación (add, set, etc.) están implementadas haciendo una copia del array&#8221;.</p>
<p>Así pues, esta clase es ideal para escenarios como el descrito más arriba: muchos accesos de lectura y unos pocos de escritura, evitando el coste computacional de los elementos &#8220;sincronizados&#8221; (<strong>synchronized</strong>).</p>
<p style="font-size: 1.5em; font-weight: bold;">BlockingQueue</p>
<p>Esta clase implementa una cola <a href="http://en.wikipedia.org/wiki/FIFO" target="_blank">FIFO</a>. La diferencia respecto a <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/Queue.html" target="_blank"><strong>Queue</strong></a> es que esta garantiza que cualquier intento de &#8220;sacar&#8221; un elemento de la cola vacía permanecerá bloqueado a la espera de que la cola contenga algún elemento listo para ser devuelto.</p>
<p>De la misma manera, si la cola está llena, cualquier intento de añadir un elemento a la misma dejará bloqueado al thread correspondiente, a la espera de que haya un hueco.</p>
<p style="font-size: 1.5em; font-weight: bold;">SynchronousQueue</p>
<p>Esta cola es similar a la interior, excepto por el tamaño: <strong>SynchronousQueue</strong> siempre tiene tamaño cero, por lo cual, cualquier intento de añadir un elemento dejará bloqueado el thread, hasta que otro haga un intento de &#8220;sacarlo&#8221;.</p>
<p style="font-size: 1.5em; font-weight: bold;">ConcurrentMap</p>
<p>La clase Map tiene un bug que podría provocar comportamientos diferentes si dos o más threads intentan modificar su contenido al mismo tiempo (incluso en un bloque &#8220;<strong>synchronized</strong>&#8220;). Es decir, se daría una condición de carrera (podéis ver <a href="http://mailinator.blogspot.com/2009/06/beautiful-race-condition.html" target="_blank">aquí</a> una descripción). Básicamente, los bloqueos se realizan tanto al principio como al final de los métodos <strong>get()</strong> (usado para comprobar si el mapa contiene un elemento) y <strong>put()</strong> (usado para añadir un elemento), con lo que un thread podría sobreescribir el contenido añadido por otro.</p>
<p>El problema está resuelto en la clase <strong>ConcurrentMap</strong>. Esta clase ofrece un método <strong>putIfAbsent()</strong> que realiza la comprobación y la adición del elemento (si el mapa no lo contiene) dentro de un mismo bloqueo.</p>
<hr />Podéis descargar código de ejemplo usando estas clases de <a href="http://www.ibm.com/developerworks/apps/download/index.jsp?contentid=490327&amp;filename=j-5things4-src.zip&amp;method=http&amp;locale=" target="_blank">aquí</a>.</p>
<p>Vía | <a href="http://www.dzone.com/links/r/5_things_you_didnt_know_about_javautilconcurrent.html" target="_blank">DZone</a></p>


<p>Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2008/08/singleton-en-java/' rel='bookmark' title='Permanent Link: Singleton en Java'>Singleton en Java</a></li>
<li><a href='http://blog.ilikeblues.com/2010/07/orden-de-inicializacion-en-objetos-java/' rel='bookmark' title='Permanent Link: Orden de inicialización en Objetos Java'>Orden de inicialización en Objetos Java</a></li>
<li><a href='http://blog.ilikeblues.com/2010/07/diferencia-entre-classnotfoundexception-y-noclassdeffounderror/' rel='bookmark' title='Permanent Link: Diferencia entre ClassNotFoundException y NoClassDefFoundError'>Diferencia entre ClassNotFoundException y NoClassDefFoundError</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.ilikeblues.com/2010/05/colecciones-java-thread-safe/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>Slider con CSS3 puro y funcionalidad de Back Button</title>
		<link>http://blog.ilikeblues.com/2010/04/slider-con-css3-puro-y-funcionalidad-de-back-button/</link>
		<comments>http://blog.ilikeblues.com/2010/04/slider-con-css3-puro-y-funcionalidad-de-back-button/#comments</comments>
		<pubDate>Wed, 28 Apr 2010 11:17:16 +0000</pubDate>
		<dc:creator>ilikeblues</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Trucos]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[anchor]]></category>
		<category><![CDATA[back button]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[css3]]></category>
		<category><![CDATA[deslizador]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[link]]></category>
		<category><![CDATA[slider]]></category>
		<category><![CDATA[target]]></category>
		<category><![CDATA[webkit]]></category>

		<guid isPermaLink="false">http://blog.ilikeblues.com/?p=321</guid>
		<description><![CDATA[Neil Grosskopf muestra en su blog una solución para crear un slider típico de jQuery usando CSS3 puro.
Pero es que además, su solución evita el problema del &#8220;Back Button&#8221; en aplicaciones que utilizan jQuery, consistente en que mostrar una parte &#8220;oculta&#8221; usando jQuery no modifica el historial de navegación, de manera que si el usuario [...]


Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2010/03/generar-sombra-usando-css-puro/' rel='bookmark' title='Permanent Link: Generar sombra usando CSS puro'>Generar sombra usando CSS puro</a></li>
<li><a href='http://blog.ilikeblues.com/2010/05/usar-jquery-para-comprobar-si-existe-un-elemento/' rel='bookmark' title='Permanent Link: Usar jQuery para comprobar si existe un elemento'>Usar jQuery para comprobar si existe un elemento</a></li>
<li><a href='http://blog.ilikeblues.com/2010/03/generar-sombra-bajo-texto-con-css3/' rel='bookmark' title='Permanent Link: Generar Sombra bajo Texto con CSS3'>Generar Sombra bajo Texto con CSS3</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Neil Grosskopf muestra en su <a href="http://www.nealgrosskopf.com/tech/thread.php?pid=45" target="_blank">blog</a> una solución para crear un slider típico de <a href="http://jquery.com/" target="_blank">jQuery</a> usando <a href="http://www.w3.org/TR/css3-roadmap/" target="_blank">CSS3</a> puro.</p>
<p>Pero es que además, su solución evita el <a href="http://jqueryfordesigners.com/enabling-the-back-button/" target="_blank">problema del &#8220;Back Button&#8221;</a> en aplicaciones que utilizan jQuery, consistente en que mostrar una parte &#8220;oculta&#8221; usando jQuery no modifica el historial de navegación, de manera que si el usuario presiona el botón &#8220;atrás&#8221;, no se vuelve a la situación anterior, sino que el navegador pasa a otra localización.</p>
<p>En fin, veamos un ejemplo (aquí una demostración online, más sencilla que la de la <a href="http://www.nealgrosskopf.com/tech/thread.php?pid=45" target="_blank">entrada original de Neil</a>).</p>
<p>Primero creamos la lista con los elementos, en este caso 3:</p>
<pre class="brush: html">
&lt;div id=&quot;content&quot;&gt;
   &lt;ul&gt;
      &lt;li&gt;
         Text 1
      &lt;/li&gt;
      &lt;li&gt;
         Text 2
      &lt;/li&gt;
      &lt;li&gt;
         Text 3
      &lt;/li&gt;
   &lt;/ul&gt;
&lt;/div&gt;
</pre>
<p>Aplicamos las siguientes reglas CSS:</p>
<pre class="brush: html">
#content, ul, li {
   height: 400px;
   padding: 10px;
}

#content, li { position: relative; width: 500px; }

#content {
   overflow: hidden;
   padding: 10px;

   float:left;
}

ul {
   list-style-type: none;
   position: absolute;
   left: 0px;
   top: 0px;
   width: 500px;
   height: 2000px;
}
</pre>
<p>Con este CSS conseguimos que, de los tres elementos li apilados en vertical, sólo se vea uno a un tiempo. Inicialmente el primero, de manera que ahora tenemos que proporcionar el mecanismo para desplazar el elemento ul las cantidades suficientes para ver los elementos 2 y 3, respectivamente.</p>
<p>Empezamos colocando los &#8220;anchors&#8221; al principio de la página. Serán divs sin contenido, ya que su único propósito es que sirvan como selectores CSS:</p>
<pre class="brush: html">
&lt;div&gt;&lt;div id=&quot;p1&quot;&gt;&lt;/div&gt;
&lt;div&gt;&lt;div id=&quot;p2&quot;&gt;&lt;/div&gt;
&lt;div&gt;&lt;div id=&quot;p3&quot;&gt;&lt;/div&gt;
</pre>
<p>Y ahora añadimos las reglas CSS, basadas en esos anchors para desplazar el elemento ul:</p>
<pre class="brush: html">
#p1:target ul { top: 0px; }
#p2:target ul { top: -420px; }
#p3:target ul { top: -840px; }
</pre>
<p>Listo. Cuando nuestro navegador apunte al anchor #p1 (o simplemente no apunte a ninguno), veremos el primer elemento. Cuando apunte al #p2, al segundo, y así sucesivamente.</p>
<p>Por último, si queremos dar sensación de fluidez al cambio de un elemento a otro, añadimos la siguiente regla CSS:</p>
<pre class="brush: html">
ul { -webkit-transition: top .3s linear; }
</pre>
<p>Pero ojo, esto último sólo funciona para navegadores con soporte WebKit.</p>
<p>Eso es todo. En <a href="http://blog.ilikeblues.com/wp-content/uploads/slider/" target="_blank">este link</a> podéis encontrar una demostración (a la que se ha añadido unos enlaces muy simples para permitir pasar de un elemento a otro sin necesidad de modificar la URL) y <a href="http://blog.ilikeblues.com/wp-content/uploads/slider.zip">en este otro un zip con el código</a>.</p>
<p>Via | <a href="http://www.nealgrosskopf.com/tech/thread.php?pid=45">http://www.nealgrosskopf.com</a></p>


<p>Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2010/03/generar-sombra-usando-css-puro/' rel='bookmark' title='Permanent Link: Generar sombra usando CSS puro'>Generar sombra usando CSS puro</a></li>
<li><a href='http://blog.ilikeblues.com/2010/05/usar-jquery-para-comprobar-si-existe-un-elemento/' rel='bookmark' title='Permanent Link: Usar jQuery para comprobar si existe un elemento'>Usar jQuery para comprobar si existe un elemento</a></li>
<li><a href='http://blog.ilikeblues.com/2010/03/generar-sombra-bajo-texto-con-css3/' rel='bookmark' title='Permanent Link: Generar Sombra bajo Texto con CSS3'>Generar Sombra bajo Texto con CSS3</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.ilikeblues.com/2010/04/slider-con-css3-puro-y-funcionalidad-de-back-button/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>flickrPlaces &#8211; Chrome Extension v1.6</title>
		<link>http://blog.ilikeblues.com/2010/04/flickrplaces-chrome-extension-v1-6/</link>
		<comments>http://blog.ilikeblues.com/2010/04/flickrplaces-chrome-extension-v1-6/#comments</comments>
		<pubDate>Wed, 21 Apr 2010 13:15:12 +0000</pubDate>
		<dc:creator>ilikeblues</dc:creator>
				<category><![CDATA[Chrome Extensions]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[projects]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[chrome]]></category>
		<category><![CDATA[css3]]></category>
		<category><![CDATA[flickr]]></category>
		<category><![CDATA[flickr place finder]]></category>
		<category><![CDATA[flickrPlaces]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[google chrome]]></category>
		<category><![CDATA[google chrome extensions]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[local storage]]></category>
		<category><![CDATA[localstorage]]></category>

		<guid isPermaLink="false">http://blog.ilikeblues.com/?p=317</guid>
		<description><![CDATA[Subida a los servidores de google la última versión (1.6) de la extensión para Google Chrome flickrPlaces.
La nueva versión, incluye la posibilidad de configurar si la foto clicada será mostrada en una nueva pestaña o no.
Gracias a @fjcanales por la sugerencia.
[Nota: para actualizar una extensión ya instalada, abrir la pestaña de extensiones, expandir las opciones para [...]


Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2010/04/flickrplaces-chrome-extension-v1-5/' rel='bookmark' title='Permanent Link: flickrPlaces &#8211; Chrome Extension v1.5'>flickrPlaces &#8211; Chrome Extension v1.5</a></li>
<li><a href='http://blog.ilikeblues.com/2010/04/last-hunted-google-chrome-extension/' rel='bookmark' title='Permanent Link: last Hunted &#8211; Google Chrome Extension'>last Hunted &#8211; Google Chrome Extension</a></li>
<li><a href='http://blog.ilikeblues.com/2010/03/google-chrome-hackaton-madrid/' rel='bookmark' title='Permanent Link: Google Chrome Hackaton &#8211; Madrid'>Google Chrome Hackaton &#8211; Madrid</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Subida a los servidores de google la última versión (1.6) de la extensión para Google Chrome <a href="https://chrome.google.com/extensions/detail/eomajjondckmhlmomjekfdjjpgjebhjg?hl=es" target="_blank">flickrPlaces</a>.</p>
<p>La nueva versión, incluye la posibilidad de configurar si la foto clicada será mostrada en una nueva pestaña o no.</p>
<p>Gracias a @fjcanales por la sugerencia.</p>
<p>[<em><strong>Nota</strong></em>: para actualizar una extensión ya instalada, abrir la pestaña de extensiones, expandir las opciones para desarrolladores (haciendo click en "Modo desarrollador") y pulsar el botón "Actualizar extensiones ahora".]</p>


<p>Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2010/04/flickrplaces-chrome-extension-v1-5/' rel='bookmark' title='Permanent Link: flickrPlaces &#8211; Chrome Extension v1.5'>flickrPlaces &#8211; Chrome Extension v1.5</a></li>
<li><a href='http://blog.ilikeblues.com/2010/04/last-hunted-google-chrome-extension/' rel='bookmark' title='Permanent Link: last Hunted &#8211; Google Chrome Extension'>last Hunted &#8211; Google Chrome Extension</a></li>
<li><a href='http://blog.ilikeblues.com/2010/03/google-chrome-hackaton-madrid/' rel='bookmark' title='Permanent Link: Google Chrome Hackaton &#8211; Madrid'>Google Chrome Hackaton &#8211; Madrid</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.ilikeblues.com/2010/04/flickrplaces-chrome-extension-v1-6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>flickrPlaces &#8211; Chrome Extension v1.5</title>
		<link>http://blog.ilikeblues.com/2010/04/flickrplaces-chrome-extension-v1-5/</link>
		<comments>http://blog.ilikeblues.com/2010/04/flickrplaces-chrome-extension-v1-5/#comments</comments>
		<pubDate>Mon, 12 Apr 2010 08:21:33 +0000</pubDate>
		<dc:creator>ilikeblues</dc:creator>
				<category><![CDATA[Chrome Extensions]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[projects]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[chrome]]></category>
		<category><![CDATA[css3]]></category>
		<category><![CDATA[flickr]]></category>
		<category><![CDATA[flickr place finder]]></category>
		<category><![CDATA[flickrPlaces]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[google chrome]]></category>
		<category><![CDATA[google chrome extensions]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[local storage]]></category>
		<category><![CDATA[localstorage]]></category>

		<guid isPermaLink="false">http://blog.ilikeblues.com/?p=310</guid>
		<description><![CDATA[Acabo de subir a los servidores de google la última versión (1.5) de la extensión para Google Chrome flickrPlaces.
La nueva versión, a petición popular   , incluye persistencia de la última búsqueda realizada.
De manera que, al hacer click en el icono, mostrará el mismo contenido de antes de cerrarla por última vez.
[Nota: para actualizar [...]


Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2010/04/flickrplaces-chrome-extension-v1-6/' rel='bookmark' title='Permanent Link: flickrPlaces &#8211; Chrome Extension v1.6'>flickrPlaces &#8211; Chrome Extension v1.6</a></li>
<li><a href='http://blog.ilikeblues.com/2010/04/last-hunted-google-chrome-extension/' rel='bookmark' title='Permanent Link: last Hunted &#8211; Google Chrome Extension'>last Hunted &#8211; Google Chrome Extension</a></li>
<li><a href='http://blog.ilikeblues.com/2010/03/google-chrome-hackaton-madrid/' rel='bookmark' title='Permanent Link: Google Chrome Hackaton &#8211; Madrid'>Google Chrome Hackaton &#8211; Madrid</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Acabo de subir a los servidores de google la última versión (1.5) de la extensión para Google Chrome <a href="https://chrome.google.com/extensions/detail/eomajjondckmhlmomjekfdjjpgjebhjg?hl=es" target="_blank">flickrPlaces</a>.</p>
<p>La nueva versión, a petición popular <img src='http://blog.ilikeblues.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  , incluye persistencia de la última búsqueda realizada.</p>
<p>De manera que, al hacer click en el icono, mostrará el mismo contenido de antes de cerrarla por última vez.</p>
<p>[<em><strong>Nota</strong></em>: para actualizar una extensión ya instalada, abrir la pestaña de extensiones, expandir las opciones para desarrolladores (haciendo click en "Modo desarrollador") y pulsar el botón "Actualizar extensiones ahora".]</p>


<p>Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2010/04/flickrplaces-chrome-extension-v1-6/' rel='bookmark' title='Permanent Link: flickrPlaces &#8211; Chrome Extension v1.6'>flickrPlaces &#8211; Chrome Extension v1.6</a></li>
<li><a href='http://blog.ilikeblues.com/2010/04/last-hunted-google-chrome-extension/' rel='bookmark' title='Permanent Link: last Hunted &#8211; Google Chrome Extension'>last Hunted &#8211; Google Chrome Extension</a></li>
<li><a href='http://blog.ilikeblues.com/2010/03/google-chrome-hackaton-madrid/' rel='bookmark' title='Permanent Link: Google Chrome Hackaton &#8211; Madrid'>Google Chrome Hackaton &#8211; Madrid</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.ilikeblues.com/2010/04/flickrplaces-chrome-extension-v1-5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>last Hunted &#8211; Google Chrome Extension</title>
		<link>http://blog.ilikeblues.com/2010/04/last-hunted-google-chrome-extension/</link>
		<comments>http://blog.ilikeblues.com/2010/04/last-hunted-google-chrome-extension/#comments</comments>
		<pubDate>Thu, 08 Apr 2010 10:22:57 +0000</pubDate>
		<dc:creator>ilikeblues</dc:creator>
				<category><![CDATA[Chrome Extensions]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[projects]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[chrome]]></category>
		<category><![CDATA[extension]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[google chrome]]></category>
		<category><![CDATA[google chrome extensions]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[tophunted]]></category>

		<guid isPermaLink="false">http://blog.ilikeblues.com/?p=304</guid>
		<description><![CDATA[<a href="http://blog.ilikeblues.com/2010/04/last-hunted-google-chrome-extension/" title="last Hunted &#8211; Google Chrome Extension"><img src="http://blog.ilikeblues.com/wp-content/uploads/yapb_cache/snapshot_2.53tudwv0cxs0ww0g4oogoss8c.a9sxxja1njksswcs400wcc4cg.th.jpeg" width="180" height="109" alt="last Hunted &#8211; Google Chrome Extension" style="float:left;padding:0 10px 10px 0;" ></a><a href="http://blog.ilikeblues.com/2010/04/last-hunted-google-chrome-extension/" title="last Hunted &#8211; Google Chrome Extension"><img src="http://blog.ilikeblues.com/wp-content/uploads/yapb_cache/snapshot_2.53tudwv0cxs0ww0g4oogoss8c.a9sxxja1njksswcs400wcc4cg.th.jpeg" width="180" height="109" alt="last Hunted &#8211; Google Chrome Extension" style="float:left;padding:0 10px 10px 0;" ></a>Publicada la release 1.0 de &#8220;last Hunted&#8221;, extensión para Google Chrome que te permite consultar de manera rápida y sencilla los updates de la página principal, así como los de los canales.
Enlace:
http://blog.ilikeblues.com/projects/google-chrome-extensions/last-hunted/


Relacionados:flickrPlaces &#8211; Chrome Extension v1.5
flickrPlaces &#8211; Chrome Extension v1.6
Google Chrome Hackaton &#8211; Madrid



Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2010/04/flickrplaces-chrome-extension-v1-5/' rel='bookmark' title='Permanent Link: flickrPlaces &#8211; Chrome Extension v1.5'>flickrPlaces &#8211; Chrome Extension v1.5</a></li>
<li><a href='http://blog.ilikeblues.com/2010/04/flickrplaces-chrome-extension-v1-6/' rel='bookmark' title='Permanent Link: flickrPlaces &#8211; Chrome Extension v1.6'>flickrPlaces &#8211; Chrome Extension v1.6</a></li>
<li><a href='http://blog.ilikeblues.com/2010/03/google-chrome-hackaton-madrid/' rel='bookmark' title='Permanent Link: Google Chrome Hackaton &#8211; Madrid'>Google Chrome Hackaton &#8211; Madrid</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<a href="http://blog.ilikeblues.com/2010/04/last-hunted-google-chrome-extension/" title="last Hunted &#8211; Google Chrome Extension"><img src="http://blog.ilikeblues.com/wp-content/uploads/yapb_cache/snapshot_2.53tudwv0cxs0ww0g4oogoss8c.a9sxxja1njksswcs400wcc4cg.th.jpeg" width="180" height="109" alt="last Hunted &#8211; Google Chrome Extension" style="float:left;padding:0 10px 10px 0;" ></a><p>Publicada la release 1.0 de &#8220;last Hunted&#8221;, extensión para Google Chrome que te permite consultar de manera rápida y sencilla los updates de la página principal, así como los de los canales.</p>
<p>Enlace:</p>
<p>http://blog.ilikeblues.com/projects/google-chrome-extensions/last-hunted/</p>


<p>Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2010/04/flickrplaces-chrome-extension-v1-5/' rel='bookmark' title='Permanent Link: flickrPlaces &#8211; Chrome Extension v1.5'>flickrPlaces &#8211; Chrome Extension v1.5</a></li>
<li><a href='http://blog.ilikeblues.com/2010/04/flickrplaces-chrome-extension-v1-6/' rel='bookmark' title='Permanent Link: flickrPlaces &#8211; Chrome Extension v1.6'>flickrPlaces &#8211; Chrome Extension v1.6</a></li>
<li><a href='http://blog.ilikeblues.com/2010/03/google-chrome-hackaton-madrid/' rel='bookmark' title='Permanent Link: Google Chrome Hackaton &#8211; Madrid'>Google Chrome Hackaton &#8211; Madrid</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.ilikeblues.com/2010/04/last-hunted-google-chrome-extension/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>AsistenteJeVWeb v1.0 released</title>
		<link>http://blog.ilikeblues.com/2010/03/asistentejevweb-v1-0-released/</link>
		<comments>http://blog.ilikeblues.com/2010/03/asistentejevweb-v1-0-released/#comments</comments>
		<pubDate>Mon, 29 Mar 2010 17:56:02 +0000</pubDate>
		<dc:creator>ilikeblues</dc:creator>
				<category><![CDATA[AsistenteJeVWeb]]></category>
		<category><![CDATA[Objective-C / iPhone]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[iPhone / iPod Touch]]></category>
		<category><![CDATA[gramática]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[ipod]]></category>
		<category><![CDATA[iPod Touch]]></category>
		<category><![CDATA[japonés]]></category>
		<category><![CDATA[lecciones]]></category>
		<category><![CDATA[nihongo]]></category>

		<guid isPermaLink="false">http://blog.ilikeblues.com/?p=267</guid>
		<description><![CDATA[<a href="http://blog.ilikeblues.com/2010/03/asistentejevweb-v1-0-released/" title="AsistenteJeVWeb v1.0 released"><img src="http://blog.ilikeblues.com/wp-content/uploads/yapb_cache/img_0005.bwq69bc9fjcok4k8gos8ow40w.a9sxxja1njksswcs400wcc4cg.th.jpeg" width="180" height="270" alt="AsistenteJeVWeb v1.0 released" style="float:left;padding:0 10px 10px 0;" ></a><a href="http://blog.ilikeblues.com/2010/03/asistentejevweb-v1-0-released/" title="AsistenteJeVWeb v1.0 released"><img src="http://blog.ilikeblues.com/wp-content/uploads/yapb_cache/img_0005.bwq69bc9fjcok4k8gos8ow40w.a9sxxja1njksswcs400wcc4cg.th.jpeg" width="180" height="270" alt="AsistenteJeVWeb v1.0 released" style="float:left;padding:0 10px 10px 0;" ></a>Liberada la versión 1.0 para instalación &#8220;offline&#8221; en la pantalla de incio de iPhone/iPod Touch de AsistenteJeVWeb.
Sigue las instrucciones en el siguiente enlace:
AsistenteJeVWeb
Sucesivas versiones incluirán más &#8220;features&#8221; y más lecciones gramaticales.
Esta versión funciona en navegadores que soporten HTML5 y WebKit (probado en Chrome 5 y Safari 4).


Relacionados:AsistenteJeVWeb v0.1 released
Javascript: comprobar si navegador soporta WebKit
jQuery: navegador [...]


Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2009/08/asistentejevweb-v0-1-released/' rel='bookmark' title='Permanent Link: AsistenteJeVWeb v0.1 released'>AsistenteJeVWeb v0.1 released</a></li>
<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/2010/05/jquery-navegador-con-soporte-webkit/' rel='bookmark' title='Permanent Link: jQuery: navegador con soporte WebKit'>jQuery: navegador con soporte WebKit</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<a href="http://blog.ilikeblues.com/2010/03/asistentejevweb-v1-0-released/" title="AsistenteJeVWeb v1.0 released"><img src="http://blog.ilikeblues.com/wp-content/uploads/yapb_cache/img_0005.bwq69bc9fjcok4k8gos8ow40w.a9sxxja1njksswcs400wcc4cg.th.jpeg" width="180" height="270" alt="AsistenteJeVWeb v1.0 released" style="float:left;padding:0 10px 10px 0;" ></a><p>Liberada la versión 1.0 para instalación &#8220;offline&#8221; en la pantalla de incio de iPhone/iPod Touch de AsistenteJeVWeb.</p>
<p>Sigue las instrucciones en el siguiente enlace:</p>
<p><a href="http://blog.ilikeblues.com/projects/asistentejevweb/">AsistenteJeVWeb</a></p>
<p>Sucesivas versiones incluirán más &#8220;features&#8221; y más lecciones gramaticales.</p>
<p>Esta versión funciona en navegadores que soporten HTML5 y WebKit (probado en Chrome 5 y Safari 4).</p>


<p>Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2009/08/asistentejevweb-v0-1-released/' rel='bookmark' title='Permanent Link: AsistenteJeVWeb v0.1 released'>AsistenteJeVWeb v0.1 released</a></li>
<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/2010/05/jquery-navegador-con-soporte-webkit/' rel='bookmark' title='Permanent Link: jQuery: navegador con soporte WebKit'>jQuery: navegador con soporte WebKit</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.ilikeblues.com/2010/03/asistentejevweb-v1-0-released/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>Generar Sombra bajo Texto con CSS3</title>
		<link>http://blog.ilikeblues.com/2010/03/generar-sombra-bajo-texto-con-css3/</link>
		<comments>http://blog.ilikeblues.com/2010/03/generar-sombra-bajo-texto-con-css3/#comments</comments>
		<pubDate>Fri, 26 Mar 2010 13:24:37 +0000</pubDate>
		<dc:creator>ilikeblues</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://blog.ilikeblues.com/?p=247</guid>
		<description><![CDATA[<a href="http://blog.ilikeblues.com/2010/03/generar-sombra-bajo-texto-con-css3/" title="Generar Sombra bajo Texto con CSS3"><img src="http://blog.ilikeblues.com/wp-content/uploads/yapb_cache/text_shadow.56kg4b2d6204s8k80c4s40sog.a9sxxja1njksswcs400wcc4cg.th.jpeg" width="180" height="39" alt="Generar Sombra bajo Texto con CSS3" style="float:left;padding:0 10px 10px 0;" ></a><a href="http://blog.ilikeblues.com/2010/03/generar-sombra-bajo-texto-con-css3/" title="Generar Sombra bajo Texto con CSS3"><img src="http://blog.ilikeblues.com/wp-content/uploads/yapb_cache/text_shadow.56kg4b2d6204s8k80c4s40sog.a9sxxja1njksswcs400wcc4cg.th.jpeg" width="180" height="39" alt="Generar Sombra bajo Texto con CSS3" style="float:left;padding:0 10px 10px 0;" ></a>En CSS3, crear la sombra para un texto es bastante sencillo. El problema es el soporte que los navegadores dan a las &#8220;features&#8221; del nuevo standard. Esta propiedad está soportada por Opera, Safari Chrome y Firefox (lo siento no tengo Windows para probar IE).
El código CSS:

text-shadow: 20px -12px 2px #6374AB;

Las propiedades indican desplazamiento en x, [...]


Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2010/03/generar-sombra-usando-css-puro/' rel='bookmark' title='Permanent Link: Generar sombra usando CSS puro'>Generar sombra usando CSS puro</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[<a href="http://blog.ilikeblues.com/2010/03/generar-sombra-bajo-texto-con-css3/" title="Generar Sombra bajo Texto con CSS3"><img src="http://blog.ilikeblues.com/wp-content/uploads/yapb_cache/text_shadow.56kg4b2d6204s8k80c4s40sog.a9sxxja1njksswcs400wcc4cg.th.jpeg" width="180" height="39" alt="Generar Sombra bajo Texto con CSS3" style="float:left;padding:0 10px 10px 0;" ></a><p>En CSS3, crear la sombra para un texto es bastante sencillo. El problema es el soporte que los navegadores dan a las &#8220;features&#8221; del nuevo standard. Esta propiedad está soportada por Opera, Safari Chrome y Firefox (lo siento no tengo Windows para probar IE).</p>
<p>El código CSS:</p>
<pre class="brush: css">
text-shadow: 20px -12px 2px #6374AB;
</pre>
<p>Las propiedades indican desplazamiento en x, en y, radio de desenfoque y color de la sombra respectivamente.</p>
<p>Los primeros valores pueden darse en diferentes unidades, por ejemplo:</p>
<pre class="brush: css">
text-shadow: 0.5em 0.5em 0.2em #600;
</pre>
<p>También puede crearse más de una sombra para un texto:</p>
<pre class="brush: css">
text-shadow: 1.5em -1.5em 0.2em #600, 1.5em 1.5em 0.2em #060, -1.5em 1.5em 0.2em #06;
</pre>


<p>Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2010/03/generar-sombra-usando-css-puro/' rel='bookmark' title='Permanent Link: Generar sombra usando CSS puro'>Generar sombra usando CSS puro</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/03/generar-sombra-bajo-texto-con-css3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Generar sombra usando CSS puro</title>
		<link>http://blog.ilikeblues.com/2010/03/generar-sombra-usando-css-puro/</link>
		<comments>http://blog.ilikeblues.com/2010/03/generar-sombra-usando-css-puro/#comments</comments>
		<pubDate>Fri, 19 Mar 2010 18:59:19 +0000</pubDate>
		<dc:creator>ilikeblues</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Trucos]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[css puro]]></category>
		<category><![CDATA[diseño web]]></category>
		<category><![CDATA[elementos]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[sombra]]></category>

		<guid isPermaLink="false">http://blog.ilikeblues.com/?p=242</guid>
		<description><![CDATA[En CSS3 es bastante simple:

.shadow {
   box-shadow: 3px 3px 4px #000;
}

El significado de los valores es más o menos fácil de adivinar: desplazamiento vertical, desplazamiento horizontal, radio de desenfoque y color.
Sin embargo, los navegadores aún no soportan por completo el nuevo estándar. Ahí va una solución:

.shadow {
   -moz-box-shadow: 3px 3px 4px [...]


Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2010/03/generar-sombra-bajo-texto-con-css3/' rel='bookmark' title='Permanent Link: Generar Sombra bajo Texto con CSS3'>Generar Sombra bajo Texto con CSS3</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>
<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>
</ol>]]></description>
			<content:encoded><![CDATA[<p>En CSS3 es bastante simple:</p>
<pre class="brush: css">
.shadow {
   box-shadow: 3px 3px 4px #000;
}
</pre>
<p>El significado de los valores es más o menos fácil de adivinar: desplazamiento vertical, desplazamiento horizontal, radio de desenfoque y color.</p>
<p>Sin embargo, los navegadores aún no soportan por completo el nuevo estándar. Ahí va una solución:</p>
<pre class="brush: css">
.shadow {
   -moz-box-shadow: 3px 3px 4px #000;
   -webkit-box-shadow: 3px 3px 4px #000;
   box-shadow: 3px 3px 4px #000;
   /* For IE 8 */
   -ms-filter: &quot;progid:DXImageTransform.Microsoft.Shadow(Strength=4, Direction=135, Color=&#039;#000000&#039;)&quot;;
   /* For IE 5.5 - 7 */
   filter: progid:DXImageTransform.Microsoft.Shadow(Strength=4, Direction=135, Color=&#039;#000000&#039;);
}
</pre>
<p>Vía | <a href="http://robertnyman.com/2010/03/16/drop-shadow-with-css-for-all-web-browsers/">Robert&#8217;s talk</a></p>


<p>Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2010/03/generar-sombra-bajo-texto-con-css3/' rel='bookmark' title='Permanent Link: Generar Sombra bajo Texto con CSS3'>Generar Sombra bajo Texto con CSS3</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>
<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>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.ilikeblues.com/2010/03/generar-sombra-usando-css-puro/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google Chrome Hackaton &#8211; Madrid</title>
		<link>http://blog.ilikeblues.com/2010/03/google-chrome-hackaton-madrid/</link>
		<comments>http://blog.ilikeblues.com/2010/03/google-chrome-hackaton-madrid/#comments</comments>
		<pubDate>Fri, 19 Mar 2010 10:00:06 +0000</pubDate>
		<dc:creator>ilikeblues</dc:creator>
				<category><![CDATA[Chrome Extensions]]></category>
		<category><![CDATA[Eventos]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Trucos]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[google chrome]]></category>
		<category><![CDATA[google chrome extensions]]></category>
		<category><![CDATA[hackaton]]></category>
		<category><![CDATA[madrid]]></category>

		<guid isPermaLink="false">http://blog.ilikeblues.com/?p=235</guid>
		<description><![CDATA[<a href="http://blog.ilikeblues.com/2010/03/google-chrome-hackaton-madrid/" title="Google Chrome Hackaton &#8211; Madrid"><img src="http://blog.ilikeblues.com/wp-content/uploads/yapb_cache/chrome_hackaton2.1qdpncs709i8g04wsk0wc88wo.a9sxxja1njksswcs400wcc4cg.th.jpeg" width="180" height="135" alt="Google Chrome Hackaton &#8211; Madrid" style="float:left;padding:0 10px 10px 0;" ></a><a href="http://blog.ilikeblues.com/2010/03/google-chrome-hackaton-madrid/" title="Google Chrome Hackaton &#8211; Madrid"><img src="http://blog.ilikeblues.com/wp-content/uploads/yapb_cache/chrome_hackaton2.1qdpncs709i8g04wsk0wc88wo.a9sxxja1njksswcs400wcc4cg.th.jpeg" width="180" height="135" alt="Google Chrome Hackaton &#8211; Madrid" style="float:left;padding:0 10px 10px 0;" ></a>Ayer, 18 de marzo de 2010, tuvo lugar en Madrid (en la Facultad de Informática de la Universidad Complutense de Madrid), el Google Chrome Hackaton, al que muy amablemente me invitaron.
Hay que decir que la organización fue buena, excepto por un par de cosillas, como que empezaron una hora tarde y que el sitio para [...]


Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2010/04/last-hunted-google-chrome-extension/' rel='bookmark' title='Permanent Link: last Hunted &#8211; Google Chrome Extension'>last Hunted &#8211; Google Chrome Extension</a></li>
<li><a href='http://blog.ilikeblues.com/2010/04/flickrplaces-chrome-extension-v1-6/' rel='bookmark' title='Permanent Link: flickrPlaces &#8211; Chrome Extension v1.6'>flickrPlaces &#8211; Chrome Extension v1.6</a></li>
<li><a href='http://blog.ilikeblues.com/2010/05/google-io-livestream-en-las-oficinas-de-madrid/' rel='bookmark' title='Permanent Link: Google I/O livestream en las oficinas de Madrid'>Google I/O livestream en las oficinas de Madrid</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<a href="http://blog.ilikeblues.com/2010/03/google-chrome-hackaton-madrid/" title="Google Chrome Hackaton &#8211; Madrid"><img src="http://blog.ilikeblues.com/wp-content/uploads/yapb_cache/chrome_hackaton2.1qdpncs709i8g04wsk0wc88wo.a9sxxja1njksswcs400wcc4cg.th.jpeg" width="180" height="135" alt="Google Chrome Hackaton &#8211; Madrid" style="float:left;padding:0 10px 10px 0;" ></a><p>Ayer, 18 de marzo de 2010, tuvo lugar en Madrid (en la <a href="http://www.fdi.ucm.es/" target="_blank">Facultad de Informática</a> de la Universidad Complutense de Madrid), el Google Chrome Hackaton, al que muy amablemente me invitaron.</p>
<p>Hay que decir que la organización fue buena, excepto por un par de cosillas, como que empezaron una hora tarde y que el sitio para la &#8220;merienda&#8221; era un poco pequeño.</p>
<p>Los ponentes fueron Ernest Delgado y Arne Roomann-Kurrik, ingenieros de desarrollo en la empresa de Mountain View, y la verdad es que lo hicieron muy bien (insisto, excepto por los problemas de tiempo, que hicieron que tuvieran que ir un poco deprisa en algunas partes de la conferencia).</p>
<p>Después de las conferencias estuvieron echando una mano a los presentes en el desarrollo de extensiones, resolviendo dudas, mostrando las herramientas de debug, etc. Muy cercanos, muy al estilo de Google.</p>
<p>En fin,  enhorabuena a los organizadores y a los ponentes. Fue un &#8220;hackaton&#8221; ameno e instrucitvo.</p>
<p>Dejo algunos enlaces con la documentación:</p>
<ul>
<li><strong>Hackaton in a box</strong>: <a href="http://bit.ly/ady30c" target="_blank">http://bit.ly/ady30c</a></li>
<li><strong>Google Chrome Extensions (Lab)</strong>: <a href="http://bit.ly/9sXFmc" target="_blank">http://bit.ly/9sXFmc</a></li>
<li><strong>Content How To Example</strong>: <a href="http://bit.ly/bXrGCQ" target="_blank">http://bit.ly/bXrGCQ</a></li>
</ul>


<p>Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2010/04/last-hunted-google-chrome-extension/' rel='bookmark' title='Permanent Link: last Hunted &#8211; Google Chrome Extension'>last Hunted &#8211; Google Chrome Extension</a></li>
<li><a href='http://blog.ilikeblues.com/2010/04/flickrplaces-chrome-extension-v1-6/' rel='bookmark' title='Permanent Link: flickrPlaces &#8211; Chrome Extension v1.6'>flickrPlaces &#8211; Chrome Extension v1.6</a></li>
<li><a href='http://blog.ilikeblues.com/2010/05/google-io-livestream-en-las-oficinas-de-madrid/' rel='bookmark' title='Permanent Link: Google I/O livestream en las oficinas de Madrid'>Google I/O livestream en las oficinas de Madrid</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.ilikeblues.com/2010/03/google-chrome-hackaton-madrid/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<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; [...]


Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2010/07/suid-permisos-para-otros-usuarios/' rel='bookmark' title='Permanent Link: SUID: permisos para otros usuarios'>SUID: permisos para otros usuarios</a></li>
</ol>]]></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>


<p>Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2010/07/suid-permisos-para-otros-usuarios/' rel='bookmark' title='Permanent Link: SUID: permisos para otros usuarios'>SUID: permisos para otros usuarios</a></li>
</ol></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>


<p></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. [...]


Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2010/05/google-io-livestream-en-las-oficinas-de-madrid/' rel='bookmark' title='Permanent Link: Google I/O livestream en las oficinas de Madrid'>Google I/O livestream en las oficinas de Madrid</a></li>
<li><a href='http://blog.ilikeblues.com/2010/03/google-chrome-hackaton-madrid/' rel='bookmark' title='Permanent Link: Google Chrome Hackaton &#8211; Madrid'>Google Chrome Hackaton &#8211; Madrid</a></li>
<li><a href='http://blog.ilikeblues.com/2010/04/last-hunted-google-chrome-extension/' rel='bookmark' title='Permanent Link: last Hunted &#8211; Google Chrome Extension'>last Hunted &#8211; Google Chrome Extension</a></li>
</ol>]]></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>


<p>Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2010/05/google-io-livestream-en-las-oficinas-de-madrid/' rel='bookmark' title='Permanent Link: Google I/O livestream en las oficinas de Madrid'>Google I/O livestream en las oficinas de Madrid</a></li>
<li><a href='http://blog.ilikeblues.com/2010/03/google-chrome-hackaton-madrid/' rel='bookmark' title='Permanent Link: Google Chrome Hackaton &#8211; Madrid'>Google Chrome Hackaton &#8211; Madrid</a></li>
<li><a href='http://blog.ilikeblues.com/2010/04/last-hunted-google-chrome-extension/' rel='bookmark' title='Permanent Link: last Hunted &#8211; Google Chrome Extension'>last Hunted &#8211; Google Chrome Extension</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.ilikeblues.com/2010/01/google-wave-invitations/feed/</wfw:commentRss>
		<slash:comments>8</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 [...]


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/2008/05/configuracion-proxy-en-ubuntu/' rel='bookmark' title='Permanent Link: Configuración proxy en Ubuntu'>Configuración proxy en Ubuntu</a></li>
</ol>]]></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>


<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/2008/05/configuracion-proxy-en-ubuntu/' rel='bookmark' title='Permanent Link: Configuración proxy en Ubuntu'>Configuración proxy en Ubuntu</a></li>
</ol></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[iphone]]></category>
		<category><![CDATA[javascript comprobar navegador iphone]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[navegador iphone]]></category>
		<category><![CDATA[safari]]></category>
		<category><![CDATA[safari mobile]]></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 {
return false;
}
}

Vía: http://blog.unijimpe.net/detectar-browser-iphone/


Relacionados:Javascript: comprobar si navegador soporta WebKit
Javascript: comprobar si el dispositivo es Android
jQuery: navegador con soporte WebKit



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/2010/05/javascript-comprobar-si-el-dispositivo-es-android/' rel='bookmark' title='Permanent Link: Javascript: comprobar si el dispositivo es Android'>Javascript: comprobar si el dispositivo es Android</a></li>
<li><a href='http://blog.ilikeblues.com/2010/05/jquery-navegador-con-soporte-webkit/' rel='bookmark' title='Permanent Link: jQuery: navegador con soporte WebKit'>jQuery: navegador con soporte WebKit</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>El siguiente código Javascript comprueba si el navegador actual es el de iPhone:</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>Vía: <a href="http://blog.unijimpe.net/detectar-browser-iphone/">http://blog.unijimpe.net/detectar-browser-iphone/</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/2010/05/javascript-comprobar-si-el-dispositivo-es-android/' rel='bookmark' title='Permanent Link: Javascript: comprobar si el dispositivo es Android'>Javascript: comprobar si el dispositivo es Android</a></li>
<li><a href='http://blog.ilikeblues.com/2010/05/jquery-navegador-con-soporte-webkit/' rel='bookmark' title='Permanent Link: jQuery: navegador con soporte WebKit'>jQuery: navegador con soporte WebKit</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.ilikeblues.com/2009/10/javascript-comprobar-si-es-el-navegador-de-iphone/feed/</wfw:commentRss>
		<slash:comments>2</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>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 [...]


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>
<li><a href='http://blog.ilikeblues.com/2010/07/orden-de-inicializacion-en-objetos-java/' rel='bookmark' title='Permanent Link: Orden de inicialización en Objetos Java'>Orden de inicialización en Objetos Java</a></li>
<li><a href='http://blog.ilikeblues.com/2008/02/sobrecarga-de-metodos-en-java/' rel='bookmark' title='Permanent Link: Sobrecarga de métodos en Java'>Sobrecarga de métodos en Java</a></li>
</ol>]]></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>


<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>
<li><a href='http://blog.ilikeblues.com/2010/07/orden-de-inicializacion-en-objetos-java/' rel='bookmark' title='Permanent Link: Orden de inicialización en Objetos Java'>Orden de inicialización en Objetos Java</a></li>
<li><a href='http://blog.ilikeblues.com/2008/02/sobrecarga-de-metodos-en-java/' rel='bookmark' title='Permanent Link: Sobrecarga de métodos en Java'>Sobrecarga de métodos en Java</a></li>
</ol></p>]]></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 {
      [...]


Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2008/02/sobrecarga-de-metodos-en-java/' rel='bookmark' title='Permanent Link: Sobrecarga de métodos en Java'>Sobrecarga de métodos en Java</a></li>
<li><a href='http://blog.ilikeblues.com/2010/07/java-usar-enumeracion-en-un-switch/' rel='bookmark' title='Permanent Link: Java: usar enumeración en un switch'>Java: usar enumeración en un switch</a></li>
<li><a href='http://blog.ilikeblues.com/2010/07/orden-de-inicializacion-en-objetos-java/' rel='bookmark' title='Permanent Link: Orden de inicialización en Objetos Java'>Orden de inicialización en Objetos Java</a></li>
</ol>]]></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>


<p>Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2008/02/sobrecarga-de-metodos-en-java/' rel='bookmark' title='Permanent Link: Sobrecarga de métodos en Java'>Sobrecarga de métodos en Java</a></li>
<li><a href='http://blog.ilikeblues.com/2010/07/java-usar-enumeracion-en-un-switch/' rel='bookmark' title='Permanent Link: Java: usar enumeración en un switch'>Java: usar enumeración en un switch</a></li>
<li><a href='http://blog.ilikeblues.com/2010/07/orden-de-inicializacion-en-objetos-java/' rel='bookmark' title='Permanent Link: Orden de inicialización en Objetos Java'>Orden de inicialización en Objetos Java</a></li>
</ol></p>]]></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 [...]


Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2010/07/diferencia-entre-classnotfoundexception-y-noclassdeffounderror/' rel='bookmark' title='Permanent Link: Diferencia entre ClassNotFoundException y NoClassDefFoundError'>Diferencia entre ClassNotFoundException y NoClassDefFoundError</a></li>
</ol>]]></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>


<p>Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2010/07/diferencia-entre-classnotfoundexception-y-noclassdeffounderror/' rel='bookmark' title='Permanent Link: Diferencia entre ClassNotFoundException y NoClassDefFoundError'>Diferencia entre ClassNotFoundException y NoClassDefFoundError</a></li>
</ol></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 [...]


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>
<li><a href='http://blog.ilikeblues.com/2008/02/llamadas-a-funciones-estaticas-externas-en-c/' rel='bookmark' title='Permanent Link: Llamadas a funciones estáticas externas en C'>Llamadas a funciones estáticas externas en C</a></li>
</ol>]]></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>


<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>
<li><a href='http://blog.ilikeblues.com/2008/02/llamadas-a-funciones-estaticas-externas-en-c/' rel='bookmark' title='Permanent Link: Llamadas a funciones estáticas externas en C'>Llamadas a funciones estáticas externas en C</a></li>
</ol></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>


<p></p>]]></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 [...]


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/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>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>


<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/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/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) {
   [...]


Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2008/10/establecer-el-locale-para-una-aplicacion-cc/' rel='bookmark' title='Permanent Link: Establecer el &#8220;locale&#8221; para una aplicación C/C++'>Establecer el &#8220;locale&#8221; para una aplicación C/C++</a></li>
<li><a href='http://blog.ilikeblues.com/2008/02/llamadas-a-funciones-estaticas-externas-en-c/' rel='bookmark' title='Permanent Link: Llamadas a funciones estáticas externas en C'>Llamadas a funciones estáticas externas en C</a></li>
</ol>]]></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>


<p>Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2008/10/establecer-el-locale-para-una-aplicacion-cc/' rel='bookmark' title='Permanent Link: Establecer el &#8220;locale&#8221; para una aplicación C/C++'>Establecer el &#8220;locale&#8221; para una aplicación C/C++</a></li>
<li><a href='http://blog.ilikeblues.com/2008/02/llamadas-a-funciones-estaticas-externas-en-c/' rel='bookmark' title='Permanent Link: Llamadas a funciones estáticas externas en C'>Llamadas a funciones estáticas externas en C</a></li>
</ol></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:
$ [...]


Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2010/07/suid-permisos-para-otros-usuarios/' rel='bookmark' title='Permanent Link: SUID: permisos para otros usuarios'>SUID: permisos para otros usuarios</a></li>
</ol>]]></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>


<p>Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2010/07/suid-permisos-para-otros-usuarios/' rel='bookmark' title='Permanent Link: SUID: permisos para otros usuarios'>SUID: permisos para otros usuarios</a></li>
</ol></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, [...]


Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2010/07/enumeraciones-en-java/' rel='bookmark' title='Permanent Link: Enumeraciones en Java'>Enumeraciones en Java</a></li>
<li><a href='http://blog.ilikeblues.com/2008/02/sobrecarga-de-metodos-en-java/' rel='bookmark' title='Permanent Link: Sobrecarga de métodos en Java'>Sobrecarga de métodos en Java</a></li>
<li><a href='http://blog.ilikeblues.com/2010/07/orden-de-inicializacion-en-objetos-java/' rel='bookmark' title='Permanent Link: Orden de inicialización en Objetos Java'>Orden de inicialización en Objetos Java</a></li>
</ol>]]></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>


<p>Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2010/07/enumeraciones-en-java/' rel='bookmark' title='Permanent Link: Enumeraciones en Java'>Enumeraciones en Java</a></li>
<li><a href='http://blog.ilikeblues.com/2008/02/sobrecarga-de-metodos-en-java/' rel='bookmark' title='Permanent Link: Sobrecarga de métodos en Java'>Sobrecarga de métodos en Java</a></li>
<li><a href='http://blog.ilikeblues.com/2010/07/orden-de-inicializacion-en-objetos-java/' rel='bookmark' title='Permanent Link: Orden de inicialización en Objetos Java'>Orden de inicialización en Objetos Java</a></li>
</ol></p>]]></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 [...]


Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2009/11/vt6656-driver-para-ubuntu-karmic-koala/' rel='bookmark' title='Permanent Link: VT6656 Driver para Ubuntu Karmic Koala'>VT6656 Driver para Ubuntu Karmic Koala</a></li>
</ol>]]></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>


<p>Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2009/11/vt6656-driver-para-ubuntu-karmic-koala/' rel='bookmark' title='Permanent Link: VT6656 Driver para Ubuntu Karmic Koala'>VT6656 Driver para Ubuntu Karmic Koala</a></li>
</ol></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/


Relacionados:No, idiota, eso no es &#8220;gratis&#8221;



Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2010/04/no-idiota-eso-no-es-gratis/' rel='bookmark' title='Permanent Link: No, idiota, eso no es &#8220;gratis&#8221;'>No, idiota, eso no es &#8220;gratis&#8221;</a></li>
</ol>]]></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>


<p>Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2010/04/no-idiota-eso-no-es-gratis/' rel='bookmark' title='Permanent Link: No, idiota, eso no es &#8220;gratis&#8221;'>No, idiota, eso no es &#8220;gratis&#8221;</a></li>
</ol></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;);
   [...]


Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2008/08/singleton-en-java/' rel='bookmark' title='Permanent Link: Singleton en Java'>Singleton en Java</a></li>
<li><a href='http://blog.ilikeblues.com/2008/02/sobrecarga-de-metodos-en-java/' rel='bookmark' title='Permanent Link: Sobrecarga de métodos en Java'>Sobrecarga de métodos en Java</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>
</ol>]]></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>


<p>Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2008/08/singleton-en-java/' rel='bookmark' title='Permanent Link: Singleton en Java'>Singleton en Java</a></li>
<li><a href='http://blog.ilikeblues.com/2008/02/sobrecarga-de-metodos-en-java/' rel='bookmark' title='Permanent Link: Sobrecarga de métodos en Java'>Sobrecarga de métodos en Java</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>
</ol></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 [...]


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>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 [...]


Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2010/07/orden-de-inicializacion-en-objetos-java/' rel='bookmark' title='Permanent Link: Orden de inicialización en Objetos Java'>Orden de inicialización en Objetos Java</a></li>
<li><a href='http://blog.ilikeblues.com/2008/08/singleton-en-java/' rel='bookmark' title='Permanent Link: Singleton en Java'>Singleton en Java</a></li>
<li><a href='http://blog.ilikeblues.com/2010/07/diferencia-entre-classnotfoundexception-y-noclassdeffounderror/' rel='bookmark' title='Permanent Link: Diferencia entre ClassNotFoundException y NoClassDefFoundError'>Diferencia entre ClassNotFoundException y NoClassDefFoundError</a></li>
</ol>]]></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>


<p>Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2010/07/orden-de-inicializacion-en-objetos-java/' rel='bookmark' title='Permanent Link: Orden de inicialización en Objetos Java'>Orden de inicialización en Objetos Java</a></li>
<li><a href='http://blog.ilikeblues.com/2008/08/singleton-en-java/' rel='bookmark' title='Permanent Link: Singleton en Java'>Singleton en Java</a></li>
<li><a href='http://blog.ilikeblues.com/2010/07/diferencia-entre-classnotfoundexception-y-noclassdeffounderror/' rel='bookmark' title='Permanent Link: Diferencia entre ClassNotFoundException y NoClassDefFoundError'>Diferencia entre ClassNotFoundException y NoClassDefFoundError</a></li>
</ol></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 [...]


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>
		<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  [...]


Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2010/07/eclipse-acceder-a-recursos-de-un-plugin/' rel='bookmark' title='Permanent Link: Eclipse: Acceder a recursos de un plugin'>Eclipse: Acceder a recursos de un plugin</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>
<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>
</ol>]]></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>


<p>Relacionados:<ol><li><a href='http://blog.ilikeblues.com/2010/07/eclipse-acceder-a-recursos-de-un-plugin/' rel='bookmark' title='Permanent Link: Eclipse: Acceder a recursos de un plugin'>Eclipse: Acceder a recursos de un plugin</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>
<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>
</ol></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>
