<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2132902040099485162</id><updated>2011-07-30T22:16:33.145-07:00</updated><category term='mootools'/><category term='effects'/><category term='jsf'/><category term='css'/><category term='productividad'/><category term='javascript'/><category term='agile'/><category term='ejb'/><category term='java'/><category term='seam'/><category term='javaee5'/><category term='tips'/><category term='html'/><category term='javaee'/><category term='patrones'/><category term='desarrollo_personal'/><category term='tomcat'/><category term='buenas_prácticas'/><category term='antipatrones'/><category term='w3c'/><title type='text'>Programación dulce para la boca, suave en el estomago</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://devsweet.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132902040099485162/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://devsweet.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>fernando jerez</name><uri>http://www.blogger.com/profile/05588139075659698258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>15</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2132902040099485162.post-5439170431833015162</id><published>2010-08-20T12:21:00.000-07:00</published><updated>2010-08-20T12:29:41.987-07:00</updated><title type='text'>JQuery: Limitando la entrada de carácteres en los input[type=text]</title><content type='html'>Hay veces en la que queremos que en una caja de texto sólo podamos ingresar ciertos carácteres, por ejemplo una caja de texto donde sólo puedo escribir números.&lt;br /&gt;&lt;br /&gt;Con &lt;a href="http://www.thimbleopensource.com/tutorials-snippets/jquery-plugin-filter-text-input"&gt;este&lt;/a&gt; plugin de jquery&lt;a href="http://www.thimbleopensource.com/tutorials-snippets/jquery-plugin-filter-text-input"&gt;&lt;/a&gt;, podemos realizar la tarea de manera sencilla: &lt;a href="http://jsfiddle.net/UZQ46/"&gt;ver demo&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Para usar el plugin usamos el método &lt;span style="font-weight: bold;"&gt;filter_input&lt;/span&gt;&lt;br /&gt;&lt;pre name="code" class="javascript"&gt;$(function(){&lt;br /&gt;//Limita la entrada en la caja de texto a los carácteres que pasen la expresión regular.&lt;br /&gt;$('#numbers').filter_input({regex:'[02468]'});​&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;La url del plugin es: &lt;a href="http://www.thimbleopensource.com/tutorials-snippets/jquery-plugin-filter-text-input"&gt;http://www.thimbleopensource.com/tutorials-snippets/jquery-plugin-filter-text-input &lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132902040099485162-5439170431833015162?l=devsweet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devsweet.blogspot.com/feeds/5439170431833015162/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://devsweet.blogspot.com/2010/08/jquery-limitando-la-entrada-de.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132902040099485162/posts/default/5439170431833015162'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132902040099485162/posts/default/5439170431833015162'/><link rel='alternate' type='text/html' href='http://devsweet.blogspot.com/2010/08/jquery-limitando-la-entrada-de.html' title='JQuery: Limitando la entrada de carácteres en los input[type=text]'/><author><name>fernando jerez</name><uri>http://www.blogger.com/profile/05588139075659698258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132902040099485162.post-3474786601566865687</id><published>2010-08-20T07:27:00.000-07:00</published><updated>2010-08-20T07:56:58.291-07:00</updated><title type='text'>JQuery: Usando Máscaras en los input[type=text]</title><content type='html'>Las máscaras de texto limitan el contenido que puede ser entrado en una caja de texto y aplica formato al mismo tiempo al contenido.&lt;br /&gt;&lt;br /&gt;El &lt;a href="http://jsfiddle.net/kMXW8/"&gt;demo&lt;/a&gt; muestra una máscara que sólo permite incluir números seis números y dos números decimales.&lt;br /&gt;&lt;br /&gt;El plugin usado para fectuar este demo es: &lt;a href="http://digitalbush.com/projects/masked-input-plugin/"&gt;http://digitalbush.com/projects/masked-input-plugin/&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;El código javascript para aplicar la máscara es sencillo:&lt;br /&gt;&lt;pre name="code" class="javascript"&gt;&lt;br /&gt;$(function(){&lt;br /&gt;  //Uamos la función para seleccionar nodos de jquery y usamos el plugin mask.&lt;br /&gt;  $('#numero').mask('999999.99')​;&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;El formato de las máscara es sencillo:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;a&lt;/b&gt; Representa carácteres alfabéticos&lt;/li&gt;  &lt;li&gt;&lt;b&gt;9&lt;/b&gt; Representa carácteres numéricos&lt;/li&gt;  &lt;li&gt;&lt;b&gt;*&lt;/b&gt; Representa carácteres alfabéticos y numéricos&lt;/li&gt;&lt;/ul&gt;Es posible configurar un evento con este plugin que se activa cuando la entrada de los datos ha completado la máscara configurada para la caja de texto:&lt;br /&gt;&lt;pre name="code" class="javascript"&gt;&lt;br /&gt;$(function(){&lt;br /&gt;  //Uamos la función para seleccionar nodos de jquery y usamos el plugin mask.&lt;br /&gt;  $('#numero').mask('999999.99', {completed: function(){ alert("Mascara completada, valor ingreado: " + this.val()); }})​;&lt;br /&gt;});&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/2132902040099485162-3474786601566865687?l=devsweet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devsweet.blogspot.com/feeds/3474786601566865687/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://devsweet.blogspot.com/2010/08/jquery-usando-mascaras-en-los-textfield.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132902040099485162/posts/default/3474786601566865687'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132902040099485162/posts/default/3474786601566865687'/><link rel='alternate' type='text/html' href='http://devsweet.blogspot.com/2010/08/jquery-usando-mascaras-en-los-textfield.html' title='JQuery: Usando Máscaras en los input[type=text]'/><author><name>fernando jerez</name><uri>http://www.blogger.com/profile/05588139075659698258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132902040099485162.post-8354005332234427988</id><published>2009-05-12T06:54:00.000-07:00</published><updated>2009-05-12T07:21:01.835-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><title type='text'>Obteniendo los caracteres invalidos a partir de un RegExp</title><content type='html'>Hoy, tuve que hacer una función en Javascript que analiza una cadena y retorna que fragmentos de la cadena son inválidos o no son compatibles con la expresión regular dada.&lt;br /&gt;&lt;br /&gt;Les comparto la función:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="javascript"&gt;&lt;br /&gt;function extractBadCharsInRegexp(regexp, str, whiteSpaceLabel, errorLabel){&lt;br /&gt; var splitResult = str.split(regexp);&lt;br /&gt; var resultArray = []; &lt;br /&gt; &lt;br /&gt; //limpio el array de cadenas vacias&lt;br /&gt; for(var i = 0; i &lt; splitResult.length; i++){&lt;br /&gt;  var tmp = splitResult[i];&lt;br /&gt;  if(tmp.length &gt; 0){&lt;br /&gt;   resultArray.push(tmp);&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; //si el nuevo array tiene elementos hay un error&lt;br /&gt; if(resultArray.length &gt; 0){&lt;br /&gt;  var result = resultArray.join(",")&lt;br /&gt;  var nowhiteResult = result.replace(/\s/g, '');&lt;br /&gt;  if(nowhiteResult != result){&lt;br /&gt;   alert(whiteSpaceLabel);&lt;br /&gt;  }&lt;br /&gt;  //muestro mensaje si hay caracteres distintos a espacio&lt;br /&gt;  if(nowhiteResult.replace(',', '').length &gt; 0){&lt;br /&gt;   alert([errorLabel, ' [', nowhiteResult, "]"].join(''));&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; return resultArray;&lt;br /&gt;}&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/2132902040099485162-8354005332234427988?l=devsweet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devsweet.blogspot.com/feeds/8354005332234427988/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://devsweet.blogspot.com/2009/05/obteniendo-los-caracteres-invalidos.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132902040099485162/posts/default/8354005332234427988'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132902040099485162/posts/default/8354005332234427988'/><link rel='alternate' type='text/html' href='http://devsweet.blogspot.com/2009/05/obteniendo-los-caracteres-invalidos.html' title='Obteniendo los caracteres invalidos a partir de un RegExp'/><author><name>fernando jerez</name><uri>http://www.blogger.com/profile/05588139075659698258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132902040099485162.post-3606001386545972881</id><published>2009-04-16T11:15:00.001-07:00</published><updated>2009-04-16T11:15:28.376-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='desarrollo_personal'/><category scheme='http://www.blogger.com/atom/ns#' term='productividad'/><title type='text'>Concejos para vencer la Procrastinación</title><content type='html'>La &lt;a href="http://es.wikipedia.org/wiki/Procrastinaci%C3%B3n"&gt;Procrastincación&lt;/a&gt; es la acción (o arte cultivada) de postergar actividades o situaciones que uno debe atender, por otras situaciones más irrelevantes y agradables.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.thinkwasabi.com/2009/04/16/como-vencer-procrastinacion/"&gt;Thinkwasabi&lt;/a&gt; nos comparte la siguiente lista para combatir la procrastinación:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Valora lo que ganaras a terminar esa tarea&lt;/li&gt;&lt;li&gt;Piensa en que retrasarlo va a ser peor&lt;/li&gt;&lt;li&gt;Si es una tarea grande, divídela en pequeñas partes&lt;/li&gt;&lt;li&gt;Míralo como un reto directo a tu fortaleza y determinación&lt;/li&gt;&lt;li&gt;Corta las mentiras, no te engañes&lt;/li&gt;&lt;li&gt;Piensa en los demás, a veces son quienes pagan cara tu Procrastinación&lt;/li&gt;&lt;li&gt;Generalmente luego &lt;span style="font-weight: bold;"&gt;"no es para tanto"&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Aplica la regla hazlo ahora&lt;/li&gt;&lt;li&gt;Si es una tarea compleja, no busques la perfección a la primera&lt;/li&gt;&lt;li&gt;Si utilizas el GTD ojo con el "algún día"&lt;/li&gt;&lt;li&gt;Piensa que si vences serás un "mejor profesional"&lt;/li&gt;&lt;li&gt;Si te han asignado una tarea que otro debía hacer, no culpes al mensajero&lt;/li&gt;&lt;li&gt;Si te vas a poner a ello, corta cualquier distracción&lt;/li&gt;&lt;li&gt;"Es que es mucho, no se por donde empezar", divide la tarea en partes y hazlo&lt;/li&gt;&lt;li&gt;Aplica la regla de los 2 minutos del GTD a las tareas que sabes que las puedes completar rápido&lt;/li&gt;&lt;li&gt;Hazlo para evitar el estrés y la frustración&lt;/li&gt;&lt;li&gt;Encuentra el lado positivo de esa tarea&lt;/li&gt;&lt;li&gt;Elimina todo lo demás de tu cabeza, sólo cuenta eso&lt;/li&gt;&lt;li&gt;Piensa que destruye tu Organización y Productividad&lt;/li&gt;&lt;li&gt;Enfréntate a la Procrastinación que viene del miedo&lt;/li&gt;&lt;li&gt;¿Necesitas un estimulo?, recurre a tu canción favorita.&lt;/li&gt;&lt;li&gt;Saborea el momento de la victoria&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132902040099485162-3606001386545972881?l=devsweet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devsweet.blogspot.com/feeds/3606001386545972881/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://devsweet.blogspot.com/2009/04/concejos-para-vencer-la-procrastinacion.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132902040099485162/posts/default/3606001386545972881'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132902040099485162/posts/default/3606001386545972881'/><link rel='alternate' type='text/html' href='http://devsweet.blogspot.com/2009/04/concejos-para-vencer-la-procrastinacion.html' title='Concejos para vencer la Procrastinación'/><author><name>fernando jerez</name><uri>http://www.blogger.com/profile/05588139075659698258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132902040099485162.post-2658266387350735696</id><published>2009-04-16T05:50:00.001-07:00</published><updated>2009-04-16T05:51:21.898-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='desarrollo_personal'/><title type='text'>La confianza en los equipos de desarrollo</title><content type='html'>Les dejo este articulo sobre la confianza en los equipos de trabajo&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;blockquote cite="5 formas para ganarse la confianza de un equipo"&gt;Lo primero que se necesita en el entorno laboral es la confianza profesional. La confianza profesional nos dice "Yo confio que usted es competente para hacer el trabajo, que va a compatir información relevante, y que tiene buenas intenciones para el equipo". Es decir, estamos hablando de la comunicación, el compromiso, y la competencia.&lt;/blockquote&gt;&lt;p class="citation"&gt;&lt;cite cite="http://www.dosideas.com/liderazgo/511-5-formas-para-ganarse-la-confianza-de-un-equipo.html"&gt;      &lt;a href="http://www.dosideas.com/liderazgo/511-5-formas-para-ganarse-la-confianza-de-un-equipo.html"&gt;5 formas para ganarse la confianza de un equipo&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;&lt;p class="citation"&gt;El articulo referencia cinco prácticas interesantes que nos ayudan a mantener confianza en un equipo de trabajo o a ganarla:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Tratar los temas directamente&lt;/li&gt;&lt;li&gt;Compartir información relevante&lt;/li&gt;&lt;li&gt;Cumplir los compromisos o dar aviso temprano de que no se puede&lt;/li&gt;&lt;li&gt;Decir &lt;span style="font-weight: bold;"&gt;"No"&lt;/span&gt; cuando queremos decir no&lt;/li&gt;&lt;li&gt;Mostrar lo que sabemos y lo que no sabemos&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132902040099485162-2658266387350735696?l=devsweet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devsweet.blogspot.com/feeds/2658266387350735696/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://devsweet.blogspot.com/2009/04/la-confianza-en-los-equipos-de.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132902040099485162/posts/default/2658266387350735696'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132902040099485162/posts/default/2658266387350735696'/><link rel='alternate' type='text/html' href='http://devsweet.blogspot.com/2009/04/la-confianza-en-los-equipos-de.html' title='La confianza en los equipos de desarrollo'/><author><name>fernando jerez</name><uri>http://www.blogger.com/profile/05588139075659698258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132902040099485162.post-4418915449253059156</id><published>2009-02-26T05:07:00.001-08:00</published><updated>2009-02-26T05:09:58.539-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><title type='text'>Tip: Como extraer los caracteres de un archivo pdf</title><content type='html'>Les dejo este tipo acerca de como extraer los caracteres de un archivo pdf. &lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;  import com.lowagie.text.pdf.PRTokeniser;&lt;br /&gt;  import com.lowagie.text.pdf.PdfReader;&lt;br /&gt;  import java.io.InputStream;&lt;br /&gt;  ...&lt;br /&gt;  InputStream stream = ...;&lt;br /&gt;  PdfReader pdfReader = new PdfReader(stream);&lt;br /&gt;  try{&lt;br /&gt;   int numberOfPages = pdfReader.getNumberOfPages();&lt;br /&gt;   for(int page = 1; page &amp;lt;= numberOfPages; page++){&lt;br /&gt;    PRTokeniser tokeniser = new PRTokeniser(pdfReader.getPageContent(page));&lt;br /&gt;    while(tokeniser.nextToken()){&lt;br /&gt;     if (tokeniser.getTokenType() == PRTokeniser.TK_STRING) {&lt;br /&gt;      System.out.println("Pagina: " + page);&lt;br /&gt;      System.out.println("Parrafo: " + tokeniser.getStringValue());&lt;br /&gt;      System.out.println("---------------------------------------");&lt;br /&gt;     }  &lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;  }finally{&lt;br /&gt;   pdfReader.close();&lt;br /&gt;  }&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/2132902040099485162-4418915449253059156?l=devsweet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devsweet.blogspot.com/feeds/4418915449253059156/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://devsweet.blogspot.com/2009/02/tip-como-extraer-los-caracteres-de-un.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132902040099485162/posts/default/4418915449253059156'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132902040099485162/posts/default/4418915449253059156'/><link rel='alternate' type='text/html' href='http://devsweet.blogspot.com/2009/02/tip-como-extraer-los-caracteres-de-un.html' title='Tip: Como extraer los caracteres de un archivo pdf'/><author><name>fernando jerez</name><uri>http://www.blogger.com/profile/05588139075659698258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132902040099485162.post-5851683865620174070</id><published>2009-02-13T05:53:00.001-08:00</published><updated>2009-02-13T05:53:16.438-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ejb'/><category scheme='http://www.blogger.com/atom/ns#' term='javaee'/><category scheme='http://www.blogger.com/atom/ns#' term='seam'/><category scheme='http://www.blogger.com/atom/ns#' term='jsf'/><title type='text'>El framework de aplicaciones Seam</title><content type='html'>Seams es un framework para construir aplicaciones de internet ricas en Java. Seam integra tecnologías tales como AJAX, JSF, JPA, EJB 3.0 y BPM dentro de una solución unificada y completa.&lt;br /&gt;&lt;br /&gt;Seams ha sido diseñado desde el comienzo con el fin de eliminar complejidad en ambos nivels de arquitectura y APIs.&lt;br /&gt;&lt;br /&gt;Algunas de las mejoras que Seam trae a la plataforma Java EE son:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Eliminar los problemas de JSF que han sido el tema de incontables peleas&lt;/li&gt;&lt;li&gt;Enmendar la comunicación entre JSF y componentes de negocio transaccionales&lt;/li&gt;&lt;li&gt;Colapsar capas innecesarias&lt;/li&gt;&lt;li&gt;Ofrece una solución para la administración de estado, desanimando el uso de arquitecturas sin estado.&lt;/li&gt;&lt;li&gt;Administra el contexto de persistencia para evitar excepciones de inicialización peresoza en la vista y subsecuentes peticiones.&lt;/li&gt;&lt;li&gt;Conecta varias vistas, con un flujo de páginas con estado&lt;/li&gt;&lt;li&gt;Trae los procesos de negocio al mundo de las aplicaciones web&lt;/li&gt;&lt;li&gt;Conecta mecanismos de autenticación y autorización basada en POJOs y soportados por JAAS.&lt;/li&gt;&lt;li&gt;Provee un contenedor embebido para pruebas.&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132902040099485162-5851683865620174070?l=devsweet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devsweet.blogspot.com/feeds/5851683865620174070/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://devsweet.blogspot.com/2009/02/el-framework-de-aplicaciones-seam.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132902040099485162/posts/default/5851683865620174070'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132902040099485162/posts/default/5851683865620174070'/><link rel='alternate' type='text/html' href='http://devsweet.blogspot.com/2009/02/el-framework-de-aplicaciones-seam.html' title='El framework de aplicaciones Seam'/><author><name>fernando jerez</name><uri>http://www.blogger.com/profile/05588139075659698258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132902040099485162.post-9022134879252786197</id><published>2009-02-12T07:44:00.001-08:00</published><updated>2009-02-12T07:46:17.179-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='w3c'/><category scheme='http://www.blogger.com/atom/ns#' term='html'/><category scheme='http://www.blogger.com/atom/ns#' term='css'/><title type='text'>Cuando puedo usar X característica en la Web</title><content type='html'>Html, Css, Javascript son las tecnologías por excelencia en el mundillo de la Web, pero la plataforma sobre la cual estas tecnologías juegan su papel no es muy estandar, estamos hablando de los navegadores web (IE, Firefox, Safari, WebKit, Opera, etc).&lt;br /&gt;&lt;br /&gt;Navegando por la Web me he encontrado con este sitio &lt;a href="http://a.deveria.com/caniuse/#agents=All&amp;amp;cats=All&amp;amp;eras=All&amp;amp;statuses=All"&gt;When can I use ...&lt;/a&gt;, este sitio muestra tablas de compatibilidad de las características de las tecnologías HTML5, DOM, CSS3, CSS2, Canvas, etc; entre los distintos navegadores.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132902040099485162-9022134879252786197?l=devsweet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devsweet.blogspot.com/feeds/9022134879252786197/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://devsweet.blogspot.com/2009/02/cuando-puedo-usar-x-caracteristica-en.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132902040099485162/posts/default/9022134879252786197'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132902040099485162/posts/default/9022134879252786197'/><link rel='alternate' type='text/html' href='http://devsweet.blogspot.com/2009/02/cuando-puedo-usar-x-caracteristica-en.html' title='Cuando puedo usar X característica en la Web'/><author><name>fernando jerez</name><uri>http://www.blogger.com/profile/05588139075659698258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132902040099485162.post-9092817480457262370</id><published>2009-02-12T07:10:00.001-08:00</published><updated>2009-02-12T07:31:52.020-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='mootools'/><category scheme='http://www.blogger.com/atom/ns#' term='effects'/><title type='text'>Transiciones con MooTools</title><content type='html'>Vamos a realizar una pequeña animación usando el framework para javascript &lt;a href="http://www.mootools.net/"&gt;Mootools&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Primero empezamos con la página html de nuestra animación:&lt;br /&gt;&lt;pre name="code" class="xml"&gt;       .....&lt;br /&gt; &amp;lt;div id="fxDiv" class="red"&amp;gt;Click aquí para iniciar la animación&amp;lt;/div&amp;gt;&lt;br /&gt; .....&lt;br /&gt;&lt;/pre&gt;Crearemos una hoja de estilos anim.css, este archivo contiene la animación de rojo (.red) a azul (.blue).&lt;br /&gt;&lt;pre name="code" class="css"&gt;&lt;br /&gt;#fxDiv {&lt;br /&gt;padding: 5px;&lt;br /&gt;position: absolute;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;.red {&lt;br /&gt;background-color: #f00;&lt;br /&gt;left: 100px;&lt;br /&gt;top: 100px;&lt;br /&gt;border: 1px solid black;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;.blue {&lt;br /&gt;background-color: #00f;&lt;br /&gt;left: 400px;&lt;br /&gt;top: 200px;&lt;br /&gt;width: 400px;&lt;br /&gt;height: 400px;&lt;br /&gt;border: 5px solid black;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Ahora el script que ejecuta la animación:&lt;br /&gt;&lt;pre name="code" class="js"&gt;&lt;br /&gt;$("fxDiv").addEvent('click', function() {&lt;br /&gt;var fx = new Fx.Morph($("fxDiv"),&lt;br /&gt;                  {duration: 1000,&lt;br /&gt;                   transition: Fx.Transitions.Sine.easeOut});&lt;br /&gt;fx.start(".blue");&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;El objeto Fx.Morph recibe dos parámetros:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Primero el elemento que se quiere animar, en este caso es un div&lt;/li&gt;&lt;li&gt;Un objeto de opciones de configuración para la animación recibe varios &lt;a href="http://mootools.net/docs/Fx/Fx"&gt;propiedades&lt;/a&gt;, en este ejemplo especificamos la duración de la animación y que tipo de transición quiero para la animación. &lt;a href="http://demos111.mootools.net/Fx.Transitions"&gt;Aquí&lt;/a&gt; encuentras un ejemplo de las &lt;a href="http://demos111.mootools.net/Fx.Transitions"&gt;transiciones&lt;/a&gt; de MooTools&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;La página html final, vinculando los estilos y código javascript:&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&amp;gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt; &amp;lt;head&amp;gt;&lt;br /&gt;     &amp;lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&amp;gt;&lt;br /&gt;     &amp;lt;title&amp;gt;Tween en MooTools&amp;lt;/title&amp;gt;&lt;br /&gt;     &amp;lt;link type="text/css" rel="stylesheet" href="css/anim.css"&amp;gt;&amp;lt;/link&amp;gt;&lt;br /&gt; &amp;lt;/head&amp;gt;&lt;br /&gt; &amp;lt;body&amp;gt;&lt;br /&gt;     &amp;lt;div id="fxDiv" class="red"&amp;gt;Click Aqui para iniciar la animación&amp;lt;/div&amp;gt;&lt;br /&gt;     &amp;lt;script type="text/javascript" src="js/mootools-1.2.1-core-yc.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;     &amp;lt;script type="text/javascript" src="js/anim.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt; &amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;Este es un simple ejemplo de animaciones con MooTools, &lt;a href="http://demos111.mootools.net/Fx.Transitions"&gt;aquí&lt;/a&gt; puede ver muchos ejemplos más de esta gran libreria&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132902040099485162-9092817480457262370?l=devsweet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devsweet.blogspot.com/feeds/9092817480457262370/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://devsweet.blogspot.com/2009/02/transiciones-con-mootools.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132902040099485162/posts/default/9092817480457262370'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132902040099485162/posts/default/9092817480457262370'/><link rel='alternate' type='text/html' href='http://devsweet.blogspot.com/2009/02/transiciones-con-mootools.html' title='Transiciones con MooTools'/><author><name>fernando jerez</name><uri>http://www.blogger.com/profile/05588139075659698258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132902040099485162.post-327263070555240519</id><published>2009-02-12T05:37:00.001-08:00</published><updated>2009-02-12T05:41:17.713-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ejb'/><category scheme='http://www.blogger.com/atom/ns#' term='javaee5'/><category scheme='http://www.blogger.com/atom/ns#' term='tomcat'/><title type='text'>EJB usando sólo Tomcat</title><content type='html'>La primera pregunta que uno podría hacerse es:&lt;span style="font-weight: bold;"&gt; ¿Por qué necesito usar EJBs?&lt;/span&gt; La respuesta está en su definición. Los EJB son Javabeans que modelan lógica de negocio, y son administrados por un contenedor, conocido como el Contenedor EJB. Este contenedor provee a los EJB de las siguientes características, que se dicen son características que todo proyecto Empresarial (hecho en Java) debería tener o por lo menos considerar: Transaccionalidad, manejo de estado en invocaciones, concurrencia, ejecución de invocaciones de manera distribuida, invocación como un Web Service, persistencia, pool de beans, seguridad.&lt;br /&gt;&lt;br /&gt;Pero si el proyecto sólo puede ser desarrollado en un contenedor Web como Tomcat. &lt;span style="font-weight: bold;"&gt;¿Entonces, no puedo usar EJB?&lt;/span&gt; La respuesta es sí puede, pero necesitas de un contenedor EJB.&lt;br /&gt;&lt;br /&gt;La fundación Apache tiene un proyecto que se integra con tomcat, y que cumple la función de un contenedor EJB,  &lt;a href="http://openejb.apache.org/"&gt;OpenEJB&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Para instalarlo es muy sencillo:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Descargar el &lt;a href="http://openejb.apache.org/download.html"&gt;openejb.war&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Copiar el openejb.war al directorio webapps del tomcat. Este war debe llamarse siempre &lt;span style="font-weight: bold;"&gt;openejb.war&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Iniciar tomcat&lt;/li&gt;&lt;li&gt;subir el proyecto Web&lt;/li&gt;&lt;/ol&gt;Los EJBs se empaquetan dentro del war del proyecto o en un war aparte.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132902040099485162-327263070555240519?l=devsweet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devsweet.blogspot.com/feeds/327263070555240519/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://devsweet.blogspot.com/2009/02/usando-ejb-usando-solo-tomcat.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132902040099485162/posts/default/327263070555240519'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132902040099485162/posts/default/327263070555240519'/><link rel='alternate' type='text/html' href='http://devsweet.blogspot.com/2009/02/usando-ejb-usando-solo-tomcat.html' title='EJB usando sólo Tomcat'/><author><name>fernando jerez</name><uri>http://www.blogger.com/profile/05588139075659698258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132902040099485162.post-1262390762957657697</id><published>2009-02-11T12:44:00.001-08:00</published><updated>2009-02-12T07:52:05.046-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='ejb'/><category scheme='http://www.blogger.com/atom/ns#' term='javaee5'/><title type='text'>Hola Mundo a la EJB</title><content type='html'>Con la liberación de Java 5 tiempo atrás, y la llegada a java de las anotaciones, los frameworks que eran difíciles de usar se han simplificado grandemente.&lt;br /&gt;&lt;br /&gt;A continuación muestro un pequeño ejemplo de EJB (HolaMundo para ser exactos), usando la especificación EJB 3.0 de Java EE 5.&lt;br /&gt;&lt;br /&gt;Todo comienza con una Interfaz...&lt;br /&gt;&lt;pre name="code" class="java"&gt;package prueba;&lt;br /&gt;import javax.ejb.Local;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* Simple bean de session que saluda a alguien&lt;br /&gt;*/&lt;br /&gt;@Local&lt;br /&gt;public interface HolaMundo {&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* Imprime un saludo&lt;br /&gt;* @param aQuien El nombre de la persona a saludar&lt;br /&gt;* @return El saludo&lt;br /&gt;*/&lt;br /&gt;String saludar(String aQuien);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;... y su implementación:&lt;br /&gt;&lt;pre name="code" class="java"&gt;package prueba;&lt;br /&gt;&lt;br /&gt;import javax.ejb.Stateless;&lt;br /&gt;&lt;br /&gt;@Stateless&lt;br /&gt;public class HolaMundoBean implements HolaMundo {&lt;br /&gt;&lt;br /&gt;/* (non-Javadoc)&lt;br /&gt;* @see prueba.HolaMundo#saludar(java.lang.String)&lt;br /&gt;*/&lt;br /&gt;@Override&lt;br /&gt;public String saludar(String aQuien){&lt;br /&gt; return "Hola " + aQuien;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Este EJB es un bean sin estado, es decir que no guarda ninguna información de estado en cada invocación, de hecho el contenedor de EJB puede retornar en cada invocación una instancia diferente del EJB.  Este tipo de EJB se definen usando la anotación &lt;span style="font-weight: bold;"&gt;@Stateless&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Para probar a nuestro amigo HolaMundo usare un servlet que debe desplegarse dentro del mismo servidor, pues el EJB sólo tiene interfaz local:&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;package prueba;&lt;br /&gt;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;import java.io.PrintWriter;&lt;br /&gt;&lt;br /&gt;import javax.ejb.EJB;&lt;br /&gt;import javax.servlet.ServletException;&lt;br /&gt;import javax.servlet.http.HttpServlet;&lt;br /&gt;import javax.servlet.http.HttpServletRequest;&lt;br /&gt;import javax.servlet.http.HttpServletResponse;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* Servlet implementation class HolaMundoServlet&lt;br /&gt;*/&lt;br /&gt;public final class HolaMundoServlet extends HttpServlet {&lt;br /&gt;private static final long serialVersionUID = 1L;&lt;br /&gt;&lt;br /&gt;@EJB&lt;br /&gt;private HolaMundo holaMundo;&lt;br /&gt;&lt;br /&gt;protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {&lt;br /&gt; saludar(request, response);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {&lt;br /&gt; saludar(request, response);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private void saludar(HttpServletRequest request, HttpServletResponse response) throws IOException {&lt;br /&gt; PrintWriter writer = response.getWriter();&lt;br /&gt; String aQuien = request.getParameter("nombre");&lt;br /&gt; if(aQuien == null || aQuien.trim().length() == 0) aQuien = "Desconocido";&lt;br /&gt; writer.println(holaMundo.saludar(aQuien));&lt;br /&gt; writer.close();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Noten como a través del uso de la anotación &lt;span style="font-weight: bold;"&gt;@EJB, &lt;/span&gt; inyecto el bean en el servlet para usar su método. (Esto era muy complicado de hacer en EJB 2.0 en el que tocaba usar JNDI)&lt;br /&gt;&lt;br /&gt;El software que use para implementar y desplegar este pequeño proyecto fue:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;IDE de desarrollo Eclipse con WTP&lt;/li&gt;&lt;li&gt;Servidor de Aplicaciones JBoss 5.0&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132902040099485162-1262390762957657697?l=devsweet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devsweet.blogspot.com/feeds/1262390762957657697/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://devsweet.blogspot.com/2009/02/hola-mundo-la-ejb.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132902040099485162/posts/default/1262390762957657697'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132902040099485162/posts/default/1262390762957657697'/><link rel='alternate' type='text/html' href='http://devsweet.blogspot.com/2009/02/hola-mundo-la-ejb.html' title='Hola Mundo a la EJB'/><author><name>fernando jerez</name><uri>http://www.blogger.com/profile/05588139075659698258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132902040099485162.post-4005331081589226505</id><published>2009-02-11T11:59:00.001-08:00</published><updated>2009-02-11T11:59:32.929-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='antipatrones'/><category scheme='http://www.blogger.com/atom/ns#' term='buenas_prácticas'/><title type='text'>Frases célebres</title><content type='html'>Esta frase la voy recordar toda mi vida.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;La optimización prematura es la raíz de todos los males&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;La optimización debe venir después de un diseño bien definido y basado en medidas.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132902040099485162-4005331081589226505?l=devsweet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devsweet.blogspot.com/feeds/4005331081589226505/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://devsweet.blogspot.com/2009/02/frases-celebres.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132902040099485162/posts/default/4005331081589226505'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132902040099485162/posts/default/4005331081589226505'/><link rel='alternate' type='text/html' href='http://devsweet.blogspot.com/2009/02/frases-celebres.html' title='Frases célebres'/><author><name>fernando jerez</name><uri>http://www.blogger.com/profile/05588139075659698258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132902040099485162.post-4791430559600183726</id><published>2009-02-11T11:43:00.001-08:00</published><updated>2009-02-11T11:48:29.196-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='mootools'/><title type='text'>Integrado Mootols con Peppy o Sizzle</title><content type='html'>Para los que deseen integrar &lt;a href="http://mootools.net/"&gt;Mootools&lt;/a&gt; con &lt;a href="http://jamesdonaghue.com/static/peppy/docs/"&gt;Peppy&lt;/a&gt; o con &lt;a href="http://github.com/jeresig/sizzle/tree/master"&gt;Sizzle&lt;/a&gt; (Aunque no veo alguna razón valida)&lt;br /&gt;&lt;br /&gt;Con Sizzle:&lt;br /&gt;&lt;pre name="code" class="js"&gt;Window.$$ = function(selector){&lt;br /&gt;return new Elements(new Sizzle(selector));&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Con Peppy:&lt;br /&gt;&lt;pre name="code" class="js"&gt;Window.$$ = function(selector){&lt;br /&gt;return new Elements(new peppy.query(selector));&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Aqui les dejo adicionalmente algunas páginas donde se compara el rendimiento de estos selectores:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://mootools.net/mootools_vs_sizzle/"&gt;Mootools vs Sizzle&lt;/a&gt;&lt;br /&gt;&lt;a href="http://jamesdonaghue.com/static/peppy/profile/slickspeed/"&gt;Peppy vs los Otros Selectores&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;El Selector de Mootools es muy efeciente para mis necesidades.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2132902040099485162-4791430559600183726?l=devsweet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devsweet.blogspot.com/feeds/4791430559600183726/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://devsweet.blogspot.com/2009/02/integrado-mootols-con-peppy-o-sizzle.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132902040099485162/posts/default/4791430559600183726'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132902040099485162/posts/default/4791430559600183726'/><link rel='alternate' type='text/html' href='http://devsweet.blogspot.com/2009/02/integrado-mootols-con-peppy-o-sizzle.html' title='Integrado Mootols con Peppy o Sizzle'/><author><name>fernando jerez</name><uri>http://www.blogger.com/profile/05588139075659698258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132902040099485162.post-9183676848670882419</id><published>2009-02-11T06:39:00.000-08:00</published><updated>2009-02-11T07:36:57.624-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='patrones'/><title type='text'>Manejos de paquetes en Javascript</title><content type='html'>En un post pasado vimos como manejar el alcance privado en Javascript, esta funcionalidad es esencial para definir que es accesible y que no (encapsulamiento).&lt;br /&gt;&lt;br /&gt;Los paquetes nos permiten a nosotros organizar funciones y variables y evitar colisión en nombres de la funciones. Los paquetes son muy comunes en otros lenguajes como ruby, java, c#, etc.&lt;br /&gt;&lt;br /&gt;Nuestra herramienta para trabajar con paquetes en Javascript es el Objeto object, es decir el paquete prueba.urbanidad realmente es un objeto urbanidad dentro de un objeto prueba.&lt;br /&gt;&lt;br /&gt;La siguiente función obtiene una paquete en javascript, El paquete raíz sera El Objeto &lt;span style="font-weight: bold;"&gt;window&lt;/span&gt;, si un paquete no existe la función lo creará, al final la función retorna el objeto que representa el paquete:&lt;br /&gt;&lt;pre name="code" class="js"&gt;&lt;br /&gt;function obtener_paquete(paquete){&lt;br /&gt; var ultimoPq = window;&lt;br /&gt; /* convertimos la cadena en un lista de paquetes */&lt;br /&gt; var partes = paquete.split(/\./);&lt;br /&gt; /* recorremos el array de paquetes */&lt;br /&gt; for(var i = 0; i &amp;lt; partes.length; i++){&lt;br /&gt;     var tmp = ultimoPq[partes[i]];&lt;br /&gt;     if(!tmp){&lt;br /&gt;       tmp = ultimoPq[partes[i]] = {};&lt;br /&gt;     }&lt;br /&gt;     ultimoPq =tmp;&lt;br /&gt; }&lt;br /&gt; return ultimoPq;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Aqui tenemos un uso de la función:&lt;br /&gt;&lt;pre name="code" class="js"&gt;/* Obtengo el paquete prueba.urbanidad*/&lt;br /&gt;obtener_paquete("prueba.urbanidad");&lt;br /&gt;prueba.urbanidad.saludar = function(){&lt;br /&gt;return "Hola";&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;/* Obtengo el paquete prueba.mala.urbanidad*/&lt;br /&gt;obtener_paquete("prueba.mala.urbanidad");&lt;br /&gt;prueba.mala.urbanidad.saludar = function(){&lt;br /&gt;  return "Adios";&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;/*Muestra el mensaje Hola */&lt;br /&gt;alert(prueba.urbanidad.saludar());&lt;br /&gt;&lt;br /&gt;/*Muestra el mensaje Adios */&lt;br /&gt;alert(prueba.mala.urbanidad.saludar());&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/2132902040099485162-9183676848670882419?l=devsweet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devsweet.blogspot.com/feeds/9183676848670882419/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://devsweet.blogspot.com/2009/02/manejos-de-paquetes-en-javascript.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132902040099485162/posts/default/9183676848670882419'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132902040099485162/posts/default/9183676848670882419'/><link rel='alternate' type='text/html' href='http://devsweet.blogspot.com/2009/02/manejos-de-paquetes-en-javascript.html' title='Manejos de paquetes en Javascript'/><author><name>fernando jerez</name><uri>http://www.blogger.com/profile/05588139075659698258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2132902040099485162.post-3644616480430045739</id><published>2009-02-11T04:59:00.000-08:00</published><updated>2009-02-11T05:52:40.412-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='patrones'/><title type='text'>Alcance privado en Javascript</title><content type='html'>Esta técnica en Javascript permite hacer funciones y variables inaccesibles a otros scripts, muy a la manera como en lenguajes de Java, C# funciona la palabra reservada private:&lt;br /&gt;&lt;br /&gt;El patrón es:&lt;br /&gt;&lt;pre name="code" class="js"&gt;(function(){&lt;br /&gt;/* código va aqui. */&lt;br /&gt;})();&lt;br /&gt;&lt;/pre&gt;Ejemplo de uso, aqui se usa el objecto &lt;span style="font-weight: bold;"&gt;window&lt;/span&gt; para exportar una función (&lt;span style="font-weight: bold;"&gt;saludar&lt;/span&gt;):&lt;br /&gt;&lt;pre name="code" class="js"&gt;(function(){&lt;br /&gt;var msg = "Hola ";&lt;br /&gt;&lt;br /&gt;window["saludar"] = function(aQuien){&lt;br /&gt;return msg + aQuien;&lt;br /&gt;}&lt;br /&gt;})();&lt;br /&gt;&lt;br /&gt;/* Esta linea fallará porque la variable msg no es accesible fuera de la función anonima */&lt;br /&gt;alert(msg);&lt;br /&gt;&lt;br /&gt;/* Muestra el mensaje Hola Heli Fernando Jerez */&lt;br /&gt;alert(saludar("Helí Fernando Jerez"));&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;otro ejemplo de uso en el que no se modifica el objeto &lt;span style="font-weight: bold;"&gt;window&lt;/span&gt; sino retorna que se retorna un objeto con los elementos publicos:&lt;br /&gt;&lt;pre name="code" class="js"&gt;var Saludar = (function(){&lt;br /&gt;var msg = "Hola ";&lt;br /&gt;&lt;br /&gt;return {&lt;br /&gt;saludar : function(aQuien){&lt;br /&gt;return msg + aQuien;&lt;br /&gt;}&lt;br /&gt;};&lt;br /&gt;})();&lt;br /&gt;&lt;br /&gt;/* Muestra el mensaje Hola Heli Fernando Jerez */&lt;br /&gt;Saludar.saludar("Helí Fernando Jerez");&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/2132902040099485162-3644616480430045739?l=devsweet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devsweet.blogspot.com/feeds/3644616480430045739/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://devsweet.blogspot.com/2009/02/alcance-privado-en-javascript.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2132902040099485162/posts/default/3644616480430045739'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2132902040099485162/posts/default/3644616480430045739'/><link rel='alternate' type='text/html' href='http://devsweet.blogspot.com/2009/02/alcance-privado-en-javascript.html' title='Alcance privado en Javascript'/><author><name>fernando jerez</name><uri>http://www.blogger.com/profile/05588139075659698258</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
