<?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>I'm 8 Bit</title>
	<atom:link href="http://im8bit.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://im8bit.com</link>
	<description>Programación, Diseño Web, Blog, Tacos y Burritos</description>
	<lastBuildDate>Wed, 11 Nov 2009 17:49:02 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Java 101 &#8211; String y StringBuilder</title>
		<link>http://im8bit.com/2009/03/java-101-string-y-stringbuilder/</link>
		<comments>http://im8bit.com/2009/03/java-101-string-y-stringbuilder/#comments</comments>
		<pubDate>Tue, 24 Mar 2009 22:31:28 +0000</pubDate>
		<dc:creator>im8bit</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://im8bit.com/?p=55</guid>
		<description><![CDATA[JM Java 101 &#8211; Concatenación (o como utilizar cadenas para hacer una gran cadena)
Hay una teoría bien difundida que dice no se debe de concatenar utilizando el símbolo de + pues este causa que varios objetos String temporales sean creados. Se dice en algunos sitios que en su lugar se debe utilizar la clase StringBuilder.
¿Qué [...]]]></description>
			<content:encoded><![CDATA[<p align="center"><span style="font-family: verdana,geneva;">JM Java 101 &#8211; Concatenación (o como utilizar cadenas para hacer una gran cadena)</span></p>
<p>Hay una teoría bien difundida que dice no se debe de concatenar utilizando el símbolo de + pues este causa que varios objetos String temporales sean creados. Se dice en algunos sitios que en su lugar se debe utilizar la clase StringBuilder.</p>
<p>¿Qué tan cierto es esto?</p>
<p>He creído conveniente comprobarlo después de yo mismo pensar esto durante algun tiempo. Utilizaremos para esto la fuente más confiable que existe, el código generado para la maquina virtual.</p>
<p>Hemos de investigar el fenomeno de concatenación con un ejemplo creíble, uno donde uno de los valores es una variable obtenida &#8220;de algun otro lado&#8221;, pues en caso de que todos los valores son definidos, por ejemplo en:</p>
<pre>public static void main(String[] args) {
String string4 = "Cadena 1" + "Cadena 2" + "Cadena 3";
}</pre>
<p>Java genera código optimizado donde todas las cadenas realmente son convertidas a una sola en tiempo de compilación, generando código para la JVM como sigue:</p>
<pre>public static void main(java.lang.String[]);
Code:
0:   ldc     #16; //String Cadena 1Cadena 2Cadena 3
2:   astore_1
3:   return</pre>
<p>Podemos ver aquí que se carga la cadena indicada como #16, y tal cadena es la concatenación de las 3 diferentes que realmente habíamos especificado.</p>
<p>Intentemos pues con variables de verdad, en los sigiuentes ejemplos, indicare con la variable &#8220;value&#8221; un valor supuestamente indefinido, aunque en el siguiente ejemplo esto no tendra mucho sentido, en los sucesivos sí lo tendrá.</p>
<p>Caso de concatenación 1.</p>
<p>Crear objetos String para todos las cadenas que deseamos concatenar y finalmente concatenarlas en una sola:</p>
<pre>public static void main(String[] args) {
String value = "Valor";

String s1 = "Cadena 1";
String s2 = "Cadena 2";
String s3 = "Cadena 3";
String string1 = s1 + value + s2 + s3;
}</pre>
<p>El código generado es más largo pero no por eso más complicado:</p>
<pre>public static void main(java.lang.String[]);
Code:
0:   ldc     #16; //String Valor
2:   astore_1
3:   ldc     #18; //String Cadena 1
5:   astore_2
6:   ldc     #20; //String Cadena 2
8:   astore_3
9:   ldc     #22; //String Cadena 3
11:  astore  4
13:  new     #24; //class java/lang/StringBuilder
16:  dup
17:  aload_2
18:  invokestatic    #26; //Method java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;
21:  invokespecial   #32; //Method java/lang/StringBuilder."&lt;init&gt;":(Ljava/lang/String;)V
24:  aload_1
25:  invokevirtual   #35; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
28:  aload_3
29:  invokevirtual   #35; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
32:  aload   4
34:  invokevirtual   #35; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
37:  invokevirtual   #39; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
40:  astore  5
42:  return</pre>
<p>La primer sorpresa al ver el código es que el mito de concatenar con + no es menos efectivo que utilizar un StringBuilder, pues el compilador nuevamente realiza algo de optimización y utiliza de forma interna un objeto StringBuilder para realizar la concatenación. Ahorrando simplemente los store del Caso 1, que no son otra cosa que la inicialización de los String.</p>
<pre>public static void main(String[] args) {
String value = "Valor";
String string2 = "Cadena1" + value + "Cadena2" + "Cadena3";
}</pre>
<pre>public static void main(java.lang.String[]);
Code:
0:   ldc     #16; //String Valor
2:   astore_1
3:   new     #18; //class java/lang/StringBuilder
6:   dup
7:   ldc     #20; //String Cadena1
9:   invokespecial   #22; //Method java/lang/StringBuilder."&lt;init&gt;":(Ljava/lang/String;)V
12:  aload_1
13:  invokevirtual   #25; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
16:  ldc     #29; //String Cadena2
18:  invokevirtual   #25; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
21:  ldc     #31; //String Cadena3
23:  invokevirtual   #25; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
26:  invokevirtual   #33; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
29:  astore_2
30:  return</pre>
<p>Caso 3:<br />
Utilizando un objeto StringBuilder.<br />
Curiosamente esta forma es mas lenta que utilizar el operador +, pues si bien, a primera vista pudiera parecer que no hace proceso extra, sí tiene que hacerlo, sí vemos el codigo de la JVM encontramos unos misterioros pop y aload_2, el problema aquí es que StringBuilder.append devuelve un valor, y una vez que el Thread principal vuelve de la subrutina los valores dejados en el stack tienen que ser removidos aun si no se estan utilizando. Es curioso que no se optimice esto de la forma en que se hizo en el caso dos, donde no existen los pop, pues de alguna forma el compilador sabe que no se utilizan y nunca existe un valor de retorno siquiera.</p>
<pre>public static void main(String[] args) {
String value = "Valor";
StringBuilder sb = new StringBuilder();
sb.append("Cadena 1");
sb.append("Cadena 2");
sb.append("Cadena 3");
String string3 = sb.toString();
}</pre>
<pre>public static void main(java.lang.String[]);
Code:
0:   ldc     #16; //String Valor
2:   astore_1
3:   new     #18; //class java/lang/StringBuilder
6:   dup
7:   invokespecial   #20; //Method java/lang/StringBuilder."&lt;init&gt;":()V
10:  astore_2
11:  aload_2
12:  ldc     #21; //String Cadena 1
14:  invokevirtual   #23; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
17:  pop
18:  aload_2
19:  ldc     #27; //String Cadena 2
21:  invokevirtual   #23; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
24:  pop
25:  aload_2
26:  ldc     #29; //String Cadena 3
28:  invokevirtual   #23; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
31:  pop
32:  aload_2
33:  invokevirtual   #31; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
36:  astore_3
37:  return</pre>
<p>No hace falta siquiera terminar de interpretar compilado para darse cuenta que la version mas corta es la producida por</p>
<pre>String string2 = "Cadena1" + value + "Cadena2" + "Cadena3";</pre>
<p>Esto resulta muy interesante, pues gracias a este tipo de optimizaciones no es necesario que java incluya un método para dividir una cadena en varias líneas, incluso, no es necesario pues si solamente estuvieramos utilizando constantes, todos nuestros valores serian concatenados en una sola cadena en tiempo de compilacion.</p>
]]></content:encoded>
			<wfw:commentRss>http://im8bit.com/2009/03/java-101-string-y-stringbuilder/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wordpress Plugins &#8211; Widgets #2 &#8211; La conexión a la base de datos</title>
		<link>http://im8bit.com/2008/11/wordpress-plugins-widgets-2-la-conexion-a-la-base-de-datos/</link>
		<comments>http://im8bit.com/2008/11/wordpress-plugins-widgets-2-la-conexion-a-la-base-de-datos/#comments</comments>
		<pubDate>Wed, 26 Nov 2008 06:45:33 +0000</pubDate>
		<dc:creator>im8bit</dc:creator>
				<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://im8bit.com/?p=25</guid>
		<description><![CDATA[Hay varias cosas que desearíamos hacer cuando el plugin es instalado, la que más rápido querremos descubrir es a mi parecer, como crear las tablas necesarias para nuestro plugin y aprender como interactuar con la base de datos.
Para crear una tabla para durante la activación de nuestro plugin vamos a agregar una nueva función, como [...]]]></description>
			<content:encoded><![CDATA[<p>Hay varias cosas que desearíamos hacer cuando el plugin es instalado, la que más rápido querremos descubrir es a mi parecer, como crear las tablas necesarias para nuestro plugin y aprender como interactuar con la base de datos.</p>
<p>Para crear una tabla para durante la activación de nuestro plugin vamos a agregar una nueva función, como sigue:</p>
<pre>function i8b_untitled_install() {
	global $wpdb;
	$tableUntitled = $wpdb-&gt;prefix."im8bit_untitled";
	$structure = "CREATE TABLE $tableUntitled (
	  `i8d_id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
	  `i8d_date` DATETIME NOT NULL,
	  `i8d_text` VARCHAR(2048) NOT NULL,
	  PRIMARY KEY (`i8d_id`)
	)";
	$wpdb-&gt;query($structure);
}</pre>
<p>Informamos a php que utilizaremos la variable global $wpdb y listo.</p>
<p><strong>Nota: Si por alguna razón teclearan mal $wpdb obtendrán unos errores increíblemente crípticos y podrían pasar mucho tiempo tratando de encontrarlo&#8230; err&#8230; me dijeron.</strong></p>
<p><em>Fuera del cuerpo de cualquier función</em> debemos teclear:<br />
<strong>register_activation_hook(__FILE__, &#8216;i8b_untitled_install&#8217;);</strong><br />
Que recibe como parámetro la ruta a nuestro archivo donde se encuentra la función de instalación (en nuestro caso el mismo archivo) y el nombre de la función.</p>
<p>Ahora, cuando activemos nuestro plugin la tabla wp_im8bit_untitled será creada, el wp ha resultado del llamado a la función $wpdb-&gt;prefix que deberíamos utilizar siempre como prefijo para nuestras tablas para mantener el estándar con el resto de las tablas de wordpress.</p>
<p>Una vez creada la tabla podemos cambiar la función que dibuja el widget a algo como lo siguiente:</p>
<pre>function i8b_untitled_widget($args) {
	global $wpdb;

	extract($args);
	echo $before_widget;
	echo $before_title;

	echo "Title";

	echo $after_title;

	$tableUntitled = $wpdb-&gt;prefix."im8bit_untitled";

	$untitled_row = $wpdb-&gt;get_row("select i8d_text from " .
	" $tableUntitled order by rand() limit 1", ARRAY_N);

	echo $untitled_row[0];

	echo $after_widget;
}</pre>
<p>Por supuesto no hay datos en nuestra tabla, así que ahora en lugar de ver el texto &#8220;Untitled&#8221; ahora no veremos nada hasta que insertemos algun dato. Estamos entonces realizando un query manual y trayendo un &#8220;tip del dia&#8221; aleatorio y exhibiendolo con los las lineas:</p>
<pre>	$tableUntitled = $wpdb-&gt;prefix."im8bit_untitled";

	$untitled_row = $wpdb-&gt;get_row("select i8d_text " .
	" from $tableUntitled order by rand() limit 1", ARRAY_N);

	echo $untitled_row[0];</pre>
<p>Construyendo como siempre el nombre de nuestra tabla ayudándonos con la función $wpdb-&gt;prefix pues esta puede cambiar de instalación a instalación de wordpress.</p>
<p>No debemos olvidar nuevamente indicar a php que $wpdb es una variable global.</p>
]]></content:encoded>
			<wfw:commentRss>http://im8bit.com/2008/11/wordpress-plugins-widgets-2-la-conexion-a-la-base-de-datos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wordpress Plugins &#8211; Widgets #1 &#8211; El Widget Básico</title>
		<link>http://im8bit.com/2008/11/hello-world/</link>
		<comments>http://im8bit.com/2008/11/hello-world/#comments</comments>
		<pubDate>Wed, 05 Nov 2008 22:53:28 +0000</pubDate>
		<dc:creator>im8bit</dc:creator>
				<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://im8bit.com/?p=1</guid>
		<description><![CDATA[Cuando empecé a desarrollar un plugin para wordpress, quería hacer un &#8220;¿Sabias que&#8230;?&#8221; muy básico, apenas un widget que pusiera un mensaje de forma aleatoria.
El primer problema no tardo en surgir rápidamente, la mayoría de los tutoriales básicos muestran como sustituir palabras en los post, o hacer algo de post-procesamiento con los post&#8230; ¡$%&#38;&#38;! Pero [...]]]></description>
			<content:encoded><![CDATA[<p>Cuando empecé a desarrollar un plugin para wordpress, quería hacer un &#8220;¿Sabias que&#8230;?&#8221; muy básico, apenas un widget que pusiera un mensaje de forma aleatoria.</p>
<p>El primer problema no tardo en surgir rápidamente, la mayoría de los tutoriales básicos muestran como sustituir palabras en los post, o hacer algo de post-procesamiento con los post&#8230; ¡$%&amp;&amp;! Pero que pasa si lo que quiero es agregar un widget.</p>
<p>Después de buscar, llegue a:</p>
<pre>
&lt;?php
/*
Plugin Name: Untitled
Plugin URI: http://www.im8bit.com/
Description: Shows a Untitled Widget
Author: Fernando Mora
Version: 0.1
Author URI: http://www.im8bit.com
*/

function i8b_untitled_init() {
register_sidebar_widget('Untitled', 'i8b_untitled_widget');
}

function i8b_untitled_widget($args) {
global $wpdb;

extract($args);
echo $before_widget;
echo $before_title;

echo "Title";

echo $after_title;

echo "Untitled";

echo $after_widget;
}

add_action('plugins_loaded', 'i8b_untitled_init');
?&gt;</pre>
<p>Guarda el script anterior en el directorio <strong>{instalacion_wordpress}/wp-content/plugins</strong> con el nombre untitled.php.</p>
<p>Si deseas tener mas orden puedes crear una carpeta dentro de la carpeta plugins, yo he llamado la mia im8bit, asi que he guardado el archivo en:</p>
<p><strong>{instalacion_wordpress}/wp-content/plugins/im8bit/untitled.php</strong></p>
<p>Este es un simple widget que muestra &#8220;Untitled&#8221; en el cuerpo y &#8220;Title&#8221; como su titulo, increíble como parezca el secreto es la función <strong>register_sidebar_widget</strong> una vez que un plugin &#8220;sabe&#8221; como dibujar un widget podemos encontrarlo disponible para activarse en &#8220;Design&#8221;-&gt;&#8221;Widgets&#8221;.  Basta agregarlo a alguna de nuestras barras laterales &#8220;sidebars&#8221; y ya tenemos así un esqueleto básico con el cual comenzar a trabajar.</p>
<p>Cosas importantes a notar:</p>
<ul>
<li>Los plugins deben de encontrarse dentro de la carpeta plugins ya sea directamente en ella o en una carpeta bajo ella.</li>
<li>Los nombres que demos a nuestras funciones deben ser unicos en la instalación de wordpress, es decir, no debe repetirse en ningun otro plugin, de ser asi seremos informados al momento de intentar activar dicho plugin. Por esta razón agrego las letras i8b (im8bit) al principio de la función para dificultar un poco el choque con una función en algun otro lugar.
</li>
<li>La instruccion <strong>add_action</strong> nos permite crear hooks para nuestro plugin dentro de wordpress, en este caso la funcion <strong>i8b_untitled_init</strong> será llamada cuando el plugin sea activado o inicializado en la sección plugins.
</li>
<li>Es importante hacer notar que el llamado a la función <strong>add_action</strong> debe encontrarse fuera del cuerpo de cualquier función para ser encontrada, mientras que el llamado función <strong>register_sidebar_widget</strong> debe encontrarse dentro del cuerpo de alguna función, en el ejemplo, como ya mencioné es nuestra función de inicialización del plugin.
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://im8bit.com/2008/11/hello-world/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
