<?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>Linux, Java y programación &#187; hack</title>
	<atom:link href="http://casidiablo.net/tag/hack/feed/" rel="self" type="application/rss+xml" />
	<link>http://casidiablo.net</link>
	<description>Blog de Java, Programación y Linux</description>
	<lastBuildDate>Fri, 11 Nov 2011 05:41:21 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>El cocinero que instaló Debian GNU/Linux y túvo éxito</title>
		<link>http://casidiablo.net/el-cocinero-que-instalo-debian-gnulinux-y-tuvo-exito/</link>
		<comments>http://casidiablo.net/el-cocinero-que-instalo-debian-gnulinux-y-tuvo-exito/#comments</comments>
		<pubDate>Wed, 04 Feb 2009 12:39:00 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[artículos]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[hack]]></category>

		<guid isPermaLink="false">http://www.casidiablo.net/wordpress/?p=346</guid>
		<description><![CDATA[Escribir un libro de cocina, es una gran bondad que nos brinda un cocinero, pues nos da la posibilidad de aprender a comer y a su vez de brindar placeres a nuestros amigos o seres queridos; también ofrece la posibilidad del progreso social y económico, pues en él, no sólo están las instrucciones para cocinar [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fcasidiablo.net%252Fel-cocinero-que-instalo-debian-gnulinux-y-tuvo-exito%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22El%20cocinero%20que%20instal%C3%B3%20Debian%20GNU%2FLinux%20y%20t%C3%BAvo%20%C3%A9xito%22%20%7D);"></div>
<p style="text-align: justify;"><img style="float:left;margin:5px;" title="debian-pastel" src="http://casidiablo.net/wordpress/wp-content/uploads/2008/02/debian-pastel.jpg" alt="debian-pastel" width="350" height="262" />Escribir un libro de cocina, es una gran bondad que nos brinda un cocinero, pues nos da la posibilidad de aprender a comer y a su vez de brindar placeres a nuestros amigos o seres queridos; también ofrece la posibilidad del progreso social y económico, pues en él, no sólo están las instrucciones para cocinar sino para trabajar, para vivir. La comida es el combustible del hombre.</p>
<p style="text-align: justify;">No soportaría que las recetas de cocina fueran textos proscritos, patentados y ocultos a la humanidad. Creo que nadie lo toleraría; nos quitarían el derecho a alimentarnos, a disfrutar, a vivir. ¿Acaso puede existir alguien tan perverso como para adjudicarse derechos sobre las papas fritas, el arroz cocido o la sopa de verduras?</p>
<p style="text-align: justify;">Los cocineros solemos ser gente arriesgada, que experimenta y busca por el mundo sabores y posibles combinaciones que nos den el plato perfecto. Un cocinero de verdad, jamás oculta el saber, disfruta tanto compartiendo una receta como preparando el plato mismo. El mejor cocinero no es aquel que más recetas conoce y se las guarda, sino el que es capaz de compartir; es decir, el que tiene la capacidad de enseñar y dar. No es un cocinero aquel que sabe preparar deliciosos manjares pero lo hace sólo para él y no muestra su talento al mundo, a sus amigos o clientes.<span id="more-346"></span></p>
<p style="text-align: justify;">Dado esto, algún día me dí cuenta que si compartía mis programas como comparto mis recetas, me convertía en una mala persona, infringía leyes y aparentemente, le vulneraba los derechos de autor a algunas personas o empresas. Pero, ¿cómo es posible que compartir sea algo malo? ¿por qué el dar es ilegal?. Si yo no podía dar mis recetas me sentía miserable y frustrado. No dar mis programas que al fin y al cabo sólo son información, me hacía sentir malvado. Así que decidí hacer algo para cambiar esto.</p>
<p style="text-align: justify;">Comencé a buscar por el mundo como cuando se busca una especia extraña, buscando esa receta o esa fórmula para poder dar y recibir sin convertirme en delincuente. Además creo que si tienes algo bueno y lo das, eres muy bueno y si tienes algo malo y lo das eres muy malo; es decir, que si le doy a alguien un programa de computador que es malo porque me impide compartir y ser libre, lo estoy esclavizando. Si tengo un manjar, lo doy. Si tengo un veneno, lo tiro. Esa es la lógica del cocinero.</p>
<p style="text-align: justify;">Así descubrí que existían programas de computador que no sólo se podían utilizar sino que todos podíamos conocer su receta y compartirla con los demás. En otras palabras, el sueño de un cocinero, algo como no sólo servir el plato sino enseñar a prepararlo.</p>
<h3>Quién dijo que fuera fácil</h3>
<p style="text-align: justify;">No escogí el software libre y GNU/Linux porque fuera fácil. Lo escogí porque es libre y puedo ser un mejor ser humano si lo uso y mejor aún si lo comparto y difundo. Pero no es de asustarse, pues si lo pude hacer yo que soy cocinero y disfruto entre sartenes, woks y cuchillos ¿por qué no tú que eres ingeniero, matemático, cineasta o arquitecto?</p>
<p style="text-align: justify;">El camino es caminando y sólo es cuestión de seguir. Al principio intenté con lo que pensé que era más sencillo, es decir programas que supuestamente lo hacían todo por mi. Descubrí un sistema operativo llamado SUSE que me parecía muy similar a lo que había trabajado. Lo instalé según las instrucciones que traía en un libro gordo y pude hacer muchas cosas. Sin embargo me dí cuenta que no era absolutamente libre y me sentí decepcionado. Así que decidí abandonarlo y seguir en busca del platillo especial de libertad. Me enteré que lo más cercano a la libertad era un sistema llamado Debian, que estaba soportado por miles de programadores y usuarios libertarios, pero que tenía la fama de ser el sistema operativo de los hackers, los gurús y toda la gente que sólo vive para el oficio de los computadores. Recordé la conversación con un comensal científico que alguna vez me dijo: Si lo hizo un humano como Einstein ¿por qué no lo puedo hacer yo que tengo el mismo cerebro?.</p>
<p style="text-align: justify;">Tuve mucha suerte a elegir Debian como mi distribución de GNU/Linux. Ahora me doy cuenta que no sólo es el sistema operativo más robusto y estable que jamás he tenido sino el más libre, manejable y fácil de usar, aunque llegar a este punto me ha costado cierto trabajo y esfuerzo. Pero recuerdo a Don Quijote cuando dijo: &#8220;La libertad, Sancho, es uno de los más preciosos dones que a los hombres dieron los cielos; con ella no pueden igualarse los tesoros que encierra la tierra ni el mar encubre; por la libertad, así como por la honra, se puede y debe aventurar la vida, y, por el contrario, el cautiverio es el mayor mal que puede venir a los hombres&#8221;. Así que el esfuerzo que he invertido es un costo mínimo para conseguir ser libre.</p>
<p style="text-align: justify;">Parece dramático, pero ser libre desde el uso de las herramientas, es el primer paso para conseguir la libertad, pues la libertad además de ser contagiosa, se esparce por la vida como la sangre. Y así como soy libre en el uso de software, quise libertarme de mi teléfono celular y lo logré. Quise libertarme de los noticieros de televisión y lo logré. Creo que la bella locura de ser libre, le ha dado un nuevo impulso a mi creatividad.</p>
<p style="text-align: justify;">Para ayudar a contagiar al mundo de los no informáticos, estoy preparando mi libro &#8220;El Cocinero que instaló GNU/Debian y tuvo éxito&#8221; como una guía para personas no técnicas que quieran empezar a conseguir su libertad desde el uso de ese magnifico sistema operativo y que hasta ahora no se han atrevido por la mitificación de la que se ha encargado la misma comunidad, que por fallas de comunicación cierra las puertas al ciudadano y al usuario final de programas informáticos, que son la base para que la sociedad se libere de las multinacionales del software y la comunicación, quienes distribuyen sus programas y mensajes diseñados para que la gente se embelese con el supuesto uso fácil y cesen cada vez más la capacidad de asombro y el ejercicio de analizar y aprender.</p>
<p style="text-align: justify;">Mi libro es un manual para más que &#8220;dummies&#8221;, que lleva al lector paso a paso por el proceso de instalación de un sistema GNU/Debian con bastantes referencias y aclaraciones de cada proceso que se dan por sentados en la mayoría de los manuales, pues asume que todos sabemos qué es un &#8220;sector de arranque&#8221; o una &#8220;partición&#8221;. Para mi libro todos los lectores son cocineros que no tienen ni la más remota idea de los componentes de su computador y necesitan que un amigo los lleve de la mano por este proceso, la mayor de las veces, tortuoso e incierto.</p>
<h3>¿Y qué le falta para sacarlo del horno?</h3>
<p style="text-align: justify;">Pues la verdad, no mucho, está casi todo cocido y dorado. Espero la salida de &#8220;Etch&#8221;, la próxima versión de Debian que está &#8220;Congelada&#8221; en el momento de escribir esta reseña, (es decir está en la etapa previa a ser lanzado como estable, según el procedimiento de Debian). Otra cosa importante es conseguir el patrocinador o editor que desee publicarla en papel, según las condiciones de la licencia Documento-GPL o Creative Commons. Esto es sumamente importante para que el medio no contradiga el mensaje. Por eso y mucho más:</p>
<h3>¡Viva el GNU/Linux!</h3>
<div class="nota"><strong>Nota</strong>: Este artículo fue escrito por <strong><a href="mailto:fredyrivera@gmail.com">Fredy Rivera</a></strong>. Lo publiqué hace ya bastante, pero no he resistido las ganas de traerlo al presente para recordarlo, puesto que me parece una historia hermosa y fascinante.</div>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/el-cocinero-que-instalo-debian-gnulinux-y-tuvo-exito/feed/</wfw:commentRss>
		<slash:comments>24</slash:comments>
		</item>
		<item>
		<title>Truco wordpress: listar entradas programadas</title>
		<link>http://casidiablo.net/hack-wordpress-mostrar-posts-futuros/</link>
		<comments>http://casidiablo.net/hack-wordpress-mostrar-posts-futuros/#comments</comments>
		<pubDate>Mon, 02 Feb 2009 17:50:02 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[tips]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[wordpress]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[truco]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=2843</guid>
		<description><![CDATA[Programar entradas te ofrece varias ventajas, como distribuir adecuadamente tu contenido cronológicamente, tener tiempo de hacer modificaciones o correcciones, etc. El truco del que hablaremos en esta entrada te permitirá listar las entradas que tienes programadas para el futuro. Pienso que es un buen gancho para mantener atentos a nuestros lectores o ganar nuevos. Los [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fcasidiablo.net%252Fhack-wordpress-mostrar-posts-futuros%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Truco%20wordpress%3A%20listar%20entradas%20programadas%22%20%7D);"></div>
<p style="text-align: justify;">Programar entradas te ofrece varias ventajas, como distribuir adecuadamente tu contenido cronológicamente, tener tiempo de hacer modificaciones o correcciones, etc. El truco del que hablaremos en esta entrada te permitirá listar las entradas que tienes programadas para el futuro. Pienso que es un buen gancho para mantener atentos a nuestros lectores o ganar nuevos.</p>
<p>Los pasos son sencillos, basta con poner la siguiente porción de código en tu plantilla (preferiblemente en el sidebar):</p>
<pre class="brush: php; title: ; notranslate">&lt;?php
$my_query = new WP_Query('post_status=future&amp;order=DESC&amp;showposts=5');
    if ($my_query-&gt;have_posts()) {
    while ($my_query-&gt;have_posts()) : $my_query-&gt;the_post(); ?&gt;
        &lt;li&gt;&lt;?php the_title(); ?&gt;&lt;/li&gt;
    &lt;?php endwhile;
}
?&gt;</pre>
<p>Eso es todo. Si lo retocas con un poco de CSS quedará bastante bonito; por ejemplo, yo lo he implementado en mi blog:</p>
<p style="text-align: center;"><img style="border:1px solid;" title="entradas-futuras" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/02/entradas-futuras.png" alt="entradas-futuras" width="272" height="218" /></p>
<p><strong>Fuente</strong>: <a href="http://wp-magazin.ch/2008/11/07/den-leser-in-die-zukunft-blicken-lassen/">Schweizer</a></p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/hack-wordpress-mostrar-posts-futuros/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Previsualiza tus entradas mientras las escribes [truco wordpress]</title>
		<link>http://casidiablo.net/wordpress-previsualizar-post-mientras-se-escribe/</link>
		<comments>http://casidiablo.net/wordpress-previsualizar-post-mientras-se-escribe/#comments</comments>
		<pubDate>Thu, 11 Sep 2008 18:38:00 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[tips]]></category>
		<category><![CDATA[wordpress]]></category>
		<category><![CDATA[entradas]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[previsualizar]]></category>
		<category><![CDATA[truco]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=1556</guid>
		<description><![CDATA[Esto es un hack bastante simple que he hecho para poder previsualizar las entradas mientras escribo, y lo pongo aquí porque tal vez a alguien le sirva. La idea se me vino a la mente puesto que soy un fanático del CSS, y de resaltar las partes importantes de mis entradas con recuadros, colores e [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fcasidiablo.net%252Fwordpress-previsualizar-post-mientras-se-escribe%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Previsualiza%20tus%20entradas%20mientras%20las%20escribes%20%5Btruco%20wordpress%5D%22%20%7D);"></div>
<p>Esto es un hack bastante simple que he hecho para poder previsualizar las entradas mientras escribo, y lo pongo aquí porque tal vez a alguien le sirva. La idea se me vino a la mente puesto que soy un fanático del CSS, y de resaltar las partes importantes de mis entradas con recuadros, colores e imagenes. Por ejemplo, para las notas uso una clase llamada &#8220;nota&#8221;, con lo cual se ve así:</p>
<p class="nota">Hola esto es una nota de prueba. Y se ve de lujo. Hola esto es una nota de prueba. Y se ve de lujo. Hola esto es una nota de prueba. Y se ve de lujo. Hola esto es una nota de prueba. Y se ve de lujo.</p>
<p class="consola">Y esto es un comando<br />
para la consola<br />
y se ve muy chulo</p>
<p>Entonces pensé que sería bueno poder ver cuál sería el resultado visual de la entrada mientras la escribía, <strong>sin tener que estar abriendo una nueva pestaña para previsualizarla</strong>. Y lo único que tuve que hace fue añadir el contenido de mi CSS al archivo <em>wordpress.css</em>, que se encuentra en <strong>wp-includes/js/tinymce</strong>. Y listo, verás algo como:</p>
<p style="text-align: center;"><img title="visualizar-css-en-tiempo-de-ejecucion" src="http://casidiablo.net/wordpress/wp-content/uploads/2008/09/visualizar-css-en-tiempo-de-ejecucion.png" alt="css visualizar wordpress" /></p>
<p>Ten en cuenta que si tu CSS hace referencias a imágenes en ésta manera, por ejemplo: <em>background:url(images/rss_icono.jpg) no-repeat left;</em> debes poner la URL completa de la imagen: <em>background:url(<strong>http://tupagina.com/wp-content/themes/tema</strong>/images/rss_icono.jpg) no-repeat left;</em>.</p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/wordpress-previsualizar-post-mientras-se-escribe/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Dividir una entrada en varias páginas [WordPress]</title>
		<link>http://casidiablo.net/dividir-post-wordpress/</link>
		<comments>http://casidiablo.net/dividir-post-wordpress/#comments</comments>
		<pubDate>Fri, 08 Aug 2008 21:13:13 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[blogsfera]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[dividir]]></category>
		<category><![CDATA[entradas]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[tip]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=1286</guid>
		<description><![CDATA[Al momento de crear una entrada muy larga, como un tutorial por ejemplo, es posible dividir el post en varias páginas de una manera muy sencilla utilizando las etiquetas &#60;!--nextpage--&#62;. Funciona de manera similar a &#60;!--more--&#62;, pero dividiendo completamente el post. Y usándola podríamos obtener resultados como este: ¿Cómo incluir esta característica en nuestra plantilla? [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fcasidiablo.net%252Fdividir-post-wordpress%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Dividir%20una%20entrada%20en%20varias%20p%C3%A1ginas%20%5BWordpress%5D%22%20%7D);"></div>
<p>Al momento de crear una entrada muy larga, como un tutorial por ejemplo, es posible dividir el post en varias páginas de una manera muy sencilla utilizando las etiquetas <code>&lt;!--nextpage--&gt;</code>. Funciona de manera similar a <code>&lt;!--more--&gt;</code>, pero dividiendo completamente el post. Y usándola podríamos obtener resultados como este:</p>
<p style="text-align: center;"><img class="aligncenter" src="http://casidiablo.net/wordpress/wp-content/uploads/2008/08/division_post.png" alt="dividir post" /></p>
<h3>¿Cómo incluir esta característica en nuestra plantilla?</h3>
<p>La mayoría de los themes deberían incluir esta importante característica, pero en algunos casos no es así. Por tanto, si la tuya no la posee, tendrás que incluir la función <a href="http://codex.wordpress.org/Template_Tags/wp_link_pages">wp_link_pages</a> dentro del archivo <em><strong>single.php</strong></em> (si tu plantilla utiliza ese archivo para mostrar las entradas) o <em><strong>index.php</strong></em> (si se muestran directamente con ese archivo). Los parámetros que podemos pasarle a <a href="http://codex.wordpress.org/Template_Tags/wp_link_pages">wp_link_pages</a> son:</p>
<ul>
<li><strong><em> before (</em><em>string)</em></strong>: Texto que va antes de los links. Por defecto <tt>&lt;p&gt;</tt>.</li>
<li><strong><em> after (</em><em>string)</em></strong>: Texto que va antes de los links. Por defecto <tt>&lt;/p&gt;</tt>.</li>
<li><strong><em> next_or_number (</em><em>string)</em></strong>: Indica se deben usar los números (<em>number</em>) para las páginas o las palabras Previous y Next (<em>next</em>).</li>
<li><strong><em> nextpagelink (</em><em>string)</em></strong>: Texto del enlace <em>siguiente</em>. Por defecto <em><tt>Next page</tt></em>.</li>
<li><strong><em> previouspagelink (</em><em>string)</em></strong>: Texto del enlace <em>anterior</em>. Por defecto <em>Previous</em>.</li>
<li><strong><em> pagelink (</em><em>string)</em></strong>: Formato para las páginas con número.  <tt>Si pones % </tt> en el string, será reemplazado con el número de la página.</li>
</ul>
<p>Por ejemplo:</p>
<pre>&lt;?php
wp_link_pages('before=&lt;div class="estilo"&gt;Páginas:&amp;after=&lt;/div&gt;&amp;pagelink=page %');
?&gt;</pre>
<p>Mostraría algo como:</p>
<p>Páginas: <a href="http://casidiablo.net/dividir-post-wordpress/">Página 1</a> <a href="http://casidiablo.net/dividir-post-wordpress/2/">Página 2</a> Página 3 <a href="http://casidiablo.net/dividir-post-wordpress/4">Página 4</a></p>
<p>Todo dentro de etiquetas &lt;div class=&#8221;estilo&#8221;&gt;, lo que haría muy fácil el proceso de aplicarle un estilo visual con <a href="http://w3c.es/divulgacion/guiasbreves/HojasEstilo">CSS</a>.</p>
<p>También existe una función llamada <a href="http://codex.wordpress.org/Template_Tags/link_pages">link_pages</a>, que hace exactamente lo mismo que <a href="http://codex.wordpress.org/Template_Tags/wp_link_pages">wp_link_pages</a>. La diferencia es que <a href="http://codex.wordpress.org/Template_Tags/link_pages">link_pages</a>, recibe los parámetros por separado, mientras que <a href="http://codex.wordpress.org/Template_Tags/wp_link_pages">wp_link_pages</a> los recibe todos en una cadena. <strong>IMPORTANTE</strong>: la función <a href="http://codex.wordpress.org/Template_Tags/link_pages">link_pages</a> se encuentra en estado <em><strong>deprecated</strong></em>, lo que significa que NO se debe usar; siempre utiliza <a href="http://codex.wordpress.org/Template_Tags/wp_link_pages">wp_link_pages</a>.</p>
<h3>Hacks en la función wp_link_pages()</h3>
<p>Si deseas aplicar algún tipo de comportamiento especial a la función <a href="http://codex.wordpress.org/Template_Tags/wp_link_pages">wp_link_pages</a>, puedes hacerlo editando el archivo <em><strong>post-template.php</strong></em>, que se encuentra en <em><strong>wp-includes</strong></em>. Debes estar seguro de lo que haces, porque de lo contrario te puedes llevar un susto <img src='http://casidiablo.net/wordpress/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>En mi caso, por ejemplo, edite dicha función de tal manera que añadiera las etiquetas &lt;span class=&#8221;current&#8221;&gt; y &lt;/span&gt;, para poder aplicar un estilo visual a la &#8220;página actual&#8221;.</p>
<p style="text-align: center;"><img class="aligncenter" src="http://casidiablo.net/wordpress/wp-content/uploads/2008/08/hack_wp_link_page.png" alt="dividir post" /></p>
<p>Lo complicado aquí es que debes tener en cuenta el cambio, cuando hagas una actualización de la versión de WordPress. Por tanto es más seguro escribir un plugin, o algo más elaborado. Está en ti decidir qué hacer: <em>un hack rápido y peligroso</em>, o <em>un plugin demorado pero seguro</em>.</p>
<p><strong>Happy hack!</strong></p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/dividir-post-wordpress/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>La mediocridad de los ingenieros (¿reir o llorar?)</title>
		<link>http://casidiablo.net/ingenieros/</link>
		<comments>http://casidiablo.net/ingenieros/#comments</comments>
		<pubDate>Sat, 02 Aug 2008 07:37:15 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[hacking]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[injection]]></category>
		<category><![CDATA[sql]]></category>
		<category><![CDATA[xss]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=1211</guid>
		<description><![CDATA[Nota: este artículo te podría interesar si deseas saber cómo solucionar problemas de seguridad de manera &#8220;profesional&#8220;. De pequeño siempre quise ser Ingeniero de Sistemas&#8230; ahora, con 19 años ya llevo 6 semestres (de 10 aquí en Colombia), aún cuando no he estudiado por 2 años falta de dinero, ya no se que quiero hacer. [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fcasidiablo.net%252Fingenieros%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22La%20mediocridad%20de%20los%20ingenieros%20%28%C2%BFreir%20o%20llorar%3F%29%22%20%7D);"></div>
<p style="text-align: right;"><span style="color: #808080;">Nota: este artículo te podría interesar si deseas saber cómo solucionar problemas de seguridad de manera &#8220;<em><abbr title="Lo de profesional es sarcasmo">profesional</abbr></em>&#8220;.</span></p>
<p>De pequeño siempre quise ser Ingeniero de Sistemas&#8230; ahora, con 19 años ya llevo 6 semestres (de 10 aquí en Colombia), aún cuando no he estudiado por 2 años falta de dinero, ya no se que quiero hacer.</p>
<p>Con algo que llevo de experiencia mezclándome con &#8220;ingenieros&#8221; me da algo de tristeza ver cómo de cada 20 hay 1 que vale la pena. Los demás <strong>son personas que no tienen puta idea de lo que hacen</strong>, estudiaron esto no por vocación sino porque <strong>piensan que se van a forrar en dinero</strong>, y además se creen Dioses que todo lo saben (aún cuando dedican la mayor parte de su tiempo <strong>laboral</strong> chateando con el MSN, volviéndose maestros en el uso del <strong>Facebook</strong>, o perdiendo el tiempo de cualquier otra manera).</p>
<p>La verdad es que hace tiempo quería escribir algo sobre esto, pero no lo hacía simplemente porque muy seguramente <strong>los lectores asiduos de este humilde blog no tienen nada de mediocres</strong>, y los ingenieros (a quienes iría dirigida la entrada) ni siquiera saben lo que es un puto lector de feeds, o me leerían usando IE 6.0 (no saben que existen &#8220;otros&#8221;) que a veces no carga bien esta página.</p>
<h3>La historia&#8230; (aprende a solucionar problemas de seguridad)</h3>
<p>Hace una semana entré a la página web del sistema de transportes colombiano <a href="http://www.transmilenio.gov.co/nuevapagina/">Transmilenio</a>, y descubrí que el sistema de búsquedas era vulnerable a ataques <a href="http://es.wikipedia.org/wiki/Cross_Site_Scripting">XSS</a> y al famoso <a href="http://es.wikipedia.org/wiki/Inyecci%C3%B3n_SQL">SQL Injection</a>, por lo cual procedí (después de jugar un par de horas y descubrir ciertos datos interesantes) a avisar del fallo.</p>
<p>La cosa iba así para un XSS:</p>
<pre class="brush: xml; title: ; notranslate">hola%' or title like '%hola&gt; &lt;script&gt;alert(/POWNED/)&lt;/script&gt;&lt;a</pre>
<p>Y así para un SQL Injection:</p>
<pre class="brush: sql; title: ; notranslate">hola%' UNION select * from NOMBRE_TABLA where 1=1 or 1 like '%1</pre>
<p>Lo cierto es que esto es algo que <strong>se puede solucionar fácilmente</strong>, haciendo una limpieza a las variables antes de realizar una búsqueda en la base de datos, pero nuestros <em>super ingenieros</em> (que ni siquiera dieron las gracias) <em><strong>encontraron una mejor solución (la más óptima): deshabilitar las búsquedas</strong></em>.</p>
<p>Y aquí es donde no sé si reir o llorar. Poca vergüenza tiene esta gente, y lo peor es que los hay por montones. Muy triste&#8230;</p>
<p>También te podría interesar este artículo: <a href="http://jesfre.blogspot.com/2008/07/devolver-el-orgullo-al-nombre-de.html">Devolver el orgullo al nombre de &#8220;programador&#8221; para solucionar el déficit de programadores</a> publicado en <a href="http://jesfre.blogspot.com/">Punto de partida</a></p>
<h3>Bonus&#8230;</h3>
<ul>
<li><a href="http://winnetmag.com/Article/ArticleID/42216/42216.html">Protegiéndose frente a la inyección SQL</a></li>
<li><a href="http://www.dotnetpuebla.com/portal/Publicaciones/Articulos/848.aspx">Protegerse de un ataque SQL Injection</a></li>
<li><a href="http://msdn.microsoft.com/msdnmag/issues/04/09/SQLInjection/">Detén los ataques de Inyección SQL antes de que ellos te detengan a ti</a></li>
</ul>
<p>P.d. esta es una entrada programada escrita el Viernes 1 de Agosto de 2008. Solo para dejar terminar la semana y ver si lo solucionan.</p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/ingenieros/feed/</wfw:commentRss>
		<slash:comments>32</slash:comments>
		</item>
		<item>
		<title>10 maneras de acelerar el arranque en Linux</title>
		<link>http://casidiablo.net/10-maneras-de-acelerar-el-arranque-en-linux/</link>
		<comments>http://casidiablo.net/10-maneras-de-acelerar-el-arranque-en-linux/#comments</comments>
		<pubDate>Fri, 25 Jul 2008 18:05:54 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[opensuse]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=1150</guid>
		<description><![CDATA[Deshabilitar servicios innecesarios. Dependiendo del uso que le des a tu sistema, algunos servicios no son necesarios. ¿Usas Linux para el escritorio? Entonces no necesitas servicios como sendmail, httpd, etc. Por ejemplo, Ubuntu viene con los servicios para manipular dispositivos Bluetooth, pero personalmente no utilizo dispositivos de ese tipo; así que si es tu caso, [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fcasidiablo.net%252F10-maneras-de-acelerar-el-arranque-en-linux%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%2210%20maneras%20de%20acelerar%20el%20arranque%20en%20Linux%22%20%7D);"></div>
<ul>
<li><strong>Deshabilitar servicios innecesarios</strong>. Dependiendo del uso que le des a tu sistema, algunos servicios no son necesarios. ¿Usas <a href="http://casidiablo.net/">Linux</a> para el escritorio? Entonces no necesitas servicios como sendmail, httpd, etc. Por ejemplo, <a href="http://casidiablo.net/category/linux/ubuntu/">Ubuntu</a> viene con los servicios para manipular dispositivos Bluetooth, pero personalmente no utilizo dispositivos de ese tipo; así que si es tu caso, puedes ir al menú Administración, seleccionar Servicios, y deshabilitar todos aquellos que no uses.</li>
<li><strong>Deshabilitar módulos del kernel innecesarios</strong>. Si tu computador solamente se conectar a internet usando una conexión cableada Ethernet, no necesitas tener cargado el módulo Wireless del kernel. Claro, esto ya es un poco más difícil puesto que <a href="http://www.frikis.org/staticpages/index.php/kernel"><strong>es necesario recompilar el kernel</strong></a>, seleccionando sólo los módulos que necesitas.<br />
La mejor manera de saber cuales son los módulos que actualmente están siendo cargados en tu sistema es instalar <a href="http://www.bootchart.org/">Bootchart</a>. Este programa genera información acerca de lo que pasa cuando inicia tu sistema, los módulos que se cargan, con gráficos y todo XD.</li>
<li><strong>Usar un entorno de escritorio liviano en vez de GNOME o KDE</strong>. Sobre todo si tenemos máquinas viejas o lentas; Además, en vez de esperar 30 o 60 segundos extra mientras inician GNOME o KDE, ¿porqué no esperar 10 segundos por Enlightenment o XFCE? No solo te ahorrará tiempo al inciar el sistema, sino mientras lo estás usando.</li>
<li><strong>Usar un sistema de logueo basado en texto en vez de uno gráfico</strong>. La mayoría de mis máquinas Linux inician en el <em>run level</em> 3 en vez del <em>run level</em> 5. Esto hará que se detenga en el sistema de logueo basado en texto, donde solo tengo que poner mi usuario y password y ejecutar <strong>startx</strong> para iniciar mi entorno de escritorio. Los sistemas gráficos de logins son bonitos, pero incrementan el tiempo de carga y producen dolores de cabeza intentando recuperarse en caso de un fallo con las X.</li>
<li><strong>Usa una distribución ligera</strong>. En vez de cargar una pesada Fedora, Ubuntu o openSuse, ¿porqué no intentar Gentoo, Arch o Puppy Linux? El tiempo de inicio es considerablemente menor con éstas.</li>
<li><strong>Usar un <a href="http://openbios.info/Welcome_to_OpenBIOS">OpenBIOS</a></strong>. Si eres lo suficientemente experto como para actualizar tu firmware, podrías considerar migrar a una BIOS open source. Una de las cosas por las que es recomendable usar un firmware open source es que permite a Linux inicializar el hardware una vez encendido el PC (en vez de que lo haga la BIOS). Aún así, si no te aventuras a hacer tal cosa, podrías considerar configurar tu BIOS para que, por ejemplo, no busque una unidad de disquete que no existe o que bootee directamente del disco duro (en vez de buscar en la unidad de CD primero).</li>
<li><strong>Evitar el DHCP</strong>. Si estás en una red casera o empresa pequeña, las direcciones IPs no suelen dar muchos problemas. Considera entonces poner una IP fija a tu PC. Esto hará que al inciar no sea necesario conectarse al servidor DHCP para obtener una IP. Si haces esto, asegúrate de configurar el archivo /etc/resolve.conf para que seleccione adecuadamente los servidores DNS.</li>
<li><strong>Si es posible, deshaste de hotplug</strong>. <a href="http://linux-hotplug.sourceforge.net/">Hotplug</a> es el sistema que te permite conectar nuevos dispositivos y usarlos inmediatamente. Si no necesitas esta característica, bórralo. Esto reducirá el tiempo de carga de tu sistema. En muchos sistemas, hotplug consume muchos recuersos al momento de iniciar el sistema. <strong>NOTA</strong>: <a href="http://www.kernel.org/pub/linux/utils/kernel/hotplug/udev.html">udev</a> ha reemplazado a hotplug en su mayoría; pero si usas una distribución antigua te podría resultar muy útil hacerlo.</li>
<li><strong>Si eres realmente osado, podrías intentar <a href="http://www.initng.org/">initng</a></strong>. El sistema <a href="http://www.initng.org/">initng</a> sirve como reemplazo para el sistema sysvinit y promete ser decrementar el tiempo de carga de sistemas basados en UNIX. Si quieres ver a <a href="http://www.initng.org/">initng</a> en acción, puedes probar el LiveCD <a href="http://home.gna.org/pingwinek/download.html">Pingwinek</a>.</li>
<li><strong>Usar un hack en Debian</strong>. Si usas Debian, existe un hack muy simple que puedes usar para inciar tus <em>startup scripts</em> en paralelo. Si le echas un vistazo al script <strong>/etc/init.d/rc</strong>, verás algo como <strong>CONCURRENCY=none</strong> más o menos en la línea 24. Cambia esto por <strong>CONCURRENCY=shell</strong> y deberías ver una reducción en el tiempo que tarda el sistema en iniciar.</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/10-maneras-de-acelerar-el-arranque-en-linux/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Juego: Aguanta el balón [by Burnhack]</title>
		<link>http://casidiablo.net/juego-aguanta-el-balon-java/</link>
		<comments>http://casidiablo.net/juego-aguanta-el-balon-java/#comments</comments>
		<pubDate>Thu, 24 Jul 2008 15:43:25 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[ejercicios en java]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[software libre]]></category>
		<category><![CDATA[hack]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=1137</guid>
		<description><![CDATA[Un ejercicio en Java que me regala mi amigo Burnhack, y se trata de un juego llamado &#8220;Aguanta el balon&#8221;, bastante bueno y divertido. Y como no, se ofrece el código fuente para su estudio y disfrute. Nos comenta Burnhack: Juego: Aguanta el balon Programado por: Burnhack Lenguaje: Java Descripción y Manejo: Pues jugar a [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fcasidiablo.net%252Fjuego-aguanta-el-balon-java%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Juego%3A%20Aguanta%20el%20bal%C3%B3n%20%5Bby%20Burnhack%5D%22%20%7D);"></div>
<p>Un ejercicio en <a href="http://casidiablo.net/java/">Java</a> que me regala mi amigo <strong><em>Burnhack</em></strong>, y se trata de un juego llamado &#8220;Aguanta el balon&#8221;, bastante bueno y divertido. Y como no, se ofrece el código fuente para su estudio y disfrute. Nos comenta <em>Burnhack</em>:</p>
<p><strong>Juego</strong>: Aguanta el balon<br />
<strong>Programado por</strong>: Burnhack<br />
<strong>Lenguaje</strong>: <a href="http://casidiablo.net/java/">Java</a></p>
<p style="text-align: center;"><a href="http://casidiablo.net/wordpress/wp-content/uploads/2008/07/futbol.png"><img class="aligncenter" title="screenshot" src="http://casidiablo.net/wordpress/wp-content/uploads/2008/07/futbol.png" alt="juego futbol java" /></a></p>
<p><strong>Descripción y Manejo</strong>: Pues jugar a este juego es muy simple, el juego comienza cuando haces click en el balón situado en el centro y sin soltar el ratón debes de arrastrarlo evitando el contacto con los otros y los laterales. A medida que avanza el tiempo también sube su velocidad así que el juego se ira complicando.</p>
<p>Como parte de su descripción he nombrado dos clases: Una llamada balon donde controlé las colisiones, y la otra llamada Fútbol y controle el resto de cosas: Movimiento de balones,Velocidad, Los paneles&#8230;</p>
<p><strong>Fallos:</strong></p>
<ul>
<li>Los balones no llegan a chocar pero es culpa del dibujo de los balones y no me dedique a hacerlos mejor porque bastante me costo hacer esto jajaja aunque sea cutre</li>
<li>El timer si hay lo descarga que me diga si cree que es correcto porque le agregue un timer y nose si mide del todo bien el tiempo&#8230;ya que creo que depende un poco tambien del pc, de todas formas nose hacerlo mejor.</li>
<li>La interfaz es la misma cutrecilla&#8230;donde se podia poner una barra de desplazamiento para que simule el aumento de la velocidad de los balones y un boton de reinicio ..pero soy muy vago y si funciona asi..pues creo que no hace falta mucho mas.</li>
</ul>
<p>Y a favor del juego&#8230;que te picas muy facilmente y pa echar un rato esta bien.</p>
<p><a href="http://casidiablo.net/descargar/Juego+Futbol+Java-by+Burnhack" class="download">Descargar código fuente y ejecutables</a></p>
<p>Gracias por la colaboración, Burnhack!</p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/juego-aguanta-el-balon-java/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Consultar DB en Java &#8211; Mostrar resultados en un JTable</title>
		<link>http://casidiablo.net/consultar-base-datos-java-mostrar-resultados-jtable/</link>
		<comments>http://casidiablo.net/consultar-base-datos-java-mostrar-resultados-jtable/#comments</comments>
		<pubDate>Fri, 02 May 2008 13:40:46 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[artículos]]></category>
		<category><![CDATA[ejercicios en java]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[ejemplos]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://www.casidiablo.net/wordpress/index.php/2007/11/26/consultar-db-en-java-mostrar-resultados-en-un-jtable/</guid>
		<description><![CDATA[Siguiendo con nuestro tema de conexiones a bases de datos desde Java&#8230; Cuando estamos trabajando con bases de datos y aplicaciones que usen Swing, la manera más elegante de presentar los datos a un usuario es usando tablas usando la clase JTable. Lo que haremos será básicamente crear una clase que herede de la clase [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fcasidiablo.net%252Fconsultar-base-datos-java-mostrar-resultados-jtable%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Consultar%20DB%20en%20Java%20-%20Mostrar%20resultados%20en%20un%20JTable%22%20%7D);"></div>
<p>Siguiendo con nuestro tema de <a href="http://www.casidiablo.net/wordpress/index.php/2007/11/19/ejemplo-basico-de-programacion-con-jdbc-y-mysql/"><strong>conexiones a bases de datos desde Java</strong></a>&#8230; Cuando estamos trabajando con bases de datos y aplicaciones que usen <a href="http://es.wikipedia.org/wiki/Swing_(biblioteca_gr%C3%A1fica)" title="Leer en la wikipedia">Swing</a>, la manera más elegante de presentar los datos a un usuario es usando tablas usando la clase <a href="https://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JTable.html" target="_blank">JTable</a>.</p>
<p style="text-align: center"><img src="http://img162.imageshack.us/img162/5121/tablajdbcswingvf6.png" title="tabla swing jdbc" alt="tabla swing jdbc" width="364" height="166" /></p>
<p> Lo que haremos será básicamente crear una clase que herede de la clase <a href="https://java.sun.com/j2se/1.4.2/docs/api/javax/swing/table/AbstractTableModel.html">AbstractTableModel</a>:</p>
<blockquote class="cita"><p>Esta clase abstracta provee la implementación por defecto de la mayoría de los métodos en la interfaz <a href="http://72.5.124.55/j2se/1.4.2/docs/api/javax/swing/table/TableModel.html"><code>TableModel</code></a>. Para crear un <code>TableModel</code> como subclase de <code>AbstractTableModel</code> necesitarás implementar únicamente los sigientes tres métodos:</p>
<pre>  public int getRowCount();  public int getColumnCount();public Object getValueAt(int row, int column);</pre>
</blockquote>
<p><span id="more-697"></span>Dicha clase administrará el contenido de nuestra tabla. Ten en cuenta que vamos a trabajar con la <a href="http://www.casidiablo.net/wordpress/index.php/2007/11/19/ejemplo-basico-de-programacion-con-jdbc-y-mysql/">base de datos que hicimos aquí</a>. Veamos entonces el código:</p>
<pre class="brush: java; title: ; notranslate">import java.sql.*;
import java.util.*;
import javax.swing.table.*;
// Las filas y columnas del objeto ResultSet se cuentan desde 1 y las filas
// y columnas del objeto JTable se cuentan desde 0. Al procesar filas
// o columnas del objeto ResultSet para usarlas en un objeto JTable, es
// necesario sumar 1 al número de fila o columnas para manipular la
// columna apropiada del objeto ResultSet (es decir, la columna 0 del objeto JTable
// es la columna 1 del objeto ResultSet y la fila 0 del objeto JTable es la fila 1 del objeto ResultSet).
public class ModeloTablaResultados extends AbstractTableModel {
    private Connection conexion;
    private Statement instruccion;
    private ResultSet conjuntoResultados;
    private ResultSetMetaData metaDatos;
    private int numeroDeFilas;
    // mantener el registro del estado de la conexión a la base de datos
    private boolean conectadoALaBaseDeDatos = false;
    // inicializar conjuntoResultados y obtener su objeto de meta datos;
    // determinar el número de filas
    public ModeloTablaResultados( String controlador, String url,
            String consulta ) throws SQLException, ClassNotFoundException {
        // cargar clase de controlador de base de datos
        Class.forName( controlador );
        // conectarse a la base de datos
        conexion = DriverManager.getConnection( url );
        // crear objeto Statement para consultar la base de datos
        instruccion = conexion.createStatement(
                ResultSet.TYPE_SCROLL_INSENSITIVE,
                ResultSet.CONCUR_READ_ONLY );
        // actualizar estado de conexión a la base de datos
        conectadoALaBaseDeDatos = true;
        // establecer consulta y ejecutarla
        establecerConsulta( consulta );
    }
    // obtener la clase que representa al tipo de columna
    public Class getColumnClass( int columna ) throws IllegalStateException {
        // asegurar que la conexión a la base de datos esté disponible
        if ( !conectadoALaBaseDeDatos )
            throw new IllegalStateException( &quot;No hay conexion a la base de datos&quot; );
        // determinar la clase de Java de columna
        try {
            String nombreClase = metaDatos.getColumnClassName( columna + 1 );
            // devolver objeto Class que representa a nombreClase
            return Class.forName( nombreClase );
        }
        // atrapar excepciones SQLException y ClassNotFoundException
        catch ( Exception excepcion ) {
            excepcion.printStackTrace();
        }
        // si ocurren problemas arriba, suponer que es tipo Object
        return Object.class;
    }
    // obtener el número de columnas en el objeto ResultSet
    public int getColumnCount() throws IllegalStateException {
        // asegurar que la conexión a la base de datos esté disponible
        if ( !conectadoALaBaseDeDatos )
            throw new IllegalStateException( &quot;No hay conexion a la base de datos&quot; );
        // determinar el número de columnas
        try {
            return metaDatos.getColumnCount();
        }
        // atrapar excepciones SQLException e imprimir mensaje de error
        catch ( SQLException excepcionSQL ) {
            excepcionSQL.printStackTrace();
        }
        // si ocurren problemas arriba, devolver 0 para el número de columnas
        return 0;
    }
    // obtener el nombre de una columna específica en el objeto ResultSet
    public String getColumnName( int columna ) throws IllegalStateException {
        // asegurar que la conexión a la base de datos esté disponible
        if ( !conectadoALaBaseDeDatos )
            throw new IllegalStateException( &quot;No hay conexion a la base de datos&quot; );
        // determinar el nombre de la columna
        try {
            return metaDatos.getColumnName( columna + 1 );
        }
        // atrapar excepciones SQLException e imprimir mensaje de error
        catch ( SQLException excepcionSQL ) {
            excepcionSQL.printStackTrace();
        }
        // si hay problemas, devolver cadena vacía para el nombre de la columna
        return &quot;&quot;;
    }
    // devolver el número de filas en el objeto ResultSet
    public int getRowCount() throws IllegalStateException {
        // asegurar que la conexión a la base de datos esté disponible
        if ( !conectadoALaBaseDeDatos )
            throw new IllegalStateException( &quot;No hay conexion a la base de datos&quot; );
        return numeroDeFilas;
    }
    // obtener el valor en una fila y columna específicas
    public Object getValueAt( int fila, int columna ) throws IllegalStateException {
        // asegurar que la conexión a la base de datos esté disponible
        if ( !conectadoALaBaseDeDatos )
            throw new IllegalStateException( &quot;No hay conexion a la base de datos&quot; );
        // obtener un valor en una fila y columna específicas del objeto ResultSet
        try {
            conjuntoResultados.absolute( fila + 1 );
            return conjuntoResultados.getObject( columna + 1 );
        }
        // atrapar excepciones SQLExceptions e imprimir mensaje de error
        catch ( SQLException excepcionSQL ) {
            excepcionSQL.printStackTrace();
        }
        // si hay problemas, devolver objeto cadena vacía
        return &quot;&quot;;
    }
    // establecer nueva cadena de consulta para la base de datos
    public void establecerConsulta( String consulta )throws SQLException, IllegalStateException {
        // asegurar que la conexión a la base de datos esté disponible
        if ( !conectadoALaBaseDeDatos )
            throw new IllegalStateException( &quot;No hay conexion a la base de datos&quot; );
        // especificar consulta y ejecutarla
        conjuntoResultados = instruccion.executeQuery( consulta );
        // obtener meta datos para el objeto ResultSet
        metaDatos = conjuntoResultados.getMetaData();
        // determinar el número de filas en el objeto ResultSet
        conjuntoResultados.last();                   // mover a la última fila
        numeroDeFilas = conjuntoResultados.getRow();  // obtener número de fila
        // notificar al objeto JTable que el modelo ha cambiado
        fireTableStructureChanged();
    }
    // cerrar objetos Statement y Connection
    public void desconectarDeLaBaseDeDatos() {
        // cerrar objetos Statement y Connection
        try {
            instruccion.close();
            conexion.close();
        }
        // atrapar excepciones SQLException e imprimir mensaje de error
        catch ( SQLException excepcionSQL ) {
            excepcionSQL.printStackTrace();
        }
        // actualizar estado de conexión a la base de datos
        finally {
            conectadoALaBaseDeDatos = false;
        }
    }
}  // fin de la clase ResultSetTableModel</pre>
<h3>Cosas por explicar el en código anterior:</h3>
<ul>
<li>Si tienes dudas respecto a las operaciones hechas  con el API de JDBC significa que debes leer esto primero: <a href="http://www.casidiablo.net/wordpress/index.php/2007/11/19/ejemplo-basico-de-programacion-con-jdbc-y-mysql/">Ejemplo Programación con JDBC</a></li>
<li><strong>public Class getColumnClass();</strong> con este método obtendremos el tipo de dato de la columna (<a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Integer.html">Integer</a>, <a href="http://java.sun.com/j2se/1.3/docs/api/java/lang/String.html">String</a>, <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Float.html">Float</a>, etc).</li>
<li><strong>public int getColumnCount();</strong> este método devuelve el número de columnas que tendrá la tabla.</li>
<li><strong>public String getColumnName(int x);</strong> devuelve el nombre de la columna X de la tabla.</li>
<li><strong>public int getRowCount();</strong> este método devuelve el número de filas que tendrá la tabla.</li>
<li><strong>public Object getValueAt(int f, int c);</strong> asigna a la tabla el valor de la celda que se encuentra en la fila <em>f</em> y en la columna <em>c</em>.</li>
<li><strong>fireTableStructureChanged();</strong> esto le indica al objeto <a href="https://java.sun.com/j2se/1.4.2/docs/api/javax/swing/table/AbstractTableModel.html">AbstractTableModel</a> que la estructura de la tabla ha cambiado.</li>
</ul>
<p>Ahora el código del frame que contiene la tabla:</p>
<pre class="brush: java; title: ; notranslate">import java.awt.*;
import java.awt.event.*;
import java.sql.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;
public class MostrarResultadosConsulta extends JFrame {
    // controlador JDBC y URL de la base de datos
    static final String CONTROLADOR_JDBC = &quot;com.mysql.jdbc.Driver&quot;;
    static final String URL_BASEDEDATOS = &quot;jdbc:mysql://localhost/ejemplo?user=root&amp;amp;amp;password=&quot;;
    // la consulta predeterminada recupera todos los datos de la tabla autores
    static final String CONSULTA_PREDETERMINADA = &quot;SELECT * FROM datos&quot;;
    private ModeloTablaResultados modeloTabla;
    private JTextArea areaConsulta;
    // crear objeto ModeloTablaResultados y GUI
    public MostrarResultadosConsulta() {
        super( &quot;Mostrando resultados de la consulta&quot; );
        // crear objeto ModeloTablaResultados y mostrar tabla de la base de datos
        try {
            // crear objeto TableModel para los resultados del a consulta SELECT * FROM autores
            modeloTabla = new ModeloTablaResultados( CONTROLADOR_JDBC, URL_BASEDEDATOS,
                    CONSULTA_PREDETERMINADA );
            JTable tablaResultados = new JTable(modeloTabla);

            getContentPane().setLayout(new BorderLayout());
            getContentPane().add( new JScrollPane(tablaResultados) , BorderLayout.CENTER );
            // establecer tamaño de ventana y mostrarla en pantalla
            setSize( 500, 250 );
            setVisible( true );
        }  // fin de bloque try
        // atrapar la excepción ClassNotFoundException lanzada por el
        // objeto ModeloTablaResultados si no se encuentra el controlador de la base de datos
        catch ( ClassNotFoundException claseNoEncontrada ) {
            JOptionPane.showMessageDialog( null,
                    &quot;No se encontro el controlador de la base de datos&quot;, &quot;No se encontro el controlador&quot;,
                    JOptionPane.ERROR_MESSAGE );
            System.exit( 1 );   // terminar la aplicación
        } // fin de bloque catch
        // atrapar la excepción SQLException lanzada por el objeto ModeloTablaResultados
        // si ocurren problemas al establecer la conexión a la base de datos
        // y realizar la consulta en la misma
        catch ( SQLException excepcionSQL ) {
            JOptionPane.showMessageDialog( null, excepcionSQL.getMessage(),
                    &quot;Error en la base de datos&quot;, JOptionPane.ERROR_MESSAGE );
            // asegurar que la conexión a la base de datos esté cerrada
            modeloTabla.desconectarDeLaBaseDeDatos();
            System.exit( 1 );   // terminar la aplicación
        }
        // desechar la ventana cuando el usuario salga de la aplicación
        // (esta opción sobrescribe a la opción predeterminada de HIDE_ON_CLOSE)
        setDefaultCloseOperation( DISPOSE_ON_CLOSE );
        // asegurar que la conexión a la base de datos esté cerrada cuando el usuario salga de la aplicación
        addWindowListener(
                new WindowAdapter() {
            // desconectarse de la base de datos y salir cuando se haya cerrado la ventana
            public void windowClosed( WindowEvent evento ) {
                modeloTabla.desconectarDeLaBaseDeDatos();
                System.exit( 0 );
            }
        }
        );
    }  // fin del constructor de MostrarResultadosConsulta
    // ejecutar la aplicación
    public static void main( String args[] ) {
        JFrame.setDefaultLookAndFeelDecorated(true);
        new MostrarResultadosConsulta();
    }
}  // fin de la clase MostrarResultadosConsulta</pre>
<p>Puedes ver un ejemplo más completo, llamado TableExample, en el set de demos que proporciona el JDK (puedes descargarlo abajo).</p>
<h3>Descargas</h3>
<ul>
<li><a href="http://casidiablo.net/descargar/Ejemplo+Tablas">Ejemplos y código fuente</a></li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/consultar-base-datos-java-mostrar-resultados-jtable/feed/</wfw:commentRss>
		<slash:comments>60</slash:comments>
		</item>
		<item>
		<title>Un poco de todo&#8230;</title>
		<link>http://casidiablo.net/un-poco-de-todo/</link>
		<comments>http://casidiablo.net/un-poco-de-todo/#comments</comments>
		<pubDate>Sat, 19 Apr 2008 16:51:29 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[blogsfera]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[noticias]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[software libre]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[opensuse]]></category>

		<guid isPermaLink="false">http://www.casidiablo.net/wordpress/index.php/2008/04/19/un-poco-de-todo/</guid>
		<description><![CDATA[Hoy me dedicaré a citar algunos enlaces interesantes que he recopilado durante algunos días&#8230; comenzamos con los nuevos números los podcast que suelo escuchar: Con respecto a programación tenemos el podcast número 11 de javaHispano, en donde han hecho una excelente entrevista Francisco Moreno Peyrona. Tzinacan nos deleita con un nuevo número de Otro Podcast [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fcasidiablo.net%252Fun-poco-de-todo%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Un%20poco%20de%20todo...%22%20%7D);"></div>
<p>Hoy me dedicaré a citar algunos enlaces interesantes que he recopilado durante algunos días&#8230; comenzamos con los nuevos números los podcast que suelo escuchar:</p>
<ul>
<li>Con respecto a programación tenemos el <a href="http://www.javahispano.org/contenidos/es/javahispano_podcast__011__evangelista_honorario_netbeans_entrevista_a_francisco_moreno_peyrona/">podcast número 11 de <em>javaHispano</em></a>, en donde han hecho una excelente entrevista <em>Francisco Moreno Peyrona</em>.</li>
<li><em>Tzinacan</em> nos deleita con un nuevo número de <em><a href="http://www.earthmusicnetwork.com/opsl/?p=39">Otro Podcast Sobre Linux</a></em></li>
<li>El <a href="http://www.linpodcast.emnhome.com/?p=62">segundo número de la segunda temporada de <em>Linpodcast</em></a></li>
<li>El número 179 de uno de los mejores podcast sobre Java: <em><a href="http://javaposse.com/index.php?post_id=328118">Java Posse</a></em></li>
<li>Por último <a href="http://www.linuxhispano.net/podcast/?p=31">un especial del <em>Podcast de Linux Hispano</em></a>, en conjunto con dos de los podcasters de <em>JavaHispano Podcast</em>.</li>
</ul>
<h3>Enlaces interesantes</h3>
<ul>
<li><a href="http://www.genbeta.com/2008/04/14-guia-de-inicio-linux-mensajeria-instantanea">Mensajería instantánea sobre Linux</a>, un listado con el mejor softawre disponible en sistemas operativos Gnu/Linux para mensajería instantánea<a href="http://www.genbeta.com/2008/04/14-guia-de-inicio-linux-mensajeria-instantanea"><br />
</a></li>
<li><a href="http://www.tuxi.com.ar/2008/04/11/los-empleados-de-google-ganan-us-9000-al-mes/">Los empleados de Google ganan U$S 9.000 al mes</a></li>
<li><a href="http://www.dosbit.com/2008/04/14-codepad-sencilla-aplicacion-para-comprobar-codigos-de-diferentes-lenguajes-directamente-de-la-web">CodePad &#8211; Sencilla aplicación para comprobar códigos de diferentes lenguajes directamente de la Web</a></li>
<li><a href="http://www.javahispano.org/contenidos/es/curso_gratuito_de_sun_introduccion_a_glassfish/">Curso Gratuito de SUN: Introduccion a Glassfish</a></li>
<li><a href="http://ociolinux.blogspot.com/2008/04/nuevo-rezo-san-gnulinux.html">Nuevo rezo a san Gnu/Linux</a></li>
<li><a href="http://www.kabytes.com/desarrollo/simple-es-mejor-lo-bueno-si-breve-dos-veces-bueno/">Simple es mejor: Lo bueno, si breve, dos veces bueno</a></li>
<li><a href="http://mundogeek.net/archivos/2008/04/16/101-formas-de-saber-que-vuestro-proyecto-software-esta-condenado-al-fracaso/">101 formas de saber que vuestro proyecto software está condenado al fracaso</a></li>
<li><a href="http://www.tuxi.com.ar/2008/04/17/el-proyecto-debian-esta-muriendo-segun-uno-de-sus-desarrolladores/"><strong>El proyecto </strong><strong>Debian esta muriendo</strong> según uno de sus desarrolladores</a></li>
<li>Si te gusta Twittear, aquí tienes un <a href="http://blog.linuxoss.com/2008/04/17/twitter-clients-for-linux-users/">listado de clientes <em>Twitter</em> para Linux </a></li>
<li><a href="http://www.ubuntips.com.ar/2008/04/18/ubuntu-804-rc-liberado-y-ship-it-funcionando/">Ubuntu 8.04 RC liberado y Ship It funcionando</a></li>
<li><a href="http://www.linuxchillan.cl/?q=node/1109">El número 14 de la revista Begins</a></li>
<li><a href="http://www.theinquirer.es/2008/04/19/primera_beta_de_opensuse_110.html">Primera Beta de openSuse 11.0</a></li>
</ul>
<p><a href="http://hackademix.net/2008/04/15/passing-down-history/"><br />
</a><br />
<a href="http://flisol.net/" title="Participa!"></p>
<p style="text-align: center"><img border="0" width="315" src="http://i270.photobucket.com/albums/jj96/Casidiablo/recordatorio.png" alt="recordatorio" height="302" /></p>
<p></a></p>
<h3><a href="http://hackademix.net/2008/04/15/passing-down-history/">Un meme extraño</a></h3>
<p>La verdad no me gusta mucho eso de los memes, de hecho no he seguido ninguno nunca (pido disculpas a los que me envían memes, y nos los sigo), hasta ahora. Pero he recibido uno bastante… “peculiar”, tanto así que he decidio seguirlo. Se trata de tipear el siguiente comando en la consola de tu sistema operativo (Gnu/Linux, por supuesto, aunque si tienes Mac…):</p>
<p><img src="http://i270.photobucket.com/albums/jj96/Casidiablo/meme.png" title="history|awk '{a[$2]++ } END{for(i in a){print a[i] " alt="history|awk '{a[$2]++ } END{for(i in a){print a[i] " height="25" width="398" /></p>
<p class="consola">11 mkdir<br />
14 bunzip2<br />
14 cp<br />
19 ./configure<br />
19 gcc<br />
2 cc<br />
2 dh<br />
2 ll<br />
2 readelf<br />
2 time</p>
<p>El meme lo puede seguir el que desee.</p>
<p>Un saludo!</p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/un-poco-de-todo/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Manual Básico de Java</title>
		<link>http://casidiablo.net/manual-java/</link>
		<comments>http://casidiablo.net/manual-java/#comments</comments>
		<pubDate>Tue, 01 Apr 2008 20:47:22 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[programación]]></category>

		<guid isPermaLink="false">http://www.casidiablo.net/wordpress/index.php/2008/04/01/manual-java/</guid>
		<description><![CDATA[Este lo he encontrado gracias a ElBarney-D y me ha parecido bastante completo. Es un tutorial en PDF de 1027 páginas y que contiene mucha información que te podría servir si estás comenzando en esto de la programación. Lo único malo que veo es que parece un poco viejo, pero de seguro le sirve a [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fcasidiablo.net%252Fmanual-java%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Manual%20B%C3%A1sico%20de%20Java%22%20%7D);"></div>
<p>Este lo he encontrado gracias a <strong><a href="http://foro.elhacker.net/index.php?action=profile;u=291818" title="Ver perfil de ElBarney-D">ElBarney-D</a> </strong>y me ha parecido bastante completo. Es un tutorial en PDF de 1027 páginas y que contiene mucha información que te podría servir si estás comenzando en esto de la programación. Lo único malo que veo es que parece un poco viejo, pero de seguro le sirve a mas de uno.</p>
<h3>Descargar</h3>
<p><a href="http://casidiablo.net/descargar/Manual+B%C3%A1sico+de+Java">Descargar versión en PDF</a></p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/manual-java/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

