<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2enclosuresfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:media="http://search.yahoo.com/mrss/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-3665485405994358712</atom:id><lastBuildDate>Thu, 19 Jan 2012 12:31:47 +0000</lastBuildDate><category>Social Media</category><category>JQuery</category><category>Twitter</category><category>Frases</category><category>Humor</category><category>Maratones</category><category>Wordpress</category><category>programación</category><category>java</category><category>Conferencia</category><title>Pirata Tobón</title><description /><link>http://www.piratatobon.com/</link><managingEditor>noreply@blogger.com (Héctor Tobón)</managingEditor><generator>Blogger</generator><openSearch:totalResults>21</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/PirataTobon" /><feedburner:info uri="piratatobon" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><media:category scheme="http://www.itunes.com/dtds/podcast-1.0.dtd">Technology</media:category><itunes:owner><itunes:email>noreply@blogger.com</itunes:email></itunes:owner><itunes:explicit>no</itunes:explicit><itunes:subtitle></itunes:subtitle><itunes:category text="Technology" /><feedburner:emailServiceId>PirataTobon</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3665485405994358712.post-9073626415301175130</guid><pubDate>Tue, 22 Nov 2011 19:19:00 +0000</pubDate><atom:updated>2011-11-22T11:21:52.215-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Social Media</category><category domain="http://www.blogger.com/atom/ns#">Twitter</category><title>SocialBro para generar estadísticas en Twitter (Recomendado)</title><description>Generalmente no me gusta publicar noticias de este tipo, sin embargo me he puesto en la tarea de compartir con mis lectores un poco de las diferentes actividades de las cuales realizo en mi trabajo.&lt;br /&gt;
&lt;br /&gt;
Una de ellas y no menos importante (pues la ejerzo a manera de hobby tomándola muy en serio!), es la de mantener, gestionar y mejorar la cuenta de twitter de nuestro programa &lt;a href="http://www.twitter.com/CIAT_DAPA" target="_blank"&gt;@CIAT_DAPA&lt;/a&gt;. No es una tarea fácil... y a decir verdad, apenas llevo 1 semana en esto; pero he logrado descubrir que en Internet existen una infinidad de aplicaciones que nos hacen la vida mucho más fácil. Y es que, gracias a estas aplicaciones, nosotros los Community Managers (del cual me considero un principiante) se quedarían con los números en las calculadoras.&lt;br /&gt;
&lt;br /&gt;
Es así como les comparto la aplicación &lt;b&gt;&lt;a href="http://www.socialbro.com/" target="_blank"&gt;SocialBro&lt;/a&gt;&lt;/b&gt; que se encarga de generar estadísticas acerca de las comunidades que hay en twitter analizadas sobre una cuenta en especial. La acabo de probar y la verdad que me ha dejado anonadado. En comparación con muchos otros sitios en Internet, esta aplicación genera contenido mucho más amigable y más del que usualmente vemos.&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-XK2Q5CXLtaI/Tsv1f77B0-I/AAAAAAAAAak/uifVSbc8jkI/s1600/SocialBro.PNG" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="272" src="http://3.bp.blogspot.com/-XK2Q5CXLtaI/Tsv1f77B0-I/AAAAAAAAAak/uifVSbc8jkI/s400/SocialBro.PNG" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;SocialBro configurado con @CIAT_DAPA (Noviembre 22 de 2011)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
Si quieren leer en más detalle, los invito a que se lean la nota del blog&amp;nbsp; "microsiervos" que muy amablemente "Alvy" nos compartió:&lt;br /&gt;
&lt;a href="http://www.microsiervos.com/archivo/internet/socialbro-analizador-social-twitter.html"&gt;http://www.microsiervos.com/archivo/internet/socialbro-analizador-social-twitter.html&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Adicionalmente la URL de la aplicación es: &lt;a href="http://www.socialbro.com/"&gt;http://www.socialbro.com&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Funciona con Adobe AIR y también se puede instalar en Google Chrome.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3665485405994358712-9073626415301175130?l=www.piratatobon.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PirataTobon/~4/rxzSrmgD_h0" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/PirataTobon/~3/rxzSrmgD_h0/socialbro-para-generar-estadisticas-en.html</link><author>noreply@blogger.com (Héctor Tobón)</author><media:thumbnail url="http://3.bp.blogspot.com/-XK2Q5CXLtaI/Tsv1f77B0-I/AAAAAAAAAak/uifVSbc8jkI/s72-c/SocialBro.PNG" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.piratatobon.com/2011/11/socialbro-para-generar-estadisticas-en.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3665485405994358712.post-8859395562204298777</guid><pubDate>Tue, 22 Nov 2011 13:45:00 +0000</pubDate><atom:updated>2011-11-22T05:45:10.296-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">JQuery</category><category domain="http://www.blogger.com/atom/ns#">programación</category><title>Lo nuevo de JQuery 1.7 (eventos on/off)</title><description>No me considero un experto en JQuery, pero he de decir que este lenguaje me ha sacado de apuros en un par de proyectos importantes.&lt;br /&gt;
&lt;br /&gt;
El equipo de desarrollo de esta grandiosa librería se ha tomado el trabajo muy en serio y ha venido realizando importantes mejoras no solo en el rendimiento y en la utilidad final de la librería, sino también en un bonita y admirable sintaxis para que el programador no se mate la cabeza diseñando código entendible.&lt;br /&gt;
&lt;br /&gt;
Es así como entre sus cambios más importantes se encuentran los métodos "&lt;i&gt;on&lt;/i&gt;" y "&lt;i&gt;off&lt;/i&gt;", que no es nada más y nada menos que para los JAVA entendientes, dos métodos que se encargan de registrar y des-registrar eventos a un componente del DOM.&lt;br /&gt;
&lt;br /&gt;
Posiblemente se preguntarán: ¿Qué pasará entonces con los métodos &lt;i&gt;bind&lt;/i&gt;, &lt;i&gt;live&lt;/i&gt; y &lt;i&gt;delegate&lt;/i&gt;?.... A futuro, tenderán a desaparecer y se marcarán como deprecated. En realidad, actualmente la nueva versión de JQuery recomienda a los desarrolladores actualizar su código para que utilicen de ahora en adelante&amp;nbsp; cada uno de estos métodos:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;&lt;i&gt;"&lt;b&gt;As of jQuery 1.7, the &lt;a href="http://api.jquery.com/on"&gt;&lt;code&gt;.on()&lt;/code&gt;&lt;/a&gt; method is the preferred method for attaching event handlers to a document&lt;/b&gt;. For earlier versions, the &lt;code&gt;.bind()&lt;/code&gt;  method is used for attaching an event handler directly to elements.  Handlers are attached to the currently selected elements in the jQuery  object, so those elements &lt;i&gt;must exist&lt;/i&gt; at the point the call to &lt;code&gt;.bind()&lt;/code&gt; occurs. &lt;b&gt;For more flexible event binding, see the discussion of event delegation in &lt;a href="http://api.jquery.com/on"&gt;&lt;code&gt;.on()&lt;/code&gt;&lt;/a&gt; or &lt;a href="http://api.jquery.com/delegate"&gt;&lt;code&gt;.delegate()&lt;/code&gt;&lt;/a&gt;&lt;/b&gt;."&lt;/i&gt;&lt;/blockquote&gt;&lt;br /&gt;
&amp;nbsp;Nuestro código usualmente se escribía así:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:js" name="code"&gt;$('#ElementoCualquiera').click(function(){
  alert('Yeap!');
});
&lt;/pre&gt;&lt;pre class="brush:js" name="code"&gt;$('#ElementoCualquiera').unbind('click');
&lt;/pre&gt;&lt;br /&gt;
Pero ahora se verá algo como:&lt;br /&gt;
&lt;pre class="brush:js" name="code"&gt;$('#ElementoCualquiera').on(function(){
  alert('Yeap!');
});
&lt;/pre&gt;&lt;br /&gt;
&lt;pre class="brush:js" name="code"&gt;$('#ElementoCualquiera').off('click');
&lt;/pre&gt;&lt;br /&gt;
Recuerde que el método &lt;i&gt;bind&lt;/i&gt; registra el evento dado para todos aquellos componentes que ya existen dentro del DOM pero NO para aquellos componentes que se crean después del llamado. Para este tipo de comportamiento, se utilizaba el método live, el cual registra el evento a cualquier componente especificado y a los futuros componentes que se creen durante el tiempo de vida de la aplicación web.&lt;br /&gt;
&lt;br /&gt;
Es así como el código que solíamos escribir se veía como:&lt;br /&gt;
&lt;pre class="brush:js" name="code"&gt;$('#ElementoCualquiera').live('click', function(){
    alert('Yeap! ');
});
&lt;/pre&gt;&lt;pre class="brush:js" name="code"&gt;$('#ElementoCualquiera').die('click');
&lt;/pre&gt;&lt;br /&gt;
Pero ahora se cambiará por:&lt;br /&gt;
&lt;pre class="brush:js" name="code"&gt;$('#ElementoCualquiera').on('click', function(){
    alert('Yeap!');
});
&lt;/pre&gt;&lt;pre class="brush:js" name="code"&gt;$('#ElementoCualquiera').off('click');
&lt;/pre&gt;&lt;br /&gt;
Si bien, este método "&lt;i&gt;live&lt;/i&gt;" es bastante útil, se convirtió en un dolor de cabeza para aquellos desarrolladores que deseaban tener un código eficiente y rápido pues cada vez que se registra el evento a un componente y, en efecto, este es ejecutado por el usuario, internamente JQuery va hasta su componente más alto del DOM (el &lt;i&gt;document&lt;/i&gt;) y a partir de allí empieza a buscar el selector especificado para ejecutar la función establecida (&lt;i&gt;callback&lt;/i&gt;).&lt;br /&gt;
&lt;br /&gt;
Es por esto que surgió el método &lt;i&gt;delegate&lt;/i&gt;, el cual recibe un parámetro adicional para permitir meter en contexto el registro del evento a un componente en particular sin tener que ir hasta su componente más alto.&lt;br /&gt;
&lt;br /&gt;
Afortunadamente el método "&lt;i&gt;on&lt;/i&gt;" también cumple con esta particularidad y por tal motivo el método &lt;i&gt;delegate&lt;/i&gt; puede ser perfectamente reemplazado.&lt;br /&gt;
&lt;br /&gt;
Nuestro código se veía así:&lt;br /&gt;
&lt;pre class="brush:js" name="code"&gt;$('#tabla').delegate('td', 'click', function() {
  alert('Yeap!');
});
&lt;/pre&gt;&lt;pre class="brush:js" name="code"&gt;$('#tabla').undelegate('td', 'click');
});
&lt;/pre&gt;&lt;br /&gt;
Y ahora se deberá actualizar por:&lt;br /&gt;
&lt;pre class="brush:js" name="code"&gt;$('#tabla').on('click', 'td', function() {
  alert('Yeap!');
});
&lt;/pre&gt;&lt;pre class="brush:js" name="code"&gt;$('#tabla').off('click', 'td');
});
&lt;/pre&gt;&lt;br /&gt;
Otra de las ventajas que nos brinda la utilización del método "&lt;i&gt;on&lt;/i&gt;", es la de permitir registrar varios eventos a un mismo componente en un mismo bloque de código. Es así como podremos tener algo como:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:js" name="code"&gt;$("#tabla").on({
  click:  function() {
    alert('click!');
  },
  mouseenter: function() {
    alert('mouse!');
  }
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
Ahora que saben todo lo anterior, no esperen a actualizar su código y mejorar el rendimiento de su aplicación.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3665485405994358712-8859395562204298777?l=www.piratatobon.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PirataTobon/~4/bqf51PGQm0s" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/PirataTobon/~3/bqf51PGQm0s/lo-nuevo-de-jquery-17-eventos-onoff.html</link><author>noreply@blogger.com (Héctor Tobón)</author><thr:total>0</thr:total><feedburner:origLink>http://www.piratatobon.com/2011/11/lo-nuevo-de-jquery-17-eventos-onoff.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3665485405994358712.post-5143730100706081440</guid><pubDate>Fri, 18 Nov 2011 13:32:00 +0000</pubDate><atom:updated>2011-11-18T05:32:05.804-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Frases</category><title>Dominio piratatobon.com</title><description>Si señores... de ahora en adelante el dominio piratatobon.com apuntará a este blog.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3665485405994358712-5143730100706081440?l=www.piratatobon.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PirataTobon/~4/CqQyIGAEFXI" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/PirataTobon/~3/CqQyIGAEFXI/dominio-piratatoboncom.html</link><author>noreply@blogger.com (Héctor Tobón)</author><thr:total>0</thr:total><feedburner:origLink>http://www.piratatobon.com/2011/11/dominio-piratatoboncom.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3665485405994358712.post-5970290951927488353</guid><pubDate>Wed, 16 Nov 2011 16:10:00 +0000</pubDate><atom:updated>2011-11-16T08:10:52.537-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Wordpress</category><title>Mover entradas de una categoría a otra en Wordpress</title><description>Debido a un pequeño cambio de proyecto en mi lugar de trabajo me ha tocado lidiar con otro tipo de actividades que se alejan un poco del lenguaje JAVA. Sin embargo no dejan de ser actividades geeks relacionadas con la programación.&lt;br /&gt;
&lt;br /&gt;
Es así como me he venido enfocando un poco en la gestión de blogs con una de las plataformas más populares (por no decir la mejor)&amp;nbsp; que existe actualmente: Wordpress.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;El problema&lt;/b&gt;: &lt;br /&gt;
&lt;br /&gt;
A manera de administración y gestión de contenido, WP permite la gestión de categorías que permiten clasificar cada una de las entradas que se publican en el blog. Sin embargo, para mi caso en particular, uno de los blogs que gestiono tiene una categorización que no es la más adecuada y necesita renovarse. Es así como viene la necesidad de crear nuevas categorías, editar las existentes y eliminar algunas otras.&lt;br /&gt;
&lt;br /&gt;
Este trabajo es relativamente fácil, pues el panel de administración permite todo eso, sin embargo, no solo se deben trabajar sobre las categorías, sino también sobre cada una de las entradas que tiene el blog (para mi caso estamos hablando de casi 300 artículos publicados).&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;La solución&lt;/b&gt;:&lt;br /&gt;
Lo más obvio sería ir artículo por artículo y actualizar las categorías. Pero.... 300 artículos? tiene hue#$...&lt;br /&gt;
&lt;br /&gt;
La solución que hice es un poco más elegante y geek, y consiste en realizar el cambio directamente en la base de datos. Es así como deben correr 3 sentencias SQL por cada conjunto de entradas que quieran mover de una categoría a otra:&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Paso 1&lt;/b&gt;: Crear/identificar la nueva categoría.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Paso 2&lt;/b&gt;: Para mover todos las entradas desde la categoría vieja a la nueva debes copiar y pegar el siguiente script en tu base de datos (phpMySQLAdmin):&lt;br /&gt;
&lt;br /&gt;
Recuerda cambiar el nombre de la categoría nueva y el nombre de la categoría vieja justo en las dos lineas del script en donde se indica.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:sql" name="code" title="SQL"&gt;update wp_terms t, wp_term_taxonomy tax, wp_term_relationships tr
set tr.term_taxonomy_id = (
  select tax2.term_taxonomy_id
  from wp_term_taxonomy tax2, wp_terms t2
  where tax2.term_id = t2.term_id
  and tax2.taxonomy = "category"
--------------------------------------
  -- Escriba aquí el nombre EXACTO de la categoría nueva
  and t2.name = "nombre categoría nueva"
--------------------------------------

) 
--------------------------------------
-- Escriba aquí el nombre EXACTO de la categoría vieja
where t.name = "nombre categoría vieja"
--------------------------------------
and tax.term_id = t.term_id
and tax.taxonomy = "category"
and tr.term_taxonomy_id = tax.term_taxonomy_id;
&lt;/pre&gt;&lt;br /&gt;
&lt;b&gt;Paso 3&lt;/b&gt;: Debes actualizar los contadores para cada categoría. Tanto la vieja como la nueva. Por ende debes correr el siguiente script dos veces para cada categoría:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:sql" name="code" title="SQL"&gt;-- Update category counters
update wp_term_taxonomy tax, wp_terms t
set tax.count = (
  select cantidad from (
    select count(*) as cantidad from wp_terms t2, wp_term_taxonomy tax2, wp_term_relationships tr2
    --------------------------------------
    -- Escriba aquí el nombre EXACTO de la categoría
    where t2.name = "nombre de la categoria"
    --------------------------------------
    and tax2.term_id = t2.term_id
    and tax2.taxonomy = "category"
    and tr2.term_taxonomy_id = tax2.term_taxonomy_id
  ) as x
)
where tax.term_id = t.term_id
and tax.taxonomy = "category"
--------------------------------------
-- Escriba aquí el nombre EXACTO de la categoría
and t.name = "nombre de la categoria"
--------------------------------------
&lt;/pre&gt;&lt;br /&gt;
Y listo!&lt;br /&gt;
&lt;br /&gt;
Este es un procedimiento técnico y de mucho cuidado porque se están realizando cambios directamente en la base de datos sin la ayuda de algun plugin que evite errores humanos.&lt;br /&gt;
&lt;br /&gt;
Espero a alguien le sirva, pues a mi me sacó de aprietos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3665485405994358712-5970290951927488353?l=www.piratatobon.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PirataTobon/~4/Thq6lq0oM5M" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/PirataTobon/~3/Thq6lq0oM5M/mover-entradas-de-una-categoria-otra-en.html</link><author>noreply@blogger.com (Héctor Tobón)</author><thr:total>0</thr:total><feedburner:origLink>http://www.piratatobon.com/2011/11/mover-entradas-de-una-categoria-otra-en.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3665485405994358712.post-7700401202288154501</guid><pubDate>Fri, 08 Jul 2011 16:39:00 +0000</pubDate><atom:updated>2011-07-08T09:41:33.020-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">java</category><title>Java SE 7 - Oracle vs El Mundo</title><description>&lt;div style="text-align: center;"&gt;Hace ya bastante tiempo que no publicaba en el blog, sin embargo esta nueva noticia no debe pasar tan desapercibida.&lt;/div&gt;&lt;br /&gt;
Nuestro "querido" Oracle acaba de lanzar la nueva versión de &lt;b&gt;JAVA &lt;/b&gt;no muy aceptada por toda la comunidad (con una votación de 13 a favor y 1 en contra - adivinen quién votó en contra), debido a sus cambios en los términos de la licencia.&lt;br /&gt;
&lt;br /&gt;
Al parecer Oracle continua recibiendo inconformidad por parte de &lt;a href="http://www.apache.org/"&gt;Apache Softwre Fundation&lt;/a&gt; ya que su idea de cambio de licencia genera conflicto con el proyecto &lt;a href="http://harmony.apache.org/"&gt;Apache Harmony&lt;/a&gt;. &lt;br /&gt;
&lt;br /&gt;
Y si señores, Google fue quien NO estuvo de acuerdo con esta nueva versión pero sólo por dichos términos de licenciamiento ya que está de totalmente a favor del código fuente, según sus comentarios en la &lt;b style="color: red;"&gt;&lt;a href="http://jcp.org/en/jsr/results?id=5207"&gt;página de votación&lt;/a&gt;&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;IBM &lt;/b&gt;y &lt;b&gt;Red Hat&lt;/b&gt; votaron a favor de la nueva versión pero con algunas reservas. Ellos basan sus votos en los méritos técnicos pero IBM explica que los cambios en los términos de licencia darán pie para que terceras partes realicen modificaciones que permitirán ejercer controles restrictivos sobre la propiedad del código fuente.&lt;br /&gt;
&lt;br /&gt;
Red Hat por su parte, expresó una idea similiar al resto de votantes en donde explica que el nuevo modelo de licenciamiento debe ser abierto para toda la comunidad y debe eliminarse cualquier posibilidad para que un individuo o institución pueda jercer un control restrictivo del estándar.&lt;br /&gt;
&lt;br /&gt;
La nueva versión la podrán encontrar &lt;a href="http://jdk7.java.net/"&gt;aquí&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Algunas de las mejoras más significativas ya las comenté anteriormente en el Post "&lt;a href="http://piratatobon.blogspot.com/2009/10/jdk-7-algunas-mejoras.html"&gt;JDK 7 - Algunas Mejoras&lt;/a&gt;". Sin embargo, siempre podrán consultar la documentación &lt;a href="http://jdk7.java.net/preview/"&gt;oficial&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: right;"&gt;&lt;a href="http://www.hostingireland.ie/images/java-logo-small.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;br /&gt;
&lt;/a&gt;&lt;/div&gt;Como se habrán dado cuenta, un nuevo enemigo GEEK ha surgido. En el pasado fue IBM. Luego apareció Microsoft. Y ahora Oracle que viene con todo su poderío a acabar con nuestra más anhelada taza de café.&lt;img src="http://www.hostingireland.ie/images/java-logo-small.jpg" /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: right;"&gt;&lt;span style="font-size: x-small;"&gt;Fuente: &lt;a href="http://www.infoworld.com/d/application-development/java-se-7-gets-thumbs-standards-committee-614"&gt;InfoWorld &lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3665485405994358712-7700401202288154501?l=www.piratatobon.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PirataTobon/~4/Dnv-GuDkNG8" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/PirataTobon/~3/Dnv-GuDkNG8/java-se-7-oracle-vs-el-mundo.html</link><author>noreply@blogger.com (Héctor Tobón)</author><thr:total>1</thr:total><feedburner:origLink>http://www.piratatobon.com/2011/07/java-se-7-oracle-vs-el-mundo.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3665485405994358712.post-5018460714028057205</guid><pubDate>Wed, 28 Jul 2010 18:08:00 +0000</pubDate><atom:updated>2010-07-28T11:08:56.378-07:00</atom:updated><title>Enviar Correo desde Java Utilizando GMail</title><description>En esta oportunidad daré un ejemplo sencillo de cómo enviar un correo electrónico desde una cuenta de gmail utilizando el protocolo SMTP que este mismo soporta.&lt;br /&gt;
&lt;br /&gt;
Para el correcto funcionamiento, utilicé una librería de uso libre (desde hace relativamente poco) llamada &lt;a href="http://www.oracle.com/technetwork/java/index-jsp-139225.html"&gt;JavaMail&lt;/a&gt;. Más concretamente pueden descargarla haciendo &lt;a href="http://www.oracle.com/technetwork/java/index-138643.html"&gt;clic aquí&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Después de descargar el archivo javamail-x.x.x.zip notarán que incluye varias carpetas (demo, docs, libs). Los nombres de las carpetas se explican por si solas.&lt;br /&gt;
&lt;br /&gt;
Como solo vamos a enviar un correo, utilizaremos las librerias smtp.jar y mailapi.jar de la carpeta lib. Recuerden que dichas librerías se deben ingresar en el class-path del proyecto para poder utilizar todos sus servicios.&lt;br /&gt;
&lt;br /&gt;
Una vez realizado lo anterior, podremos implementar el siguiente código:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:java" name="code" title="Codigo"&gt;package enviarcorreo;

import java.util.Date;
import java.util.Properties;

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class EnviarCorreo {

 public static void main(String[] args) {
  String servidorSMTP = "smtp.gmail.com";
  String puerto = "587";
  String usuario = "usuario_gmail@gmail.com";
  String password = "password_gmail";
  
  String destino = "destino@correo.com";
  String asunto = "Prueba!";
  String mensaje = "Este es un mensaje de prueba.";

  Properties props = new Properties();

  props.put("mail.debug", "true");
  props.put("mail.smtp.auth", true);
  props.put("mail.smtp.starttls.enable", true);
  props.put("mail.smtp.host", servidorSMTP);
  props.put("mail.smtp.port", puerto);

  Session session = Session.getInstance(props, null);

  try {
   MimeMessage message = new MimeMessage(session);
   message.addRecipient(Message.RecipientType.TO, new InternetAddress(
     destino));
   message.setSubject(asunto);
   message.setSentDate(new Date());
   message.setText(mensaje);
   
   Transport tr = session.getTransport("smtp");
   tr.connect(servidorSMTP, usuario, password);
   message.saveChanges();   
   tr.sendMessage(message, message.getAllRecipients());
   tr.close();
   
  } catch (MessagingException e) {
   e.printStackTrace();
  }
 }
}

&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
El mismo pedazo de código podría funcionar para algún otro servidor de correo diferente de GMAIL. Pero las especificaciones de puerto, ssl, autenticación y demás podrían cambiar notablemente.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3665485405994358712-5018460714028057205?l=www.piratatobon.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PirataTobon/~4/hkDfQU_NYV4" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/PirataTobon/~3/hkDfQU_NYV4/enviar-correo-desde-java-utilizando.html</link><author>noreply@blogger.com (Héctor Tobón)</author><thr:total>0</thr:total><feedburner:origLink>http://www.piratatobon.com/2010/07/enviar-correo-desde-java-utilizando.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3665485405994358712.post-244989509963623599</guid><pubDate>Tue, 04 May 2010 19:46:00 +0000</pubDate><atom:updated>2010-05-05T06:31:53.909-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">programación</category><title>Parámetros Ilimitados en un Método</title><description>Hace rato que no actualizo este blog, y me llegaron de momento las ganas de hacerlo con un pequeño truco que imagino a muchos les va a gustar.&lt;br /&gt;&lt;br /&gt;Muchas veces nos ha sucedido (sobretodo cuando recién estamos aprendiendo JAVA), que queremos un método que reciba una cierta cantidad de parámetros de un mismo tipo y que desconocemos. Sin embargo no lo podemos hacer debido a que en la definición del método, sólo podemos expresar una cierta cantidad de parámetros, según sea nuestra necesidad.&lt;br /&gt;&lt;br /&gt;Pues bien, la solución que generalmente llevamos a cabo como principiantes es el de realizar un método por cada cantidad de parámetros acordados.&lt;br /&gt;&lt;br /&gt;Ejemplos:&lt;br /&gt;&lt;pre name="code" class="brush:java"&gt;&lt;br /&gt;public int sumar(int a, int b) {&lt;br /&gt;   return a+b;&lt;br /&gt;}&lt;br /&gt;public int sumar(int a, int b, int c) {&lt;br /&gt;   return a+b+c;&lt;br /&gt;}&lt;br /&gt;public int sumar(int a, int b, int c, int d) {&lt;br /&gt;   return a+b+c+d;&lt;br /&gt;}&lt;br /&gt;public int sumar(int a, int b, int c, int d, int e) {&lt;br /&gt;  return a+b+c+d+e;&lt;br /&gt;}&lt;br /&gt;public int sumar(int a, int b, int c, int d, int e, int f) {&lt;br /&gt;  return a+b+c+d+e+f;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Otros programadores son mucho más prácticos (y de eso se trata!), y pensarán que dicho problema podría solucionarse muy facilmente si existiese  un método que reciba por parámetro un arreglo de enteros. Así nos quitaríamos de encima la idea de tener que crear un método para cada cantidad de parámetros.&lt;br /&gt;&lt;br /&gt;Ejemplo:&lt;br /&gt;&lt;pre name="code" class="brush:java"&gt;&lt;br /&gt;public static int sumar(int[] numeros){&lt;br /&gt;  int suma = 0;&lt;br /&gt;  for(int n : numeros) suma += n;&lt;br /&gt;  return suma;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public static void main(String args[]) {&lt;br /&gt;  System.out.println(sumar(new int[]{1}));&lt;br /&gt;  System.out.println(sumar(new int[]{1, 2}));&lt;br /&gt;  System.out.println(sumar(new int[]{1, 2, 3}));&lt;br /&gt;  System.out.println(sumar(new int[]{1, 2, 3, 4}));&lt;br /&gt;  System.out.println(sumar(new int[]{1, 2, 3, 4, 5}));&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Pues bien, tienen toda la razón!... Pero para poder utilizar dicho método, deben primero declarar, inicializar e insertar los datos en un arreglo para poder utilizar el método en cuestión.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;EL "TRUCO":&lt;/span&gt;&lt;br /&gt;Aquí hay otra forma de hacerlo, y que a mi consideración, es mucho más elegante:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="brush:java"&gt;&lt;br /&gt;public static int sumar(int... numeros){&lt;br /&gt;  int suma = 0;&lt;br /&gt;  for(int n : numeros) suma += n;&lt;br /&gt;  return suma;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public static void main(String args[]) {&lt;br /&gt;  System.out.println(sumar(1));&lt;br /&gt;  System.out.println(sumar(1, 2));&lt;br /&gt;  System.out.println(sumar(1, 2, 3));&lt;br /&gt;  System.out.println(sumar(1, 2, 3, 4));&lt;br /&gt;  System.out.println(sumar(1, 2, 3, 4, 5));&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;El parámetro "numeros" se comporta también como un arreglo dentro del método.&lt;br /&gt;Además, el método está declarado de forma tal que se le pueden ingresar todos los parámetros que se deseen (del mismo tipo).&lt;br /&gt;&lt;br /&gt;Más adelante les comentaré un poco acerca de las repercusiones de utilizar este tipo de declaraciones en los métodos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3665485405994358712-244989509963623599?l=www.piratatobon.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PirataTobon/~4/TIH-dkq797k" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/PirataTobon/~3/TIH-dkq797k/parametros-ilimitados-en-un-metodo.html</link><author>noreply@blogger.com (Héctor Tobón)</author><thr:total>3</thr:total><feedburner:origLink>http://www.piratatobon.com/2010/05/parametros-ilimitados-en-un-metodo.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3665485405994358712.post-3290206933211734598</guid><pubDate>Tue, 17 Nov 2009 03:27:00 +0000</pubDate><atom:updated>2009-11-17T07:16:11.356-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">programación</category><title>Design Patterns #1</title><description>&lt;div style="text-align: justify;"&gt;Bueno, este es mi primer post en este blog, entonces voy a presentarme un poco. Soy ingeniero de sistemas e hice todos mis estudios en Suiza. Ahora trabajo en Colombia (desde hace 2 años) como investigador y supervisor de diferentes proyectos de programación. Una de las cosas que me gustan mucho en el desarrollo es la programación orientada a objetos. Y veo con gran tristeza que muchas veces los estudiantes que superviso tienen problemas con los conceptos de POO, es por eso que decidí hacer una serie de posts sobre la teoría de los patrones de diseño (Design Patterns).&lt;br /&gt;&lt;br /&gt;Los patrones de diseño son el resultado de un estudio realizado por Cristopher Alexander cuya meta era mejorar la construcción de edificios en zonas urbanas. Su línea base de pensamiento era que "Un modelo es una regla […] expresando una asociación entre un contexto, un problema y una solución". En otras palabras, un modelo es una solución a un problema en un contexto definido. Bueno no se preocupen, no voy a hablar de edificios en este blog, pero sí de la aplicación de esta teoría de los patrones de diseño en programación y aun siendo más preciso en la programación orientada a objetos.&lt;br /&gt;&lt;br /&gt;El santo grial de la programación orientada a objetos habla de hacer algoritmos reutilizables, pero cada uno de nosotros sabe que los ingenieros somos un poco holgazanes; es por esto que para ayudarnos con nuestra "pereza", existen los Design Patterns. La filosofía que vamos a seguir es la de identificar problemas recurrentes en el diseño de software y crear patrones (soluciones) genéricos que podremos aplicar en el futuro cada vez que un problema aparece.&lt;br /&gt;&lt;br /&gt;Esta manera de trabajar tiene varias ventajas:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;    Facilita la reutilización de lo que ya hemos desarrollado&lt;/li&gt;&lt;li&gt;    Facilita la comunicación entre los programadores porque tienen un vocabulario común.&lt;/li&gt;&lt;li&gt;    Mejora la documentación y el mantenimiento de nuestros programas porque sus estructuras pueden ser descritas de maneja precisa.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Pero tiene también unas desventajas:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;    El aprendizaje de estos patrones no es trivial y usarlos eficientemente es todo un arte; también se necesita una capacidad de abstracción bien desarrollada para reconocer las situaciones en las cuales se pueden usar.&lt;/li&gt;&lt;li&gt;    El costo de trabajar con patrones de diseño puede ser la multiplicación de las clases en el producto final.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Para terminar esta introducción, podríamos decir que los patrones de diseño no nos van a dar la mejor solución, pero seguramente una menos peor!&lt;br /&gt;&lt;br /&gt;Pero ya escribí mucho blablabla… Vamos a ver unos de estos famosos patrones, y para empezar, voy a escoger uno de los más fáciles de utilizar, reconocer y aprender: El Singleton!&lt;br /&gt;&lt;br /&gt;Regularmente cuando programamos, es importante que una sola instancia de una clase existiese. Por ejemplo una clase que se encargue de escuchar en un puerto en particular en una estructura cliente/servidor, o una clase que represente una ventana principal de la GUI de nuestro software.&lt;br /&gt;&lt;br /&gt;Nuestro problema es: ¿Cómo hacer para que una clase sea creada una y sólo una vez aun si el programador tiene errores en su código?&lt;br /&gt;&lt;br /&gt;La solución básica, que seria la de crear una variable global de esa clase, no mejoraría la situación porque aun así, si sólo una instancia de dicha clase existiese, no sería imposible crearla de nuevo. La solución que nos da el patron de disño Sigleton es la de dejar la responsabilidad de la creación de su instancia a la clase misma.&lt;br /&gt;&lt;br /&gt;El código java de Singleton es el siguiente (por supuesto es aplicable a cualquier lenguaje orientado a objetos):&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre name="code" class="brush:java"&gt;&lt;br /&gt;class Singleton {&lt;br /&gt;&lt;br /&gt;  private static Singleton instance;&lt;br /&gt;&lt;br /&gt;  private Singleton() { /*…*/} // constructor privado&lt;br /&gt;&lt;br /&gt;  public static Singleton getInstance() {&lt;br /&gt;&lt;br /&gt;     if (instance == null) {&lt;br /&gt;        instance = new Singleton();&lt;br /&gt;     }&lt;br /&gt;     return instance;&lt;br /&gt;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Singleton está compuesto de tres partes importantes, la instancia privada y estática de nuestra clase, el constructor privado para que no sea posible la creación de una instancia fuera de nuestra clase, y finalmente el acceso a nuestra clase vía getInstance() en cual la creación de la instancia ocurre si nunca ha ocurrido antes. Finalmente, si queremos acceder a la instancia de nuestra clase simplemente se usa la forma estática siguiente:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre name="code" class="brush:java"&gt;&lt;br /&gt;Singleton.getInstance();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Y ahí lo tenemos!, si aplicamos esta estructura a nuestras clases, no se podría crear más de una sola instancia. Lo que puede ser muy útil para el manejo de la red, de las impresoras o del GUI.&lt;br /&gt;&lt;br /&gt;Bueno bueno, este fue mi primer post sobre los Design Pattern, espero que les haya gustado. En mis próximos posts voy a analizar un poco más la teoría de los Design Pattern y presentarles otros de estos patrones.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3665485405994358712-3290206933211734598?l=www.piratatobon.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PirataTobon/~4/HePJ5zgm9MY" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/PirataTobon/~3/HePJ5zgm9MY/design-patterns-1.html</link><author>noreply@blogger.com (Louis Reymondin)</author><thr:total>0</thr:total><feedburner:origLink>http://www.piratatobon.com/2009/11/design-patterns-1.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3665485405994358712.post-6287367154880665658</guid><pubDate>Sun, 18 Oct 2009 17:54:00 +0000</pubDate><atom:updated>2009-10-27T07:48:55.100-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">programación</category><title>JDK 7 - Algunas Mejoras</title><description>&lt;span style="font-size:100%;"&gt;Próximamente aparecerá la nueva versión del compilador de Java del JDK 7.. y con ella, vendrán una serie de mejoras que para nosotros los desarrolladores nos hará la vida un poco más simple.&lt;br /&gt;&lt;br /&gt;Algunos de los cambios que traerá consigo son los siguientes:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-weight: bold;"&gt;Cadenas en el switch:&lt;/span&gt; Si, así como lo ve.... ya podremos incluir cadenas dentro de un switch y no tendrémos que limitarnos a los enteros y los char.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;Ej:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="brush:java"&gt;&lt;br /&gt;String country = input......&lt;br /&gt;switch(country) {&lt;br /&gt;case "Colombia":&lt;br /&gt;System.out.println("Bogotá");&lt;br /&gt;break;&lt;br /&gt;case "Mexico":&lt;br /&gt;System.out.println("México D.F.");&lt;br /&gt;break;&lt;br /&gt;case "Chile":&lt;br /&gt;System.out.println("Santiago de Chile");&lt;br /&gt;break;&lt;br /&gt;default:&lt;br /&gt;System.out.println("Busque en google.com");&lt;br /&gt;break;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Manejo automático de algunos recursos:&lt;/span&gt; Existen algunos recursos que deben ser gestionados por nosotros los desarrolladores para evitar que sigan consumiendo más memoria y hacer que el recolector de basura se encargue de ellos muchos más fácilmente.&lt;/li&gt;&lt;/ul&gt;Generalmente dichos recursos son gestionados mediante un bloque try-catch, permitiendo de esta forma abrir el recurso desde el bloque try y cerrarlo posteriormente desde el bloque finally.&lt;br /&gt;Sin embargo, siempre ha sido necesario la creación de un nuevo bloque try-catch justo en el momento en que invocamos el cierre del recurso "recurso.close()", generando así una redundancia de código que para programadores novatos tiende a confundir.&lt;br /&gt;&lt;br /&gt;Ahora bien, El nuevo JDK traerá consigo un nuevo formato para el try-catch en donde se permitirá crear e inicializar el objeto en el try sin tener que cerrarlo posteriormente ya que JAVA se encargará de eso solito, permitiendo enfocarnos básicamente en el proceso principal que queremos hacer y permitiendo así ahorrar gran cantidad de líneas de código.&lt;br /&gt;&lt;br /&gt;El código antes y después sería así:&lt;br /&gt;&lt;br /&gt;ANTES:&lt;br /&gt;&lt;pre name="code" class="brush:java"&gt;&lt;br /&gt;public static void main(String[] args) {&lt;br /&gt; BufferedReader lector = null;&lt;br /&gt; try {&lt;br /&gt;  lector = new BufferedReader(new FileReader("archivo.txt"));&lt;br /&gt;  String linea;&lt;br /&gt;  while ((linea = lector.readLine()) != null) {&lt;br /&gt;   System.out.println(linea);&lt;br /&gt;  }&lt;br /&gt; } catch (IOException e) {&lt;br /&gt;  System.out.println("Sucedió un problema!");&lt;br /&gt; } finally {&lt;br /&gt;  try {&lt;br /&gt;   if (lector != null) {&lt;br /&gt;    lector.close();&lt;br /&gt;   }&lt;br /&gt;  } catch (IOException e) {&lt;br /&gt;   System.out.println("No se pudo cerrar el flujo!");&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;DESPUES:&lt;br /&gt;&lt;pre name="code" class="brush:java"&gt;&lt;br /&gt;public static void main(String[] args) {&lt;br /&gt; BufferedReader lector = null;&lt;br /&gt; try (lector = new BufferedReader(new FileReader("archivo.txt"))) {&lt;br /&gt;  String linea;&lt;br /&gt;  while ((linea = lector.readLine()) != null) {&lt;br /&gt;   System.out.println(linea);&lt;br /&gt;  }&lt;br /&gt; } catch (IOException e) {&lt;br /&gt;  System.out.println("Sucedió un problema!");&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Inicialización de variables genéricas&lt;/span&gt;: La creación de variables genéricas como en las colecciones permite grandes beneficios en el desarrollo en el momento en que tengamos que utilizar dicha variable más adelante (para hacer búsquedas, inserciones, etc...) . Sin embargo, la sentencia de creación de la variable es reduntante:&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="brush:html"&gt;&lt;br /&gt;ArrayList &amp;lt;String&amp;gt; cadenas = new ArrayList&amp;lt;String&amp;gt;();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Por ende, con la nueva versión podremos inicializar la variable utilizando simplemente "&lt;&gt;" y el compilador inferirá de qué tipo tendrá en Generics.&lt;br /&gt;(Ojo! es en el momento de inicializar y no en el momento de creación)&lt;br /&gt;&lt;br /&gt;La sentencia de código quedaría así:&lt;br /&gt;&lt;pre name="code" class="brush:java"&gt;&lt;br /&gt;ArrayList &amp;lt;String&amp;gt; cadenas = new ArrayList&amp;lt;&amp;gt;();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Declaración de variables de tipo numérico:&lt;/span&gt; Java permite declarar enteros en formato decimal, hexadecimal y octal. Pero no permite la creación de variables en formato binario; por ende la nueva versión traerá consigo esta mejora más que necesaria para aplicaciones de bajo nivel.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Para crear la variable se debe utilizar el prefijo "0b".&lt;br /&gt;&lt;pre name="code" class="brush:java"&gt;&lt;br /&gt;int binario = 0b1000101010111001;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Como dato casual, la nueva versión permitirá la creación de números con literales de separación del tipo "_", de forma que permita visualmente entender de forma mucho más rápida la información que allí se encuentra.&lt;br /&gt;&lt;br /&gt;El compilador ignorará posteriormente dichos caracteres de separación y concatenará el número en uno solo:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="brush:java"&gt;&lt;br /&gt;int debitoBanco = 3056_005634_987;&lt;br /&gt;long hexadecimal = 0xFF_ED_5FE;&lt;br /&gt;int numBits = 0b10101011_01011101_10&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Colecciones y Arreglos van de la mano:&lt;/span&gt; Las colecciones podrán ser declaradas y manejadas como si fueran arreglos de objetos o de tipos básicos.&lt;/li&gt;&lt;/ul&gt;Ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="brush:java"&gt;&lt;br /&gt;ArrayList&amp;lt;Character&amp;gt; vocales = ['a', 'e', 'i', 'o', 'u'];&lt;br /&gt;&lt;br /&gt;System.out.println("La primer vocal del idioma español es: "+vocales[0]);&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3665485405994358712-6287367154880665658?l=www.piratatobon.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PirataTobon/~4/tuje_MLVCXI" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/PirataTobon/~3/tuje_MLVCXI/jdk-7-algunas-mejoras.html</link><author>noreply@blogger.com (Héctor Tobón)</author><thr:total>2</thr:total><feedburner:origLink>http://www.piratatobon.com/2009/10/jdk-7-algunas-mejoras.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3665485405994358712.post-4431995246222514127</guid><pubDate>Tue, 06 Oct 2009 20:27:00 +0000</pubDate><atom:updated>2009-10-06T14:03:26.766-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Humor</category><title>Ingenieria de Software (La Realidad)</title><description>&lt;div style="text-align: center;"&gt;&lt;img src="http://lh4.ggpht.com/_-hRtiexeGnY/SsuprcerHCI/AAAAAAAAASI/My4x6sexyGo/2drf8df.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Esta imagen ya ha dado muchas vueltas por la Internet, inclusive creo que ya muchos de ustedes la han visto....&lt;br /&gt;&lt;br /&gt;Sin embargo, he querido publicarla debido a que ha causado un gran impacto en mi. Me ha hecho pensar en muchos de los problemas que nosotros como ingenieros debemos afrontar en la vida real para llevar a cabo un apto entendimiento de cada uno de los requerimientos que tiene  un usuario cualquiera.&lt;br /&gt;&lt;br /&gt;Y es que, es de conocimiento común para todos que la ingeniería de software lleva muy poco tiempo de haberse creada... Ha partido desde un proceso histórico que comenzó desde la &lt;span style="font-weight: bold;"&gt;artesanía &lt;/span&gt;en donde talentosos programadores y aficionados utilizaban su conocimiento para crear "obras de arte" que posiblemente podrían tener un destino incierto.&lt;br /&gt;&lt;br /&gt;Paralelamente viene la simple &lt;span style="font-weight: bold;"&gt;producción &lt;/span&gt;en masa de software, que no es mas que una oleada temporal, en donde lo importante es crear material nuevo para distribuir, vender y/o compartir al mejor postor.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;A continuación aparece la &lt;span style="font-weight: bold;"&gt;comercialización &lt;/span&gt;del software (una evolución que se veía venir), en donde aparecen "artesanos" mucho mejor preparados, empiezan a crearse los primeros procedimientos en el proceso de elaboración del software, ayudados de la experiencia y los errores del pasado.&lt;br /&gt;&lt;br /&gt;Y no es mas que agradecer que es en este punto, en donde la Ingeniería de software se convierte en una &lt;span style="font-weight: bold;"&gt;Ciencia&lt;/span&gt;. La formación se vuelve mucho más mecánica, y se empiezan a establecer ciertos parámetros de interés general que ayudarán, entre otras cosas, a pasar a la Ingenería de software a lo que es hoy por hoy....... una &lt;span style="font-weight: bold;"&gt;Ingeniería Profesional&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;-.-.-.-.-.-.-.-.-.-.&lt;br /&gt;&lt;br /&gt;Como pueden ver, la ingeniería de software ha llevado (y llevará!) todo un proceso en donde las partes que la componen poseen un rol altamente importante en cada uno de los pasos del desarrollo de una aplicación. Por ende... si alguna falla (o todas..), sucederá lo que expresa  la imagen publicada.&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3665485405994358712-4431995246222514127?l=www.piratatobon.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PirataTobon/~4/ilklxSAJDBU" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/PirataTobon/~3/ilklxSAJDBU/ingenieria-de-software-la-realidad.html</link><author>noreply@blogger.com (Héctor Tobón)</author><media:thumbnail url="http://lh4.ggpht.com/_-hRtiexeGnY/SsuprcerHCI/AAAAAAAAASI/My4x6sexyGo/s72-c/2drf8df.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.piratatobon.com/2009/10/ingenieria-de-software-la-realidad.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3665485405994358712.post-1037213683475928591</guid><pubDate>Wed, 23 Sep 2009 16:34:00 +0000</pubDate><atom:updated>2009-09-23T12:16:37.121-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Frases</category><category domain="http://www.blogger.com/atom/ns#">Humor</category><title>Recursividad</title><description>&lt;div style="text-align: left; font-style: italic;"&gt;&lt;blockquote&gt;&lt;span style="font-size:180%;"&gt;       En el mundo hay dos tipos de personas: los que aprecian los chistes sobre que hay dos tipos de personas en el mundo y los que no.&lt;/span&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div style="text-align: right;"&gt;Microsiervos.com&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3665485405994358712-1037213683475928591?l=www.piratatobon.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PirataTobon/~4/GWUvf9KrjZ0" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/PirataTobon/~3/GWUvf9KrjZ0/recursividad.html</link><author>noreply@blogger.com (Héctor Tobón)</author><thr:total>0</thr:total><feedburner:origLink>http://www.piratatobon.com/2009/09/recursividad.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3665485405994358712.post-5799649800087609537</guid><pubDate>Wed, 23 Sep 2009 14:08:00 +0000</pubDate><atom:updated>2009-09-23T09:20:08.360-07:00</atom:updated><title>Guardar Objeto en Archivo Comprimido</title><description>En muchas ocasiones nos hemos visto en la necesidad de guardar información en archivos básicos, ya sea porque la información que queremos salvar no es tan grande y compleja como para darse el lujo de utilizar una base de datos, o porque los requerimientos del software así lo solicitan.&lt;br /&gt;&lt;br /&gt;De todas formas, siempre es bueno saber que existen diferentes opciones para guardar la información en archivos. Una de las más usadas es utilizando la clase ObjectOutputStream para guardar toda la información de un determinado objeto y de esta forma no tener que preocuparnos por la forma como se guardará el archivo.&lt;br /&gt;&lt;br /&gt;En fin... No voy a explicar en detalle cómo se guarda un archivo en el disco duro utilizando java. Lo que pienso explicar es la forma como se debe hacer si queremos escribir el mismo archivo de forma comprimida para que no nos ocupe mucho espacio en el disco.&lt;br /&gt;&lt;br /&gt;Para lo anterior, vamos a necesitar el paquete java.util.zip, en donde se encuentran más específicamente las clases GZIPInputStream y GZIPOutputStream.&lt;br /&gt;&lt;br /&gt;El ejemplo básico que describiré, consistirá en un método para escribir que recibirá por parámetro un File (correspondiente al archivo en donde voy a guardar la información) y un objeto de tipo Object (correspondiente a la información que se va a guardar); y retorna un booleano que  el metodo se llevó a cabo de forma correcta o no.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;-------- GUARDANDO EL ARCHIVO ----------&lt;/code&gt;&lt;br /&gt;&lt;pre name="code" class="brush:java"&gt;&lt;br /&gt;public boolean guardarArchivo(File archivoNuevo, Object objeto) {&lt;br /&gt;try {&lt;br /&gt;  if (archivoNuevo.isFile()) {&lt;br /&gt;   FileOutputStream fos = new FileOutputStream(archivoNuevo);&lt;br /&gt;   GZIPOutputStream gz = new GZIPOutputStream(fos);&lt;br /&gt;   ObjectOutputStream oos = new ObjectOutputStream(gz);&lt;br /&gt;   oos.writeObject(objeto);&lt;br /&gt;   oos.flush();&lt;br /&gt;   oos.close();&lt;br /&gt;   gz.close();&lt;br /&gt;   fos.close();&lt;br /&gt;   System.out.println("Archivo Guardado con éxito: " + archivoNuevo.getAbsolutePath());&lt;br /&gt;   return true;&lt;br /&gt;  }&lt;br /&gt;} catch(FileNotFoundException e) {&lt;br /&gt; System.out.println("No se encontró el archivo");&lt;br /&gt; return false;&lt;br /&gt;} catch(IOException e) {&lt;br /&gt; System.put.println("Hubo algún problema con la escritura del archivo");&lt;br /&gt; return false;&lt;br /&gt;}&lt;br /&gt;  return false;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Generalmente lo que se hace es abrir un flujo de escritura directo al archivo utilizando la clase FileOutputStream.&lt;br /&gt;A su vez, se abre un flujo encargado de la compresión (GZipOutputStream) y que escribirá directamente sobre el flujo de anterior.&lt;br /&gt;Y a continuación se abre un flujo de escritura de objetos (ObjectOutputStream) que se encargará de reconocer el objeto a guardar.&lt;br /&gt;&lt;br /&gt;Me tomé la libertad de crear un gráfico para que puedan entender el proceso mucho mejor:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_-hRtiexeGnY/SrpHC65-zRI/AAAAAAAAAQA/mwVzVjYfD6s/s1600-h/Flujos.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 454px; height: 116px;" src="http://2.bp.blogspot.com/_-hRtiexeGnY/SrpHC65-zRI/AAAAAAAAAQA/mwVzVjYfD6s/s400/Flujos.PNG" alt="" id="BLOGGER_PHOTO_ID_5384694419972607250" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;De la misma forma pero en sentido contrario se debe realizar el método para leer el objeto de dicho archivo:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;-------- LEYENDO EL ARCHIVO ----------&lt;/code&gt;&lt;br /&gt;&lt;pre name="code" class="brush:java"&gt;&lt;br /&gt;public Object leerArchivo(File archivo) {&lt;br /&gt;  try {&lt;br /&gt;  if (archivo.exists() &amp;amp;&amp;amp; archivo.isFile() &amp;amp;&amp;amp; archivo.canRead()) {&lt;br /&gt;   FileInputStream fis = new FileInputStream(archivo);&lt;br /&gt;   GZIPInputStream gz = new GZIPInputStream(fis);&lt;br /&gt;   ObjectInputStream ois = new ObjectInputStream(gz);&lt;br /&gt;   Object objeto = ois.readObject();&lt;br /&gt;   ois.close();&lt;br /&gt;   gz.close();&lt;br /&gt;   fis.close();&lt;br /&gt;   System.out.println("Archivo leido con éxito: " + archivoNuevo.getAbsolutePath());&lt;br /&gt;                       return objeto;&lt;br /&gt;   return true;&lt;br /&gt;  }&lt;br /&gt;  } catch(FileNotFoundException e) {&lt;br /&gt;      System.out.println("No se encontró el archivo");&lt;br /&gt;      return null;&lt;br /&gt;  } catch(IOException e) {&lt;br /&gt;      System.put.println("Hubo algún problema con la lectura del archivo");&lt;br /&gt;      return null;&lt;br /&gt;  } catch(ClassNotFoundException e) {&lt;br /&gt;      System.out.println("No se pudo realizar el cast con éxito");&lt;br /&gt;      return null;&lt;br /&gt;  }&lt;br /&gt;  return null;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;El proceso de lectura sería entonces así:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_-hRtiexeGnY/SrpJ1uF-bwI/AAAAAAAAAQI/TzKOgnAgj5c/s1600-h/FlujosLectura.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 429px; height: 109px;" src="http://1.bp.blogspot.com/_-hRtiexeGnY/SrpJ1uF-bwI/AAAAAAAAAQI/TzKOgnAgj5c/s400/FlujosLectura.JPG" alt="" id="BLOGGER_PHOTO_ID_5384697491729837826" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Listo, eso es todo. Espero este tipo de utilidades sirva de algo en algún proyecto futuro.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3665485405994358712-5799649800087609537?l=www.piratatobon.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PirataTobon/~4/wJJNjx4a_pM" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/PirataTobon/~3/wJJNjx4a_pM/guardar-objeto-en-archivo-comprimido.html</link><author>noreply@blogger.com (Héctor Tobón)</author><media:thumbnail url="http://2.bp.blogspot.com/_-hRtiexeGnY/SrpHC65-zRI/AAAAAAAAAQA/mwVzVjYfD6s/s72-c/Flujos.PNG" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.piratatobon.com/2009/09/guardar-objeto-en-archivo-comprimido.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3665485405994358712.post-5143733306972820139</guid><pubDate>Thu, 03 Sep 2009 21:01:00 +0000</pubDate><atom:updated>2009-09-03T14:23:50.842-07:00</atom:updated><title>Aumentar tamaño de la maquina virtual de Java</title><description>&lt;span&gt;No les ha sucedido alguna vez que se encuentran desarrollando un algoritmo y de un momento a otro aparece un dichosa excepción:&lt;br /&gt;&lt;br /&gt;Exception in thread "main" java.lang.OutOfMemoryError: Java heap space&lt;br /&gt;&lt;br /&gt;.... Pues esto sucede debido a que Java no trabaja directamente con toda la memoria RAM de tu pc, que aunque podría llegar a ser de 2, 4 u 8GB, igual no está configurado para trabajar con tanto.&lt;br /&gt;&lt;br /&gt;Realmente lo que sucede es que el sistema operativo, le asigna un pedazo de memoria RAM para que JAVA pueda ser ejecutado en la máquina virtual de java (JVM - Java Virtual Machine). Para ser más precisos, en mi caso apenas tiene asignado 63.5MB ó 64MB tal cual como lo especifica JAVA.&lt;br /&gt;&lt;br /&gt;Es decir que si ejecuto la siguiente sentencia de códio (si lo hacen ustedes, también puede que les suceda lo mismo), me aparecerá la susodicha excepción:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="brush:java"&gt;&lt;br /&gt;package pruebas;&lt;br /&gt;public class PruebaDeMemoria {&lt;br /&gt;public static void main(String[] args) {&lt;br /&gt;int[][] matrizExagerada = new int[2000000][100];&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Para solucionar el inconveniente, existe un argumento llamado -Xmx&lt;size&gt; que cambia el tamaño utilizado en la memoria.&lt;br /&gt;&lt;br /&gt;Para hacerlo efectivo en eclipse, nos dirigimos a:&lt;br /&gt;Menú - Run/Run Configurations y en la pestaña (x)=Arguments nos situamos en el area de texto "VM arguments:" y escribimos cualquiera de las siguientes entradas:&lt;br /&gt;&lt;/size&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;size&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;-Xmx128m&lt;br /&gt;- Xmx256m&lt;br /&gt;-Xmx2000m&lt;br /&gt;-Xmx2g&lt;br /&gt;etc...&lt;br /&gt;&lt;/code&gt;&lt;/size&gt;&lt;/span&gt;&lt;span&gt;&lt;size&gt;&lt;/size&gt;&lt;/span&gt;&lt;span&gt;&lt;size&gt;&lt;br /&gt;&lt;br /&gt;en donde m (Megabytes) y g (GigaBytes).&lt;br /&gt;&lt;br /&gt;Luego dan clic en el botón Aplicar (Apply), y corren el algoritmo.&lt;br /&gt;Si cometieron algun error en la sentencia del argumento, les aparecerá el siguiente error:&lt;/size&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;size&gt;&lt;br /&gt;&lt;br /&gt;"&lt;/size&gt;&lt;/span&gt;&lt;code style="color: rgb(255, 0, 0);"&gt;Could not create the Java virtual machine.&lt;/code&gt;"&lt;br /&gt;&lt;br /&gt;Bueno.... eso es todo... espero este pequeño y simple truco los saque de algún aprieto mientras están desarrollando.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3665485405994358712-5143733306972820139?l=www.piratatobon.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PirataTobon/~4/wf3EC2h_xG8" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/PirataTobon/~3/wf3EC2h_xG8/aumentar-tamano-de-la-maquina-virtual.html</link><author>noreply@blogger.com (Héctor Tobón)</author><thr:total>0</thr:total><feedburner:origLink>http://www.piratatobon.com/2009/09/aumentar-tamano-de-la-maquina-virtual.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3665485405994358712.post-3354545825930874014</guid><pubDate>Mon, 31 Aug 2009 15:42:00 +0000</pubDate><atom:updated>2009-09-12T19:51:59.464-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">programación</category><title>JButton soporta HTML (Saltos de linea!)</title><description>Esta es una de las curiosidades que llaman la atención y que muy posiblemente no enseñan en los cursos básicos de programación gráfica con swing.&lt;br /&gt;&lt;br /&gt;Muchas veces nos ha interesado crear saltos de línea en los botones de Java. Sin embargo hemos visto que el texto no soporta los comandos básicos de salto de línea como "\n" ó "\r".&lt;br /&gt;&lt;br /&gt;La solución es muy sencilla. Los componentes JButton, así como los JLabel, así como muchos otros componentes del paquete javax.swing soportan HTML.&lt;br /&gt;&lt;br /&gt;Es decir que si queremos hacer uso de un salto de línea, lo único que debemos hacer es utilizar la etiqueta \&lt;br\&gt;.&lt;br /&gt;&lt;br /&gt;Ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;/br\&gt;&lt;div style="text-align: center;"&gt;&lt;br\&gt;Antes.java&lt;/br\&gt;&lt;br /&gt;&lt;br\&gt;&lt;/br\&gt;&lt;/div&gt;&lt;br\&gt;&lt;br /&gt;&lt;/br\&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_-hRtiexeGnY/SpwVHNBe0yI/AAAAAAAAAPw/Ea5_aKQTlms/s1600-h/antes.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 200px; height: 100px;" src="http://1.bp.blogspot.com/_-hRtiexeGnY/SpwVHNBe0yI/AAAAAAAAAPw/Ea5_aKQTlms/s320/antes.PNG" alt="" id="BLOGGER_PHOTO_ID_5376195268672672546" border="0" /&gt;&lt;/a&gt;&lt;br\&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="brush:java:nogutter"&gt;&lt;br /&gt;import java.awt.Dimension;&lt;br /&gt;import javax.swing.JButton;&lt;br /&gt;import javax.swing.JFrame;&lt;br /&gt;import javax.swing.JPanel;&lt;br /&gt;&lt;br /&gt;public class Antes extends JFrame {&lt;br /&gt;public static void main(String[] args) {&lt;br /&gt;   Antes v = new Antes();&lt;br /&gt;   v.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);&lt;br /&gt;   v.setSize(new Dimension(200, 100));&lt;br /&gt;   JPanel panel = new JPanel();&lt;br /&gt;   v.getContentPane().add(panel);&lt;br /&gt;   JButton boton = new JButton("Hola Mundo");&lt;br /&gt;   panel.add(boton);&lt;br /&gt;   v.setVisible(true);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/br\&gt;&lt;div style="text-align: center;"&gt;&lt;br\&gt;Despues.java&lt;/br\&gt;&lt;br /&gt;&lt;br\&gt;&lt;/br\&gt;&lt;/div&gt;&lt;br\&gt;&lt;br /&gt;&lt;/br\&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_-hRtiexeGnY/SpwU_JBJkQI/AAAAAAAAAPo/NO6ngH6uXJQ/s1600-h/despues.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 200px; height: 100px;" src="http://4.bp.blogspot.com/_-hRtiexeGnY/SpwU_JBJkQI/AAAAAAAAAPo/NO6ngH6uXJQ/s320/despues.PNG" alt="" id="BLOGGER_PHOTO_ID_5376195130158584066" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br\&gt;&lt;br /&gt;&lt;pre name="code" class="brush:java"&gt;&lt;br /&gt;import java.awt.Dimension;&lt;br /&gt;import javax.swing.JButton;&lt;br /&gt;import javax.swing.JFrame;&lt;br /&gt;import javax.swing.JPanel;&lt;br /&gt;&lt;br /&gt;public class Despues extends JFrame {&lt;br /&gt;public static void main(String[] args) {&lt;br /&gt;Despues v = new Despues();&lt;br /&gt;v.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);&lt;br /&gt;v.setSize(new Dimension(200, 100));&lt;br /&gt;JPanel panel = new JPanel();&lt;br /&gt;v.getContentPane().add(panel);&lt;br /&gt;JButton boton = new JButton("&lt;"+"html"+"&gt;Hola&lt;"+"br"+"&gt;Mundo+"&lt;!--"+"html"+"--&gt;");&lt;br /&gt;panel.add(boton);&lt;br /&gt;v.setVisible(true);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;NOTA: Me tocó que separar la cadena debido a un problema de edición en el editor de entradas del blog... ustedes sientanse libres de organizar la cadena como mejor lo consideren.&lt;br /&gt;&lt;br /&gt;También puede realizar el formato de texto utilizando otras etiquetas del lenguaje HTML. Pero recuerden no extralimitarse ya que hay etiquetas que no se soportan.&lt;/br\&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3665485405994358712-3354545825930874014?l=www.piratatobon.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PirataTobon/~4/vlMPMGx5YZc" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/PirataTobon/~3/vlMPMGx5YZc/jbutton-soporta-html-saltos-de-linea.html</link><author>noreply@blogger.com (Héctor Tobón)</author><media:thumbnail url="http://1.bp.blogspot.com/_-hRtiexeGnY/SpwVHNBe0yI/AAAAAAAAAPw/Ea5_aKQTlms/s72-c/antes.PNG" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.piratatobon.com/2009/08/jbutton-soporta-html-saltos-de-linea.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3665485405994358712.post-8988577102259707530</guid><pubDate>Mon, 31 Aug 2009 02:56:00 +0000</pubDate><atom:updated>2009-08-30T21:44:23.256-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Humor</category><title>Uno nunca se imagina! (Version Geek) - Parte 1</title><description>&lt;span style="font-family:trebuchet ms;"&gt;Así como dice el post "Uno nunca se imagina!".... y es verdad.... uno nunca se imagina con las frases, afirmaciones, hipotesis ó yo no sé cómo más llamarlo... de algunas personas ajenas al ámbito de la tecnología que pasan por ingenuas (en el mejor sentido de la palabra) y creen conocerlo todo.. Pero que pasan por inocentes frente a personas que a sabiendas conocen muy bien del tema.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;He aquí algunos ejemplos:&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:trebuchet ms;font-size:78%;"  &gt;&lt;span style="font-style: italic;"&gt;NOTA:&lt;/span&gt; Los nombres publicados entre paréntesis corresponden a las personas que publicaron la frase, más no a las que la dijeron.&lt;/span&gt;&lt;br /&gt;&lt;ul  style="font-family:trebuchet ms;"&gt;&lt;li&gt;Cómo pongo los números en mayúscula?&lt;br /&gt;&lt;span style="font-size:78%;"&gt;(Quano)&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;¿En qué parte del teclado están los números romanos?&lt;br /&gt;&lt;span style="font-size:78%;"&gt;(healejandro)&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;¿Qué reproductor tengo que bajar para ver un .torrent?&lt;br /&gt;&lt;span style="font-size:78%;"&gt;(Bram Cohen)&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Buenas tardes, ¿Me puede hacer una impresión?&lt;br /&gt;&lt;span style="font-size:78%;"&gt;(julio)&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;"no sé qué pasa, cada que me meto a mi mail está vacío". Era mi tía, cada que quería entrar a su mail le picaba en registrar y creaba uno nuevo.&lt;br /&gt;&lt;span style="font-size:78%;"&gt;(diego)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Fui a cambiar un monitor a una compañera de trabajo y me dijo que por favor guardara los iconos del escritorio que eran importantes ya que al cambiar el monitor iba a perder todos los archivos que tenía ahí.&lt;br /&gt;&lt;span style="font-size:78%;"&gt;(javielinux)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Persona: Mi nueva laptop esta muy lenta.&lt;br /&gt;Yo: En serio? cuales son las especificaciones de tu laptop&lt;br /&gt;Persona: Dell Vostro&lt;br /&gt;&lt;span style="font-size:78%;"&gt;(Yoshira)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Linda Niña: Tengo clase de logaritmos I....&lt;br /&gt;Yo: mmm.... una nueva materia? lol&lt;br /&gt;&lt;span style="font-size:78%;"&gt;(Héctor)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Le he cambiado el kernel a windows ME para que vaya mejor. Le he puesto el kernel de windows 2000.&lt;br /&gt;&lt;span style="font-size:78%;"&gt;(javiferrer)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Este es bueno:&lt;br /&gt;"Normalmente si los cables llevan curvas pronunciadas al derrapar los bits salen disparados del cable; y nada mas pensar que los cables que enlazan con dos alturas, los bits al ver el vacio se aggaran al cable para no caer mas rapido y crean embotellamientos"&lt;br /&gt;&lt;span style="font-size:78%;"&gt;(Fran)&lt;/span&gt;&lt;br /&gt;- Qué man tan inteligente!&lt;/li&gt;&lt;li&gt;Amigo : Si diego, yo tengo Windows gratis…&lt;br /&gt;Yo    : …?&lt;br /&gt;Amigo : Si claro, lo baje del ares, es gratis !&lt;br /&gt;Yo    : JUA JUA JUA&lt;br /&gt;&lt;span style="font-size:78%;"&gt;(diego)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;- mira con el msg plus ya puedes mandar mensajes de voz.&lt;br /&gt;- si, pero tengo el micro desconectado.&lt;br /&gt;- no! si con el plus ya no hace falta micro.&lt;br /&gt;&lt;span style="font-size:78%;"&gt;(Marta)&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;PROFESOR: "Ahora, para cerrar cualquier ventana de windows damos a la X, como hemos hecho siempre"&lt;br /&gt;ALUMNA: " ¡¡A mi no me funciona!! Por mas que le doy a la TECLA X, no cierra la ventana".&lt;br /&gt;&lt;span style="font-size:78%;"&gt;(RinCEWinG)&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;- Sí, es que yo tengo en la cuenta de correo un mail (a saber cuál) en el que tengo un zip que contiene los datos.&lt;br /&gt;&lt;span style="font-size:78%;"&gt;(Antonio)&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;ella- menudo lio con el C! por fin hoy me he enterado de algo&lt;br /&gt;yo  -- y eso?&lt;br /&gt;ella- que siempre que el profesor hablaba de "C" pensaba que se referia al c: (unidad de disco)&lt;br /&gt;yo  -- stack overflow!&lt;br /&gt;&lt;span style="font-size:78%;"&gt;(zakariax)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;La hermana de mi compañera de curro:  "No, yo tengo que comprarme un MAC pq internet va más deprisa…"&lt;/p&gt; &lt;p&gt;La misma persona: "Si levanto el portatil y lo balanceo va más deprisa" (acaso hace que el disco gire a más rpm o qué¿?¿?)&lt;br /&gt;&lt;span style="font-size:78%;"&gt;(pollito)&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;" ¿Cuántos Gigas són 6 onzas? "&lt;br /&gt;&lt;span style="font-size:78%;"&gt;(DrK)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;¿Me puedes grabar Internet en un disquete?&lt;br /&gt;¿Donde está la tecla ANY? (press any key)&lt;br /&gt;&lt;span style="font-size:78%;"&gt;(ramix)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;-¿Qué ordenador tienes?&lt;br /&gt;-¿Yo?, un Windows&lt;br /&gt;&lt;span style="font-size:78%;"&gt;(joses)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Méteme aquí el windo sp gratuíto, que yo soy cliente de hace tiempo y ya me metieron el 96 gratis hace tiempo&lt;br /&gt;&lt;span style="font-size:78%;"&gt;(Sparda)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Si grabas un cd a 2x no podras leerlo a 4x o mas. Es IMPOSIBLE!&lt;br /&gt;&lt;span style="font-size:78%;"&gt;(c0nd0r)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;"¿Es verdad que existe un virus que te hace explotar el monitor?" Att: sic&lt;br /&gt;&lt;span style="font-size:78%;"&gt;(eVeR)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;En una empresa de software cercana a usted:&lt;br /&gt;Desarrollador Senior -si claro, aquí reutilizamos el código&lt;br /&gt;Desarrollador Junior -y que metodos o software usan?&lt;br /&gt;Senior -pues lo copiamos con ctrl+c y lo pegamos con ctrl+v&lt;br /&gt;&lt;span style="font-size:78%;"&gt;(gootvo)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Estudiante: "Pues me llevaré el visual studio a casa" y se copió el acceso directo del escritorio en un disquete de 3.5!!!&lt;br /&gt;&lt;span style="font-size:78%;"&gt;(Rebel Jack)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;- La impresora no me imprime correctamente.&lt;br /&gt;- Es en color?&lt;br /&gt;- No, es blanca.&lt;br /&gt;&lt;span style="font-size:78%;"&gt;(Kurdt)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;En el trabajo hace como 2 meses:&lt;br /&gt;"una pregunta, osea que puedo escuchar musica y usar word al mismo tiempo???"&lt;br /&gt;&lt;span style="font-size:78%;"&gt;(kaeltas)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;"Que es mejor un Pentium4 o Window???"&lt;br /&gt;&lt;span style="font-size:78%;"&gt;(rparrakipax)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;- Denme un USB.&lt;br /&gt;- Yo: Aqui esta&lt;br /&gt;- mmmm, en donde coloco los audifonos??&lt;br /&gt;&lt;span style="font-size:78%;"&gt;(Maquivex)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;- ¿Donde puedo descargas mas ram? (Foro de hardware)&lt;br /&gt;&lt;span style="font-size:78%;"&gt;(Wizard-raz)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;No encuentro el Crack para Ubuntu?&lt;br /&gt;&lt;span style="font-size:78%;"&gt;(Javier)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Mi 'Mazinger' no funciona....... (O será messenger)&lt;br /&gt;&lt;span style="font-size:78%;"&gt;(Marco_A)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;¿para conectarme a una red inalámbrica hace falta una tarjeta de red?, ¿pues no que es inlámbrica?&lt;br /&gt;&lt;span style="font-size:78%;"&gt;(Marco_A)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;¿Cómo se hace copiar y pegar en el Word? Es que el Word no lo uso mucho. Si fuera el Excel, sí que sé. Que soy experto.&lt;br /&gt;&lt;span style="font-size:78%;"&gt;(Carlos)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;-¿Cómo puedo hacer para conectar dos internets?:S&lt;br /&gt;&lt;span style="font-size:78%;"&gt;(joseluys)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;-JOSE, MI CORREO NO SE MUESTRA.&lt;br /&gt;-A ver métete que vea si tienes algún problema.&lt;br /&gt;Y fue y, en la barra de direcciones escribió &lt;a href="http://www%2E@hotmail.com/" rel="nofollow"&gt;http://www.@hotmail.com&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;(joseluys)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;"El Virus se comió el antivirus, ¿puedes venir a ponerlo de nuevo?"&lt;br /&gt;&lt;span style="font-size:78%;"&gt;(Dorvax)&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Es todo por el momento... Estaré escribiendo más partes en un futuro.....&lt;br /&gt;&lt;br /&gt;Ah... como bonus les dejo esta perlita:&lt;br /&gt;&lt;br /&gt;Una de estas molestas llamadas de teléfono (en mi caso Telefónica) para ofrecerte más y mejor internet en banda ancha:&lt;br /&gt;-Nosotros le ofrecemos más velocidad desde el primer día y no tendrá que hacer nada. En cuanto le mandemos el router podrá conectarlo y navegar.&lt;br /&gt;(y yo que soy un poco perra)&lt;br /&gt;-Ya, pero usteded cree que el router funcionará en mi Ubuntu?&lt;br /&gt;-Sí, sí. Nosotros damos soporte técnico para Windowns en todas sus versiones.&lt;br /&gt;-Ya, bueno, pero yo no tengo un windows.&lt;br /&gt;-También damos soporte para todos los Machintos.&lt;br /&gt;-Yo tengo Ubuntu. En un GNU/Lin…&lt;br /&gt;-Como ya le he dicho damos soporte para TODOS LOS WINDOWS: (aquí se pone a enumerar) windows xp, windows ME, windows 2000, windows vista…&lt;br /&gt;-Y Ubuntu?&lt;br /&gt;-Sí, también windows Ubuntu.&lt;br /&gt;(Arilena)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Vía: &lt;a href="http://mundogeek.net/"&gt;MundoGeek&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3665485405994358712-8988577102259707530?l=www.piratatobon.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PirataTobon/~4/_EzzVMZb67E" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/PirataTobon/~3/_EzzVMZb67E/uno-nunca-se-imagina-version-geek-parte.html</link><author>noreply@blogger.com (Héctor Tobón)</author><thr:total>1</thr:total><feedburner:origLink>http://www.piratatobon.com/2009/08/uno-nunca-se-imagina-version-geek-parte.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3665485405994358712.post-5589482912711111864</guid><pubDate>Tue, 25 Aug 2009 21:00:00 +0000</pubDate><atom:updated>2009-08-25T14:06:43.344-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Humor</category><title>Diferencias entre un arquitecto y un programador</title><description>&lt;span style="font-family:georgia;"&gt;En un rato de ocio, me leí un texto de un &lt;/span&gt;&lt;a style="font-family: georgia;" href="http://mundogeek.net/"&gt;blog&lt;/a&gt;&lt;span style="font-family:georgia;"&gt; que me llamó mucho la atención&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;¿Qué pasaría si un arquitecto trabajara como lo tiene que hacer un desarrollador de software?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;Bueno... aquí les dejo un texto que simula en términos generales a lo que me refiero en la pregunta anterior:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;p&gt;Estimado Sr. Arquitecto:&lt;/p&gt; &lt;p&gt;Por favor diseñe y construya una casa para mi. No estoy muy seguro de lo que necesito, asi que tendrá que usar su imaginación. Mi casa debería tener entre dos y cuarenta y cinco dormitorios. Simplemente asegurese de que todo esté pensado de forma que sea sencillo añadir o quitar dormitorios. Cuando me traiga los modelos, tomaré la decisión sobre lo que quiero. Además, traigame un resumen de los costes para cada configuración de manera que pueda elegir una de ellas de manera arbitraria.&lt;span id="more-370"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;Tenga en cuenta que la nueva casa debe costar bastante menos que la casa en la que estoy viviendo ahora. Pero asegurese, de todas formas, de que corrige todas las deficiencias que existen en mi casa actual (el suelo de la cocina vibra cuando ando por el, y las paredes no tienen suficiente aislamiento).&lt;/p&gt; &lt;p&gt;Mientras diseña, tenga en cuenta que quiero mantener los costes de mantenimiento lo mas bajos posibles. Esto significará la incorporación de materiales mas costosos como el aluminio, la fibra de vidrio o el vinilo. (Si elige no considerar el aluminio, preparese para explicar su decisión en todo detalle.)&lt;/p&gt; &lt;p&gt;Por favor asegurese de que se utilicen las prácticas mas modernas de diseño y lo último de lo último en materiales a la hora de construir la casa, ya que deseo poder presumir de haber utilizado las mas actuales ideas y métodos. Tenga en cuenta, de todas formas, que la cocina debería diseñarse para acomodar, entre otras cosas, mi nevera Gibson del 52.&lt;/p&gt; &lt;p&gt;Para asegurarse de que esté construyendo la casa de manera correcta para toda la familia, contacte con cada uno de mis hijos e hijas, y también con mis nueros y nueras. Mi suegra tendrá también bastantes cosas que decir sobre como debería diseñarse la casa, ya que nos visita al menos una vez al año. Asegurese de que considera cada una de las opciones que le propongan cuidadosamente y asegurese también de elegir la decisión acertada. Yo, de cualquier forma, siempre tendré la última palabra y podré rectificar cualquier elección que tome.&lt;/p&gt; &lt;p&gt;Por favor no me moleste con los pequeños detalles de momento. Su trabajo es desarrollar una idea general del diseño de la casa: captar la idea. Este momento, por ejemplo, no es el apropiado para elegir el color de la alfombra.&lt;/p&gt; &lt;p&gt;En cualquier caso, recuerde que a mi esposa le gusta el azul.&lt;/p&gt; &lt;p&gt;Además, no se preocupe aún de adquirir los materiales necesarios para construir la casa. Su prioridad es la de desarrollar planos detallados y especificaciones. De todas formas, una vez que yo apruebe esos planos, espero que la casa esté construida en 48 horas.&lt;/p&gt; &lt;p&gt;Aunque esté diseñando esta casa especificamente para mí, tenga en cuenta que antes o después tendré que venderla a otra persona. De manera que debería ser atrayente para una gran variedad de compradores potenciales. Por favor asegurese antes de que finalice los planos de que halla un consenso sobre las características de la casa entre la población de la zona. Le aconsejo que eche un vistazo a la casa que mi vecino se construyó el año pasado. Nos encanta. Tiene bastantes características que también queremos en nuestra nueva casa, especialmente la piscina de 75 pies. Aplicando la ingeniería de manera cuidadosa, creo que no tendrá dificultades en añadirlo al diseño final sin que tenga ningún impacto en el coste.&lt;/p&gt; &lt;p&gt;Por favor prepare un conjunto completo de modelos. No es necesario por ahora que prepare el diseño real, dado que solo queremos los modelos para calcular los costes de la obra. Tenga en cuenta, de todas formas, que usted será el responsable de cualquier incremento en el precio debido a cambios posteriores en el diseño.&lt;/p&gt; &lt;p&gt;¡Debería estar emocionado por trabajar en un proyecto tan interesante como este! Poder utilizar las últimas técnicas y materiales y el que le den tanta libertad en sus diseños es algo que no ocurre muy amenudo. Contacte conmigo tan pronto como sea posible con una lista completa de sus ideas y sus planes.&lt;/p&gt; &lt;p&gt;Postdata: Mi esposa acaba de decirme que no está de acuerdo con algunas de las instrucciones que le doy en esta carta. Como arquitecto, es su responsabilidad el resolver estas diferencias entre mi esposa y yo. Yo ya lo he intentado en el pasado y fui incapaz de conseguirlo. Si no puede hacer frente a esta responsabilidad, tendré que contratar a otro arquitecto.&lt;/p&gt; &lt;p&gt;PostPostdata: Quizás lo que necesite ni tan si quiera sea una casa, sino una caravana. Por favor aconsejeme lo mas pronto posible si ese es el caso..&lt;/p&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3665485405994358712-5589482912711111864?l=www.piratatobon.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PirataTobon/~4/zlKeRFlUwcU" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/PirataTobon/~3/zlKeRFlUwcU/diferencias-entre-un-arquitecto-y-un.html</link><author>noreply@blogger.com (Héctor Tobón)</author><thr:total>0</thr:total><feedburner:origLink>http://www.piratatobon.com/2009/08/diferencias-entre-un-arquitecto-y-un.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3665485405994358712.post-5971237975386092005</guid><pubDate>Mon, 24 Aug 2009 13:28:00 +0000</pubDate><atom:updated>2009-08-24T07:34:43.760-07:00</atom:updated><title>JAVA Juega Mario Bross</title><description>El video que verán a continuación, hace referencia a un proyecto que consiste en crear un script que juegue solito el dichoso y conocido juego de Mario Bross.&lt;br /&gt;&lt;br /&gt;Es interesante saber que la tecnología está llegando a puntos que nunca habíamos imaginado. Y esta muestra describe la capacidad y la genialidad del ser humano para llevar a cabo cada una de sus metas.&lt;br /&gt;&lt;br /&gt;Las lineas en color rojo son los posibles caminos que el script de JAVA debe gestionar para tomar la mejor decisión.&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/DlkMs4ZHHr8&amp;color1=0xb1b1b1&amp;color2=0xcfcfcf&amp;hl=en&amp;feature=player_embedded&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/DlkMs4ZHHr8&amp;color1=0xb1b1b1&amp;color2=0xcfcfcf&amp;hl=en&amp;feature=player_embedded&amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Este otro video muestra el mismo script haciendo que Mario Bross siga el puntero del mouse.&lt;br /&gt;(Algo curioso he impresionante a mi consideración).&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/qYluZRwrw9w&amp;color1=0xb1b1b1&amp;color2=0xcfcfcf&amp;hl=en&amp;feature=player_embedded&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/qYluZRwrw9w&amp;color1=0xb1b1b1&amp;color2=0xcfcfcf&amp;hl=en&amp;feature=player_embedded&amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;via &lt;a href="http://www.arturogoga.com/2009/08/14/un-script-de-pc-juega-super-mario-por-su-cuenta/"&gt;arturogoga&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3665485405994358712-5971237975386092005?l=www.piratatobon.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PirataTobon/~4/SnlcpsgqPrw" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/PirataTobon/~3/SnlcpsgqPrw/java-juega-mario-bross.html</link><author>noreply@blogger.com (Héctor Tobón)</author><thr:total>0</thr:total><enclosure url="http://www.youtube.com/v/DlkMs4ZHHr8&amp;color1=0xb1b1b1&amp;color2=0xcfcfcf&amp;hl=en&amp;feature=player_embedded&amp;fs=1" length="1163" type="application/x-shockwave-flash" /><media:content url="http://www.youtube.com/v/DlkMs4ZHHr8&amp;color1=0xb1b1b1&amp;color2=0xcfcfcf&amp;hl=en&amp;feature=player_embedded&amp;fs=1" fileSize="1163" type="application/x-shockwave-flash" /><itunes:explicit>no</itunes:explicit><itunes:subtitle>El video que verán a continuación, hace referencia a un proyecto que consiste en crear un script que juegue solito el dichoso y conocido juego de Mario Bross. Es interesante saber que la tecnología está llegando a puntos que nunca habíamos imaginado. Y es</itunes:subtitle><itunes:author>noreply@blogger.com (Héctor Tobón)</itunes:author><itunes:summary>El video que verán a continuación, hace referencia a un proyecto que consiste en crear un script que juegue solito el dichoso y conocido juego de Mario Bross. Es interesante saber que la tecnología está llegando a puntos que nunca habíamos imaginado. Y esta muestra describe la capacidad y la genialidad del ser humano para llevar a cabo cada una de sus metas. Las lineas en color rojo son los posibles caminos que el script de JAVA debe gestionar para tomar la mejor decisión. Este otro video muestra el mismo script haciendo que Mario Bross siga el puntero del mouse. (Algo curioso he impresionante a mi consideración). via arturogoga</itunes:summary><feedburner:origLink>http://www.piratatobon.com/2009/08/java-juega-mario-bross.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3665485405994358712.post-1417234637542079506</guid><pubDate>Mon, 10 Aug 2009 20:52:00 +0000</pubDate><atom:updated>2009-08-10T14:30:23.728-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Humor</category><title>Gastando tiempo en Twitter?</title><description>Desde que apareció twitter, tengo muchos amigos que se pasan (o sobrepasan) utilizando este sistema.&lt;br /&gt;&lt;br /&gt;Es por esto que me pareció curiosa una aplicación llamada "&lt;a href="http://tweetwasters.com/"&gt;Tweet Waster&lt;/a&gt;", la cual calcula en promedio el tiempo "malgastado" en dicho servicio. (Pongo malgastado entre comillas para no herir susceptibilidades de aquellos amantes del twitteo).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;La aplicación realiza &lt;img alt="" src="http://tweetwasters.com/images/logo.gif" style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 383px; height: 91px;" border="0" /&gt;un calculo general de la cantidad total de mensajes publicados y toma en cuenta que en promedio una persona demora alrededor de 30 segundos para publicar un mensaje.&lt;br /&gt;&lt;br /&gt;Como podrán darse cuenta, he "malgastado" poco tiempo (&lt;a href="http://tweetwasters.com/htobon"&gt;clic aquí&lt;/a&gt;). Aunque acepto que me gustaría "malgastar" más.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3665485405994358712-1417234637542079506?l=www.piratatobon.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PirataTobon/~4/vSwpr9Ri4eY" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/PirataTobon/~3/vSwpr9Ri4eY/gastando-tiempo-en-twitter.html</link><author>noreply@blogger.com (Héctor Tobón)</author><thr:total>0</thr:total><feedburner:origLink>http://www.piratatobon.com/2009/08/gastando-tiempo-en-twitter.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3665485405994358712.post-4845944029974366238</guid><pubDate>Mon, 10 Aug 2009 12:41:00 +0000</pubDate><atom:updated>2009-09-23T12:18:05.455-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Maratones</category><category domain="http://www.blogger.com/atom/ns#">programación</category><title>XXIII Maratón Nacional de Programación ACIS / REDIS 2009</title><description>&lt;div style="text-align: justify;"&gt;Todos los años se están llevando a cabo una serie de maratones a nivel mundial en la que diversos participantes de diferentes universidades compiten entre sí para lograr resolver problemas de diversos temas (recursividad, recorrido de grafos, manejo de cadenas, etc...), en diferentes lenguajes de programación entre los cuales se encuentra JAVA.&lt;br /&gt;&lt;br /&gt;Dichas maratones son organizadas por &lt;a href="http://www.acm.org/"&gt;ACM (Association for Computing Machinery)&lt;/a&gt;, quien es la sociedad educativa y de ciencias de la computación más grande del mundo. Encargada principalmente de incentivar y apoyar todo lo referente al tema de la computación para lograr avances importantes a nivel mundial.&lt;br /&gt;&lt;br /&gt;Dicha sociedad ha creado lo que hoy llamamos &lt;a href="http://cm.baylor.edu/welcome.icpc"&gt;ICPC (International Collegiate Programming Contest)&lt;/a&gt; que como decía anteriormente se realiza anualmente. Las reglas y demás políticas del evento las pueden consultar &lt;a href="http://cm2prod.ciat.cgiar.org/resources/pdf/ppgs.pdf"&gt;aquí&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Como la participación es tan amplia, se realiza en todo el mundo una pre-clasificación (también llamada Maratón Nacional) en la que participantes de diferentes universidades de un mismo país compiten entre sí por 35 cupos (dichos cupos dependen también de la cantidad de universidades inscritas, hago referencia a que pueden ser más o pueden ser menos), a la Maratón Regional.&lt;br /&gt;&lt;br /&gt;Después de haber clasificado los mejores equipos de Colombia, como comentaba anteriormente, se lleva a cabo la Maratón Regional en la que normalmente se enfrentan dos países (en este caso Colombia se enfrenta por tan solo 1, 2 ó 3 cupos contra Venezuela), para pasar finalmente a la Maratón Mundial.&lt;br /&gt;&lt;br /&gt;La Maratón Nacional de este año se llevará a cabo el &lt;span style="font-weight: bold;"&gt;Sabado 5 de Septiembre de 2009&lt;/span&gt; en diferentes partes de Colombia, en la cual la ciudad de Cali no esta exenta de participación. La cede Vallecaucana será la &lt;a href="http://www.icesi.edu.co/"&gt;Universidad Icesi&lt;/a&gt;, quien brindará sus servicios y su infraestructura para que dicho evento se lleve a cabo con entera normalidad, recibiendo la asesoría de la &lt;a href="http://www.acis.org.co/"&gt;Asociación Colombiana de Ingenieros de Sistemas (ACIS)&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Espero que este año haya mucha más participación, y se logre contar con muchos más equipos para que la maratón sea mucho más reñida.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3665485405994358712-4845944029974366238?l=www.piratatobon.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PirataTobon/~4/Iy_vRpvzSZE" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/PirataTobon/~3/Iy_vRpvzSZE/iii-maraton-de-programacion-icesi.html</link><author>noreply@blogger.com (Héctor Tobón)</author><thr:total>0</thr:total><feedburner:origLink>http://www.piratatobon.com/2009/08/iii-maraton-de-programacion-icesi.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3665485405994358712.post-6162231556574616900</guid><pubDate>Sun, 02 Aug 2009 23:26:00 +0000</pubDate><atom:updated>2009-08-03T06:10:00.377-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">programación</category><title>Convirtiendo un Canvas a JPG</title><description>&lt;span style="font-family:verdana;"&gt;Hace algún tiempo en el foro de laneros destinado a JAVA, alguien preguntó acerca de convertir un dibujo realizado en &lt;/span&gt;&lt;a style="font-family: verdana;" href="http://java.sun.com/j2se/1.5.0/docs/api/java/awt/Canvas.html"&gt;java.awt.Canvas&lt;/a&gt;&lt;span style="font-family:verdana;"&gt; ó &lt;/span&gt;&lt;a style="font-family: verdana;" href="http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/JPanel.html"&gt;javax.swing.JPanel&lt;/a&gt;&lt;span style="font-family:verdana;"&gt; a una imagen JPG.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Existen muchas formas de llegar al mismo resultado, sin embargo, aquí les planteo una de ellas:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Sólo para que lo tengan en cuenta, Lo que hice fue realizar un polígono de 20 puntos, los cuales son generados aleatoriamente, de forma que cada vez que se corra el programa, el dibujo será completamente diferente.&lt;br /&gt;&lt;br /&gt;Además, la imagen será guardada en C:/ImagenPrueba.jpg&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;script src='http://pastie.org/569637.js'&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Cómo pueden notar, el código está completamente comentado y es perfectamente entendible....&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3665485405994358712-6162231556574616900?l=www.piratatobon.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PirataTobon/~4/iK9Omboet4g" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/PirataTobon/~3/iK9Omboet4g/convirtiendo-un-canvas-jpg.html</link><author>noreply@blogger.com (Héctor Tobón)</author><thr:total>4</thr:total><feedburner:origLink>http://www.piratatobon.com/2009/08/convirtiendo-un-canvas-jpg.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3665485405994358712.post-1647645981769252909</guid><pubDate>Mon, 27 Jul 2009 00:18:00 +0000</pubDate><atom:updated>2009-07-27T18:16:41.755-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Conferencia</category><title>Kevin Mitnick: "The Art Of Deception"</title><description>Como primer entrada a mi blog de programación y cosas varias, me gustaría presentarles la conferencia que nos brindó el famoso Kevin Mitnick en el evento anual que se celebra desde hace 2 años en Colombia.... CAMPUS PARTY.&lt;br /&gt;&lt;br /&gt;Es totalmente interesante cómo un personaje de esta talla realiza una serie de acciones para romper la seguridad de importantes organizaciones, y que además, se salta de todo esquema clásico de un hacker. &lt;br /&gt;&lt;br /&gt;Si piensas que un hacker es aquella persona con anteojos que se la pasa al lado de un computador las 24/7 y que realiza todas sus proesas utilizando la red, estás completamente equivocado.&lt;br /&gt;&lt;br /&gt;Para demostrarte un poco a lo que me refiero, invito a todos los leyentes de este blog a que le dediquen un poco de su tiempo en escuchar las palabras de este curioso personaje.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Idioma Inglés:&lt;/blockquote&gt;&lt;br /&gt;&lt;object width="500" height="315"&gt;&lt;param name="movie" value="http://www.youtube.com/v/gLae5So0PUQ&amp;hl=es&amp;fs=1&amp;color1=0x3a3a3a&amp;color2=0x999999&amp;border=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/gLae5So0PUQ&amp;hl=es&amp;fs=1&amp;color1=0x3a3a3a&amp;color2=0x999999&amp;border=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="500" height="315"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3665485405994358712-1647645981769252909?l=www.piratatobon.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PirataTobon/~4/KXFka0GLyeY" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/PirataTobon/~3/KXFka0GLyeY/probando.html</link><author>noreply@blogger.com (Héctor Tobón)</author><thr:total>0</thr:total><enclosure url="http://www.youtube.com/v/gLae5So0PUQ&amp;hl=es&amp;fs=1&amp;color1=0x3a3a3a&amp;color2=0x999999&amp;border=1" length="1058" type="application/x-shockwave-flash" /><media:content url="http://www.youtube.com/v/gLae5So0PUQ&amp;hl=es&amp;fs=1&amp;color1=0x3a3a3a&amp;color2=0x999999&amp;border=1" fileSize="1058" type="application/x-shockwave-flash" /><itunes:explicit>no</itunes:explicit><itunes:subtitle>Como primer entrada a mi blog de programación y cosas varias, me gustaría presentarles la conferencia que nos brindó el famoso Kevin Mitnick en el evento anual que se celebra desde hace 2 años en Colombia.... CAMPUS PARTY. Es totalmente interesante cómo u</itunes:subtitle><itunes:author>noreply@blogger.com (Héctor Tobón)</itunes:author><itunes:summary>Como primer entrada a mi blog de programación y cosas varias, me gustaría presentarles la conferencia que nos brindó el famoso Kevin Mitnick en el evento anual que se celebra desde hace 2 años en Colombia.... CAMPUS PARTY. Es totalmente interesante cómo un personaje de esta talla realiza una serie de acciones para romper la seguridad de importantes organizaciones, y que además, se salta de todo esquema clásico de un hacker. Si piensas que un hacker es aquella persona con anteojos que se la pasa al lado de un computador las 24/7 y que realiza todas sus proesas utilizando la red, estás completamente equivocado. Para demostrarte un poco a lo que me refiero, invito a todos los leyentes de este blog a que le dediquen un poco de su tiempo en escuchar las palabras de este curioso personaje. Idioma Inglés: </itunes:summary><itunes:keywords>Conferencia</itunes:keywords><feedburner:origLink>http://www.piratatobon.com/2009/07/probando.html</feedburner:origLink></item><language>en-us</language><media:rating>nonadult</media:rating></channel></rss>

