<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2spanishfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.weblogssl.com/~d/styles/itemcontent.css"?><rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>Genbetadev</title><link>http://www.genbetadev.com</link><description>Información sobre el sector de los desarrolladores, el desarrollo de aplicaciones, para móviles, desarrollo web, bases de datos, frameworks y lenguajes de programación</description><language>en</language><pubDate>Thu, 17 May 2012 16:05:56 GMT</pubDate><lastBuildDate>Thu, 17 May 2012 16:05:56 GMT</lastBuildDate><ttl>2</ttl><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.weblogssl.com/genbetadev" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="genbetadev" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><image><url>http://blogs.es/imagenes/planet/genbetadev.jpg</url></image><feedburner:emailServiceId xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">genbetadev</feedburner:emailServiceId><feedburner:feedburnerHostname xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://add.my.yahoo.com/content?lg=es&amp;url=http%3A%2F%2Ffeeds.weblogssl.com%2Fgenbetadev" src="http://eur.i1.yimg.com/eur.yimg.com/i/es/my/addto1.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.feedness.com/alta/http://feeds.weblogssl.com/genbetadev" src="http://www.feedness.com/ayuda/wp-content/square_b_sh_feed.gif">Subscribe with Feedness</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.weblogssl.com%2Fgenbetadev" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.bloglines.com/sub/http://feeds.weblogssl.com/genbetadev" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.weblogssl.com%2Fgenbetadev" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.weblogssl.com%2Fgenbetadev" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.weblogssl.com%2Fgenbetadev" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.plusmo.com/add?url=http%3A%2F%2Ffeeds.weblogssl.com%2Fgenbetadev" src="http://plusmo.com/res/graphics/fbplusmo.gif">Subscribe with Plusmo</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.thefreedictionary.com/_/hp/AddRSS.aspx?http%3A%2F%2Ffeeds.weblogssl.com%2Fgenbetadev" src="http://img.tfd.com/hp/addToTheFreeDictionary.gif">Subscribe with The Free Dictionary</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.bitty.com/manual/?contenttype=rssfeed&amp;contentvalue=http%3A%2F%2Ffeeds.weblogssl.com%2Fgenbetadev" src="http://www.bitty.com/img/bittychicklet_91x17.gif">Subscribe with Bitty Browser</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.live.com/?add=http%3A%2F%2Ffeeds.weblogssl.com%2Fgenbetadev" src="http://tkfiles.storage.msn.com/x1piYkpqHC_35nIp1gLE68-wvzLZO8iXl_JMledmJQXP-XTBOLfmQv4zhj4MhcWEJh_GtoBIiAl1Mjh-ndp9k47If7hTaFno0mxW9_i3p_5qQw">Subscribe with Live.com</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://mix.excite.eu/add?feedurl=http%3A%2F%2Ffeeds.weblogssl.com%2Fgenbetadev" src="http://image.excite.co.uk/mix/addtomix.gif">Subscribe with Excite MIX</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.webwag.com/wwgthis.php?url=http%3A%2F%2Ffeeds.weblogssl.com%2Fgenbetadev" src="http://www.webwag.com/images/wwgthis.gif">Subscribe with Webwag</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.podcastready.com/oneclick_bookmark.php?url=http%3A%2F%2Ffeeds.weblogssl.com%2Fgenbetadev" src="http://www.podcastready.com/images/podcastready_button.gif">Subscribe with Podcast Ready</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.wikio.com/subscribe?url=http%3A%2F%2Ffeeds.weblogssl.com%2Fgenbetadev" src="http://www.wikio.com/shared/img/add2wikio.gif">Subscribe with Wikio</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.dailyrotation.com/index.php?feed=http%3A%2F%2Ffeeds.weblogssl.com%2Fgenbetadev" src="http://www.dailyrotation.com/rss-dr2.gif">Subscribe with Daily Rotation</feedburner:feedFlare><item><title>Defacement contra el impago de una web, ¿una solución acertada?</title><link>http://weblogssl.feedsportal.com/c/33859/f/609642/s/1f7330ba/l/0L0Sgenbetadev0N0Cdesarrollo0Efreelance0Cdefacement0Econtra0Eel0Eimpago0Ede0Euna0Eweb0Euna0Esolucion0Eacertada/story01.htm</link><description>&lt;p&gt;&lt;img alt="Defacement de una web no pagada" src="http://img.genbetadev.com/2012/05/Defacement.jpg" class="centro" /&gt;&lt;br /&gt; La imagen que veis arriba es un ejemplo real que estos días está circulando por diversas redes sociales. Se trata de la &lt;strong&gt;web de una pequeña empresa que&lt;/strong&gt;, atendiendo a la versión de su diseñador, &lt;strong&gt;no fue pagada&lt;/strong&gt;. Esto me da que pensar y me hace lanzar una pregunta al aire: &lt;strong&gt;¿sirve de algo &lt;em&gt;okupar&lt;/em&gt; la web de quien no te paga?&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;La raíz del problema está bastante clara y es conocida en nuestro mundillo: a día de hoy, sigue siendo muy difícil hacer ver a los clientes el valor de nuestro trabajo. &lt;strong&gt;Nuestra profesión está muy infravalorada&lt;/strong&gt; y nos encontramos con muchos clientes que piensan que programar una web es &lt;em&gt;poner cuatro botones&lt;/em&gt; y que diseñarla artísticamente es &lt;em&gt;hacer tres garabatos&lt;/em&gt;. Así, cuando llega el momento de la entrega y pasamos la factura, nos podemos encontrar con la desagradable sorpresa de que el clienta &lt;em&gt;no se crea&lt;/em&gt; nuestros precios y decida no pagarnos.&lt;/p&gt; &lt;p&gt;Ante una situación así, ¿qué podemos hacer para cobrar lo que nos corresponde? ¿Cómo podríamos haber evitado llegar hasta aquí?&lt;br /&gt; &lt;!--more--&gt;&lt;br /&gt; &lt;h2&gt;El dilema moral&lt;/h2&gt;&lt;/p&gt; &lt;p&gt;Hacer un &lt;strong&gt;defacement&lt;/strong&gt; es una decisión que no debería tomarse a la ligera. Sí, vale que tenemos &lt;em&gt;la mala costumbre de querer comer a diario&lt;/em&gt;, pero antes de elegir ese método para reclamar tu dinero debes recordar el sabio dicho que aconsejaba:&lt;/p&gt; &lt;blockquote&gt;No tomes decisiones estando enfadado, ni hagas promesas estando contento.&lt;/blockquote&gt; &lt;p&gt;En el caso de una pequeña o mediana empresa es bastante probable que haya recaído sobre ti toda la responsabilidad tecnológica, desde el alquiler del hosting y el dominio, hasta la programación y diseño de la web. Es probable que tú tengas todas las claves del ftp, e incluso que seas el único que las conoce, pero tener ese poder no te da derecho a modificarlo a tu gusto. Por eso lo llaman ser el &lt;strong&gt;responsable&lt;/strong&gt; del apartado tecnológico.&lt;/p&gt; &lt;p&gt;Al cambiar la web de tu cliente para mostrar tu reclamación en lugar de su producto, te estás rebajando al nivel de un &lt;a href="http://es.wikipedia.org/wiki/Cracker"&gt;cracker&lt;/a&gt; o de un chantajista. Pero es más, aparte de tu dilema ético está el hecho de que darías al cliente la potestad de denunciarte por diversas faltas o delitos, desde el &lt;strong&gt;incumplimiento de contrato&lt;/strong&gt; hasta la difamación y otros &lt;strong&gt;delitos contra el honor&lt;/strong&gt;. &lt;/p&gt; &lt;p&gt;Por otra parte, no hace falta tener acceso a las claves del dominio de la propia web para crearle una campaña en contra. Ahora son muchos los que se dedican a crear cuentas específicas de Twitter o páginas de empresa en Facebook con el nombre de la empresa morosa pero con contenidos que denuncian dicho impago. Una táctica similar fue usada por la &lt;em&gt;&amp;#8220;Plataforma per la llengua&amp;#8221;&lt;/em&gt; para exigir el uso del catalán a varias marcas conocidas, registrando un dominio .cat por cada una de ellas y denunciando sus prácticas, aunque se ofrecían a ceder dichos dominios a las marcas de marras.&lt;/p&gt; &lt;p&gt;&lt;img alt="Campaña solicitando el etiquetado de Danone en catalán" src="http://img.genbetadev.com/2012/05/Danone_cat.png" class="centro" /&gt;&lt;/p&gt; &lt;p&gt;Aunque la estrategia dio algunos de sus frutos y las marcas adoptaron el dominio .cat, buena parte de la opinión pública lo vio como una &lt;a href="http://espana.barrapunto.com/article.pl?sid=07/10/16/1710219"&gt;extorsión a las multinacionales&lt;/a&gt;. Polémicas aparte, es precisamente con estas grandes empresas, tan preocupadas por su imagen pública, cuando más fácil es que funcione la táctica de la publicidad negativa, mientras que a una pyme puede afectarle mucho menos lo que se diga de ella.&lt;/p&gt; &lt;h2&gt;Reputación vs cobro&lt;/h2&gt; &lt;p&gt;Pero no todo queda ahí. Independientemente de cómo acabe la situación con el cliente con el que tienes la disputa, &lt;strong&gt;el deface puede convertirse en tu peor tarjeta de presentación&lt;/strong&gt;. El mundo de la informática, y especialmente en algunos sectores concretos, es bastante endogámico, y tus posibles futuros clientes podrían tener conocimiento de las &lt;em&gt;malas artes&lt;/em&gt; con las que has reclamado el cobro.&lt;/p&gt; &lt;p&gt;¿Qué opinión se puede hacer de ti un cliente que buscando tu &lt;em&gt;portfolio&lt;/em&gt; se encuentra una página de denuncia que deja en mal lugar al cliente o anunciante? Ten en cuenta que este futuro cliente no sabrá si eres tú quien llevaba la razón contra tu no pagador, y es probable que se posicione junto al otro cliente y te vea como alguien con exigencias económicas muy altas o poco sentido de la ética profesional.&lt;/p&gt; &lt;p&gt;Salvo que la &lt;em&gt;mordida&lt;/em&gt; por este proyecto sea muy importante en lo económico, es importante que sopeses cuánto podrías ganar si consigues que finalmente te pague, y cuánto puedes llegar a perder en &lt;strong&gt;proyectos futuros&lt;/strong&gt; no concedidos por culpa de una reputación beligerante.&lt;/p&gt; &lt;h2&gt;Cómo evitar llegar a este punto&lt;/h2&gt; &lt;p&gt;En un mundo utópico tú sabrías reconocer todas las necesidades de un cliente, él sabría reconocer tu trabajo y ambos llegaríais a un &lt;strong&gt;acuerdo sobre el precio más justo&lt;/strong&gt; para ese trabajo, tú entregarías la web con toda la funcionalidad en el plazo acordado y por último él te pagaría lo pactado. Demasiado utópico todo, ¿verdad?&lt;/p&gt; &lt;p&gt;En primer lugar, hagamos un poco de introspección. ¿Hemos cubierto las necesidades planteadas por el cliente? Si es así, ¿queda patente que están cubiertas? Si queremos hacer valer nuestro trabajo, lo primero que tenemos que conseguir es que quede constancia de que con nuestro desarrollo se van a satisfacer las necesidades por las que se nos llamó en un primer momento. Si la web no cumple alguno de los requisitos descritos, o la operatividad es tan compleja que no se ve de forma sencilla que la funcionalidad está realmente ahí, el cliente pensará que no hemos hecho el trabajo para el que nos contrató.&lt;/p&gt; &lt;p&gt;En segundo lugar, hay que acordar un precio que sea justo tanto para ti como para el cliente. Aquí no existe ninguna panacea, pero sí que puedes usar herramientas como &lt;a href="http://www.genbetadev.com/desarrollo-freelance/cuantocobrar-la-aplicacion-que-aconseja-al-trabajador-freelance-sobre-sus-tarifas"&gt;la aplicación CuantoCobrar&lt;/a&gt; para que te sirva de guía para no inflar demasiado tus precios, al tiempo que le puedes mostrar al cliente unos baremos aproximados de cómo está el mercado y de los distintos costes en los que incurres, que van mucho más allá del &lt;em&gt;teclear un poco y dibujar unos trazos&lt;/em&gt;.&lt;/p&gt; &lt;p&gt;Si hasta aquí ha ido todo bien y has conseguido &lt;strong&gt;involucrar al cliente&lt;/strong&gt; en tu trabajo hasta el punto de reconocer su valor, ahora es toda tu responsabilidad el seguir con el plan trazado y entregar toda la funcionalidad en plazo. Desgraciadamente, los imprevistos son inevitables y siempre puede haber algo que lo impida, pero si has sabido demostrar tu implicación en el proyecto es menos probable que el cliente se aferre a la excusa de los plazos para incumplir su deber de pago.&lt;/p&gt; &lt;p&gt;No obstante, en esta vida hay mucho caradura y aunque hagas todo bien puede dejar de pagarte alegando fallos que no son tales o falta de liquidez debido a sus proveedores, etc. Puede que incluso se apodere de tus diseños sin haber pagado por ellos y los utilice en la rotulación de su establecimiento, coches de empresa, &lt;em&gt;branding&lt;/em&gt;, etc. Ahí, inevitablemente, te ves en la misma situación que el compositor cuya obra han plagiado o el panadero al que le han robado su pan. No es plato de buen gusto, pero en esa situación &lt;strong&gt;debes denunciar&lt;/strong&gt; y esperar que la justicia te conceda lo que es tuyo.&lt;/p&gt; &lt;p&gt;No obstante, si durante la fase de desarrollo (especialmente si te acercas al final y ya has invertido mucho tiempo y esfuerzo) sospechas que tu cliente pueda ser uno de esos caraduras, puedes intentar forzar una &lt;strong&gt;renegociación de las condiciones de pago&lt;/strong&gt; y sólo activar ciertas funcionalidades conforme te vaya pagando la parte proporcional de las mismas.&lt;/p&gt; &lt;p&gt;Puestos a meter una &lt;strong&gt;bomba lógica&lt;/strong&gt; dentro del programa, mejor que sea para activar funciones en el momento en el que cobres, que para desactivarlas si la otra parte incumple el trato. Si entregas una maqueta consistente, aunque sin funcionamiento real, será más fácil convencer al cliente de que si cumple con su obligación, activarás los datos y procesos reales.&lt;/p&gt; &lt;p&gt;En Tecnología Pyme | &lt;a href="http://www.tecnologiapyme.com/ebusiness/si-contratas-a-un-profesional-para-disenar-tu-web-deja-que-haga-su-trabajo"&gt;Si contratas a un profesional para diseñar tu web, deja que haga su trabajo&lt;/a&gt;&lt;br /&gt; En Genbeta Dev | &lt;a href="http://www.genbetadev.com/trabajar-como-desarrollador/los-limites-de-la-etica-del-programador-mercenario"&gt;Los límites de la ética del programador mercenario&lt;/a&gt;, &lt;a href="http://www.genbetadev.com/trabajar-como-desarrollador/autoempleo-no-es-prostitucion"&gt;Autoempleo no es prostitución&lt;/a&gt;&lt;br /&gt; Imagen de danone.cat | &lt;a href="https://www.plataforma-llengua.cat/danonecat/"&gt;Plataforma per la llengua&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='http://weblogssl.feedsportal.com/c/33859/f/609642/s/1f7330ba/mf.gif' border='0'/&gt;&lt;div class='mf-viral'&gt;&lt;table border='0'&gt;&lt;tr&gt;&lt;td valign='middle'&gt;&lt;a href="http://share.feedsportal.com/viral/sendEmail.cfm?lang=es&amp;title=Defacement+contra+el+impago+de+una+web%2C+%C2%BFuna+soluci%C3%B3n+acertada%3F&amp;link=http%3A%2F%2Fwww.genbetadev.com%2Fdesarrollo-freelance%2Fdefacement-contra-el-impago-de-una-web-una-solucion-acertada" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/emailthis2_es.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark_es.cfm?title=Defacement+contra+el+impago+de+una+web%2C+%C2%BFuna+soluci%C3%B3n+acertada%3F&amp;link=http%3A%2F%2Fwww.genbetadev.com%2Fdesarrollo-freelance%2Fdefacement-contra-el-impago-de-una-web-una-solucion-acertada" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/bookmark_es.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://da.feedsportal.com/r/134204345194/u/49/f/609642/c/33859/s/1f7330ba/kg/319-329/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/134204345194/u/49/f/609642/c/33859/s/1f7330ba/kg/319-329/a2.img" border="0"/&gt;&lt;/a&gt;&lt;img width="1" height="1" src="http://pi.feedsportal.com/r/134204345194/u/49/f/609642/c/33859/s/1f7330ba/kg/319-329/a2t.img" border="0"/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.weblogssl.com/~ff/genbetadev?a=AYhDBwjwMl0:3nibwxds9s0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/genbetadev?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.weblogssl.com/~ff/genbetadev?a=AYhDBwjwMl0:3nibwxds9s0:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/genbetadev?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><pubDate>Thu, 17 May 2012 14:00:00 GMT</pubDate><author>Johnbo</author><guid isPermaLink="false">http://www.genbetadev.com/desarrollo-freelance/defacement-contra-el-impago-de-una-web-una-solucion-acertada</guid></item><item><title>¿Cuál fue tu primer lenguaje y por qué lo abandonaste?: La pregunta de la semana</title><link>http://weblogssl.feedsportal.com/c/33859/f/609642/s/1f718ae6/l/0L0Sgenbetadev0N0Cgenbeta0Edev0Ccual0Efue0Etu0Eprimer0Elenguaje0Ey0Epor0Eque0Elo0Eabandonaste0Ela0Epregunta0Ede0Ela0Esemana/story01.htm</link><description>&lt;p&gt;&lt;img src="http://img.genbetadev.com/2012/04/bg-header-qa_6501-1.jpg" class="centro"&gt;&lt;/p&gt; &lt;p&gt;Pues ya estamos aquí otra vez dispuestos a realizar la &lt;a href="http://www.genbetadev.com/tag/la-pregunta-de-la-semana"&gt;pregunta de la semana&lt;/a&gt;. La semana pasada afloró la vena filosófica y esta semana va a aflorar la pragmática:&lt;/p&gt; &lt;p&gt;&lt;p&gt;&lt;blockquote&gt;&lt;a href="http://www.genbetadev.com/respuestas/cual-fue-tu-primer-lenguaje-y-por-que-lo-abandonaste"&gt;¿Cuál fue tu primer lenguaje y por qué lo abandonaste?&lt;/a&gt;&lt;/blockquote&gt;&lt;/p&gt; &lt;p&gt;A ser posible explicad de forma objetiva el motivo que os llevó a abandonar ese primer lenguaje que habíais abrazado y que tantas satisfacciones (o no) os había dado.&lt;/p&gt; &lt;p&gt;Como siempre, es mejor &lt;strong&gt;responder a la pregunta en la sección de respuestas&lt;/strong&gt; en lugar de en los comentarios de esta entrada, aunque puedes hacerlo en los dos sitios si lo prefieres. Lo principal es que siempre respondas en la sección de respuestas y así tu respuesta podrá salir vencedora y &lt;strong&gt;aparecerá en el post de la próxima semana&lt;/strong&gt;. &lt;/p&gt; &lt;p&gt;&lt;!--more--&gt;&lt;/p&gt; &lt;p&gt;Y hablando de repuestas elegidas, esta es la respuesta elegida para nuestra pregunta de la semana pasada &lt;a href="http://www.genbetadev.com/respuestas/que-te-motivo-a-convertirte-en-programador"&gt;¿Qué te motivó a convertirte en programador?&lt;/a&gt; enviada por &lt;a href="http://www.genbetadev.com/usuario/errepunto"&gt;errepunto&lt;/a&gt; (triki para los amigos):&lt;/p&gt; &lt;p&gt;&lt;blockquote&gt;¡Es lo más parecido a ser un nigromante! Creas un ejército de rutinas y funciones que lanzas con indiferencia a batallar a la &lt;span class="caps"&gt;RAM&lt;/span&gt; con el procesador como arma, para conseguir tus oscuros fines. Estooo, ¿cuál era la pregunta? :)&lt;/blockquote&gt;&lt;/p&gt; &lt;p&gt;¡Nos vemos en la sección de respuestas!.&lt;/p&gt; &lt;p&gt;En Genbeta Dev | &lt;a href="http://www.genbetadev.com/respuestas/cual-fue-tu-primer-lenguaje-y-por-que-lo-abandonaste"&gt;¿Cuál fue tu primer lenguaje y por qué lo abandonaste?&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='http://weblogssl.feedsportal.com/c/33859/f/609642/s/1f718ae6/mf.gif' border='0'/&gt;&lt;div class='mf-viral'&gt;&lt;table border='0'&gt;&lt;tr&gt;&lt;td valign='middle'&gt;&lt;a href="http://share.feedsportal.com/viral/sendEmail.cfm?lang=es&amp;title=%C2%BFCu%C3%A1l+fue+tu+primer+lenguaje+y+por+qu%C3%A9+lo+abandonaste%3F%3A+La+pregunta+de+la+semana&amp;link=http%3A%2F%2Fwww.genbetadev.com%2Fgenbeta-dev%2Fcual-fue-tu-primer-lenguaje-y-por-que-lo-abandonaste-la-pregunta-de-la-semana" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/emailthis2_es.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark_es.cfm?title=%C2%BFCu%C3%A1l+fue+tu+primer+lenguaje+y+por+qu%C3%A9+lo+abandonaste%3F%3A+La+pregunta+de+la+semana&amp;link=http%3A%2F%2Fwww.genbetadev.com%2Fgenbeta-dev%2Fcual-fue-tu-primer-lenguaje-y-por-que-lo-abandonaste-la-pregunta-de-la-semana" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/bookmark_es.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://da.feedsportal.com/r/134204580972/u/49/f/609642/c/33859/s/1f718ae6/kg/324/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/134204580972/u/49/f/609642/c/33859/s/1f718ae6/kg/324/a2.img" border="0"/&gt;&lt;/a&gt;&lt;img width="1" height="1" src="http://pi.feedsportal.com/r/134204580972/u/49/f/609642/c/33859/s/1f718ae6/kg/324/a2t.img" border="0"/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.weblogssl.com/~ff/genbetadev?a=YVNpX-MiQLg:LpUWD64ew24:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/genbetadev?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.weblogssl.com/~ff/genbetadev?a=YVNpX-MiQLg:LpUWD64ew24:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/genbetadev?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><pubDate>Thu, 17 May 2012 10:10:14 GMT</pubDate><author>Oscar Campos</author><guid isPermaLink="false">http://www.genbetadev.com/genbeta-dev/cual-fue-tu-primer-lenguaje-y-por-que-lo-abandonaste-la-pregunta-de-la-semana</guid></item><item><title>Amazon Cloudfront, permite distribuir contenido dinámico desde sus CDN</title><link>http://weblogssl.feedsportal.com/c/33859/f/609642/s/1f67605f/l/0L0Sgenbetadev0N0Cprogramacion0Een0Ela0Enube0Camazon0Ecloudfront0Epermite0Edistribuir0Econtenido0Edinamico0Edesde0Esus0Ecdn/story01.htm</link><description>&lt;p&gt;&lt;img alt="amazon cloudfront ec2" src="http://img.genbetadev.com/2012/05/650_1000_amazon-cloudfront-ec2.png" class="centro_sinmarco" /&gt;&lt;/p&gt; &lt;p&gt;A la capacidad de distribuir contenido estático y streaming de &lt;strong&gt;Amazon Cloudfront&lt;/strong&gt;, se le une una nueva característica que permite &lt;strong&gt;servir contenido dinámico y personalizado&lt;/strong&gt; con la ventaja de disponer de numerosos &lt;span class="caps"&gt;CDN&lt;/span&gt; repartidos por todo el mundo. El competidor de &lt;strong&gt;Akamai&lt;/strong&gt; desarrollado por Amazon Web Services sigue ofreciendo más servicios a bajo coste y de una forma sencilla de configurar a través de la &lt;span class="caps"&gt;AWS&lt;/span&gt; Management Console.&lt;/p&gt; &lt;p&gt;Amazon explica en una entrada de &lt;a href="http://aws.typepad.com/aws/2012/05/amazon-cloudfront-support-for-dynamic-content.html"&gt;su blog técnico&lt;/a&gt; que este nuevo servicio no implicará ningún coste adicional, ni la necesidad de escribir código adicional. Incrementa el rendimiento y la fiabilidad a la hora de servir contenido dinámico. &lt;/p&gt; &lt;p&gt;&lt;!--more--&gt;&lt;/p&gt; &lt;p&gt;Podemos seleccionar distintos servidores orígenes para cada tipo de contenidos: &lt;strong&gt;un bucket de Amazon S3&lt;/strong&gt; para el contenido estático y&lt;strong&gt; Amazon EC2 para el contenido dinámico&lt;/strong&gt;. Este contenido puede engancharse de cualquier instancia que tengamos en EC2 que sirva contenido dinámico indicando los paramentos que queramos en la query string para indicarle a Cloudfront si debe ofrecer ese contenido cacheado o directamente del servidor origen.&lt;/p&gt; &lt;p&gt;&lt;img alt="Cloudfront" src="http://img.genbetadev.com/2012/05/650_1000_cloudfront-dynamic.jpg" class="centro" /&gt;&lt;/p&gt; &lt;p&gt;No está permitido ningún origen fuera de &lt;span class="caps"&gt;AWS&lt;/span&gt;, así que no podremos usar este servicio con nuestros propios servidores, pero es una buena alternativa si todo nuestro contenido está en Amazon EC2 o S3.&lt;/p&gt; &lt;p&gt;Más información | &lt;a href="http://aws.amazon.com/es/cloudfront/"&gt;Amazon Cloudfront&lt;/a&gt;&lt;br /&gt; Vía | &lt;a href="http://aws.typepad.com/aws/2012/05/amazon-cloudfront-support-for-dynamic-content.html"&gt;&lt;span class="caps"&gt;AWS&lt;/span&gt; blog&lt;/a&gt;&lt;br /&gt; Vídeo | &lt;a href="http://www.youtube.com/watch?v=yvCYTDkjMJw"&gt;Introducción a Amazon Cloudfront&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='http://weblogssl.feedsportal.com/c/33859/f/609642/s/1f67605f/mf.gif' border='0'/&gt;&lt;div class='mf-viral'&gt;&lt;table border='0'&gt;&lt;tr&gt;&lt;td valign='middle'&gt;&lt;a href="http://share.feedsportal.com/viral/sendEmail.cfm?lang=es&amp;title=Amazon+Cloudfront%2C+permite+distribuir+contenido+din%C3%A1mico+desde+sus+CDN&amp;link=http%3A%2F%2Fwww.genbetadev.com%2Fprogramacion-en-la-nube%2Famazon-cloudfront-permite-distribuir-contenido-dinamico-desde-sus-cdn" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/emailthis2_es.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark_es.cfm?title=Amazon+Cloudfront%2C+permite+distribuir+contenido+din%C3%A1mico+desde+sus+CDN&amp;link=http%3A%2F%2Fwww.genbetadev.com%2Fprogramacion-en-la-nube%2Famazon-cloudfront-permite-distribuir-contenido-dinamico-desde-sus-cdn" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/bookmark_es.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://da.feedsportal.com/r/134204285359/u/49/f/609642/c/33859/s/1f67605f/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/134204285359/u/49/f/609642/c/33859/s/1f67605f/a2.img" border="0"/&gt;&lt;/a&gt;&lt;img width="1" height="1" src="http://pi.feedsportal.com/r/134204285359/u/49/f/609642/c/33859/s/1f67605f/a2t.img" border="0"/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.weblogssl.com/~ff/genbetadev?a=geCbrQvQPmE:1JPTKQIdIc8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/genbetadev?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.weblogssl.com/~ff/genbetadev?a=geCbrQvQPmE:1JPTKQIdIc8:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/genbetadev?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><pubDate>Wed, 16 May 2012 06:51:25 GMT</pubDate><author>Txema Rodríguez</author><guid isPermaLink="false">http://www.genbetadev.com/programacion-en-la-nube/amazon-cloudfront-permite-distribuir-contenido-dinamico-desde-sus-cdn</guid></item><item><title>Introducción: Play Framework 2 (Parte I: Scala)</title><link>http://weblogssl.feedsportal.com/c/33859/f/609642/s/1f65aa03/l/0L0Sgenbetadev0N0Cframeworks0Cintroduccion0Eplay0Eframework0E20Eparte0Ei0Escala/story01.htm</link><description>&lt;p&gt;&lt;img alt="Play with Scala" src="http://img.genbetadev.com/galleries/play-scala/scala.png" class="centro_sinmarco" /&gt;&lt;/p&gt; &lt;p&gt; &lt;p&gt;Para aquellos que no lo conozcan, &lt;a href="http://www.playframework.org/"&gt;Play&lt;/a&gt; es un Framework de desarrollo web para Java y &lt;strong&gt;Scala&lt;/strong&gt;. Ha sido desarrollado por Guillaume Bort como proyecto interno para su empresa Zenexity y luego liberado como Open Source.&lt;/p&gt; &lt;p&gt;A partir de la versión 2.0 del mismo, &lt;a href="http://en.wikipedia.org/wiki/Martin_Odersky"&gt;Martin Odersky&lt;/a&gt; y su compañía &lt;strong&gt;TypeSafe&lt;/strong&gt; que a su vez son los creadores de Scala han decidido incluirlo en el paquete que denominan &lt;a href="http://typesafe.com/stack"&gt;TypeSafe Stack&lt;/a&gt;.&lt;/p&gt;&lt;/p&gt; &lt;p&gt;Como ya hemos dicho, Play puede ser utilizado para &lt;strong&gt;construir sitios y aplicaciones web&lt;/strong&gt; tanto en Java como en Scala comparten gran parte de la &lt;span class="caps"&gt;&lt;span class="caps"&gt;&lt;span class="caps"&gt;API&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; ya que Scala puede importar y utilizar librerías de Java sin problemas.&lt;/p&gt; &lt;p&gt;Pero antes de hacer una &lt;strong&gt;pequeña introducción&lt;/strong&gt; al framework es necesario hablar sobre que es Scala y por qué es &amp;#8220;&lt;em&gt;especial&lt;/em&gt;&amp;#8220;. Esta guía introductoria &lt;strong&gt;no pretende&lt;/strong&gt; ser una guía exhaustiva del lenguaje de programación Scala, tal tarea es algo que &lt;strong&gt;se escapa&lt;/strong&gt; a mis pretensiones y mi inteligencia.&lt;!--more--&gt;&lt;/p&gt; &lt;p&gt; &lt;p&gt;&lt;h2&gt;¿Qué es Scala?&lt;/h2&gt;&lt;br /&gt; &lt;/p&gt; &lt;p&gt;Scala es un lenguaje de programación &lt;strong&gt;multiparadigma&lt;/strong&gt; diseñado para integrar características de la &lt;strong&gt;programación orientada a objetos&lt;/strong&gt; y de la &lt;strong&gt;programación funcional&lt;/strong&gt;. Aunque nuestra primera reacción es pensar que ambos paradigmas son excluyentes, lo cierto es que Scala ha sabido mezclarlos de manera muy sutil con un gran resultado.&lt;/p&gt;&lt;/p&gt; &lt;p&gt;Scala es de &lt;strong&gt;tipado estático&lt;/strong&gt; fuerte y por lo tanto debe compilarse aunque también puede utilizarse a modo de scripts utilizando el &amp;#8220;intérprete&amp;#8221; de línea de comandos para ejecutar pequeños programas escritos en él sin necesidad de compilar previamente a bytecode los mismos.&lt;/p&gt; &lt;p&gt;Scala nos permite programar de forma &lt;strong&gt;imperativa&lt;/strong&gt;, &lt;strong&gt;funcional&lt;/strong&gt; o &lt;strong&gt;ambas a la vez&lt;/strong&gt;. Por ejemplo, podemos utilizar Polimorfismo clásico de la orientación a objetos o bien &lt;a href="http://en.wikipedia.org/wiki/Pattern_matching"&gt;pattern matching&lt;/a&gt; para resolver el mismo problema. Podemos usar uno u otro paradigma dependiendo de si la solución que plantea &lt;strong&gt;parece la más adecuada&lt;/strong&gt; a la hora de resolver el problema al que nos estamos enfrentando. &lt;/p&gt; &lt;p&gt;En Scala, así como en todos los lenguajes que soportan la programación funcional (incluso &lt;span class="caps"&gt;&lt;span class="caps"&gt;&lt;span class="caps"&gt;PHP&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; después de su versión 5.3.1) las funciones son &lt;strong&gt;ciudadanos de primer orden&lt;/strong&gt; (o first-class) dentro del lenguaje y por lo tanto pueden ser creadas &lt;strong&gt;utilizando literales&lt;/strong&gt; que después pueden ser pasados como parámetros y devueltos por otras funciones. &lt;/p&gt; &lt;p&gt;En Scala además los &lt;strong&gt;tipos&lt;/strong&gt; son &lt;strong&gt;inferidos&lt;/strong&gt; aunque también pueden ser definidos de forma explicita. Por ejemplo:&lt;pre class="prettyprint lang-scala"&gt;val uno = 1&lt;br /&gt; val dos: Int = 2&lt;/pre&gt;Ambas declaraciones son válidas. En el primer caso el tipo de la variable (aunque inmutable) uno es Int ya que es inferido por el compilador.&lt;/p&gt; &lt;p&gt;Scala se ejecuta sobre la &lt;strong&gt;máquina virtual de Java&lt;/strong&gt; (&lt;span class="caps"&gt;&lt;span class="caps"&gt;&lt;span class="caps"&gt;JVM&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;) y/o la &lt;strong&gt;máquina virtual de .NET&lt;/strong&gt; (&lt;span class="caps"&gt;&lt;span class="caps"&gt;&lt;span class="caps"&gt;CLR&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;), también puede correr sobre &lt;strong&gt;Dalvik en la plataforma Android&lt;/strong&gt;. Tanto el compilador como las librerías se distribuyen bajo una &lt;strong&gt;licencia &lt;span class="caps"&gt;&lt;span class="caps"&gt;&lt;span class="caps"&gt;BSD&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt; &lt;p&gt;&lt;h3&gt;El &lt;span class="caps"&gt;&lt;span class="caps"&gt;&lt;span class="caps"&gt;REPL&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;br /&gt; &lt;/p&gt; &lt;p&gt;Scala viene con una especie de intérprete conocido como el &lt;strong&gt;&lt;span class="caps"&gt;&lt;span class="caps"&gt;&lt;span class="caps"&gt;REPL&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt; (Read, Evaluate, Print, Loop) que puede ser ejecutado desde el terminal al instalar el lenguaje en nuestro sistema. Para acceder a él tan solo tenemos que escribir el comando &lt;em&gt;&lt;strong&gt;scala&lt;/strong&gt;&lt;/em&gt; en la línea de comandos de nuestro sistema operativo.&lt;/p&gt;&lt;/p&gt; &lt;p&gt;En el caso de Windows es posible que primero necesites añadir la ruta al directorio de los binarios de Scala al &lt;span class="caps"&gt;&lt;span class="caps"&gt;&lt;span class="caps"&gt;PATH&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; del sistema.&lt;/p&gt; &lt;p&gt; &lt;p&gt;&lt;h3&gt;Programación Orientada a Objetos&lt;/h3&gt;&lt;br /&gt; &lt;/p&gt; &lt;p&gt;Scala es un lenguaje orientado a objetos &lt;strong&gt;puro&lt;/strong&gt;, es decir, todo en Scala es un objeto. Las estructuras de datos así como los métodos que definen su comportamiento están descritos por &lt;strong&gt;clases y traits&lt;/strong&gt;. Así definiríamos una clase en Scala:&lt;pre class="prettyprint lang-scala"&gt;class User { private var name = &amp;#34;Perico&amp;#34; private var lastname = &amp;#34;Los Palotes&amp;#34; // En Scala se usa la palabra reservada def (como en Python) // para declarar un método o función def fullname(): String = { name + &amp;#34; &amp;#34; + lastname }&lt;br /&gt; }&lt;br /&gt; val perico = new User&lt;br /&gt; perico.fullname&lt;/pre&gt;&lt;/p&gt;&lt;/p&gt; &lt;p&gt;Habréis notado la ausencia de la palabra reservada &lt;em&gt;&lt;strong&gt;return&lt;/strong&gt;&lt;/em&gt; en el ejemplo anterior, en Scala la última expresión que aparece en una función es usada como &lt;strong&gt;su valor de retorno&lt;/strong&gt;. Los punto y coma son &lt;strong&gt;opcionales&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;El cuerpo de una función &lt;strong&gt;no es obligatorio&lt;/strong&gt; en Scala si, como en nuestro ejemplo, la función solo ejecuta una expresión. Podríamos haber reducido nuestro código declarando el método &lt;code&gt;fullname&lt;/code&gt; de la siguiente forma: &lt;pre class="prettyprint lang-scala"&gt;&lt;code&gt;def fullname(): String = name + &amp;#34; &amp;#34; + lastname&lt;/code&gt;&lt;/pre&gt;Tambień podríamos haber obviado el tipo del valor de retorno (String) que habría sido&lt;strong&gt; inferido de forma automática&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;Scala es &lt;strong&gt;más estricto&lt;/strong&gt; en su orientación a objetos que &lt;strong&gt;Java&lt;/strong&gt; o &lt;strong&gt;C++&lt;/strong&gt; y las clases no soportan métodos estáticos por lo que el lenguaje hace uso de &lt;strong&gt;objetos singleton&lt;/strong&gt;. La definición de un objeto singleton se parece a la definición de una clase excepto que en lugar de usar la palabra reservada &lt;em&gt;&lt;strong&gt;class&lt;/strong&gt;&lt;/em&gt; usamos la palabra reservada &lt;em&gt;&lt;strong&gt;object&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt; &lt;p&gt;Scala soporta la extensión de tipos mediante &lt;strong&gt;herencia simple&lt;/strong&gt; así como un mecanismo de composición basado en &lt;strong&gt;mixins&lt;/strong&gt; usando traits. Asimismo Scala incorpora &lt;strong&gt;reglas de visibilidad&lt;/strong&gt; para ocultar el scope de los métodos y/o propiedades a través de las palabras reservadas &lt;em&gt;&lt;strong&gt;public&lt;/strong&gt;&lt;/em&gt;, &lt;em&gt;&lt;strong&gt;protected&lt;/strong&gt;&lt;/em&gt; y &lt;em&gt;&lt;strong&gt;private&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt; &lt;p&gt;Podemos &lt;strong&gt;sobreescribir métodos&lt;/strong&gt; de clases y traits utilizando la palabra reservada &lt;em&gt;&lt;strong&gt;override&lt;/strong&gt;&lt;/em&gt;. Podemos declarar los tipos como finales para que no puedan sobreescribirse o abstractos para lo contrario.&lt;/p&gt; &lt;p&gt;La implementación de la orientación a objetos en Scala es bastante peculiar, por ejemplo existen los &lt;em&gt;&lt;strong&gt;companion objects&lt;/strong&gt;&lt;/em&gt; y las &lt;em&gt;&lt;strong&gt;case clases&lt;/strong&gt;&lt;/em&gt; recomiendo echar un ojo a la página de Scala para ampliar esta muy escueta información.&lt;/p&gt; &lt;p&gt; &lt;p&gt;&lt;h3&gt;Programación Funcional&lt;/h3&gt;&lt;br /&gt; &lt;/p&gt; &lt;p&gt;Scala soporta &lt;strong&gt;plenamente&lt;/strong&gt; la programación funcional aunque no exento de problema. Por ejemplo la &lt;strong&gt;optimización de recursión&lt;/strong&gt; (convertir una función recursiva a un loop eliminando posibles stack overflow y la sobrecarga de la llamada a función) con &lt;strong&gt;&lt;em&gt;tail calls&lt;/em&gt;&lt;/strong&gt; (subrutina que aparece en una función como su última instrucción) no está soportada de forma nativa por la &lt;span class="caps"&gt;&lt;span class="caps"&gt;&lt;span class="caps"&gt;JVM&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, el compilador de Scala (&lt;code&gt;scalac&lt;/code&gt;) si lo hace.&lt;/p&gt;&lt;/p&gt; &lt;p&gt; &lt;p&gt;Dentro del estilo de programación funcional encontramos implementadas las siguientes:&lt;br /&gt; &lt;/p&gt; &lt;p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Inmutablidad&lt;/strong&gt;: Scala soporta las variables inmutables a través de la palabra reservada &lt;strong&gt;&lt;em&gt;val&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Funciones First Class&lt;/strong&gt;: Las funciones son ciudadanas de primera clase&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Closures&lt;/strong&gt;: Se pueden definir y utilizar closures y clases anidadas&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Traversing, Mapping, Filtering, Folding y Reducing&lt;/strong&gt;: Operaciones que no producen efectos secundarios en las colecciones&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Pattern Matching&lt;/strong&gt;: Pieza fundamental en los lenguajes funcionales&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Partial Functions&lt;/strong&gt;: Expresiones en las que no todos los argumentos definidos en una función son pasados a la función&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Currying&lt;/strong&gt;: Convierte una función que toma múltiples argumentos en una cadena de funciones que toman un único argumento&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Implicit&lt;/strong&gt;: Algunas veces es necesario usar un tipo en un contexto diferente pero similar al tipo real requerido para ello se usa la palabra reservada &lt;strong&gt;&lt;em&gt;implicit&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Lazy vals&lt;/strong&gt;: Inicialización vaga de variables&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;&lt;/p&gt; &lt;p&gt; &lt;p&gt;&lt;h3&gt;Actores&lt;/h3&gt;&lt;br /&gt; &lt;/p&gt; &lt;p&gt;Scala implementa la concurrencia a través de los llamados &lt;em&gt;&lt;strong&gt;actores&lt;/strong&gt;&lt;/em&gt; que inspirados por el trabajo de Carl Hewitt, Peter Bishop, y Richard Steiger en &lt;em&gt;A Universal Modular Actor Formalism for Artificial Intelligence&lt;/em&gt; y la implementación de estos en el lenguaje &lt;strong&gt;Erlang&lt;/strong&gt;.&lt;/p&gt;&lt;/p&gt; &lt;p&gt; &lt;p&gt;En su forma &lt;strong&gt;más básica&lt;/strong&gt;, los Actores en Scala son objetos que heredan de &lt;code&gt;scala.actors.Actor&lt;/code&gt; y ejecutan alguna función:&lt;br /&gt; &lt;/p&gt; &lt;pre class="prettyprint lang-scala"&gt;import scala.actors.Actor&lt;br /&gt; class WorkerDog extends Actor { def talk() { println(&amp;#34;Woof woof&amp;#8230; and this is a side effect :(&amp;#34;) } def act = talk&lt;br /&gt; }&lt;br /&gt; val toby = new WorkerDog&lt;br /&gt; toby.start&lt;/pre&gt;&lt;/p&gt; &lt;p&gt;Esto es bastante similar a la forma en la que usaríamos un Thread en otro lenguaje como por ejemplo &lt;strong&gt;Python&lt;/strong&gt; o Java.&lt;/p&gt; &lt;p&gt; &lt;p&gt;&lt;h2&gt;Conclusión&lt;/h2&gt;&lt;br /&gt; &lt;/p&gt; &lt;p&gt;Aunque en Scala se puede programar de forma imperativa, es recomendable ir utilizando una forma más funcional conforme nos vamos &lt;strong&gt;sintiendo cómodos con el lenguaje&lt;/strong&gt; aunque eso de la comodidad va a tardar en llegar. Scala es un lenguaje complejo y enrevesado con una &lt;strong&gt;curva de aprendizaje brutal&lt;/strong&gt; y en muchos casos desalentadora.&lt;/p&gt;&lt;/p&gt; &lt;p&gt;Recomiendo echarle un ojo en serio a la documentación de Scala y a la página de Play Framework.&lt;/p&gt; &lt;p&gt;Más en Genbeta Dev | &lt;a href="http://www.genbetadev.com/paradigmas-de-programacion/diferencias-entre-paradigmas-de-programacion"&gt;Diferencias entre paradigmas de programación&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='http://weblogssl.feedsportal.com/c/33859/f/609642/s/1f65aa03/mf.gif' border='0'/&gt;&lt;div class='mf-viral'&gt;&lt;table border='0'&gt;&lt;tr&gt;&lt;td valign='middle'&gt;&lt;a href="http://share.feedsportal.com/viral/sendEmail.cfm?lang=es&amp;title=Introducci%C3%B3n%3A+Play+Framework+2+%28Parte+I%3A+Scala%29&amp;link=http%3A%2F%2Fwww.genbetadev.com%2Fframeworks%2Fintroduccion-play-framework-2-parte-i-scala" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/emailthis2_es.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark_es.cfm?title=Introducci%C3%B3n%3A+Play+Framework+2+%28Parte+I%3A+Scala%29&amp;link=http%3A%2F%2Fwww.genbetadev.com%2Fframeworks%2Fintroduccion-play-framework-2-parte-i-scala" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/bookmark_es.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://da.feedsportal.com/r/134204549065/u/49/f/609642/c/33859/s/1f65aa03/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/134204549065/u/49/f/609642/c/33859/s/1f65aa03/a2.img" border="0"/&gt;&lt;/a&gt;&lt;img width="1" height="1" src="http://pi.feedsportal.com/r/134204549065/u/49/f/609642/c/33859/s/1f65aa03/a2t.img" border="0"/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.weblogssl.com/~ff/genbetadev?a=ZkEqkfJaIc4:M_klTtX7v9A:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/genbetadev?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.weblogssl.com/~ff/genbetadev?a=ZkEqkfJaIc4:M_klTtX7v9A:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/genbetadev?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><pubDate>Wed, 16 May 2012 04:00:00 GMT</pubDate><author>Oscar Campos</author><guid isPermaLink="false">http://www.genbetadev.com/frameworks/introduccion-play-framework-2-parte-i-scala</guid></item><item><title>Freepik, un buscador de imágenes libres. Made in Spain</title><link>http://weblogssl.feedsportal.com/c/33859/f/609642/s/1f5d4cf4/l/0L0Sgenbetadev0N0Cherramientas0Cfreepik0Eun0Ebuscador0Ede0Eimagenes0Elibres0Emade0Ein0Espain/story01.htm</link><description>&lt;p&gt;&lt;img alt="Freepik" src="http://img.genbetadev.com/2012/05/freepik.jpg" class="centro" /&gt;&lt;/p&gt; &lt;p&gt;Siguiendo la línea de &lt;strong&gt;GenbetaDev de señalar el trabajo de los desarrolladores de España&lt;/strong&gt; en particular y de Latinoamérica en general, hoy quiero compartir un vistazo, y una breve conversación, a un recurso muy interesante para los diseñadores y desarrolladores web.&lt;/p&gt; &lt;p&gt;&lt;em&gt;Freepik es un motor de búsqueda que ayuda a los diseñadores gráficos y de web a &lt;strong&gt;localizar fotos de alta calidad, imágenes vectoriales, ilustraciones y archivos &lt;span class="caps"&gt;PSD&lt;/span&gt;&lt;/strong&gt; para sus proyectos creativos.&lt;/p&gt; &lt;p&gt;Freepik busca y localiza contenidos gráficos libres en Internet y muestra los resultados en una disposición adecuada para facilitar el acceso. Freepik &lt;strong&gt;hace más fácil que pueda encontrar los archivos que necesitas&lt;/strong&gt; sin buscar manualmente en decenas de sitios web.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;!--more--&gt;&lt;/p&gt; &lt;p&gt;&lt;h2&gt;¿Cómo funciona?&lt;/h2&gt;&lt;br /&gt; Los robots de Freepik visitan cientos de páginas web en busca de recursos gráficos, leen el contenido de estos sites y, si lo considera oportuno, los trata con &lt;strong&gt;un algoritmo que determina el valor del contenido&lt;/strong&gt; y clasifica los resultados según criterios de calidad y pertinencia.&lt;/p&gt; &lt;blockquote&gt;El trabajo duro en Freepik no es realizado por personas. Los robots rastrean Internet manteniendo la base de datos actualizada con los últimos contenidos.&lt;/blockquote&gt; &lt;p&gt;Freepik tiene como objetivo el convertirse en una de las fuentes gráficas más importante, &lt;strong&gt;relacionada con el contenido libre&lt;/strong&gt;, y una herramienta esencial para los diseñadores. Una vez que el usuario encuentra los archivos que necesita, se le redirige a los sitios de alojamiento de los archivos originales.&lt;/p&gt; &lt;h2&gt;Algunas palabras del autor&lt;/h2&gt; &lt;p&gt;&lt;strong&gt;¿Cómo se te ocurrió hacer este producto teniendo a google images o bing images como &amp;#8220;&lt;em&gt;competidores&lt;/em&gt;&amp;#8220;?&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;La idea de desarrollar este proyecto fue por necesidad propia ya que llevo años desarrollando webs y siempre he necesitado de contenido gráfico a poder ser gratuito. Para encontrar una imagen o vector medianamente bueno tenía que recorrer una lista decenas de webs donde diseñadores colgaban contenido gratuito hasta dar con el que me interesaba y todo esto me hacía perder mucho tiempo. &lt;/p&gt; &lt;p&gt;Ahora si buscas una imagen en concreto, el buscador se encarga de visitar por ti cientos de webs y darte los resultados más relevantes de ese momento.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;¿En qué lenguaje y sobre qué plataforma lo habéis realizado?&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Freepik está desarrollado en &lt;span class="caps"&gt;PHP&lt;/span&gt; y Mysql, y como servidor web utilizo Nginx. Está desarrollado completamente a medida ya que es necesario que la web esté muy optimizada ya que tiene millones de usuarios al mes.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;¿Cuantas personas componen el equipo?&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;El sitio lo desarrollé yo en su totalidad, pero desde hace he incorporado a personas en el equipo ya que el proyecto necesita cada día más trabajo.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;¿Alguna ayuda privada o pública?&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Ninguna ayuda, al desarrollarlo yo lo único que necesitaba era tiempo y mas tiempo ;)&lt;/p&gt; &lt;p&gt;&lt;strong&gt;¿Y el futuro?¿Hacia donde se encamina freepik?&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Freepik nació con la idea de ser el buscador de contenido gratuito líder en la red, una vez conseguido este objetivo, estamos trabajando muy duro para darle a los usuarios herramientas para poder proponer contenido, votarlo, clasificarlo y con la ayuda de la comunidad hacer que el contenido sea todavía mejor.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;¿De donde es la empresa?&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;La empresa esta en Málaga Capital.&lt;/p&gt; &lt;p&gt;&lt;h2&gt;Revisión&lt;/h2&gt;&lt;br /&gt; Desde que ha llegado a mis oídos este buscador, &lt;strong&gt;se me ha hecho mucho más fácil encontrar imágenes sin derechos de autor&lt;/strong&gt; para realizar las imágenes de portada de los artículos.&lt;/p&gt; &lt;p&gt;El buscador es rápido y el número de resultados y la utilidad de los mismos, me ha parecido muy buena. Si acaso mejoraría la velocidad en que carga la primera página de imágenes ya que es un poquillo lenta.&lt;/p&gt; &lt;p&gt;Me gusta el poder filtrar la búsqueda por imágenes vectoriales o por fotos. O dar un vistazo rápido a las nuevas imágenes, o los recursos más populares. Y, como marca de la casa, puedo buscar también &lt;strong&gt;ficheros &lt;span class="caps"&gt;PSD&lt;/span&gt; (Photoshop)&lt;/strong&gt;.&lt;/p&gt; &lt;div class="caption-img"&gt; &lt;img alt="Free Source" src="http://img.genbetadev.com/2012/05/freesource.jpg" /&gt; &lt;span&gt;Curioso que solo salgan 8 resultados de &amp;#8220;Free Source&amp;#8221;&lt;/span&gt; &lt;/div&gt; &lt;p&gt;Otra ayuda es el poder darme de alta como usuario. Pudiendo acceder a un histórico de mis descargas o almacenar mis favoritos.&lt;/p&gt; &lt;p&gt;Como conclusión, si bien es cierto que se nota que lleva poco tiempo indexando cuando buscas términos &amp;#8220;raros&amp;#8221; como World of Warcraft, a mi parecer &lt;strong&gt;merece mucho la pena y es de agradecer el trabajo de Alex&lt;/strong&gt;, el autor.&lt;/p&gt; &lt;p&gt;Web | &lt;a href="http://www.freepik.com/"&gt;freepik.com&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='http://weblogssl.feedsportal.com/c/33859/f/609642/s/1f5d4cf4/mf.gif' border='0'/&gt;&lt;div class='mf-viral'&gt;&lt;table border='0'&gt;&lt;tr&gt;&lt;td valign='middle'&gt;&lt;a href="http://share.feedsportal.com/viral/sendEmail.cfm?lang=es&amp;title=Freepik%2C+un+buscador+de+im%C3%A1genes+libres.+Made+in+Spain&amp;link=http%3A%2F%2Fwww.genbetadev.com%2Fherramientas%2Ffreepik-un-buscador-de-imagenes-libres-made-in-spain" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/emailthis2_es.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark_es.cfm?title=Freepik%2C+un+buscador+de+im%C3%A1genes+libres.+Made+in+Spain&amp;link=http%3A%2F%2Fwww.genbetadev.com%2Fherramientas%2Ffreepik-un-buscador-de-imagenes-libres-made-in-spain" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/bookmark_es.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://da.feedsportal.com/r/134204236194/u/49/f/609642/c/33859/s/1f5d4cf4/kg/317-319-326/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/134204236194/u/49/f/609642/c/33859/s/1f5d4cf4/kg/317-319-326/a2.img" border="0"/&gt;&lt;/a&gt;&lt;img width="1" height="1" src="http://pi.feedsportal.com/r/134204236194/u/49/f/609642/c/33859/s/1f5d4cf4/kg/317-319-326/a2t.img" border="0"/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.weblogssl.com/~ff/genbetadev?a=_AwaLuXi23g:FdDWQrj9oH4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/genbetadev?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.weblogssl.com/~ff/genbetadev?a=_AwaLuXi23g:FdDWQrj9oH4:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/genbetadev?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><pubDate>Tue, 15 May 2012 06:00:00 GMT</pubDate><author>Juan Quijano</author><guid isPermaLink="false">http://www.genbetadev.com/herramientas/freepik-un-buscador-de-imagenes-libres-made-in-spain</guid></item><item><title>7 consejos para hacer buen responsive design</title><link>http://weblogssl.feedsportal.com/c/33859/f/609642/s/1f59b27c/l/0L0Sgenbetadev0N0Cdesarrollo0Eweb0C70Econsejos0Epara0Ehacer0Ebuen0Eresponsive0Edesign/story01.htm</link><description>&lt;p&gt;&lt;img alt="responsive design" src="http://img.genbetadev.com/2012/05/responsive_web_design.png" class="centro" /&gt;&lt;/p&gt; &lt;p&gt;Este 2012 es el año de la prima de riesgo, Lana del Rey, las pelis de superhéroes y &lt;strong&gt;el diseño sensible o responsive design&lt;/strong&gt; (amigo lector, esto es sólo la intro del post, no centres tus iras en ella&amp;#8230;). Por eso, cuando he visto un post en uno de mis blogs de desarrollo de cabecera, &lt;strong&gt;Cats who Code&lt;/strong&gt;, con una serie de consejos o tips para crear diseños responsive de calidad, me he visto en la obligación ética y moral de compartirlo con toda la comunidad de &lt;a href="http://www.genbetadev.com"&gt;Genbeta Dev&lt;/a&gt;. En total son &lt;strong&gt;7 consejos para hacer buen responsive design&lt;/strong&gt; y tengo que reconocer que los comparto todos y cada uno:&lt;!--more--&gt;&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;Empieza con una plantilla&lt;/strong&gt;. Si, mola ser un tipo duro y empezar las cosas desde cero pero si hay cosas muy chulas ya hechas (&lt;a href="http://www.getskeleton.com/"&gt;Skeleton&lt;/a&gt;, &lt;a href="http://www.genbetadev.com/desarrollo-web/omega-responsive-design-tambien-en-drupal"&gt;Omega&lt;/a&gt;, &lt;a href="http://www.genbetadev.com/desarrolladores/un-framework-bastante-apanado-para-diseno-web-sensible-responsive"&gt;Amazium&lt;/a&gt;&amp;#8230;), ¿por qué no utilizarlas?&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Trabaja con layouts basados en grids fluidos&lt;/strong&gt;. Lo que en cristiano viene a ser: ni una medida en pixeles, todo en porcentajes y relaciones&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Imágenes flexibles o adaptativas&lt;/strong&gt;. Esto no siempre es fácil y la mayoría de las veces es costoso pero con unas reglas de &lt;span class="caps"&gt;&lt;span class="caps"&gt;CSS&lt;/span&gt;&lt;/span&gt; bien definidas y un buen número de presets para los tamaños de las imágenes, se puede lograr y dar un aspecto genial.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;jQuery es tu amigo&lt;/strong&gt;. Y los plugins de jQuery son más amigos tuyos todavía, añado yo. Exprímelos todo lo que puedas, sin miedo.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;No te olvides del viewport de Apple&lt;/strong&gt;. Porque ahora los iPhones y los iPads son lo que está petando el mercado y lo sabes.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Fondos escalables&lt;/strong&gt;. Primordial para dar una sensación de responsive design bien hecho.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Inspírate&lt;/strong&gt;. Ya dijo Picasso aquello de &amp;#8220;los buenos artistas copian, los genios roban&amp;#8221;. No tengas miedo a ser un Tarantino e inspírate todo lo que puedas. No se trata de inventar la rueda sino de que esta haga ir a nuestro vehículo lo más rápido posible.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Prueba, prueba y vuelve a probar&lt;/strong&gt;. Hay en ciertos ámbitos culturetas cierto desdén por el &amp;#8220;prueba y error&amp;#8221;. En el caso del responsive design no queda otra, tanto que se puede hacer tedioso&amp;#8230; aunque por suerte hay &lt;a href="http://resizemybrowser.com/"&gt;algunas herramientas&lt;/a&gt; que nos pueden facilitar un poco la vida.&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;Y esto es todo. Ya sabéis, la tertulia (mejor tertulia que discusión, que ya somos mayorcitos y este tema tampoco es que sea la crisis económica o la burbuja inmobiliaria, tomemoslo con calma y buen rollo) en los comentarios, que para algo están.&lt;/p&gt; &lt;p&gt;Vía | &lt;a href="http://www.catswhocode.com/blog/tips-and-best-practices-to-develop-responsible-websites"&gt;Cats who Code&lt;/a&gt;&lt;br /&gt; Imagen | &lt;a href="http://www.webdesignshock.com/responsive-design/"&gt;Web Design Shock&lt;/a&gt;&lt;br /&gt; En Genbeta Dev | &lt;a href="http://www.genbetadev.com/tag/responsive-design"&gt;Responsive Design&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='http://weblogssl.feedsportal.com/c/33859/f/609642/s/1f59b27c/mf.gif' border='0'/&gt;&lt;div class='mf-viral'&gt;&lt;table border='0'&gt;&lt;tr&gt;&lt;td valign='middle'&gt;&lt;a href="http://share.feedsportal.com/viral/sendEmail.cfm?lang=es&amp;title=7+consejos+para+hacer+buen+responsive+design&amp;link=http%3A%2F%2Fwww.genbetadev.com%2Fdesarrollo-web%2F7-consejos-para-hacer-buen-responsive-design" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/emailthis2_es.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark_es.cfm?title=7+consejos+para+hacer+buen+responsive+design&amp;link=http%3A%2F%2Fwww.genbetadev.com%2Fdesarrollo-web%2F7-consejos-para-hacer-buen-responsive-design" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/bookmark_es.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://da.feedsportal.com/r/134204217673/u/49/f/609642/c/33859/s/1f59b27c/kg/319/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/134204217673/u/49/f/609642/c/33859/s/1f59b27c/kg/319/a2.img" border="0"/&gt;&lt;/a&gt;&lt;img width="1" height="1" src="http://pi.feedsportal.com/r/134204217673/u/49/f/609642/c/33859/s/1f59b27c/kg/319/a2t.img" border="0"/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.weblogssl.com/~ff/genbetadev?a=YLT2grVGoDI:m4A8UTwUsHQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/genbetadev?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.weblogssl.com/~ff/genbetadev?a=YLT2grVGoDI:m4A8UTwUsHQ:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/genbetadev?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><pubDate>Mon, 14 May 2012 17:45:18 GMT</pubDate><author>Fernando Siles</author><guid isPermaLink="false">http://www.genbetadev.com/desarrollo-web/7-consejos-para-hacer-buen-responsive-design</guid></item><item><title>Sobrecargando los métodos en C#</title><link>http://weblogssl.feedsportal.com/c/33859/f/609642/s/1f53f6ce/l/0L0Sgenbetadev0N0Ccnet0Csobrecargando0Elos0Emetodos0Een0Ec/story01.htm</link><description>&lt;p&gt;&lt;img alt="Sobrecargas de métodos" src="http://img.genbetadev.com/2012/05/sobrecargas.jpg" class="centro" /&gt;&lt;/p&gt; &lt;p&gt;Los lenguajes, como casi todo en este universo que tiende a la entropía, van evolucionando y ganando complejidad con el tiempo. Así nos encontramos con la paradoja de que &lt;b&gt;cuanto más completa es la sintaxis, más ilegible&lt;/b&gt; se puede volver el código.&lt;/p&gt; &lt;p&gt;Por ejemplo, la máxima que decía “&lt;i&gt;escribe la menor cantidad de código, que vaya lo más rápido posible&lt;/i&gt;”, tiene un orden de prioridad menor frente a paradigmas de programación más modernos como &lt;strong&gt;Clean Code o &lt;span class="caps"&gt;KISS&lt;/span&gt;&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;Por ello ahora quiero compartir &lt;b&gt;una técnica para facilitar la legibilidad&lt;/b&gt; de nuestros programas y que trata de la sobrecarga de los métodos.&lt;br /&gt; &lt;!--more--&gt;&lt;br /&gt; &lt;h2&gt;Qué es sobrecargar&lt;/h2&gt;&lt;br /&gt; Según &lt;span class="caps"&gt;MSDN&lt;/span&gt;, “&lt;em&gt;La sobrecarga consiste en crear más de un procedimiento, constructor de instancia o propiedad en una clase con el mismo nombre y distintos tipos de argumento&lt;/em&gt;”. Lo cual, sin un buen ejemplo, es un tanto confuso.&lt;/p&gt; &lt;p&gt;Me pongo manos a la obra, creo un proyecto de consola y, en el inicio del programa, hago que escriba por consola el resultado de un método llamado &lt;em&gt;suma()&lt;/em&gt;.&lt;br /&gt; &lt;pre class="prettyprint lang-csh"&gt;&lt;br /&gt; using System;&lt;br /&gt; namespace GenbetaDevConsola&lt;br/&gt;&lt;br /&gt; {&lt;br/&gt; class Program&lt;br/&gt; {&lt;br/&gt; static void Main(string[] args)&lt;br/&gt; {&lt;br/&gt; System.Console.Write(suma(1, 1));&lt;br/&gt; }&lt;br/&gt; }&lt;br/&gt;&lt;br /&gt; }&lt;br /&gt; &lt;/pre&gt;&lt;br /&gt; Obviamente debo escribir el método, tal que así:&lt;br /&gt; &lt;pre class="prettyprint lang-csh"&gt;&lt;br /&gt; private int suma(int numero1, int numero2)&lt;br/&gt;&lt;br /&gt; {&lt;br/&gt; return numero1 + numero2;&lt;br/&gt;&lt;br /&gt; }&lt;br /&gt; &lt;/pre&gt;&lt;br /&gt; Pero, ¿si me encuentro con que los números no son enteros si no que son más grandes?&lt;/p&gt; &lt;p&gt;Tengo dos opciones. Una sería crear un nuevo método que se llame algo como &lt;em&gt;sumaDouble()&lt;/em&gt; y que tenga dos números &lt;em&gt;doubles&lt;/em&gt; por parámetros. La otra opción &lt;strong&gt;es sobrecargar el método suma con nuevos parámetros&lt;/strong&gt;, pudiéndolo utilizar indistintamente en un caso o en el otro.&lt;br /&gt; &lt;pre class="prettyprint lang-csh"&gt;&lt;br /&gt; private int suma(double numero1, double numero2)&lt;br/&gt;&lt;br /&gt; {&lt;br/&gt; int numero = 0;&lt;br/&gt; Int32.TryParse((numero1 + numero2).ToString(),out numero);&lt;br/&gt; return numero;&lt;br/&gt;&lt;br /&gt; }&lt;br /&gt; &lt;/pre&gt;&lt;br /&gt; Lo mejor es que Intellisense del Visual Studio me ayuda y me indica que el método &lt;em&gt;suma()&lt;/em&gt; está sobrecargado y me ofrece ver la firma de cada una de ellas.&lt;/p&gt; &lt;p&gt;&lt;img alt="intellisense" src="http://img.genbetadev.com/2012/05/intellisense.jpg" class="centro" /&gt;&lt;/p&gt; &lt;p&gt;Es más, puedo ir añadiendo complejidad a mi método suma aceptando más parámetros y de diferente tipo como, por ejemplo, poder sumar tres cantidades o hacer sumas booleanas.&lt;br /&gt; &lt;pre class="prettyprint lang-csh"&gt;&lt;br /&gt; private static int suma(int numero1, int numero2, int numero3)&lt;br/&gt;&lt;br /&gt; {&lt;br/&gt; return numero1 + numero2 &amp;#8211; numero3;&lt;br/&gt;&lt;br /&gt; }&lt;br/&gt;&lt;/p&gt; &lt;p&gt;private static int suma(Boolean numero1, Boolean numero2)&lt;br/&gt;&lt;br /&gt; {&lt;br/&gt; return numero1 == numero2? 1 : 0;&lt;br/&gt;&lt;br /&gt; }&lt;br /&gt; &lt;/pre&gt;&lt;br /&gt; &lt;span class="caps"&gt;NOTA&lt;/span&gt;: Lo que he utilizado en la suma Booleana &lt;strong&gt;es una forma compacta de un condicional&lt;/strong&gt;. Si se cumple la igualdad, devuelvo 1. Si no, devuelvo 0. No es muy legible y conozco alguno que decía que esto era “&lt;em&gt;evil&lt;/em&gt;”. Pero es muy útil.&lt;/p&gt; &lt;p&gt;Fíjate que lo importante de utilizar sobrecargas, es que encapsulo el funcionamiento de los métodos de forma que siempre llamo a &lt;em&gt;suma()&lt;/em&gt;, y solo me debo preocupar de cumplimentar correctamente alguna de sus posibles firmas.&lt;/p&gt; &lt;p&gt;Por cierto, por si alguno desconoce el concepto de firma, &lt;span class="caps"&gt;MSDN&lt;/span&gt; dice: &lt;br /&gt; &lt;blockquote&gt;Los métodos se declaran en una clase o struct mediante la especificación del nivel de acceso como public o private, modificadores opcionales como abstract o sealed, el valor devuelto, el nombre del método y cualquier parámetro de método.Todos esos elementos constituyen la firma del método.&lt;/blockquote&gt;&lt;/p&gt; &lt;p&gt;&lt;h2&gt;Mejorando las sobrecargas&lt;/h2&gt;&lt;br /&gt; Pero C# sigue adelante en su evolución (realmente todo .NET) &lt;strong&gt;y a partir de la versión 4.0 tengo tres novedades&lt;/strong&gt; que me han llamado mucho la atención por su utilidad.&lt;/p&gt; &lt;p&gt;Puedo declarar un método y ponerle por defecto un valor a cada uno de sus parámetros. Por ejemplo &lt;strong&gt;si quiero calcular la hipotenusa&lt;/strong&gt; puedo crear un método tal cual,&lt;br /&gt; &lt;pre class="prettyprint lang-csh"&gt;&lt;br /&gt; public static double calculaHipotenusa&lt;br/&gt; (&lt;br/&gt; double cateto1 = 100,&lt;br/&gt; double cateto2 = 100,&lt;br/&gt; double hipotenusa = 0&lt;br/&gt; )&lt;br/&gt;&lt;br /&gt; { &lt;br/&gt; return Math.Sqrt(Math.Pow(cateto1,2) + Math.Pow(cateto1,2));&lt;br/&gt;&lt;br /&gt; }&lt;br /&gt; &lt;/pre&gt;&lt;br /&gt; Así puedo llamar a este método de diferentes formas de acuerdo a los datos que tenga, sin tener que rellenar obligatoriamente todos los parámetros.&lt;br /&gt; &lt;pre class="prettyprint lang-csh"&gt;&lt;br /&gt; static void Main(string[] args)&lt;br/&gt;&lt;br /&gt; {&lt;br/&gt; System.Console.Write(calculaHipotenusa());&lt;br/&gt; System.Console.Write(calculaHipotenusa(100));&lt;br/&gt; System.Console.Write(calculaHipotenusa(100, 50));&lt;br/&gt; System.Console.Write(calculaHipotenusa(cateto2:50));&lt;br/&gt;&lt;br /&gt; }&lt;br /&gt; &lt;/pre&gt;&lt;/p&gt; &lt;p&gt;Ahora fíjate en la última forma de llamar al método. Estoy introduciendo &lt;strong&gt;el nombre del parámetro que quiero cargar&lt;/strong&gt;. Esto, que parece trivial, nos alivia de tener que construir un método sobrecargado para cada una de las firmas. Y tampoco debemos de invocar el método con todos sus parámetros, ya que solamente remito los que quiero enviándolos por su nombre.&lt;/p&gt; &lt;p&gt;Por último, y &lt;strong&gt;si tienes ganas de jugar más fuerte, te puedes meter en la sobrecarga de operadores&lt;/strong&gt;. Es decir, darle comportamientos particulares y específicos a cosas como +, -, =, etc. Así puedo hacer una suma directa de valores booleanos en una clase sin tener que construir un método con esa firma. &lt;/p&gt; &lt;p&gt;Pero esto yo no lo he utilizado nunca y no encuentro ahora mismo donde aplicarlo.&lt;/p&gt; &lt;p&gt;Más información | &lt;a href="http://msdn.microsoft.com/es-es/library/ms173114.aspx"&gt;Métodos (Guía de programación de C#)&lt;/a&gt;, &lt;a href="http://msdn.microsoft.com/es-es/magazine/ff796223.aspx"&gt;Nuevas características de C# en .NET Framework 4&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='http://weblogssl.feedsportal.com/c/33859/f/609642/s/1f53f6ce/mf.gif' border='0'/&gt;&lt;div class='mf-viral'&gt;&lt;table border='0'&gt;&lt;tr&gt;&lt;td valign='middle'&gt;&lt;a href="http://share.feedsportal.com/viral/sendEmail.cfm?lang=es&amp;title=Sobrecargando+los+m%C3%A9todos+en+C%23&amp;link=http%3A%2F%2Fwww.genbetadev.com%2Fcnet%2Fsobrecargando-los-metodos-en-c" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/emailthis2_es.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark_es.cfm?title=Sobrecargando+los+m%C3%A9todos+en+C%23&amp;link=http%3A%2F%2Fwww.genbetadev.com%2Fcnet%2Fsobrecargando-los-metodos-en-c" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/bookmark_es.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://da.feedsportal.com/r/134204423280/u/49/f/609642/c/33859/s/1f53f6ce/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/134204423280/u/49/f/609642/c/33859/s/1f53f6ce/a2.img" border="0"/&gt;&lt;/a&gt;&lt;img width="1" height="1" src="http://pi.feedsportal.com/r/134204423280/u/49/f/609642/c/33859/s/1f53f6ce/a2t.img" border="0"/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.weblogssl.com/~ff/genbetadev?a=xeDlahg0dI8:sKlcbGIFzu0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/genbetadev?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.weblogssl.com/~ff/genbetadev?a=xeDlahg0dI8:sKlcbGIFzu0:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/genbetadev?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><pubDate>Mon, 14 May 2012 06:00:00 GMT</pubDate><author>Juan Quijano</author><guid isPermaLink="false">http://www.genbetadev.com/cnet/sobrecargando-los-metodos-en-c</guid></item><item><title>Manos en la masa, haciendo crecer nuestro árbol del repositorio de código</title><link>http://weblogssl.feedsportal.com/c/33859/f/609642/s/1f4f5602/l/0L0Sgenbetadev0N0Cgestores0Ede0Econtenido0Cmanos0Een0Ela0Emasa0Ehaciendo0Ecrecer0Enuestro0Earbol0Edel0Erepositorio0Ede0Ecodigo/story01.htm</link><description>&lt;p&gt;&lt;img alt="Portada Manos en la Masa" src="http://img.genbetadev.com/2012/05/portadaManosEnLaMasa.jpg" class="centro" /&gt;&lt;/p&gt; &lt;p&gt;Este es el tercer capítulo de la miniserie sobre Branching. Que se ha compuesto de &lt;em&gt;Labeling&lt;/em&gt;, &lt;em&gt;Branching&lt;/em&gt; y este, &lt;em&gt;Manos en la masa&lt;/em&gt;. Y que trata sobre técnicas de división del desarrollo en el repositorio de código que &lt;strong&gt;nos haga más fácil el manejar la complejidad inherente&lt;/strong&gt; a toda construcción de aplicaciones de software.&lt;/p&gt; &lt;p&gt;Este ejemplo lo voy a mostrar en Visual Studio 11 beta contra un Team Foundation Service, pero es muy similar el realizarlo en Git, Mercurial o &lt;span class="caps"&gt;SVN&lt;/span&gt;. &lt;strong&gt;Lo importante no es la herramienta&lt;/strong&gt;, si no tener claro que el uso de estas técnicas nos hace crecer en la madurez de nuestros equipos y nos facilita y prepara para cuando las cosas se tuercen &lt;del&gt;que es casi siempre&lt;/del&gt;.&lt;br /&gt; &lt;!--more--&gt;&lt;br /&gt; &lt;h2&gt;Haciendo un branch&lt;/h2&gt;&lt;br /&gt; Tengo un proyecto de GenbetaDev en mi repositorio de código en una cuenta de Team Foundation Service (en la Nube). Accedo a él, y selecciono el explorador del repositorio de código.&lt;/p&gt; &lt;p&gt;&lt;img alt="Team Explorer" src="http://img.genbetadev.com/2012/05/branch04.jpg" class="centro_sinmarco" /&gt;&lt;/p&gt; &lt;p&gt;En la ventana que se me abre, veo mi directorio de carpetas de proyectos, en donde abro la de GenbetaDev.&lt;/p&gt; &lt;p&gt;Aquí me encuentro la carpeta troncal &lt;em&gt;Trunk&lt;/em&gt; de mi desarrollo y &lt;strong&gt;de la cual quiero hacer una nueva rama&lt;/strong&gt;. Para ello pulso con el botón derecho encima del nodo del cual quiero que salga la rama, y en el menú contextual selecciono “&lt;em&gt;Branching and Merging&lt;/em&gt;”.&lt;/p&gt; &lt;p&gt;&lt;img alt="Seleccionando Branch" src="http://img.genbetadev.com/2012/05/branch05.jpg" class="centro_sinmarco" /&gt;&lt;/p&gt; &lt;p&gt;En el menú desplegable selecciono la opción “&lt;em&gt;Branch&lt;/em&gt;”, y se me abre una ventana en donde le pongo un nombre &lt;b&gt;en el repositorio&lt;/b&gt; a la carpeta que va a contener la nueva rama; qué versión del código original quiero copiar en el &lt;em&gt;Branch&lt;/em&gt; (el último, una etiqueta específica, una fecha, etc.); y si quiero descargar la nueva rama en mi &lt;em&gt;workspaces&lt;/em&gt; actual o convertirla en mi código por defecto.&lt;/p&gt; &lt;p&gt;&lt;img alt="Seleccionando versión" src="http://img.genbetadev.com/2012/05/branch06.jpg" class="centro_sinmarco" /&gt;&lt;/p&gt; &lt;p&gt;A continuación me solicita que haga un mapeado de la carpeta del repositorio de código a mi disco duro. Es decir, &lt;strong&gt;en qué carpeta local voy a guardar el código almacenado en el &lt;em&gt;Branch&lt;/em&gt;&lt;/strong&gt;. Y aquí te voy a dar un consejillo.&lt;/p&gt; &lt;p&gt;&lt;img alt="Creando workspace" src="http://img.genbetadev.com/2012/05/branch07.jpg" class="centro_sinmarco" /&gt;&lt;/p&gt; &lt;p&gt;En desarrollos medios o pequeños, sin mucha complejidad, yo utilizo la misma carpeta para el &lt;em&gt;Trunk&lt;/em&gt; y los &lt;em&gt;Branch&lt;/em&gt;. Así me &lt;strong&gt;evito modificar el código en la rama inadecuada por no darme cuenta de cual solución estoy abriendo&lt;/strong&gt;. Puede que no sea la mejor práctica, pero a mi me funciona muy bien para evitar errores.&lt;/p&gt; &lt;p&gt;Una vez realizado esto, pulsamos el botón de “&lt;em&gt;Map&lt;/em&gt;” y &lt;strong&gt;el sistema se pone a realizar el &lt;em&gt;branching&lt;/em&gt; de nuestro código&lt;/strong&gt;. Observándose en el explorador del repositorio, cuando finalice el proceso, nuestra nueva rama y el que está configurada como solución por defecto.&lt;/p&gt; &lt;p&gt;&lt;img alt="Escogiendo target" src="http://img.genbetadev.com/2012/05/branch08.jpg" class="centro_sinmarco" /&gt;&lt;/p&gt; &lt;p&gt;&lt;h2&gt;Fundiendo ramas&lt;/h2&gt;&lt;br /&gt; La segunda parte del proceso, y&lt;strong&gt; sin duda la más difícil&lt;/strong&gt;, es cuando tengo una rama y la quiero actualizar en el &lt;em&gt;Trunk&lt;/em&gt;. O actualizar con el código de la principal, el código de una &lt;em&gt;Branch&lt;/em&gt;.&lt;/p&gt; &lt;p&gt;Para ello, desde la ventana del explorador del repositorio, pulso con el botón derecho sobre la rama que quiero fundir con otra, y escojo “&lt;em&gt;Merge&lt;/em&gt;”. Abriéndose la ventana de un asistente en donde debo escoger cual es la rama destino para realizar la actualización y cual es la versión de código que nos queremos llevar.&lt;/p&gt; &lt;p&gt;&lt;img alt="Seleccionando merge" src="http://img.genbetadev.com/2012/05/branch09.jpg" class="centro_sinmarco" /&gt;&lt;/p&gt; &lt;p&gt;Acto y seguido el TF Service se pondrá a trabajar y &lt;strong&gt;añadirá y modificará los ficheros de forma automática, siempre que sea posible&lt;/strong&gt;. Y en el caso de que no lo pueda hacer porque la modificación tiene posibilidades de no hacerse correctamente, entonces nos marca el &lt;em&gt;Merge&lt;/em&gt; como manual y debemos de utilizar la herramienta de comparación de código para completar la unión.&lt;/p&gt; &lt;p&gt;Pero de esta herramienta hablaré &lt;strong&gt;en el próximo capítulo&lt;/strong&gt;,&lt;/p&gt; &lt;p&gt;Más información | &lt;a href="http://vsarbranchingguide.codeplex.com/"&gt;Visual Studio Team Foundation Server Branching and Merging Guide&lt;/a&gt; &lt;a href="http://www-cs-students.stanford.edu/~blynn/gitmagic/intl/es/ch04.html "&gt;Git. Magia Con Los Branches&lt;/a&gt; &lt;/p&gt; &lt;p&gt;En GenbetaDev | &lt;a href="http://www.genbetadev.com/gestores-de-contenido/etiquetando-haciendo-crecer-nuestro-arbol-del-repositorio-de-codigo" title=""&gt;Etiquetando,haciendo crecer nuestro árbol del repositorio de código&lt;/a&gt;, &lt;a href="http://www.genbetadev.com/gestores-de-contenido/branching-haciendo-crecer-nuestro-arbol-del-repositorio-de-codigo"&gt;Branching, haciendo crecer nuestro árbol del repositorio de código&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='http://weblogssl.feedsportal.com/c/33859/f/609642/s/1f4f5602/mf.gif' border='0'/&gt;&lt;div class='mf-viral'&gt;&lt;table border='0'&gt;&lt;tr&gt;&lt;td valign='middle'&gt;&lt;a href="http://share.feedsportal.com/viral/sendEmail.cfm?lang=es&amp;title=Manos+en+la+masa%2C+haciendo+crecer+nuestro+%C3%A1rbol+del+repositorio+de+c%C3%B3digo&amp;link=http%3A%2F%2Fwww.genbetadev.com%2Fgestores-de-contenido%2Fmanos-en-la-masa-haciendo-crecer-nuestro-arbol-del-repositorio-de-codigo" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/emailthis2_es.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark_es.cfm?title=Manos+en+la+masa%2C+haciendo+crecer+nuestro+%C3%A1rbol+del+repositorio+de+c%C3%B3digo&amp;link=http%3A%2F%2Fwww.genbetadev.com%2Fgestores-de-contenido%2Fmanos-en-la-masa-haciendo-crecer-nuestro-arbol-del-repositorio-de-codigo" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/bookmark_es.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://da.feedsportal.com/r/134204397593/u/49/f/609642/c/33859/s/1f4f5602/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/134204397593/u/49/f/609642/c/33859/s/1f4f5602/a2.img" border="0"/&gt;&lt;/a&gt;&lt;img width="1" height="1" src="http://pi.feedsportal.com/r/134204397593/u/49/f/609642/c/33859/s/1f4f5602/a2t.img" border="0"/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.weblogssl.com/~ff/genbetadev?a=jFz6qfkqJoA:hbdPAOYRAMg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/genbetadev?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.weblogssl.com/~ff/genbetadev?a=jFz6qfkqJoA:hbdPAOYRAMg:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/genbetadev?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><pubDate>Sun, 13 May 2012 12:01:03 GMT</pubDate><author>Juan Quijano</author><guid isPermaLink="false">http://www.genbetadev.com/gestores-de-contenido/manos-en-la-masa-haciendo-crecer-nuestro-arbol-del-repositorio-de-codigo</guid></item><item><title>Un juego de la serpiente en jQuery para ir aprendiendo el framework de moda</title><link>http://weblogssl.feedsportal.com/c/33859/f/609642/s/1f49436a/l/0L0Sgenbetadev0N0Cjavascript0Cun0Ejuego0Ede0Ela0Eserpiente0Een0Ejquery0Epara0Eir0Eaprendiendo0Eel0Eframework0Ede0Emoda/story01.htm</link><description>&lt;p&gt;&lt;img alt="snake" src="http://img.genbetadev.com/2012/05/cell-phone-snake-game.jpg" class="centro" /&gt;&lt;/p&gt; &lt;p&gt;Siempre he pensado que &lt;em&gt;el juego de la serpiente&lt;/em&gt; o &lt;strong&gt;Snake&lt;/strong&gt; es uno de los problemas más interesantes cuando estás intentando hacerte con el control un lenguaje de programación o tecnología. Si sabes hacer un Snake, &lt;strong&gt;el lenguaje de programación ya (casi) no tiene secretos para ti&lt;/strong&gt;. Por eso me ha parecido interesante esta demo del &lt;strong&gt;Snake hecho en jQuery&lt;/strong&gt; que os enlazamos hoy y que se han currado en &lt;strong&gt;webdeveloper juice&lt;/strong&gt;.&lt;!--more--&gt;&lt;/p&gt; &lt;p&gt;Unas cuantas líneas de html, otras pocas de css y todo el potencial de jQuery y tenemos un Snake perfectamente funcional en un rato. Una buena manera de adentrarte en el framework de moda en el mundo Javascript y de &lt;strong&gt;conocer su sintaxis, sus flujos y sus peculiaridades&lt;/strong&gt;. Y además, aunque el juego es perfectamente funcional, es también &lt;strong&gt;perfectamente mejorable&lt;/strong&gt; (ajustar más la velocidad, opciones de stop y reset, tabla de high scores&amp;#8230;) por lo que seguro que &lt;strong&gt;te entran ganas de trastear el código&lt;/strong&gt; y mejorarlo ya seas un novato en el mundillo de jQuery o todo un experto.&lt;/p&gt; &lt;p&gt;Una sombrita, unas birras y un poco de picar código jQuery, ¿qué mejor plan que este se te ocurre para esta calurosa tarde de sábado? Pues eso, de nada.&lt;/p&gt; &lt;p&gt;Vía y demo | &lt;a href="http://www.webdeveloperjuice.com/2012/03/29/how-to-make-snake-game-using-jquery/"&gt;webdeveloper juice&lt;/a&gt;&lt;br /&gt; Imagen | Snake para Nokia&lt;br /&gt; En Genbeta Dev | &lt;a href="http://www.genbetadev.com/frameworks/30-dias-para-aprender-jquery"&gt;30 días para aprender jQuery&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='http://weblogssl.feedsportal.com/c/33859/f/609642/s/1f49436a/mf.gif' border='0'/&gt;&lt;div class='mf-viral'&gt;&lt;table border='0'&gt;&lt;tr&gt;&lt;td valign='middle'&gt;&lt;a href="http://share.feedsportal.com/viral/sendEmail.cfm?lang=es&amp;title=Un+juego+de+la+serpiente+en+jQuery+para+ir+aprendiendo+el+framework+de+moda&amp;link=http%3A%2F%2Fwww.genbetadev.com%2Fjavascript%2Fun-juego-de-la-serpiente-en-jquery-para-ir-aprendiendo-el-framework-de-moda" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/emailthis2_es.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark_es.cfm?title=Un+juego+de+la+serpiente+en+jQuery+para+ir+aprendiendo+el+framework+de+moda&amp;link=http%3A%2F%2Fwww.genbetadev.com%2Fjavascript%2Fun-juego-de-la-serpiente-en-jquery-para-ir-aprendiendo-el-framework-de-moda" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/bookmark_es.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://da.feedsportal.com/r/134204142309/u/49/f/609642/c/33859/s/1f49436a/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/134204142309/u/49/f/609642/c/33859/s/1f49436a/a2.img" border="0"/&gt;&lt;/a&gt;&lt;img width="1" height="1" src="http://pi.feedsportal.com/r/134204142309/u/49/f/609642/c/33859/s/1f49436a/a2t.img" border="0"/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.weblogssl.com/~ff/genbetadev?a=QYlvHC6bfDQ:uokkL6CDlpI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/genbetadev?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.weblogssl.com/~ff/genbetadev?a=QYlvHC6bfDQ:uokkL6CDlpI:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/genbetadev?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><pubDate>Sat, 12 May 2012 11:00:00 GMT</pubDate><author>Fernando Siles</author><guid isPermaLink="false">http://www.genbetadev.com/javascript/un-juego-de-la-serpiente-en-jquery-para-ir-aprendiendo-el-framework-de-moda</guid></item><item><title>Desentrañando el RSS. ¿Cómo es un feed por dentro?</title><link>http://weblogssl.feedsportal.com/c/33859/f/609642/s/1f48c331/l/0L0Sgenbetadev0N0Cdesarrollo0Eweb0Cdesentranando0Eel0Erss0Ecomo0Ees0Eun0Efeed0Epor0Edentro/story01.htm</link><description>&lt;p&gt;&lt;img alt="Las tripas del RSS" src="http://img.genbetadev.com/2012/05/Rss_tripas.jpg" class="centro_sinmarco" /&gt;&lt;br /&gt; Todos los aquí presentes conocemos los &lt;span class="caps"&gt;RSS&lt;/span&gt; y estamos suscritos a decenas, o incluso cientos de ellos, pero seguramente pocos conocen ni el significado de las siglas (según &lt;a href="http://es.wikipedia.org/wiki/Rss"&gt;la Wikipedia&lt;/a&gt; es &lt;strong&gt;Really Simple Syndication&lt;/strong&gt;, pero también fue &lt;strong&gt;Rich Site Summary&lt;/strong&gt;), ni mucho menos el funcionamiento interno de estas &lt;em&gt;fuentes web&lt;/em&gt; que nos tienen al tanto de todas las novedades en nuestras páginas favoritas.&lt;/p&gt; &lt;p&gt;Y es normal, ya que quien use un blog, una wiki o cualquier &lt;a href="http://www.genbetadev.com/categoria/gestores-de-contenido"&gt;gestor de contenido&lt;/a&gt; típico, no tiene que preocuparse ya que sus &lt;span class="caps"&gt;RSS&lt;/span&gt; se generan automáticamente conforme nutre de contenido a su web. Pero, ¿y si tenemos que &lt;strong&gt;crear nuestro &lt;span class="caps"&gt;RSS&lt;/span&gt; a mano&lt;/strong&gt;? ¿Qué formato debemos utilizar y cómo podemos automatizar esta tarea?&lt;br /&gt; &lt;!--more--&gt;&lt;br /&gt; &lt;h2&gt;&lt;span class="caps"&gt;RSS&lt;/span&gt; es un subconjunto de &lt;span class="caps"&gt;XML&lt;/span&gt;&lt;/h2&gt;&lt;br /&gt; Pues bien, básicamente el &lt;span class="caps"&gt;RSS&lt;/span&gt; no es más que un fichero &lt;span class="caps"&gt;XML&lt;/span&gt; que contiene ciertos elementos que lo definen y que serán reconocidos por cualquier navegador moderno, así como por lectores de feeds como Google Reader, Netvibes o similares. Es decir, es un &lt;strong&gt;subconjunto de &lt;span class="caps"&gt;XML&lt;/span&gt;&lt;/strong&gt; con unas etiquetas determinadas. De un modo muy básico y genérico, podríamos decir que el formato de un &lt;span class="caps"&gt;RSS&lt;/span&gt; 2.0 sería el siguiente:&lt;/p&gt; &lt;pre class="prettyprint lang-xml"&gt;&lt;code&gt; &amp;#60;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;utf-8&amp;#34;?&amp;#62; &amp;#60;rss version=&amp;#34;2.0&amp;#34;&amp;#62; &amp;#60;channel&amp;#62; &amp;#60;!-- Aquí van las propiedades del canal --&amp;#62; &amp;#60;item&amp;#62; &amp;#60;!-- Aquí va el contenido de una entrada publicada --&amp;#62; &amp;#60;/item&amp;#62; ... &amp;#60;!-- Tantos elementos como entradas queramos --&amp;#62; &amp;#60;item&amp;#62; &amp;#60;/item&amp;#62; &amp;#60;/channel&amp;#62; &amp;#60;/rss&amp;#62; &lt;/code&gt;&lt;/pre&gt; &lt;p&gt;Ahora después entraremos en detalle acerca de qué hay que poner en el canal y en los ítems (las entradas), pero de momento vamos a centrarnos en lo más genérico del formato. Las únicas etiquetas obligatorias son las dos que abren el anterior extracto de código: el encabezado &lt;span class="caps"&gt;XML&lt;/span&gt; versión 1.0 con su codificación de caracteres, y un único elemento &lt;span class="caps"&gt;RSS&lt;/span&gt; versión 2.0.&lt;/p&gt; &lt;h3&gt;Etiquetas y atributos opcionales del encabezado&lt;/h3&gt; &lt;p&gt;Aunque nos bastaría con lo anterior, también podemos añadir estos otros dos encabezados tras el primero:&lt;/p&gt; &lt;pre class="prettyprint lang-xml"&gt;&lt;code&gt; &amp;#60;?xml-stylesheet type=&amp;#34;text/xsl&amp;#34; media=&amp;#34;screen&amp;#34; href=&amp;#34;/~d/styles/rss2spanishfull.xsl&amp;#34;?&amp;#62; &amp;#60;?xml-stylesheet type=&amp;#34;text/css&amp;#34; media=&amp;#34;screen&amp;#34; href=&amp;#34;http://feeds.weblogssl.com/~d/styles/itemcontent.css&amp;#34;?&amp;#62; &lt;/code&gt;&lt;/pre&gt; &lt;p&gt;Estos enlaces no tiene valor semántico, sino puramente estético, ya que sólo definen cómo se representará la información si visualizamos el feed en un navegador sin suscribirnos a él. Por una parte, el &lt;span class="caps"&gt;XSL&lt;/span&gt; dirá cómo transformar el &lt;span class="caps"&gt;XML&lt;/span&gt; en &lt;span class="caps"&gt;HTML&lt;/span&gt; en nuestro navegador, mientras que el &lt;span class="caps"&gt;CSS&lt;/span&gt; aplicará los estilos correspondientes a dicho &lt;span class="caps"&gt;HTML&lt;/span&gt;.&lt;/p&gt; &lt;p&gt;En cuanto a la etiqueta &lt;span class="caps"&gt;RSS&lt;/span&gt;, el único atributo obligatorio es la versión, pero podemos añadirle algunos más:&lt;/p&gt; &lt;pre class="prettyprint lang-xml"&gt;&lt;code&gt; &amp;#60;rss xmlns:itunes=&amp;#34;http://www.itunes.com/dtds/podcast-1.0.dtd&amp;#34; xmlns:dc=&amp;#34;http://purl.org/dc/elements/1.1/&amp;#34; xmlns:taxo=&amp;#34;http://purl.org/rss/1.0/modules/taxonomy/&amp;#34; xmlns:rdf=&amp;#34;http://www.w3.org/1999/02/22-rdf-syntax-ns#&amp;#34; xmlns:atom=&amp;#34;http://www.w3.org/2005/Atom&amp;#34; version=&amp;#34;2.0&amp;#34;&amp;#62; &lt;/code&gt;&lt;/pre&gt; &lt;p&gt;Esto nos permitirá usar namespaces propios de itunes, atom, etc. y hacer así que se reconozca un podcast o un feed atom como extensiones de &lt;span class="caps"&gt;RSS&lt;/span&gt;.&lt;/p&gt; &lt;h2&gt;Propiedades del canal&lt;/h2&gt; &lt;p&gt;Cuando hablamos del &lt;strong&gt;canal&lt;/strong&gt; nos referimos al origen de los posts, que puede ser &lt;strong&gt;una web o una sección&lt;/strong&gt; dentro de la misma (podemos ofrecer un &lt;span class="caps"&gt;RSS&lt;/span&gt; general y otros específicos por temática, por ejemplo). Son varios los elementos utilizados para identificar un canal, muchos de ellos opcionales, pero lo normal es que tenga un aspecto similar a éste:&lt;/p&gt; &lt;pre class="prettyprint lang-xml"&gt;&lt;code&gt; &amp;#60;channel&amp;#62; &amp;#60;title&amp;#62;Genbetadev&amp;#60;/title&amp;#62; &amp;#60;link&amp;#62;http://www.genbetadev.com&amp;#60;/link&amp;#62; &amp;#60;description&amp;#62;Informaci&amp;#38;#195;&amp;#38;#179;n sobre el sector de los desarrolladores, el desarrollo de aplicaciones, para m&amp;#38;#195;&amp;#38;#179;viles, desarrollo web, bases de datos, frameworks y lenguajes de programaci&amp;#38;#195;&amp;#38;#179;n&amp;#60;/description&amp;#62; &amp;#60;language&amp;#62;es-ES&amp;#60;/language&amp;#62; &amp;#60;lastBuildDate&amp;#62;Tue, 08 May 2012 06:13:05 GMT&amp;#60;/lastBuildDate&amp;#62; &amp;#60;ttl&amp;#62;2&amp;#60;/ttl&amp;#62; &amp;#60;/channel&amp;#62; &lt;/code&gt;&lt;/pre&gt; &lt;p&gt;En &lt;code&gt;&amp;#60;title&amp;#62;&lt;/code&gt; indicamos el título de la web o sección, siendo éste el nombre con el que el feed se guardará en el lector, a cambio que el usuario lo modifique manualmente si su lector lo permite.&lt;/p&gt; &lt;p&gt;El &lt;code&gt;&amp;#60;link&amp;#62;&lt;/code&gt; es un enlace a la que consideremos como página principal, ya sea de la web o de la sección a la que corresponde el &lt;span class="caps"&gt;RSS&lt;/span&gt;.&lt;/p&gt; &lt;p&gt;En la &lt;code&gt;&amp;#60;description&amp;#62;&lt;/code&gt; se debe introducir un pequeño resumen de lo que versa el feed, similar al texto con el que definimos una web cuando queremos que sea indexada por los buscadores.&lt;/p&gt; &lt;p&gt;El hecho de indicar un &lt;code&gt;&amp;#60;language&amp;#62;&lt;/code&gt; no supone ninguna obligación de que el post verdaderamente esté en ese idioma, sino que más bien puede servir para la categorización por idiomas en agregadores de feeds.&lt;/p&gt; &lt;p&gt;Con &lt;code&gt;&amp;#60;lastBuildDate&amp;#62;&lt;/code&gt; informamos de cuándo se generó por última vez el &lt;span class="caps"&gt;RSS&lt;/span&gt;. Es útil si no tenemos mucha periodicidad a la hora de escribir pero queremos que el lector sepa que nuestro feed no ha dejado de generarse y sigue funcionando a la perfección.&lt;/p&gt; &lt;p&gt;Precisamente, dependiendo de nuestra periodicidad nos puede interesar cambiar el elemento &lt;code&gt;&amp;#60;ttl&amp;#62;&lt;/code&gt;, con el que informamos del tiempo de vida de una versión concreta del &lt;span class="caps"&gt;RSS&lt;/span&gt;. Con ello, conseguimos que el lector revisite nuestro feed cuando pasen tantos segundos como se indica en este elemento. Si publicamos un artículo al día, nos puede bastar con que el &lt;span class="caps"&gt;RSS&lt;/span&gt; se consulte cada hora y que nuestro servidor no se satura de llamadas buscando un nuevo contenido que aún no existe. Por contra, si nuestra web es de noticias, o simplemente la actualidad es uno de sus puntos fuertes, nos interesará tener un ttl bajo y asegurarnos que los usuarios puedan tener el feed actualizado casi tan pronto como el artículo se publique.&lt;/p&gt; &lt;h3&gt;Otros elementos para el canal&lt;/h3&gt; &lt;p&gt;Existen otros elementos que pueden aparecer en el canal, aunque de menor utilidad que los anteriores. Por ejemplo, podemos agregar una imagen identificativa, y hacer que tenga un enlace a nuestra web. Sin embargo, este dato orientado al usuario humano y no al software lector sólo será visible, en el mejor de los casos, en el momento de suscribirse, por lo que no es de gran importancia.&lt;/p&gt; &lt;pre class="prettyprint lang-xml"&gt;&lt;code&gt; &amp;#60;image&amp;#62; &amp;#60;url&amp;#62;http://blogs.es/imagenes/planet/genbetadev.jpg&amp;#60;/url&amp;#62; &amp;#60;link&amp;#62;http://www.genbetadev.com&amp;#60;/link&amp;#62; &amp;#60;title&amp;#62;Genbeta Dev&amp;#60;/title&amp;#62; &amp;#60;/image&amp;#62; &lt;/code&gt;&lt;/pre&gt; &lt;p&gt;Si sabemos que hay ciertas horas en las que nunca vamos a publicar nada (de madrugada, normalmente) o ciertos días de la semana en los que nunca sacamos contenidos, podemos indicar al lector que no intente actualizarse en esos periodos mediante las estructuras &lt;code&gt;&amp;#60;skipHours&amp;#62;&lt;/code&gt; y &lt;code&gt;&amp;#60;skipDays&amp;#62;&lt;/code&gt;&lt;/p&gt; &lt;pre class="prettyprint lang-xml"&gt;&lt;code&gt; &amp;#60;skipDays&amp;#62; &amp;#60;day&amp;#62;Saturday&amp;#60;/day&amp;#62; &amp;#60;day&amp;#62;Sunday&amp;#60;/day&amp;#62; &amp;#60;/skipDays&amp;#62; &amp;#60;skipHours&amp;#62; &amp;#60;hour&amp;#62;0&amp;#60;/hour&amp;#62; &amp;#60;hour&amp;#62;1&amp;#60;/hour&amp;#62; &amp;#60;hour&amp;#62;2&amp;#60;/hour&amp;#62; &amp;#60;hour&amp;#62;3&amp;#60;/hour&amp;#62; &amp;#60;hour&amp;#62;4&amp;#60;/hour&amp;#62; &amp;#60;hour&amp;#62;5&amp;#60;/hour&amp;#62; &amp;#60;hour&amp;#62;6&amp;#60;/hour&amp;#62; &amp;#60;hour&amp;#62;7&amp;#60;/hour&amp;#62; &amp;#60;hour&amp;#62;20&amp;#60;/hour&amp;#62; &amp;#60;hour&amp;#62;21&amp;#60;/hour&amp;#62; &amp;#60;hour&amp;#62;22&amp;#60;/hour&amp;#62; &amp;#60;hour&amp;#62;23&amp;#60;/hour&amp;#62; &amp;#60;/skipHours&amp;#62; &lt;/code&gt;&lt;/pre&gt; &lt;p&gt;Si queremos que los derechos de los artículos queden patentes en el propio &lt;span class="caps"&gt;RSS&lt;/span&gt; aparte de en nuestra web de destino, podemos agregar un elemento &lt;code&gt;&amp;#60;copyright&amp;#62;&lt;/code&gt; con el texto correspondiente.&lt;/p&gt; &lt;p&gt;Del mismo modo, si queremos que quede constancia de la aplicación con la que hemos generado el feed, podemos indicarlo añadiendo el tag &lt;code&gt;&amp;#60;generator&amp;#62;&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;Por último, antes de pasar a las entradas que suponen el verdadero contenido del &lt;span class="caps"&gt;RSS&lt;/span&gt;, si hemos añadido namespaces de feedburner, itunes y otros servicios de terceros, lo normal es que tengamos algunos elementos pertenecientes a dichos namespaces y que se regirán por las restricciones de formato que cada uno de ellos imponga, por lo que no vamos a verlos aquí.&lt;/p&gt; &lt;h2&gt;Las entradas&lt;/h2&gt; &lt;p&gt;Cada una de las entradas o posts que queremos notificar a nuestros suscriptores vendrá definida por un elemento &lt;code&gt;&amp;#60;item&amp;#62;&lt;/code&gt;, que entre elementos obligatorios y los muy recomendables, suele ser como mínimo algo similar a esto:&lt;/p&gt; &lt;pre class="prettyprint lang-xml"&gt;&lt;code&gt; &amp;#60;item&amp;#62; &amp;#60;title&amp;#62;Diagrama para elegir la licencia m&amp;#38;#195;&amp;#38;#161;s apropiada para tu software&amp;#60;/title&amp;#62; &amp;#60;link&amp;#62; http://weblogssl.feedsportal.com/c/33859/f/609642/s/1f17063b/l/0L0Sgenbetadev0N0Csoftware0Elibre0Ey0Elicencias0Cdiagrama0Epara0Eelegir0Ela0Elicencia0Emas0Eapropiada0Epara0Etu0Esoftware/story01.htm&amp;#60;/link&amp;#62; &amp;#60;description&amp;#62;&amp;#38;lt;p&amp;#38;gt;&amp;#38;lt;img alt=&amp;#34;Cabecera infograf&amp;#38;#195;&amp;#38;#173;a licencias libres&amp;#34; src=&amp;#34;http://img.genbetadev.com/2012/05/Cabecera_licencias.jpg&amp;#34; class=&amp;#34;centro_sinmarco&amp;#34; /&amp;#38;gt;&amp;#38;lt;br /&amp;#38;gt; Ponerle copyright a un software y &amp;#38;lt;em&amp;#38;gt;sentarse a esperar los beneficios&amp;#38;lt;/em&amp;#38;gt; es muy f&amp;#38;#195;&amp;#38;#161;cil, pero si alguna vez has pensado &amp;#38;lt;strong&amp;#38;gt;aplicar una licencia libre&amp;#38;lt;/strong&amp;#38;gt; al fruto de tus trabajos te habr&amp;#38;#195;&amp;#38;#161;s encontrado con que es una decisi&amp;#38;#195;&amp;#38;#179;n bastante complicada, especialmente por el &amp;#38;lt;strong&amp;#38;gt;amplio abanico de licencias&amp;#38;lt;/strong&amp;#38;gt; disponibles y las a veces muy sutiles diferencias entre unas y otras.&amp;#38;lt;/p&amp;#38;gt; &amp;#38;lt;p&amp;#38;gt;Como m&amp;#38;#195;&amp;#38;#169;todo de ayuda a la hora de elegir, y a mitad de camino entre el estudio exhaustivo y el sentido del humor, &amp;#38;lt;a href=&amp;#34;https://twitter.com/#%21/dbentley&amp;#34;&amp;#38;gt;Dan Bentley&amp;#38;lt;/a&amp;#38;gt; y &amp;#38;lt;a href=&amp;#34;https://twitter.com/#%21/therealfitz&amp;#34;&amp;#38;gt;Brian Fitzpatrick&amp;#38;lt;/a&amp;#38;gt; han creado esta infograf&amp;#38;#195;&amp;#38;#173;a en forma de &amp;#38;lt;strong&amp;#38;gt;diagrama de flujo&amp;#38;lt;/strong&amp;#38;gt; para ayudarnos en la decisi&amp;#38;#195;&amp;#38;#179;n en favor de una u otra licencia.&amp;#38;lt;/p&amp;#38;gt; &amp;#38;lt;p&amp;#38;gt;Yo lo he seguido y me sale que deber&amp;#38;#195;&amp;#38;#173;a usar la &amp;#38;lt;span class=&amp;#34;caps&amp;#34;&amp;#38;gt;LGPL&amp;#38;lt;/span&amp;#38;gt; en mis desarrollos. &amp;#38;#194;&amp;#38;#191;Y a vosotros? &amp;#60;/description&amp;#62; &amp;#60;pubDate&amp;#62;Mon, 07 May 2012 13:30:00 GMT&amp;#60;/pubDate&amp;#62; &amp;#60;author&amp;#62;Johnbo&amp;#60;/author&amp;#62; &amp;#60;guid isPermaLink=&amp;#34;false&amp;#34;&amp;#62; http://www.genbetadev.com/software-libre-y-licencias/diagrama-para-elegir-la-licencia-mas-apropiada-para-tu-software&amp;#60;/guid&amp;#62; &amp;#60;/item&amp;#62; &lt;/code&gt;&lt;/pre&gt; &lt;p&gt;El elemento &lt;code&gt;&amp;#60;title&amp;#62;&lt;/code&gt;, como su propio nombre indica, es el título del artículo. En lectores de feeds con formato minimalista será lo único que veamos. Normalmente, lo ideal es que coincida al 100% con el título de la entrada en la web, aunque en casos de títulos muy largos, puede ser conveniente utilizar una versión reducida para que se visualice en el feed.&lt;/p&gt; &lt;p&gt;El otro elemento fundamental de las entradas es el &lt;code&gt;&amp;#60;guid&amp;#62;&lt;/code&gt;, un identificador unívoco para nuestra entrada. La importancia del &lt;span class="caps"&gt;GUID&lt;/span&gt; radica en el hecho de que, manteniéndolo, podemos realizar cualquier cambio dentro del resto del ítem, y por lo general los agregadores lo seguirán tratando como el mismo post, mientras que si cambiamos el &lt;span class="caps"&gt;GUID&lt;/span&gt;, aunque todo lo demás permanezca invariable, lo más probable es que nuestro lector duplique la entrada, al considerar que cada &lt;span class="caps"&gt;GUID&lt;/span&gt; correspondía a un artículo distinto. La forma más sencilla de asegurarse que sea único y que no vaya a variar es utilizar como identificador la &lt;span class="caps"&gt;URL&lt;/span&gt; de destino, aunque esto no significa que al clicar vayamos a llegar seguro a esa dirección. De hecho, al darle el valor falso a su atributo &lt;code&gt;isPermaLink&lt;/code&gt; (que por defecto es verdadero) le estamos indicando que no debe interpretarse como una &lt;span class="caps"&gt;URL&lt;/span&gt; al uso.&lt;/p&gt; &lt;p&gt;Esto se debe a que quien realmente nos indica el destino es el elemento &lt;code&gt;&amp;#60;link&amp;#62;&lt;/code&gt;, que puede coincidir (o no) con el &lt;span class="caps"&gt;GUID&lt;/span&gt;. Hoy día, donde las analíticas web cobran tanta importancia, lo normal es que este enlace no nos lleve directamente a la página de destino, sino que nos haga pasar por una página intermedia que haga las veces de contador, ya que un lector de feeds que no tenga interfaz web normalmente no proporcionará un &lt;em&gt;referer&lt;/em&gt; adecuado para poder medir la influencia del &lt;span class="caps"&gt;RSS&lt;/span&gt;.&lt;/p&gt; &lt;p&gt;La mayoría de discrepancias están a la hora de elegir el contenido del elemento &lt;code&gt;&amp;#60;description&amp;#62;&lt;/code&gt;, ya que hay quien calza ahí el artículo completo, hay quien pone los primeros dos o tres párrafos y hay quien se contenta con apenas un &lt;em&gt;abstract&lt;/em&gt;. La decisión dependerá de qué consideración tenemos hacia nuestros usuarios. Ponerles únicamente un breve resumen para obligarles a que te visiten, generándote ingresos por publicidad, puede hacer que la gente acabe por adoptar una actitud reacia, o incluso que el artículo no les interese porque no les has mostrado la parte más atractiva. Poner el artículo completo suele ser una buena alternativa, ya que tratas respetuosamente al usuario y sólo le haces ir a tu web para interactuar (escribiendo comentarios, por ejemplo), aunque tiene la pega de que los artículos de gran longitud se pueden llegar a ver como un &lt;em&gt;estorbo&lt;/em&gt; dentro del lector.&lt;/p&gt; &lt;p&gt;En cuanto a su formato, no es necesario que sea texto plano, sino que podemos usar &lt;span class="caps"&gt;HTML&lt;/span&gt; igual que en la propia entrada, con unas salvedades bastante obvias. En primer lugar, los caracteres &amp;#60; y &amp;#62; han de introducirse con sus entidades &lt;span class="caps"&gt;HTML&lt;/span&gt; correspondientes &amp;#38;lt; y &amp;#38;gt; para evitar que sean reconocidas en el propio &lt;span class="caps"&gt;XML&lt;/span&gt;. En segundo lugar, hay que tener cuidado de convertir en absolutas todas las rutas relativas de imágenes u otros recursos, así como permitir en nuestro servidor el &lt;strong&gt;hotlinking&lt;/strong&gt; para esos archivos desde los dominios de los principales lectores de noticias. Y por último, saber que el lector no va a reconocer estilos más allá de los más básicos: &lt;code&gt;&amp;#60;strong&amp;#62;&lt;/code&gt;, &lt;code&gt;&amp;#60;em&amp;#62;&lt;/code&gt;, etc.&lt;/p&gt; &lt;h3&gt;Elementos opcionales para una entrada&lt;/h3&gt; &lt;p&gt;El &lt;code&gt;&amp;#60;pubDate&amp;#62;&lt;/code&gt; es la fecha de publicación del artículo. En principio debería servir para ordenar las entradas dentro del feed, pero lo cierto es que muchos lectores la ignoran y las muestran por orden estrictamente secuencial, por lo que su finalidad principal es simplemente informar al usuario de cuándo se publicó. Importante: para no marear, lo mejor es usar la hora &lt;span class="caps"&gt;GMT&lt;/span&gt;, y que ya el software del lector se encargue de traducirlo a la zona horaria del usuario.&lt;/p&gt; &lt;p&gt;Otro elemento no obligatorio dentro de un &lt;code&gt;&amp;#60;item&amp;#62;&lt;/code&gt; relativamente habitual es el &lt;code&gt;&amp;#60;author&amp;#62;&lt;/code&gt;, aunque sólo en blogs con varios articulistas, ya que en páginas llevadas por una única persona no tiene mucho sentido confirmar su autoría en todos y cada uno de ellos. En un inicio se solía indicar aquí el e-mail del autor, pero debido a los medios automatizados para spammear, actualmente se suele usar el nombre propio o un apodo.&lt;/p&gt; &lt;p&gt;Mucho menos habitual es encontrar el elemento &lt;code&gt;&amp;#60;comments&amp;#62;&lt;/code&gt;, cuyo contenido es un texto con comentarios con respecto a la entrada, o incluso el enlace a una segunda &lt;span class="caps"&gt;URL&lt;/span&gt; donde encontrar esos comentarios. Al no haber limitación de tamaño en la descripción, este elemento aporta muy poco a la misma.&lt;/p&gt; &lt;p&gt;Con &lt;code&gt;&amp;#60;enclosure&amp;#62;&lt;/code&gt; tenemos la posibilidad de adjuntar un archivo al &lt;span class="caps"&gt;RSS&lt;/span&gt;, aportando su &lt;span class="caps"&gt;URL&lt;/span&gt;, longitud y tipo. Dado que la descripción podía contener algunos objetos incrustados, no es muy habitual usar esta construcción para añadir uno al final.&lt;/p&gt; &lt;pre class="prettyprint lang-xml"&gt;&lt;code&gt; &amp;#60;enclosure url=&amp;#34;http://www.direcciondelrecurso/archivo.mp3&amp;#34; length=&amp;#34;3000000&amp;#34; type=&amp;#34;audio/mpeg&amp;#34; /&amp;#62; &lt;/code&gt;&lt;/pre&gt; &lt;p&gt;Para finalizar, el elemento &lt;code&gt;&amp;#60;category&amp;#62;&lt;/code&gt; permite agrupar los posts por su temática, de forma que los agregadores &lt;span class="caps"&gt;RSS&lt;/span&gt; puedan mostrar los distintos feeds organizados por categorías. Tanto el canal como cada uno de los ítems puede pertenecer a una o más categorías.&lt;/p&gt; &lt;h2&gt;¿Cómo generarlo?&lt;/h2&gt; &lt;p&gt;Bueno, ya sabemos en qué consiste el formato de un &lt;span class="caps"&gt;RSS&lt;/span&gt; al detalle, pero aún no hemos dicho cómo podemos generarlo. Mientras en el mercado existen herramientas de pago como &lt;a href="http://www.feedforall.com/"&gt;Feed for all&lt;/a&gt;, ya que somos programadores vamos a ver cómo haríamos para generarlo nosotros mismos sin depender de terceros.&lt;/p&gt; &lt;p&gt;El problema se reduce a tener un fichero llamado &lt;strong&gt;rss.xml&lt;/strong&gt; y ser capaces de &lt;em&gt;parsearlo&lt;/em&gt; para añadir un nuevo ítem cada vez que tengamos una actualización. Lo normal es que usemos el mismo lenguaje con el que hemos desarrollado la página y aprovechemos el momento en que se publica el contenido para añadir una nueva función que genere dicho &lt;span class="caps"&gt;XML&lt;/span&gt;.&lt;/p&gt; &lt;p&gt;El cómo hacerlo ya dependerá del lenguaje utilizado y las librerías de tratamiento de &lt;span class="caps"&gt;XML&lt;/span&gt; con las que cuente, ya que mientras algunos nos permiten de forma muy sencilla parsear un &lt;span class="caps"&gt;XML&lt;/span&gt;, movernos por él y añadir o eliminar elementos a nuestro antojo; es posible que otros menos modernos no dispongan de esta capacidad y no nos quede más remedio que abrir el archivo en modo texto y movernos por él secuencialmente buscando patrones para encontrar el lugar de inserción del nuevo elemento, que habremos de añadir también como si de una simple cadena de texto se tratase.&lt;/p&gt; &lt;p&gt;Más información | &lt;a href="http://www.w3schools.com/rss/default.asp"&gt;w3schools.com &amp;#8211; &lt;span class="caps"&gt;RSS&lt;/span&gt; Tutorial&lt;/a&gt;&lt;br /&gt; En Genbeta Dev Respuestas | &lt;a href="http://www.genbetadev.com/respuestas/como-crear-una-rss-para-mi-web"&gt;¿Cómo crear una &lt;span class="caps"&gt;RSS&lt;/span&gt; para mi web?&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='http://weblogssl.feedsportal.com/c/33859/f/609642/s/1f48c331/mf.gif' border='0'/&gt;&lt;div class='mf-viral'&gt;&lt;table border='0'&gt;&lt;tr&gt;&lt;td valign='middle'&gt;&lt;a href="http://share.feedsportal.com/viral/sendEmail.cfm?lang=es&amp;title=Desentra%C3%B1ando+el+RSS.+%C2%BFC%C3%B3mo+es+un+feed+por+dentro%3F&amp;link=http%3A%2F%2Fwww.genbetadev.com%2Fdesarrollo-web%2Fdesentranando-el-rss-como-es-un-feed-por-dentro" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/emailthis2_es.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark_es.cfm?title=Desentra%C3%B1ando+el+RSS.+%C2%BFC%C3%B3mo+es+un+feed+por+dentro%3F&amp;link=http%3A%2F%2Fwww.genbetadev.com%2Fdesarrollo-web%2Fdesentranando-el-rss-como-es-un-feed-por-dentro" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/bookmark_es.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://da.feedsportal.com/r/134204138668/u/49/f/609642/c/33859/s/1f48c331/kg/319/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/134204138668/u/49/f/609642/c/33859/s/1f48c331/kg/319/a2.img" border="0"/&gt;&lt;/a&gt;&lt;img width="1" height="1" src="http://pi.feedsportal.com/r/134204138668/u/49/f/609642/c/33859/s/1f48c331/kg/319/a2t.img" border="0"/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.weblogssl.com/~ff/genbetadev?a=NzbyeJ_d4Is:quCtKErZUGk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/genbetadev?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.weblogssl.com/~ff/genbetadev?a=NzbyeJ_d4Is:quCtKErZUGk:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/genbetadev?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><pubDate>Sat, 12 May 2012 08:00:00 GMT</pubDate><author>Johnbo</author><guid isPermaLink="false">http://www.genbetadev.com/desarrollo-web/desentranando-el-rss-como-es-un-feed-por-dentro</guid></item><item><title>No te lo vas a creer, el Goto aún existe en C#</title><link>http://weblogssl.feedsportal.com/c/33859/f/609642/s/1f4566cb/l/0L0Sgenbetadev0N0Ccnet0Cno0Ete0Elo0Evas0Ea0Ecreer0Eel0Egoto0Eaun0Eexiste0Een0Ec/story01.htm</link><description>&lt;p&gt;&lt;img alt="Portada" src="http://img.genbetadev.com/2012/05/gotoPortada.jpg" class="centro" /&gt;&lt;/p&gt; &lt;p&gt;Tengo que reconocer que Twiter se ha convertido en &lt;strong&gt;una fuente de información sorprendente&lt;/strong&gt;. Como leí en algún sitio &amp;#8220;&lt;em&gt;desde que existe twiter, siempre leo en el periódico noticias antiguas&lt;/em&gt;&amp;#8220;.&lt;/p&gt; &lt;p&gt;Esto viene al caso al llegarme por este medio un rumor que, al principio, no me podía creer. El rey del &amp;#8220;&lt;em&gt;spaguetti code&lt;/em&gt;&amp;#8220;, el causante de inmenso dolor en los tiempos del &lt;span class="caps"&gt;&lt;span class="caps"&gt;GWBASIC&lt;/span&gt;&lt;/span&gt;, el paradigma de lo que no se tiene que utilizar; &lt;strong&gt;aún vive&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;Y estoy hablando de &lt;strong&gt;la sentencia de salto absoluto &lt;span class="caps"&gt;&lt;span class="caps"&gt;GOTO&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;.&lt;br /&gt; &lt;!--more--&gt;&lt;br /&gt; Lo que parecía una broma, me ha llevado a la página de &lt;span class="caps"&gt;&lt;span class="caps"&gt;MSDN&lt;/span&gt;&lt;/span&gt;, en donde he leído boquiabierto que no solamente no es un recuerdo lejano de un pasado secuencial, &lt;strong&gt;si no que se sigue implementado en .NET.&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Y para comprobar que funciona, traigo un ejemplo escrito en C# con Visual Studio 11 beta. Lo cual significa que &lt;strong&gt;en el novísimo framework 4.5, aún se puede utilizar&lt;/strong&gt;. &lt;/p&gt; &lt;pre class="prettyprint lang-csh"&gt; int numero = 0; int suma = 0; switch (numero)&lt;br/&gt; {&lt;br/&gt; case 1:&lt;br/&gt; suma += 20;&lt;br/&gt; break;&lt;br/&gt; case 2:&lt;br/&gt; suma += 30;&lt;br/&gt; goto case 1;&lt;br/&gt; case 3:&lt;br/&gt; suma += 50;&lt;br/&gt; goto case 1;&lt;br/&gt; default:&lt;br/&gt; suma = 0;&lt;br/&gt; break;&lt;br/&gt; } &lt;/pre&gt; &lt;p&gt;&lt;strong&gt;Me he quedado sin palabras&amp;#8230;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Más información | &lt;a href="http://msdn.microsoft.com/es-es/library/13940fs2(v=vs.100).aspx"&gt;&lt;span class="caps"&gt;&lt;span class="caps"&gt;MSDN&lt;/span&gt;&lt;/span&gt;: goto (Referencia de C#)&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='http://weblogssl.feedsportal.com/c/33859/f/609642/s/1f4566cb/mf.gif' border='0'/&gt;&lt;div class='mf-viral'&gt;&lt;table border='0'&gt;&lt;tr&gt;&lt;td valign='middle'&gt;&lt;a href="http://share.feedsportal.com/viral/sendEmail.cfm?lang=es&amp;title=No+te+lo+vas+a+creer%2C+el+Goto+a%C3%BAn+existe+en+C%23&amp;link=http%3A%2F%2Fwww.genbetadev.com%2Fcnet%2Fno-te-lo-vas-a-creer-el-goto-aun-existe-en-c" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/emailthis2_es.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark_es.cfm?title=No+te+lo+vas+a+creer%2C+el+Goto+a%C3%BAn+existe+en+C%23&amp;link=http%3A%2F%2Fwww.genbetadev.com%2Fcnet%2Fno-te-lo-vas-a-creer-el-goto-aun-existe-en-c" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/bookmark_es.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://da.feedsportal.com/r/134204396490/u/49/f/609642/c/33859/s/1f4566cb/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/134204396490/u/49/f/609642/c/33859/s/1f4566cb/a2.img" border="0"/&gt;&lt;/a&gt;&lt;img width="1" height="1" src="http://pi.feedsportal.com/r/134204396490/u/49/f/609642/c/33859/s/1f4566cb/a2t.img" border="0"/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.weblogssl.com/~ff/genbetadev?a=B142GkvSLMc:jBsRbfnYkkU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/genbetadev?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.weblogssl.com/~ff/genbetadev?a=B142GkvSLMc:jBsRbfnYkkU:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/genbetadev?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><pubDate>Fri, 11 May 2012 15:25:43 GMT</pubDate><author>Juan Quijano</author><guid isPermaLink="false">http://www.genbetadev.com/cnet/no-te-lo-vas-a-creer-el-goto-aun-existe-en-c</guid></item><item><title>¿Qué te motivó a convertirte en programador?: la pregunta de la semana</title><link>http://weblogssl.feedsportal.com/c/33859/f/609642/s/1f3a6aac/l/0L0Sgenbetadev0N0Cgenbeta0Edev0Cque0Ete0Emotivo0Ea0Econvertirte0Een0Eprogramador0Ela0Epregunta0Ede0Ela0Esemana/story01.htm</link><description>&lt;p&gt;&lt;img src="http://img.genbetadev.com/2012/04/bg-header-qa_6501-1.jpg" class="centro"/&gt;&lt;/p&gt; &lt;p&gt;Otra semana más aquí estamos en &lt;a href="http://www.genbetadev.com"&gt;Genbeta Dev&lt;/a&gt; con nuestra &lt;a href="http://www.genbetadev.com/tag/la-pregunta-de-la-semana"&gt;pregunta de la semana&lt;/a&gt;. Esta vez nos ponemos un poco más genéricos e incluso filosóficos si se me permite y te cuestionamos sobre &lt;strong&gt;las decisiones que has tomado en tu vida&lt;/strong&gt;. Bueno, de todas no, principalmente de la siguiente:&lt;/p&gt; &lt;p&gt;&lt;blockquote&gt;&lt;a href="http://www.genbetadev.com/respuestas/que-te-motivo-a-convertirte-en-programador"&gt;¿Qué te motivó a convertirte en programador?&lt;/a&gt;&lt;/blockquote&gt;&lt;!--more--&gt;&lt;/p&gt; &lt;p&gt;Es decir, &lt;strong&gt;¿cómo llegaste a ser desarrollador y por qué?&lt;/strong&gt; Y ya de paso pues te puedes explayar un poco y contarnos &lt;strong&gt;tus sensaciones sobre este trabajo&lt;/strong&gt;, si es lo que esperabas, si estás pensando en dejarlo o te ves muchos años dentro del gremio&amp;#8230; Y si no eres desarrollador pero estás pensando en serlo, pues lo mismo: ¿por qué?&lt;/p&gt; &lt;p&gt;Recuerda que mejor &lt;strong&gt;contestar a la pregunta en la sección de Respuestas&lt;/strong&gt; del blog (que para algo está &lt;a href="http://www.genbetadev.com/respuestas"&gt;aquí&lt;/a&gt;) que hacerlo en los comentarios porque si tu respuesta gusta podrás salir en el post de la semana que viene, como es el caso de &lt;a href="http://www.genbetadev.com/usuario/anthares"&gt;Juan M. Gómez&lt;/a&gt;, que contesto a la pregunta de la semana pasada, &amp;#8216;&lt;a href="http://www.genbetadev.com/respuestas/deberiamos-preocuparnos-por-el-copyright-de-lenguajes-y-apis-de-programacion"&gt;¿Deberíamos preocuparnos por el copyright de lenguajes y &lt;span class="caps"&gt;API&lt;/span&gt;s de programación?&lt;/a&gt;&amp;#8216;, tal como sigue:&lt;/p&gt; &lt;p&gt;&lt;blockquote&gt;Del uso que le damos a una &lt;span class="caps"&gt;API&lt;/span&gt; o servicio creo que deberíamos preocuparnos, sobre todo a éste último.&lt;/p&gt; &lt;p&gt;En cuanto a la pregunta en sí, el copyright. Pues creo que a corto plazo puede que no, pero nos estamos dirigiendo a un modelo que destruye la innovación. Llegará un momento en que las empresas cobraran de manera masiva por el uso de APis (entiendase pago de patentes) y será imposible para el pequeño programador/empresas desarrollar aplicaciones sin pasar por caja.&lt;/p&gt; &lt;p&gt;Creo firmemente que las herramientas de desarrollo y todo lo relacionado con ellas, deberían ser libres y gratuitas. ¿Acaso alguien paga patentes por utilizar herramientas matemáticas en cualquier otro campo (arquitectura, ingeniería, etc.) ?&lt;/blockquote&gt;&lt;/p&gt; &lt;p&gt;Esto es todo. La semana que viene, más y mejor.&lt;/p&gt; &lt;p&gt;En Genbeta Dev | &lt;a href="http://www.genbetadev.com/respuestas/que-te-motivo-a-convertirte-en-programador"&gt;¿Qué te motivó a convertirte en programador?&lt;/a&gt;&lt;/blockquote&gt;&lt;/p&gt;&lt;img width='1' height='1' src='http://weblogssl.feedsportal.com/c/33859/f/609642/s/1f3a6aac/mf.gif' border='0'/&gt;&lt;div class='mf-viral'&gt;&lt;table border='0'&gt;&lt;tr&gt;&lt;td valign='middle'&gt;&lt;a href="http://share.feedsportal.com/viral/sendEmail.cfm?lang=es&amp;title=%C2%BFQu%C3%A9+te+motiv%C3%B3+a+convertirte+en+programador%3F%3A+la+pregunta+de+la+semana&amp;link=http%3A%2F%2Fwww.genbetadev.com%2Fgenbeta-dev%2Fque-te-motivo-a-convertirte-en-programador-la-pregunta-de-la-semana" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/emailthis2_es.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark_es.cfm?title=%C2%BFQu%C3%A9+te+motiv%C3%B3+a+convertirte+en+programador%3F%3A+la+pregunta+de+la+semana&amp;link=http%3A%2F%2Fwww.genbetadev.com%2Fgenbeta-dev%2Fque-te-motivo-a-convertirte-en-programador-la-pregunta-de-la-semana" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/bookmark_es.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://da.feedsportal.com/r/134204293032/u/49/f/609642/c/33859/s/1f3a6aac/kg/319/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/134204293032/u/49/f/609642/c/33859/s/1f3a6aac/kg/319/a2.img" border="0"/&gt;&lt;/a&gt;&lt;img width="1" height="1" src="http://pi.feedsportal.com/r/134204293032/u/49/f/609642/c/33859/s/1f3a6aac/kg/319/a2t.img" border="0"/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.weblogssl.com/~ff/genbetadev?a=R3x2kHOJtXE:k_GqX1a8i8c:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/genbetadev?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.weblogssl.com/~ff/genbetadev?a=R3x2kHOJtXE:k_GqX1a8i8c:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/genbetadev?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><pubDate>Thu, 10 May 2012 12:34:06 GMT</pubDate><author>Fernando Siles</author><guid isPermaLink="false">http://www.genbetadev.com/genbeta-dev/que-te-motivo-a-convertirte-en-programador-la-pregunta-de-la-semana</guid></item><item><title>Cazadores de Mitos: Las propiedades privadas en Python</title><link>http://weblogssl.feedsportal.com/c/33859/f/609642/s/1f3317a5/l/0L0Sgenbetadev0N0Cpython0Ccazadores0Ede0Emitos0Elas0Epropiedades0Eprivadas0Een0Epython/story01.htm</link><description>&lt;p&gt;&lt;img alt="Cazadores de Mitos: Python" src="http://img.genbetadev.com/galleries/mitos-python/Python.jpg" class="centro" /&gt;&lt;/p&gt; &lt;p&gt;El otro día discutía con un buen amigo en Twitter sobre lo que el llamaba &amp;#8220;&lt;em&gt;falta de private protected y public keywords&lt;/em&gt;&amp;#8220; en Python y recordé la tremenda confusión y desinformación que hay en la red en relación a las propiedades y/o métodos &amp;#8220;&lt;em&gt;privadas/os&lt;/em&gt;&amp;#8220; en el lenguaje creado por &lt;strong&gt;Guido Van Rossum&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;En esta entrada voy a intentar explicar &lt;strong&gt;por qué no existen propiedades ni métodos privados en Python&lt;/strong&gt; y por qué no son necesarios, por qué existe esta confusión sobre los métodos y propiedades (o atributos) que utilizan el underscore (_ y __) y cual es la auténtica naturaleza de los mismos.&lt;!--more--&gt;&lt;/p&gt; &lt;p&gt;&lt;h2&gt;El origen del Mito&lt;/h2&gt;&lt;br /&gt; Muy posiblemente el origen del mito comenzó con el &lt;strong&gt;fantástico libro de Mark Pilgrim&lt;/strong&gt; &lt;a href="http://www.diveintopython.net/toc/index.html"&gt;Dive into Python&lt;/a&gt; que ha sido el primer contacto y libro de referencia por antonomasia para los novicios en Python desde prácticamente su lanzamiento el treinta de octubre del 2000. Yo mismo aprendí con él.&lt;/p&gt; &lt;p&gt;El capítulo 5.9. del citado libro, lamentablemente, se titula &amp;#8220;&lt;em&gt;Private Functions&lt;/em&gt;&amp;#8220; y en él se dice lo siguiente:&lt;br /&gt; &lt;blockquote&gt;Como en muchos otros lenguajes, Python tiene el concepto de elementos privados:&lt;ul&gt;&lt;li&gt;Funciones privadas, que no pueden ser invocadas desde fuera de su módulo&lt;/li&gt;&lt;li&gt;Métodos de clase privados, que no pueden ser invocados desde fuera de su clase&lt;/li&gt;&lt;li&gt;Atributos privados, que no pueden ser accedidos desde fuera de su clase&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt; Pero a diferencia de la mayoría de lenguajes, lo que hace a una función, método o atributo de Python privado viene determinado enteramente por su nombre.&lt;/p&gt; &lt;p&gt;Si el nombre de una función, el método de una clase o uno de sus atributos comienza con (pero no termina con) dos guiones bajos (&lt;em&gt;underscores&lt;/em&gt;), es privado; todo lo demás es público.&lt;/blockquote&gt;&lt;/p&gt; &lt;p&gt;Para &lt;strong&gt;reforzar esta afirmación&lt;/strong&gt; recurre a un sencillo ejemplo que demuestra que no se puede invocar un método llamado &amp;#8220;&lt;em&gt;__parse&lt;/em&gt;&amp;#8220; desde fuera de una clase. Yo voy a escribir otro sencillo ejemplo &lt;strong&gt;en el &lt;span class="caps"&gt;&lt;span class="caps"&gt;REPL&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt; e iré explicando sobre la marcha por qué Mark Pilgrim estaba, sencillamente, &lt;strong&gt;equivocado con respecto a este particular&lt;/strong&gt; en específico.&lt;/p&gt; &lt;pre class="prettyprint lang-python"&gt;&amp;#62;&amp;#62; class Gato(object): &amp;#62;&amp;#62;&amp;#62; &amp;#34;&amp;#34;&amp;#34;Clase Gato&amp;#34;&amp;#34;&amp;#34; &amp;#62;&amp;#62;&amp;#62; def __init__(self): &amp;#62;&amp;#62;&amp;#62; super(Gato, self).__init__() &amp;#62;&amp;#62;&amp;#62; def __privado(self): &amp;#62;&amp;#62;&amp;#62; &amp;#34;&amp;#34;&amp;#34;Metodo supuestamente privado&amp;#34;&amp;#34;&amp;#34; &amp;#62;&amp;#62;&amp;#62; print &amp;#34;Soy privado como los intereses del Estado&amp;#8230;&amp;#34; &amp;#62;&amp;#62;&amp;#62; def un_metodo(self): &amp;#62;&amp;#62;&amp;#62; &amp;#34;&amp;#34;&amp;#34;Metodo supuestamente publico desde el que se accede a __privado&amp;#34;&amp;#34;&amp;#34; &amp;#62;&amp;#62;&amp;#62; self.__privado() &amp;#62;&amp;#62;&amp;#62; &amp;#62;&amp;#62;&amp;#62; g1 = Gato() &amp;#62;&amp;#62;&amp;#62; g1.__privado() &amp;#62;&amp;#62;&amp;#62; Traceback (most recent call last): &amp;#62;&amp;#62;&amp;#62; File &amp;#34;&amp;#60;interactive input&amp;#62;&amp;#34;, line 1, in ? &amp;#62;&amp;#62;&amp;#62; AttributeError: &amp;#39;Gato&amp;#39; object has no attribute &amp;#39;__privado&amp;#39; &amp;#62;&amp;#62;&amp;#62; &amp;#62;&amp;#62;&amp;#62; g1.un_metodo() Soy privado como los intereses del Estado&amp;#8230; &amp;#62;&amp;#62;&amp;#62;&lt;/pre&gt; &lt;p&gt;Vemos como efectivamente no hemos sido capaces de invocar al método &lt;strong&gt;__privado&lt;/strong&gt; de nuestra clase Gato pero sin embargo al invocar al método &lt;strong&gt;un_metodo&lt;/strong&gt; que llama internamente al método &amp;#8220;&lt;em&gt;__privado&lt;/em&gt;&amp;#8220; si se ha imprimido el mensaje y por lo tanto &amp;#8220;demuestra&amp;#8221; la teoría explicada por Pilgrim en Dive Into Python.&lt;/p&gt; &lt;p&gt;Pero esto no es más que una &lt;strong&gt;desagradable coincidencia&lt;/strong&gt;. Que el método no sea accesible desde fuera de la clase no tiene nada que ver con la visibilidad o restricción del método sino que es el efecto de un mecanismo de Python conocido como &lt;em&gt;&lt;strong&gt;name mangling&lt;/strong&gt;&lt;/em&gt; (presente en otros lenguajes como C++ o Java) y no sirve para lo que &lt;strong&gt;por error&lt;/strong&gt; se cree de manera popular. Vamos a explicarlo con otro ejemplo en la &lt;span class="caps"&gt;&lt;span class="caps"&gt;REPL&lt;/span&gt;&lt;/span&gt;:&lt;/p&gt; &lt;pre class="prettyprint lang-python"&gt;&amp;#62;&amp;#62;&amp;#62; class Gatico(Gato): &amp;#62;&amp;#62;&amp;#62; &amp;#34;&amp;#34;&amp;#34;La clase Gatico hereda de la clase Gato&amp;#34;&amp;#34;&amp;#34; &amp;#62;&amp;#62;&amp;#62; def __init__(self): &amp;#62;&amp;#62;&amp;#62; super(Gatico, self).__init__() &amp;#62;&amp;#62;&amp;#62; def __privado(self): &amp;#62;&amp;#62;&amp;#62; &amp;#34;&amp;#34;&amp;#34;Estoy sobreescribiendo el metodo privado?&amp;#34;&amp;#34;&amp;#34; &amp;#62;&amp;#62;&amp;#62; print &amp;#34;Es necesario abrir los datos al publico y dejar de ser privado&amp;#8230;&amp;#34; &amp;#62;&amp;#62;&amp;#62; def otro_metodo(self): &amp;#62;&amp;#62;&amp;#62; &amp;#34;&amp;#34;&amp;#34;Soy otro metodo y me llamo asi a posta para nos sobreescribir a un_metodo de la clase base&amp;#34;&amp;#34;&amp;#34; &amp;#62;&amp;#62;&amp;#62; self.__privado() &amp;#62;&amp;#62;&amp;#62; &amp;#62;&amp;#62;&amp;#62; g2 = Gatico() &amp;#62;&amp;#62;&amp;#62; g2.__privado() &amp;#62;&amp;#62;&amp;#62; Traceback (most recent call last): &amp;#62;&amp;#62;&amp;#62; File &amp;#34;&amp;#60;interactive input&amp;#62;&amp;#34;, line 1, in ? &amp;#62;&amp;#62;&amp;#62; AttributeError: &amp;#39;Gatico&amp;#39; object has no attribute &amp;#39;__privado&amp;#39; &amp;#62;&amp;#62;&amp;#62; &amp;#62;&amp;#62;&amp;#62; g2.otro_metodo() Es necesario abrir los datos al publico y dejar de ser privado&amp;#8230; &amp;#62;&amp;#62;&amp;#62; &amp;#62;&amp;#62;&amp;#62; g2.un_metodo() Soy privado como los intereses del Estado&amp;#8230; &amp;#62;&amp;#62;&amp;#62;&lt;/pre&gt; &lt;p&gt;¿Qué es lo que ha pasado aquí?. Los programadores de Java y de C++ que están leyendo este artículo (porque lo estáis leyendo verdad, os interesa un montón&amp;#8230;) se habrán percatado rápidamente de que &lt;strong&gt;algo raro&lt;/strong&gt; está pasando.&lt;/p&gt; &lt;p&gt;En Java no está permitido sobreescribir métodos privados, si el programador nombra a un método privado en una clase heredada &lt;strong&gt;exactamente igual&lt;/strong&gt; que un método privado de su clase base, sencillamente estará creando un método completamente nuevo en la subclase y este ocultará al método de la superclase.&lt;/p&gt; &lt;p&gt;En C++ se puede sobreescribir cualquier método que sea &lt;strong&gt;virtual&lt;/strong&gt;, de hecho, es una práctica aceptada y recomendable sobreescribir solo funciones virtuales privadas y nunca públicas pero si sobreescribimos un método privado de una clase base en una subclase y lo invocamos desde la subclase, debería de llamarse al método adecuado, es decir, al nuevo método que sobreescribe al de la clase base aunque sea invocado por un método de la clase base desde la subclase. Este es uno de los principios del &lt;strong&gt;polimorfismo&lt;/strong&gt; en C++.&lt;/p&gt; &lt;p&gt;Por lo tanto es extraño que en Python hayamos sobreescrito el método &amp;#8220;&lt;em&gt;__privado&lt;/em&gt;&amp;#8220; pero sin embargo el método &amp;#8220;&lt;em&gt;un_metodo&lt;/em&gt;&amp;#8220; siga pudiendo invocar a la implementación del método &amp;#8220;&lt;em&gt;__privado&lt;/em&gt;&amp;#8220; de su propia clase. De hecho, esto ocurre por que &lt;strong&gt;en ningún momento hemos sobreescrito&lt;/strong&gt; el método &amp;#8220;&lt;em&gt;__privado&lt;/em&gt;&amp;#8220; de la clase Gato ni es un método privado, ni nunca ha sido intención del lenguaje poder crear métodos privados ni por éste &lt;strong&gt;ni por ningún otro medio&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;&lt;h2&gt;Ahora si que estoy perdido, ¿me lo explica?&lt;/h2&gt;&lt;br /&gt; Python es un lenguaje potente que permite al programador hacer prácticamente lo que quiera, como por ejemplo, definir algo como &lt;code&gt;True = False&lt;/code&gt; y &lt;strong&gt;liarla parda&lt;/strong&gt; o bien sobreescribir una función&lt;em&gt; builtin&lt;/em&gt;. Esto es así por la particular visión de como debe ser el lenguaje por parte de los Pythonistas y del &lt;strong&gt;&lt;span class="caps"&gt;&lt;span class="caps"&gt;BDFL&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt; (Benevolent Dictator For Life).&lt;/p&gt; &lt;p&gt;Uno de los principales valores de Python es que &lt;strong&gt;trata al programador como mayor de edad&lt;/strong&gt; y en lugar de imponer restricciones confía en el buen juicio de nosotros, los programadores, para no hacer barbaridades así que la Comunidad define una serie de &lt;strong&gt;convenciones sobre el lenguaje&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;Entre estas convenciones se encuentra la de nombrar a toda aquella función, todo aquel método o atributo &lt;strong&gt;que no sea parte de la &lt;span class="caps"&gt;&lt;span class="caps"&gt;API&lt;/span&gt;&lt;/span&gt; pública&lt;/strong&gt; (que no métodos ni propiedades) de nuestra clase, librería, framework o módulo y sea perceptible a cambios, la desaparición o el estado obsoleto y olvidado sin previo aviso, con un underscore delante del nombre para informar a los consumidores de dicha &lt;span class="caps"&gt;&lt;span class="caps"&gt;API&lt;/span&gt;&lt;/span&gt; de que se trata de un método interno que puede &lt;strong&gt;cambiar sin previo aviso&lt;/strong&gt; y no está diseñado (ni es útil) para el uso normal de la &lt;span class="caps"&gt;&lt;span class="caps"&gt;API&lt;/span&gt;&lt;/span&gt;.&lt;/p&gt; &lt;p&gt;Si además el nombre de nuestra variable coincide con una clase, método, variable o &lt;em&gt;builtin&lt;/em&gt; pero es el único que tiene lógica, por ejemplo, &lt;em&gt;list&lt;/em&gt;, &lt;em&gt;sum&lt;/em&gt;, &lt;em&gt;rand&lt;/em&gt; por convención se añade un underscore al nombre antes de hacer algo &amp;#8220;&lt;em&gt;tan guarro&lt;/em&gt;&amp;#8220; (para el Zen de Python) como nombrarlo &amp;#8220;&lt;em&gt;lst&lt;/em&gt;&amp;#8220;, &amp;#8220;&lt;em&gt;sm&lt;/em&gt;&amp;#8220;, &amp;#8220;&lt;em&gt;rnd&lt;/em&gt;&amp;#8220; que no aporta valor semántico.&lt;/p&gt; &lt;p&gt;Por otro lado, para posibilitar que las clases que heredan de clases bases puedan sobreescribir métodos &lt;strong&gt;sin romper las llamadas internas&lt;/strong&gt; de sus clases base a dichos métodos, cualquier método (o función o atributo) que comience con al menos dos underscores (y no acabe en dos underscores, uno si está permitido) es &lt;strong&gt;renombrado por el intérprete&lt;/strong&gt; en la definición de la clase siguiendo la siguiente norma &amp;#8220;&lt;em&gt;_classname__methodname&lt;/em&gt;&amp;#8220; así que para nuestro ejemplo el método quedaría así &amp;#8220;&lt;em&gt;_Gato__privado&lt;/em&gt;&amp;#8220; y de hecho podría seguir siendo invocado desde fuera de la clase si así lo queremos:&lt;br /&gt; &lt;pre class="prettyprint lang-python"&gt;&lt;code&gt;&amp;#38;gt;&amp;#38;gt;&amp;#38;gt; g1._Gato__privado() Soy privado como los intereses del Estado...&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt; &lt;p&gt;Y puede ser invocado ya que nunca fue la intención del lenguaje que existieran los métodos privados, ya que en Python, por su propia condición de lenguaje dinámico y sus características, no es necesario. Asimismo, los métodos, funciones o variables que empiezan con un underscore &lt;strong&gt;no son importados&lt;/strong&gt; al usar &lt;code&gt;from bleh import *&lt;/code&gt; que por otro lado es una sintaxis considerada &amp;#8220;&lt;em&gt;deprectaed&lt;/em&gt;&amp;#8220; y mala práctica de programación por el &lt;span class="caps"&gt;&lt;span class="caps"&gt;PEP&lt;/span&gt;&lt;/span&gt;-8.&lt;/p&gt; &lt;p&gt;&lt;h2&gt;Conclusión&lt;/h2&gt;&lt;br /&gt; Ya se que ha sido un &lt;strong&gt;artículo ladrillazo&lt;/strong&gt; pero considero que en vista a la falta total de literatura al respecto era necesario realizar esta aclaración para ayudar así a comprender mejor este maravilloso lenguaje.&lt;/p&gt; &lt;p&gt;En breve escribiré otro artículo explicando porque no es necesario el uso de métodos o propiedades privados. Hasta entonces, happy hacking.&lt;/p&gt; &lt;p&gt;Más Desinformación | &lt;a href="http://www.diveintopython.net/object_oriented_framework/private_functions.html"&gt;Capítulo 5.9. de Dive Into Python&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='http://weblogssl.feedsportal.com/c/33859/f/609642/s/1f3317a5/mf.gif' border='0'/&gt;&lt;div class='mf-viral'&gt;&lt;table border='0'&gt;&lt;tr&gt;&lt;td valign='middle'&gt;&lt;a href="http://share.feedsportal.com/viral/sendEmail.cfm?lang=es&amp;title=Cazadores+de+Mitos%3A+Las+propiedades+privadas+en+Python&amp;link=http%3A%2F%2Fwww.genbetadev.com%2Fpython%2Fcazadores-de-mitos-las-propiedades-privadas-en-python" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/emailthis2_es.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark_es.cfm?title=Cazadores+de+Mitos%3A+Las+propiedades+privadas+en+Python&amp;link=http%3A%2F%2Fwww.genbetadev.com%2Fpython%2Fcazadores-de-mitos-las-propiedades-privadas-en-python" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/bookmark_es.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://da.feedsportal.com/r/134204266939/u/49/f/609642/c/33859/s/1f3317a5/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/134204266939/u/49/f/609642/c/33859/s/1f3317a5/a2.img" border="0"/&gt;&lt;/a&gt;&lt;img width="1" height="1" src="http://pi.feedsportal.com/r/134204266939/u/49/f/609642/c/33859/s/1f3317a5/a2t.img" border="0"/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.weblogssl.com/~ff/genbetadev?a=tnsUNFWs3sU:59fsmIuL-T8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/genbetadev?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.weblogssl.com/~ff/genbetadev?a=tnsUNFWs3sU:59fsmIuL-T8:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/genbetadev?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><pubDate>Thu, 10 May 2012 04:00:00 GMT</pubDate><author>Oscar Campos</author><guid isPermaLink="false">http://www.genbetadev.com/python/cazadores-de-mitos-las-propiedades-privadas-en-python</guid></item><item><title>I/O Extended e I/O Live, otras maneras de ser parte de la Google I/O 2012</title><link>http://weblogssl.feedsportal.com/c/33859/f/609642/s/1f2f0363/l/0L0Sgenbetadev0N0Cactualidad0Ci0Eo0Eextended0Ee0Ei0Eo0Elive0Eotras0Emaneras0Ede0Eser0Eparte0Ede0Ela0Egoogle0Ei0Eo0E20A12/story01.htm</link><description>&lt;p&gt;&lt;img alt="Inscripción Google IO 2012" src="http://img.genbetadev.com/2012/03/650_1000_incripcion-GoogleIO2012.jpg" class="centro" /&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Google I/O&lt;/strong&gt; es indiscutiblemente &lt;strong&gt;uno de los grandes eventos para desarrolladores&lt;/strong&gt; que hay a nivel global. Pero San Francisco está lejos y los tickets son muy caros (aunque esto siempre es relativo, claro) por lo que seguro que te interesan las dos iniciativas aledañas que prepara Google para finales del mes de Junio: &lt;strong&gt;I/O Extended e I/O Live&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;La segunda, &lt;strong&gt;I/O Live&lt;/strong&gt;, viene a ser &lt;strong&gt;el streaming habitual&lt;/strong&gt; de todos los años, que ya el año pasado reunió a más de un millón de espectadores y que en esta edición esperan casi doblar. ¿Cómo? Ofreciendo la &lt;strong&gt;keynote y varias de las conferencias&lt;/strong&gt; y actividades más relevantes. Todas ellas más la que no se retransmitan en directo se podrán luego visualizar en menos de 48 horas.&lt;/p&gt; &lt;p&gt;La primera, &lt;a href="https://developers.google.com/events/io/io-extended"&gt;I/O Extended&lt;/a&gt;, podemos decir que se trata de &lt;strong&gt;fiestas o quedadas oficiales para seguir el evento principal&lt;/strong&gt; repartidas por todo el largo y ancho mundo: desde Chattanooga en Tennesee hasta Uganda pasando por varias en Europa, incluyendo &lt;strong&gt;una en Barcelona&lt;/strong&gt; de la que puedes encontrar más info &lt;a href="https://docs.google.com/spreadsheet/viewform?formkey=dElfZWFsOWl6emdncGZWUjE0RlRtZHc6MQ"&gt;aquí&lt;/a&gt;. Todavía Google está aceptando nuevas fiestas por lo que lo mismo nos encontramos con alguna todavía más cerquita.&lt;/p&gt; &lt;p&gt;En definitiva, que los días &lt;strong&gt;27, 28 y 29 de Junio&lt;/strong&gt; se prevén intensos para cualquier developer que se precie de serlo y guste de estar a la última, vamos, para un &lt;em&gt;genbetadevero&lt;/em&gt; de pro.&lt;/p&gt; &lt;p&gt;Pd: ¿alguien en la sala que vaya a estar &lt;em&gt;in situ&lt;/em&gt;?&lt;/p&gt; &lt;p&gt;Vía | &lt;a href="http://googledevelopers.blogspot.com.es/2012/05/experience-google-io-2012-anywhere.html"&gt;Google Developers Blog&lt;/a&gt; &lt;br /&gt; En Genbeta Dev | &lt;a href="http://www.genbetadev.com/desarrolladores/se-anuncia-la-fecha-del-registro-de-el-google-io-2012-atentos-al-27-de-marzo"&gt;Se anuncia la fecha de registro del Google IO 2012, atentos al 27 de marzo&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='http://weblogssl.feedsportal.com/c/33859/f/609642/s/1f2f0363/mf.gif' border='0'/&gt;&lt;div class='mf-viral'&gt;&lt;table border='0'&gt;&lt;tr&gt;&lt;td valign='middle'&gt;&lt;a href="http://share.feedsportal.com/viral/sendEmail.cfm?lang=es&amp;title=I%2FO+Extended+e+I%2FO+Live%2C+otras+maneras+de+ser+parte+de+la+Google+I%2FO+2012&amp;link=http%3A%2F%2Fwww.genbetadev.com%2Factualidad%2Fi-o-extended-e-i-o-live-otras-maneras-de-ser-parte-de-la-google-i-o-2012" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/emailthis2_es.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark_es.cfm?title=I%2FO+Extended+e+I%2FO+Live%2C+otras+maneras+de+ser+parte+de+la+Google+I%2FO+2012&amp;link=http%3A%2F%2Fwww.genbetadev.com%2Factualidad%2Fi-o-extended-e-i-o-live-otras-maneras-de-ser-parte-de-la-google-i-o-2012" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/bookmark_es.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://da.feedsportal.com/r/133515401530/u/49/f/609642/c/33859/s/1f2f0363/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/133515401530/u/49/f/609642/c/33859/s/1f2f0363/a2.img" border="0"/&gt;&lt;/a&gt;&lt;img width="1" height="1" src="http://pi.feedsportal.com/r/133515401530/u/49/f/609642/c/33859/s/1f2f0363/a2t.img" border="0"/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.weblogssl.com/~ff/genbetadev?a=u0JNGV5juV0:y8evvQHG0UY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/genbetadev?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.weblogssl.com/~ff/genbetadev?a=u0JNGV5juV0:y8evvQHG0UY:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/genbetadev?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><pubDate>Wed, 09 May 2012 16:18:46 GMT</pubDate><author>Fernando Siles</author><guid isPermaLink="false">http://www.genbetadev.com/actualidad/i-o-extended-e-i-o-live-otras-maneras-de-ser-parte-de-la-google-i-o-2012</guid></item><item><title>KarmicGraphs, plugin jQuery para gráficas liberado por Karmacracy</title><link>http://weblogssl.feedsportal.com/c/33859/f/609642/s/1f25f003/l/0L0Sgenbetadev0N0Cherramientas0Ckarmicgraphs0Eplugin0Ejquery0Epara0Egraficas0Eliberado0Epor0Ekarmacracy/story01.htm</link><description>&lt;p&gt;&lt;img alt="Karmacracy" src="http://img.genbetadev.com/galleries/karmagraphics/2012_04_11_Karmacracy1.jpg" class="centro" /&gt;&lt;/p&gt; &lt;p&gt;Para quien no lo sepa, &lt;strong&gt;KarmaCracy&lt;/strong&gt; es una startup nacida en Bilbao de mano de Alex Dolara y Jordi Martí pero ademaś es un acortador de Urls que en las últimas 24 horas ha generado &lt;strong&gt;37.849 clicks válidos&lt;/strong&gt; a través de &lt;strong&gt;1.169 enlaces&lt;/strong&gt; generados por &lt;strong&gt;222 usuarios&lt;/strong&gt;, nada mal ¿he?.&lt;/p&gt; &lt;p&gt;Recientemente han liberado bajo el amparo de la &lt;strong&gt;GPLv3&lt;/strong&gt; la primera versión del plugin que &lt;strong&gt;ellos mismos utilizan&lt;/strong&gt; para mostrar las gráficas en detalle de los enlaces o kclicks que se generan en la plataforma. &lt;/p&gt; &lt;p&gt;Los mismos desarrolladores nos cuentan que decidieron crear un plugin ligero para jQuery que reemplazara las antiguas gráficas generadas con flash mediante FusionCharts.&lt;!--more--&gt;&lt;/p&gt; &lt;p&gt;Hemos podido hablar con &lt;strong&gt;Xabi Sáez de Ocariz&lt;/strong&gt; y &lt;strong&gt;Alex Dolara&lt;/strong&gt; programador JavaScript y Diseñador Gráfico respectivamente además de padres de la criatura que nos han explicado como funciona el plugin y como ha sido el proceso de desarrollo y liberación del código.&lt;/p&gt; &lt;p&gt;&lt;h2&gt;¿Cómo se usa?&lt;/h2&gt;&lt;br /&gt; Usar el plugin es &lt;strong&gt;muy sencillo&lt;/strong&gt;, tan solo necesitamos un array de entrada de datos válido con el que alimentar al plugin y llamar a un simple método usando un selector de jQuery:&lt;br /&gt; &lt;pre class="prettyprint lang-javascript"&gt;&lt;code&gt;$(document).ready(function() { var data = [[[40,[&amp;#8220;3&amp;#8221;,&amp;#8220;25\/11\/2011&amp;#8221;]], [1,[&amp;#8220;1&amp;#8221;,&amp;#8220;26\/11\/2011&amp;#8221;]], [4,[&amp;#8220;4&amp;#8221;,&amp;#8220;27\/11\/2011&amp;#8221;]], [5,[&amp;#8220;5&amp;#8221;,&amp;#8220;28\/11\/2011&amp;#8221;]], [14,[&amp;#8220;14&amp;#8221;,&amp;#8220;29\/11\/2011&amp;#8221;]], [15,[&amp;#8220;15&amp;#8221;,&amp;#8220;30\/11\/2011&amp;#8221;]], [13,[&amp;#8220;13&amp;#8221;,&amp;#8220;01\/12\/2011&amp;#8221;]], [6,[&amp;#8220;6&amp;#8221;,&amp;#8220;02\/12\/2011&amp;#8221;]], [1,[&amp;#8220;1&amp;#8221;,&amp;#8220;03\/12\/2011&amp;#8221;]], [10,[&amp;#8220;10&amp;#8221;,&amp;#8220;04\/12\/2011&amp;#8221;]], [7,[&amp;#8220;7&amp;#8221;,&amp;#8220;05\/12\/2011&amp;#8221;]], [7,[&amp;#8220;7&amp;#8221;,&amp;#8220;06\/12\/2011&amp;#8221;]], [40,[&amp;#8220;40&amp;#8221;,&amp;#8220;07\/12\/2011&amp;#8221;]]];&lt;/p&gt; $(&amp;#8217;#grafico&amp;#8217;).karmicGraph(data, { &amp;#8216;outLabel&amp;#8217;: &amp;#8216;Situa el cursor sobre un dato para descubrir su valor&amp;#8217;, &amp;#8216;color&amp;#8217;: &amp;#8216;blue&amp;#8217;, &amp;#8216;label&amp;#8217;: &amp;#8216;&lt;b&gt;{0} puntos&lt;/b&gt; el d&amp;#237;a {1}&amp;#8217;, &amp;#8216;type&amp;#8217;: &amp;#8216;flatbars&amp;#8217;, &amp;#8216;freeColumn&amp;#8217; : 1 }); }); &lt;/code&gt;&lt;/pre&gt; &lt;p&gt;El código anterior da como resultado lo que vemos en la siguiente imagen:&lt;br /&gt; &lt;div class="caption-img"&gt; &lt;img alt="KarmaGraphics" src="http://img.genbetadev.com/galleries/karmagraphics/karma.png" /&gt; &lt;span&gt;Gráfico generado por el plugin&lt;/span&gt; &lt;/div&gt;&lt;/p&gt; &lt;p&gt;Como podéis comprobar su uso no es nada complicado.&lt;/p&gt; &lt;p&gt;&lt;h2&gt;¿Cómo funciona?&lt;/h2&gt;&lt;br /&gt; El plugin cuenta con una función llamada karmicGrahp, que se aplica sobre un elemento div. Esta función acepta tres parámetros:&lt;br /&gt; &lt;ul&gt;&lt;li&gt;&lt;strong&gt;method&lt;/strong&gt;: El método que se quiere invocar. Este parámetro es opcional y, de no ponerlo, se ejecuta el único método implementado por el momento: init.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;data&lt;/strong&gt;: Array de datos del gráfico. Tiene la siguiente forma: [[valor1,[elementos del label]],[valor2,[elementos del label]],&amp;#8230;]&lt;/li&gt;&lt;li&gt;&lt;strong&gt;options&lt;/strong&gt;: Objeto javascript con las opciones de configuración. Son las siguientes:&lt;ul&gt;&lt;li&gt;&lt;strong&gt;type&lt;/strong&gt;: Tipo de gráfico. Actualmente hay dos estilos: flatbars, para el gráfico que se ve en el detalle de kcy y tinybars, para el que se ve en las estadísticas del usuario.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;color&lt;/strong&gt;: El color. Acepta: &lt;em&gt;blue, red, green, yellow, orange, dark-orange, violet&lt;/em&gt; y &lt;em&gt;gold&lt;/em&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;showLabel&lt;/strong&gt;: Si se muestra el label o no. &lt;em&gt;true&lt;/em&gt; o &lt;em&gt;false&lt;/em&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;label&lt;/strong&gt;: La cadena de texto que se muestra cuando se pone el cursor sobre una barra. Puede hacerse referencia al valor a través con &lt;em&gt;{val}&lt;/em&gt; y a los elementos del label descritos en el array de datos con &lt;em&gt;{0},{1}&lt;/em&gt;, haciendo referencia a su posición en dicho array.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;outLabel&lt;/strong&gt;: La cadena de texto que se muestra cuando el usuario no está posicionado encima de ninguna barra.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;noLabel&lt;/strong&gt;: La cadena de texto que se muestra cuando no hay valor definido para la barra sobre la que está el usuario.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;freeColumn&lt;/strong&gt;: Indica dónde se “anclan” las barras del gráfico. Si es menor o igual que 0, las barras sin datos se colocarán a la izquierda y la última barra del gráfico estará pegada a la derecha. Si es mayor que 0, las barras sin datos muestran a la derecha de las que sí los tienen y el principio del gráfico se ancla al extremo izquierdo.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;width&lt;/strong&gt;: La anchura, en píxeles, que queremos que tenga el gráfico.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt; &lt;p&gt;&lt;h2&gt;¿Cómo se desarrolló y liberó?&lt;/h2&gt;&lt;br /&gt; Para construir el plugin siguieron las &lt;a href="http://docs.jquery.com/Plugins/Authoring"&gt;indicaciones y consejos&lt;/a&gt; de la página oficial de jQuery. En la versión actual, el plugin solo ofrece un método que inicializa el gráfico y genera el &lt;span class="caps"&gt;HTML&lt;/span&gt; adecuado pero la intención de Xabi es ofrecer otro método que realice una actualización de los datos desde una &lt;span class="caps"&gt;URL&lt;/span&gt; que se le pueda pasar como un &lt;strong&gt;parámetro configurable&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;Para el desarrolo se ha seguido el modelo de implementación de varios métodos para un plugin que &lt;strong&gt;aconseja jQuery&lt;/strong&gt;. Los métodos se agrupan en un objeto javascript y se llaman a través de la función principal, pasándole como parámetro una cadena de texto con el nombre del método en cuestión. &lt;/p&gt; &lt;p&gt;Esto se hace así para &lt;strong&gt;no saturar el espacio de nombres&lt;/strong&gt; &lt;code&gt;$.fn&lt;/code&gt; que es dónde se declaran las funciones plugin de jQuery. En el siguiente bloque de código podemos comprobar la gestión de la llamada a métodos:&lt;br /&gt; &lt;pre class="prettyprint lang-javascript"&gt;&lt;code&gt;$.fn.karmicGraph = function( method ) { if ( methods[method] ) { return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 )); } else if ( typeof method === &amp;#39;object&amp;#39; || ! method ) { return methods.init.apply( this, arguments ); } else { $.error( &amp;#39;Method &amp;#39; + method + &amp;#39; does not exist on jQuery.karmicGraph&amp;#39; ); } }&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt; &lt;p&gt;A la hora de liberar el código se añadió una licencia &lt;strong&gt;GPLv3&lt;/strong&gt; para que toda la Comunidad pueda beneficiarse del código y se subió al &lt;a href="https://github.com/karmacracy"&gt;repositorio público GitHub de Karmacracy&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Desde Genbeta Dev, y como siempre, les deseamos &lt;strong&gt;la mejor de las suertes&lt;/strong&gt; a los chicos de Karmacracy y esperamos que en el futuro sigan liberando Software Libre de forma regular.&lt;/p&gt; &lt;p&gt;Más Información | &lt;a href="https://github.com/karmacracy/KarmicGraphs"&gt;Repositorio del proyecto&lt;/a&gt;&lt;br /&gt; En Genbeta Dev | &lt;a href=""&gt;&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='http://weblogssl.feedsportal.com/c/33859/f/609642/s/1f25f003/mf.gif' border='0'/&gt;&lt;div class='mf-viral'&gt;&lt;table border='0'&gt;&lt;tr&gt;&lt;td valign='middle'&gt;&lt;a href="http://share.feedsportal.com/viral/sendEmail.cfm?lang=es&amp;title=KarmicGraphs%2C+plugin+jQuery+para+gr%C3%A1ficas+liberado+por+Karmacracy&amp;link=http%3A%2F%2Fwww.genbetadev.com%2Fherramientas%2Fkarmicgraphs-plugin-jquery-para-graficas-liberado-por-karmacracy" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/emailthis2_es.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark_es.cfm?title=KarmicGraphs%2C+plugin+jQuery+para+gr%C3%A1ficas+liberado+por+Karmacracy&amp;link=http%3A%2F%2Fwww.genbetadev.com%2Fherramientas%2Fkarmicgraphs-plugin-jquery-para-graficas-liberado-por-karmacracy" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/bookmark_es.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://da.feedsportal.com/r/133515368095/u/49/f/609642/c/33859/s/1f25f003/kg/315/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/133515368095/u/49/f/609642/c/33859/s/1f25f003/kg/315/a2.img" border="0"/&gt;&lt;/a&gt;&lt;img width="1" height="1" src="http://pi.feedsportal.com/r/133515368095/u/49/f/609642/c/33859/s/1f25f003/kg/315/a2t.img" border="0"/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.weblogssl.com/~ff/genbetadev?a=HmRvZoPuDKc:GGzMTVhEu7w:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/genbetadev?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.weblogssl.com/~ff/genbetadev?a=HmRvZoPuDKc:GGzMTVhEu7w:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/genbetadev?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><pubDate>Wed, 09 May 2012 04:00:00 GMT</pubDate><author>Oscar Campos</author><guid isPermaLink="false">http://www.genbetadev.com/herramientas/karmicgraphs-plugin-jquery-para-graficas-liberado-por-karmacracy</guid></item><item><title>Dell prepara un portátil para Desarrolladores con Ubuntu y Software Libre</title><link>http://weblogssl.feedsportal.com/c/33859/f/609642/s/1f1c2d3e/l/0L0Sgenbetadev0N0Cactualidad0Cdell0Eprepara0Eun0Eportatil0Epara0Edesarrolladores0Econ0Eubuntu0Ey0Esoftware0Elibre/story01.htm</link><description>&lt;p&gt;&lt;img src="http://img.genbetadev.com/galleries/xps13-ubuntu/dell-ubuntu.png" class="centro_sinmarco" /&gt;&lt;/p&gt; &lt;p&gt;Ayer día siete de mayo, Dell anunciaba en la Ubuntu Developers Summit que pretende &lt;strong&gt;introducirse dentro del mercado de portátiles con Linux&lt;/strong&gt; (otra vez) con el proyecto &lt;strong&gt;Sputnik&lt;/strong&gt;, un ordenador portátil &lt;strong&gt;para desarrolladores&lt;/strong&gt; centrado en Ubuntu 12.04 bajo el hardware Dell Ultrabook &lt;strong&gt;XPS13&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;Si eres el feliz propietario de un XPS13 puedes &lt;a href="http://hwe.ubuntu.com/uds-q/dellxps/"&gt;descargar la imagen&lt;/a&gt; en &lt;strong&gt;fase de desarrollo&lt;/strong&gt; de la distribución de Linux modificada y darle un tiento, si quieres saber lo que se encuentra dentro de ella solo tienes que seguir leyendo esta entrada.&lt;!--more--&gt;&lt;/p&gt; &lt;p&gt;&lt;h2&gt;¿Por qué un portátil para Desarrolladores?&lt;/h2&gt;&lt;br /&gt; Según Barton George, líder del proyecto, Dell realizó un estudio de mercado acerca de &lt;strong&gt;las necesidades de desarrollo&lt;/strong&gt; para empresas que utilizan Internet como su plataforma. Una de las ideas que recogieron fue la de un portátil Dell ejecutando Ubuntu Linux &lt;strong&gt;especialmente enfocado en los desarrolladores&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;A los ingenieros de Dell la idea les pareció interesante y se pusieron manos a la obra con el proyecto Sputnik para de esta forma poder servir mejor a las necesidades de los desarrolladores y la plataforma XPS13 &lt;strong&gt;les pareció la más adecuada&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;La decisión de Dell de elegir Ubuntu viene dada por su &lt;strong&gt;gren experiencia previa&lt;/strong&gt; con la distribución de &lt;strong&gt;Linux&lt;/strong&gt; de Canonical y por su alta popularidad de la que obviamente también pretenden beneficiarse. Recordemos que los XPS13 son portátiles de &lt;strong&gt;la gama más alta de Dell&lt;/strong&gt;, solo superados en precio y prestaciones por la serie Alienware para Gamers.&lt;/p&gt; &lt;p&gt;La imagen actual de Sputnik contiene lo siguiente:&lt;br /&gt; &lt;ol&gt;&lt;li&gt;drivers/parches para la activación de Hardware&lt;/li&gt;&lt;li&gt;un kit básico de herramientas y utilidades&lt;/li&gt;&lt;li&gt;una herramienta de administración de software con la que se podrán descargar &lt;strong&gt;&amp;#8220;perfiles&amp;#8221; de desarrollo&lt;/strong&gt; desde GitHub (en desarrollo)&lt;/li&gt;&lt;/ol&gt;&lt;/p&gt; &lt;p&gt;&lt;h3&gt;Administración de perfiles de desarrollo&lt;/h3&gt;&lt;br /&gt; Donde el proyecto se torna interesante es en esto que Dell ha llamado &amp;#8220;perfiles de desarrollo&amp;#8221;. Según Barton, no hay dos desarrolladores iguales, por lo que en lugar de sembrar la distribución con todas las herramientas de desarrollo disponibles, plantean un &lt;strong&gt;enfoque diferente&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;Como ya hemos comentado, la imagen de instalación es &lt;strong&gt;muy simple&lt;/strong&gt;, la intención de la compañía es crear perfiles de desarrollo que podrán ser &lt;strong&gt;descargados e instalados&lt;/strong&gt; a través de repositorios alojados en &lt;strong&gt;GitHub&lt;/strong&gt;. Los primeros perfiles que están probando son &lt;strong&gt;Android&lt;/strong&gt;, &lt;strong&gt;Ruby&lt;/strong&gt; y &lt;strong&gt;JavaScript&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;Charles Lowell, parte del equipo de desarrollo en Austin comenta sobre el proyecto:&lt;br /&gt; &lt;blockquote&gt;Lo que quiero ver no es solo una configuración estándar impecable sino además un meta-sistema para administrar tu configuración de desarrollo. La revolución de los devops es sobre tratar la configuración como código. ¿Cómo de guai sería que la configuración del portátil donde programo pudiera ser almacenada en un repositorio de código en algún sitio?.&lt;/blockquote&gt;&lt;/p&gt; &lt;p&gt;La intención de Dell es conseguir que la Comunidad de desarrolladores &lt;strong&gt;creen y cuelguen sus propios perfiles&lt;/strong&gt; de desarrollo una vez la plataforma esté en marcha.&lt;/p&gt; &lt;p&gt;Como proyecto es cuanto menos curioso y la decisión de que los repositorios se encuentren en Github a disposición de cualquiera me parece muy acertada pero habrá que ver &lt;strong&gt;bajo que licencia&lt;/strong&gt; se lanza el administrador de perfiles.&lt;/p&gt; &lt;p&gt;Si el administrador se lanza con una licencia de Software Libre sería genial para la Comunidad ya que &lt;strong&gt;podría extenderse&lt;/strong&gt; el uso (si al final resulta útil y todo el sistema) del invento a otras plataformas y distribuciones. En caso contrario, el invento me parece además un movimiento de marketing muy bien pensado por Dell y Ubuntu para vender más hardware y crear más marca respectivamente.&lt;/p&gt; &lt;p&gt;¿Qué opináis vosotros?&lt;/p&gt; &lt;p&gt;Más Información en | &lt;a href="http://bartongeorge.net/2012/05/07/introducing-project-sputnik-developer-laptop/"&gt;Blog personal de Barton&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='http://weblogssl.feedsportal.com/c/33859/f/609642/s/1f1c2d3e/mf.gif' border='0'/&gt;&lt;div class='mf-viral'&gt;&lt;table border='0'&gt;&lt;tr&gt;&lt;td valign='middle'&gt;&lt;a href="http://share.feedsportal.com/viral/sendEmail.cfm?lang=es&amp;title=Dell+prepara+un+port%C3%A1til+para+Desarrolladores+con+Ubuntu+y+Software+Libre&amp;link=http%3A%2F%2Fwww.genbetadev.com%2Factualidad%2Fdell-prepara-un-portatil-para-desarrolladores-con-ubuntu-y-software-libre" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/emailthis2_es.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark_es.cfm?title=Dell+prepara+un+port%C3%A1til+para+Desarrolladores+con+Ubuntu+y+Software+Libre&amp;link=http%3A%2F%2Fwww.genbetadev.com%2Factualidad%2Fdell-prepara-un-portatil-para-desarrolladores-con-ubuntu-y-software-libre" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/bookmark_es.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://da.feedsportal.com/r/133515330093/u/49/f/609642/c/33859/s/1f1c2d3e/kg/294-319/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/133515330093/u/49/f/609642/c/33859/s/1f1c2d3e/kg/294-319/a2.img" border="0"/&gt;&lt;/a&gt;&lt;img width="1" height="1" src="http://pi.feedsportal.com/r/133515330093/u/49/f/609642/c/33859/s/1f1c2d3e/kg/294-319/a2t.img" border="0"/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.weblogssl.com/~ff/genbetadev?a=2kImXsfMkHQ:HTtLgpsmux0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/genbetadev?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.weblogssl.com/~ff/genbetadev?a=2kImXsfMkHQ:HTtLgpsmux0:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/genbetadev?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><pubDate>Tue, 08 May 2012 06:00:00 GMT</pubDate><author>Oscar Campos</author><guid isPermaLink="false">http://www.genbetadev.com/actualidad/dell-prepara-un-portatil-para-desarrolladores-con-ubuntu-y-software-libre</guid></item><item><title>Branching, haciendo crecer nuestro árbol del repositorio de código</title><link>http://weblogssl.feedsportal.com/c/33859/f/609642/s/1f1b6375/l/0L0Sgenbetadev0N0Cgestores0Ede0Econtenido0Cbranching0Ehaciendo0Ecrecer0Enuestro0Earbol0Edel0Erepositorio0Ede0Ecodigo/story01.htm</link><description>&lt;p&gt;&lt;img alt="Portada Branching" src="http://img.genbetadev.com/2012/05/portadaBranching.jpg" class="centro_sinmarco" /&gt;&lt;/p&gt; &lt;p&gt;En el artículo anterior de esta miniserie, estuve tratando sobre &lt;strong&gt;la necesidad básica de tener un repositorio de código&lt;/strong&gt;. Y de una primera aproximación a la gestión más madura del trabajo por medio del etiquetado de versiones: &lt;em&gt;labeling&lt;/em&gt;.&lt;/p&gt; &lt;p&gt;En esta segunda parte, final, quiero dar un paso adelante y describir una técnica de separación de las líneas de desarrollo en el repositorio de código fuente que nos ayude, en gran medida, a organizar la complejidad inherente a todo desarrollo en equipo.&lt;/p&gt; &lt;p&gt;&lt;em&gt;Branching&lt;/em&gt;, dicho de forma espantosa sería algo como “&lt;em&gt;rameando&lt;/em&gt;” o ir haciendo ramas, se utiliza en los repositorios de código. &lt;strong&gt;No es algo novedoso, ni mucho menos&lt;/strong&gt;. De hecho, al menos desde los años 70 ya existen aplicaciones como &lt;em&gt;CA Software Change Manager&lt;/em&gt;, que permiten hacer branching; mucho antes de que algunos de nuestros lectores hubiese, tan siquiera nacido.&lt;/p&gt; &lt;p&gt;&lt;!--more--&gt;&lt;/p&gt; &lt;p&gt;&lt;h2&gt;Porqué necesitamos hacer branching&lt;/h2&gt;&lt;br /&gt; Por ejemplo, estoy integrado en un equipo de cuatro personas haciendo un proyecto de una aplicación de gestión de una empresa de repuestos. Y empezamos a trabajar sobre el módulo de almacén.&lt;/p&gt; &lt;p&gt;Vemos que vamos a necesitar hacer una pantalla típica de &lt;span class="caps"&gt;CRUD&lt;/span&gt;: alta, modificación, baja y listado de piezas. Para ir más deprisa &lt;strong&gt;vamos a trabajar los cuatro al mismo tiempo&lt;/strong&gt; en la misma pantalla, por lo cual vamos a trastear en el mismo código tanto en la capa de representación, en la de negocio y en la de acceso a datos.&lt;/p&gt; &lt;p&gt;Para que no haya problemas, habilitamos la capacidad de &lt;em&gt;checkin&lt;/em&gt; múltiple, así varios podemos tocar el mismo código al mismo tiempo, y mantenemos la coherencia del código por medio de &lt;em&gt;merges&lt;/em&gt;. Cuando lo tenemos acabado y vemos que ha funcionado bien, &lt;strong&gt;le ponemos una etiqueta&lt;/strong&gt;, y continuamos con la siguiente pantalla.&lt;/p&gt; &lt;p&gt;Cuando tenemos terminado el módulo de almacén, y todas sus pantallas, volvemos a etiquetar y le damos al cliente el módulo para su puesta en producción. Y nos disponemos a continuar con el módulo de facturación, que está muy relacionado con el de almacén.Nos volvemos a repartir el trabajo, y empezamos a modificar y añadir las líneas del nuevo código al ya existente de almacén.&lt;/p&gt; &lt;p&gt;Y en esto nos encontramos que &lt;strong&gt;el cliente ha encontrado un fallo crítico y hay que corregirlo&lt;/strong&gt; y publicar una actualización. Para ello nos hacemos una copia de seguridad, recuperamos la etiqueta, realizamos los arreglos, volvemos a etiquetar y se lo mandamos al cliente el módulo arreglado.&lt;/p&gt; &lt;p&gt;&lt;em&gt;¿Y ahora cómo vuelvo al código original, que aún no funciona y que está en desarrollo; y, además, le añado los arreglos añadidos en la nueva versión?&lt;/em&gt;&lt;/p&gt; &lt;p&gt;La respuesta más obvia es, &lt;strong&gt;utilizando desarrollo en ramas&lt;/strong&gt; (&lt;em&gt;branching&lt;/em&gt;).&lt;/p&gt; &lt;p&gt;Cuando he terminado de hacer el módulo de almacén, no solamente lo etiqueto si no que creo una nueva rama, que es una copia del código, en donde voy a ir desarrollando el nuevo módulo de facturación. Así, si tengo que modificar el módulo de almacén, &lt;strong&gt;no tengo que esperar a tener una versión funcional del de facturación&lt;/strong&gt;, o andar haciendo copias de seguridad.&lt;/p&gt; &lt;p&gt;&lt;img alt="Branching1" src="http://img.genbetadev.com/2012/05/branch01.jpg" class="centro" /&gt;&lt;/p&gt; &lt;p&gt;Como se ve en la figura, &lt;strong&gt;este sistema es mucho más robusto y seguro&lt;/strong&gt;. Y evito que los trabajos en un módulo me afecten al trabajo en los demás.&lt;/p&gt; &lt;p&gt;&lt;h2&gt;Diferentes sabores&lt;/h2&gt;&lt;br /&gt; Ahora que tengo claro que la complejidad del desarrollo del software me lleva de la mano a realizar ramas en mi repositorio de código, quiero compartir los dos primeros niveles de &lt;em&gt;branching&lt;/em&gt; que utilizo con diariamente.&lt;/p&gt; &lt;p&gt;El primero es una forma secuencial en donde tengo el tronco de la aplicación (siempre lista para ser desplegada), etiquetado cada punto de publicación y en donde &lt;strong&gt;las modificaciones y añadidos se inician, se completan y se unen al tronco por medio de una rama&lt;/strong&gt;. Una vez terminada la misma, iniciaría otra rama para el siguiente módulo.&lt;/p&gt; &lt;p&gt;&lt;img alt="Branching2" src="http://img.genbetadev.com/2012/05/branch02.jpg" class="centro" /&gt; &lt;/p&gt; &lt;p&gt;Esta forma de trabajo tiene la ventaja de ser muy ordenada y que la dirección de las actualizaciones siempre es del &lt;em&gt;branch&lt;/em&gt; al &lt;em&gt;trunk&lt;/em&gt;. Es decir, del nuevo desarrollo a la línea base. Como inconveniente, &lt;strong&gt;se complica hacer varios trabajos de forma simultánea&lt;/strong&gt;. A menos que arranquemos tareas de similar duración que acaben al mismo tiempo o que no compartan nada de código (lo cual es difícil en cuanto empiezas a trabajar en capas). &lt;/p&gt; &lt;p&gt;Lo más habitual es que el grafo del árbol de ramas alrededor del tronco principal, sea de múltiples direcciones. No solamente de las ramas hacia el trunk, si no de este a diferentes ramas o, incluso, entre ramas diferentes.&lt;/p&gt; &lt;p&gt;&lt;img alt="Branching3" src="http://img.genbetadev.com/2012/05/branch03.jpg" class="centro" /&gt;&lt;/p&gt; &lt;p&gt;Así, por ejemplo, en la figura anterior he iniciado una corrección en el &lt;em&gt;trunk&lt;/em&gt; mientras termino el módulo1. Ya que he terminado la corrección, hago un &lt;em&gt;merge&lt;/em&gt; de este con el &lt;em&gt;branch&lt;/em&gt; del módulo 2, para que esté actualizado; ya que hay cosas en la capa de negocio que están implicadas.&lt;/p&gt; &lt;p&gt;Como se ve, con esta forma de trabajo &lt;strong&gt;voy a tener una versión de la aplicación lista para ser publicada en cualquier momento&lt;/strong&gt;. Aseguro el no tener que esperar a que se acabe un trabajo para iniciar otro. Y puedo mantener actualizado los módulos según lo necesite en cada caso.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;El mayor inconveniente es la complejidad&lt;/strong&gt;. Si somos varios equipos, y realizamos desarrollos cruzados, con puntos en común crecientes y que se deben mantener sincronizados, puedo tener un árbol con muchas ramas que llegue a ser confuso o difícil de abarcar.&lt;/p&gt; &lt;p&gt;A partir de este punto de madurez, podemos ir ganando complejidad subdividiendo los trabajos incluso hasta tener una rama por Sprint o por tarea dentro de un Sprint. Teniendo siempre claro que el concepto subyacente es que el desarrollo no impida tener código funcionando en cualquier momento.&lt;/p&gt; &lt;p&gt;Incluso podemos llegar a un sistema de &lt;em&gt;branching&lt;/em&gt; similar a una publicación continua, en donde &lt;strong&gt;no trabajamos contra un tronco, si no con simultaneas ramas&lt;/strong&gt;. Y donde se activan o desactivan las funcionalidades según tengamos finalizados y probados los módulos.&lt;/p&gt; &lt;p&gt;Ahora solamente queda &lt;strong&gt;el pasar de la teoría a la práctica y ver un ejemplo&lt;/strong&gt; en mi repositorio de código.&lt;/p&gt; &lt;p&gt;Más información | &lt;a href="http://vsarbranchingguide.codeplex.com/"&gt;Visual Studio Team Foundation Server Branching and Merging Guide&lt;/a&gt;, &lt;a href="http://www-cs-students.stanford.edu/~blynn/gitmagic/intl/es/ch04.html "&gt;Git. Magia Con Los Branches&lt;/a&gt;&lt;br /&gt; En GenbetaDev | Etiquetando,haciendo crecer nuestro árbol del repositorio de código, &lt;a href="http://www.genbetadev.com/herramientas/manejo-de-ramas-de-desarrollo-con-git"&gt;Manejo de ramas de desarrollo con git&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='http://weblogssl.feedsportal.com/c/33859/f/609642/s/1f1b6375/mf.gif' border='0'/&gt;&lt;div class='mf-viral'&gt;&lt;table border='0'&gt;&lt;tr&gt;&lt;td valign='middle'&gt;&lt;a href="http://share.feedsportal.com/viral/sendEmail.cfm?lang=es&amp;title=Branching%2C+haciendo+crecer+nuestro+%C3%A1rbol+del+repositorio+de+c%C3%B3digo&amp;link=http%3A%2F%2Fwww.genbetadev.com%2Fgestores-de-contenido%2Fbranching-haciendo-crecer-nuestro-arbol-del-repositorio-de-codigo" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/emailthis2_es.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark_es.cfm?title=Branching%2C+haciendo+crecer+nuestro+%C3%A1rbol+del+repositorio+de+c%C3%B3digo&amp;link=http%3A%2F%2Fwww.genbetadev.com%2Fgestores-de-contenido%2Fbranching-haciendo-crecer-nuestro-arbol-del-repositorio-de-codigo" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/bookmark_es.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://da.feedsportal.com/r/133515344760/u/49/f/609642/c/33859/s/1f1b6375/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/133515344760/u/49/f/609642/c/33859/s/1f1b6375/a2.img" border="0"/&gt;&lt;/a&gt;&lt;img width="1" height="1" src="http://pi.feedsportal.com/r/133515344760/u/49/f/609642/c/33859/s/1f1b6375/a2t.img" border="0"/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.weblogssl.com/~ff/genbetadev?a=fdT-U6OolYs:iwt7HcSbbUg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/genbetadev?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.weblogssl.com/~ff/genbetadev?a=fdT-U6OolYs:iwt7HcSbbUg:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/genbetadev?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><pubDate>Tue, 08 May 2012 04:00:00 GMT</pubDate><author>Juan Quijano</author><guid isPermaLink="false">http://www.genbetadev.com/gestores-de-contenido/branching-haciendo-crecer-nuestro-arbol-del-repositorio-de-codigo</guid></item><item><title>Diagrama para elegir la licencia más apropiada para tu software</title><link>http://weblogssl.feedsportal.com/c/33859/f/609642/s/1f17063b/l/0L0Sgenbetadev0N0Csoftware0Elibre0Ey0Elicencias0Cdiagrama0Epara0Eelegir0Ela0Elicencia0Emas0Eapropiada0Epara0Etu0Esoftware/story01.htm</link><description>&lt;p&gt;&lt;img alt="Cabecera infografía licencias libres" src="http://img.genbetadev.com/2012/05/Cabecera_licencias.jpg" class="centro_sinmarco" /&gt;&lt;br /&gt; Ponerle copyright a un software y &lt;em&gt;sentarse a esperar los beneficios&lt;/em&gt; es muy fácil, pero si alguna vez has pensado &lt;strong&gt;aplicar una licencia libre&lt;/strong&gt; al fruto de tus trabajos te habrás encontrado con que es una decisión bastante complicada, especialmente por el &lt;strong&gt;amplio abanico de licencias&lt;/strong&gt; disponibles y las a veces muy sutiles diferencias entre unas y otras.&lt;/p&gt; &lt;p&gt;Como método de ayuda a la hora de elegir, y a mitad de camino entre el estudio exhaustivo y el sentido del humor, &lt;a href="https://twitter.com/#%21/dbentley"&gt;Dan Bentley&lt;/a&gt; y &lt;a href="https://twitter.com/#%21/therealfitz"&gt;Brian Fitzpatrick&lt;/a&gt; han creado esta infografía en forma de &lt;strong&gt;diagrama de flujo&lt;/strong&gt; para ayudarnos en la decisión en favor de una u otra licencia.&lt;/p&gt; &lt;p&gt;Yo lo he seguido y me sale que debería usar la &lt;span class="caps"&gt;LGPL&lt;/span&gt; en mis desarrollos. ¿Y a vosotros?&lt;br /&gt; &lt;!--more--&gt;&lt;br /&gt; &lt;img alt="Gráfico de elección de licencias libres" src="http://img.genbetadev.com/2012/05/Licencias_libres-1.jpg" class="centro_sinmarco" /&gt;&lt;br /&gt; Vía | &lt;a href="http://www.billthelizard.com/2012/05/which-open-source-license.html"&gt;Bill the Lizard &amp;#8211; Which open source license?&lt;/a&gt;&lt;br /&gt; Autores de la infografía | &lt;a href="https://twitter.com/#%21/dbentley"&gt;Dan Bentley&lt;/a&gt; y &lt;a href="https://twitter.com/#%21/therealfitz"&gt;Brian Fitzpatrick&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='http://weblogssl.feedsportal.com/c/33859/f/609642/s/1f17063b/mf.gif' border='0'/&gt;&lt;div class='mf-viral'&gt;&lt;table border='0'&gt;&lt;tr&gt;&lt;td valign='middle'&gt;&lt;a href="http://share.feedsportal.com/viral/sendEmail.cfm?lang=es&amp;title=Diagrama+para+elegir+la+licencia+m%C3%A1s+apropiada+para+tu+software&amp;link=http%3A%2F%2Fwww.genbetadev.com%2Fsoftware-libre-y-licencias%2Fdiagrama-para-elegir-la-licencia-mas-apropiada-para-tu-software" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/emailthis2_es.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark_es.cfm?title=Diagrama+para+elegir+la+licencia+m%C3%A1s+apropiada+para+tu+software&amp;link=http%3A%2F%2Fwww.genbetadev.com%2Fsoftware-libre-y-licencias%2Fdiagrama-para-elegir-la-licencia-mas-apropiada-para-tu-software" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/bookmark_es.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://da.feedsportal.com/r/133515322484/u/49/f/609642/c/33859/s/1f17063b/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/133515322484/u/49/f/609642/c/33859/s/1f17063b/a2.img" border="0"/&gt;&lt;/a&gt;&lt;img width="1" height="1" src="http://pi.feedsportal.com/r/133515322484/u/49/f/609642/c/33859/s/1f17063b/a2t.img" border="0"/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.weblogssl.com/~ff/genbetadev?a=9h_3THpqPbY:mdkqfjDKx3o:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/genbetadev?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.weblogssl.com/~ff/genbetadev?a=9h_3THpqPbY:mdkqfjDKx3o:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/genbetadev?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><pubDate>Mon, 07 May 2012 13:30:00 GMT</pubDate><author>Johnbo</author><guid isPermaLink="false">http://www.genbetadev.com/software-libre-y-licencias/diagrama-para-elegir-la-licencia-mas-apropiada-para-tu-software</guid></item><item><title>¿Cómo funciona el memory breakpoint en un depurador de C/C++? (breakpoints part III)</title><link>http://weblogssl.feedsportal.com/c/33859/f/609642/s/1f146114/l/0L0Sgenbetadev0N0Ccc0Ccomo0Efunciona0Eel0Ememory0Ebreakpoint0Een0Eun0Edepurador0Ede0Ec0Ec0Ebreakpoints0Epart0Eiii/story01.htm</link><description>&lt;div class="caption-img"&gt; &lt;img alt="IDA Debugger" src="http://img.genbetadev.com/galleries/memory-dbg/memory.png" /&gt; &lt;span&gt;Desensamblador y Depurador &lt;span class="caps"&gt;IDA&lt;/span&gt; corriendo en Windows&lt;/span&gt; &lt;/div&gt; &lt;p&gt;En el último artículo de la serie vimos lo útiles que pueden llegar a ser los &lt;em&gt;hardware breakpoints&lt;/em&gt; para depurar aplicaciones que por ejemplo hacen comprobaciones de &lt;span class="caps"&gt;CRC&lt;/span&gt; y &lt;strong&gt;no pueden ser depuradas&lt;/strong&gt; modificando sus datos en memoria.&lt;/p&gt; &lt;p&gt;Hoy vamos a ver como podemos utilizar &lt;em&gt;memory breakpoints&lt;/em&gt; para &lt;strong&gt;sobrepasar los límites&lt;/strong&gt; impuestos por los &lt;em&gt;hardware breakpoints&lt;/em&gt; y poder entre otras cosas controlar el acceso a grandes partes de la memoria.&lt;!--more--&gt;&lt;/p&gt; &lt;p&gt;&lt;h2&gt;Memory Breakpoints&lt;/h2&gt;&lt;br /&gt; Para empezar hay que decir que los &lt;em&gt;memory breakpoints&lt;/em&gt; no son realmente &lt;em&gt;breakpoints&lt;/em&gt;. Cuando un depurador fija un &lt;em&gt;memory breakpoint&lt;/em&gt; cambia los permisos en una región o página de la memoria.&lt;/p&gt; &lt;p&gt;Una página es la &lt;strong&gt;porción más pequeña de memoria&lt;/strong&gt; que un sistema operativo puede manejar, este valor normalmente es de 4096 Bytes (4K). Cuando se asigna una página, el sistema operativo le otorga una serie de permisos que indican como debe ser accedida. Algunos de esos permisos son los que siguen:&lt;br /&gt; &lt;ul&gt;&lt;li&gt;&lt;strong&gt;Ejecución&lt;/strong&gt;: Permite la ejecución pero eleva una excepción si el proceso intenta escribir o leer de la página&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Lectura&lt;/strong&gt;: Activa el acceso para lectura pero se eleva una excepción ante cualquier intento de escritura o ejecución&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Escritura&lt;/strong&gt;: Permite el acceso de escritura&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Protegida&lt;/strong&gt;: Cualquier acceso a una página protegida resulta en una excepción y la página vuelve a su estado original&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt; &lt;p&gt;La mayoría de los sistemas operativos modernos permiten combinar estos permisos. Por ejemplo, podemos tener páginas en memoria que permitan el acceso de lectura y escritura mientras que otras pueden permitir el acceso de lectura y la ejecución.&lt;/p&gt; &lt;p&gt;Cada sistema operativo implementa sus propios métodos para consultar los permisos de una página en particular y modificarlos si fuese necesario. El permiso que nos interesa para nuestra tarea de depurado es el de &amp;#8220;&lt;strong&gt;página protegida&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;Este tipo de página es &lt;strong&gt;realmente útil&lt;/strong&gt; para cosas como separar el &lt;em&gt;&lt;strong&gt;stack&lt;/strong&gt;&lt;/em&gt; del &lt;em&gt;&lt;strong&gt;heap&lt;/strong&gt;&lt;/em&gt; o comprobar que una región de memoria dada no sobrepasa sus límites. Y claro, también es tremendamente útil para detener un proceso cuando accede a una sección de memoria en particular.&lt;/p&gt; &lt;p&gt;&lt;h2&gt;¿Cómo se usan?&lt;/h2&gt;&lt;br /&gt; Imaginemos que estamos depurando un servidor de red, podríamos establecer un &lt;em&gt;memory breakpoint&lt;/em&gt; en la región de memoria donde se guarda el cuerpo de un paquete de red al recibirlo. Esto permite determinar cuando y de que manera, la aplicación utiliza el contenido del paquete recibido ya que cualquier acceso a esa región de memoria hará que la &lt;span class="caps"&gt;CPU&lt;/span&gt; se pare y &lt;strong&gt;levantará una excepción&lt;/strong&gt; de página protegida que podremos capturar con el depurador.&lt;/p&gt; &lt;p&gt;Entonces podremos &lt;strong&gt;inspeccionar&lt;/strong&gt; la instrucción que ha accedido a la memoria y &lt;strong&gt;determinar&lt;/strong&gt; que operaciones realiza con el contenido de la misma. Esta técnica también esquiva el problema de comprobación de firma &lt;span class="caps"&gt;CRC&lt;/span&gt; ya que no modificamos nada del código en ejecución.&lt;/p&gt; &lt;p&gt;Y con este último método ya hemos visto todas las formas en las que podemos colocar un punto de interrupción en una aplicación en ejecución para poder depurarla con los fines que sean.&lt;/p&gt; &lt;p&gt;Más en GenbetaDev | &lt;a href="http://www.genbetadev.com/busqueda?cx=partner-pub-9977500652563564%3A9925236086&amp;q=depurador+de+C%2FC%2B%2B&amp;ie=UTF-8&amp;oe=UTF-8&amp;cof=FORID%3A10&amp;x=0&amp;y=0"&gt;Funcionamiento de los depuradores de C y C++&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='http://weblogssl.feedsportal.com/c/33859/f/609642/s/1f146114/mf.gif' border='0'/&gt;&lt;div class='mf-viral'&gt;&lt;table border='0'&gt;&lt;tr&gt;&lt;td valign='middle'&gt;&lt;a href="http://share.feedsportal.com/viral/sendEmail.cfm?lang=es&amp;title=%C2%BFC%C3%B3mo+funciona+el+memory+breakpoint+en+un+depurador+de+C%2FC%2B%2B%3F+%28breakpoints+part+III%29&amp;link=http%3A%2F%2Fwww.genbetadev.com%2Fcc%2Fcomo-funciona-el-memory-breakpoint-en-un-depurador-de-c-c-breakpoints-part-iii" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/emailthis2_es.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark_es.cfm?title=%C2%BFC%C3%B3mo+funciona+el+memory+breakpoint+en+un+depurador+de+C%2FC%2B%2B%3F+%28breakpoints+part+III%29&amp;link=http%3A%2F%2Fwww.genbetadev.com%2Fcc%2Fcomo-funciona-el-memory-breakpoint-en-un-depurador-de-c-c-breakpoints-part-iii" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/bookmark_es.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://da.feedsportal.com/r/133515313037/u/49/f/609642/c/33859/s/1f146114/kg/315/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/133515313037/u/49/f/609642/c/33859/s/1f146114/kg/315/a2.img" border="0"/&gt;&lt;/a&gt;&lt;img width="1" height="1" src="http://pi.feedsportal.com/r/133515313037/u/49/f/609642/c/33859/s/1f146114/kg/315/a2t.img" border="0"/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.weblogssl.com/~ff/genbetadev?a=0MIrm62M5VQ:8Yj97iH3Wts:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/genbetadev?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.weblogssl.com/~ff/genbetadev?a=0MIrm62M5VQ:8Yj97iH3Wts:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/genbetadev?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><pubDate>Mon, 07 May 2012 10:00:00 GMT</pubDate><author>Oscar Campos</author><guid isPermaLink="false">http://www.genbetadev.com/cc/como-funciona-el-memory-breakpoint-en-un-depurador-de-c-c-breakpoints-part-iii</guid></item><item><title>Etiquetando,haciendo crecer nuestro árbol del repositorio de código</title><link>http://weblogssl.feedsportal.com/c/33859/f/609642/s/1f116027/l/0L0Sgenbetadev0N0Cgestores0Ede0Econtenido0Cetiquetando0Ehaciendo0Ecrecer0Enuestro0Earbol0Edel0Erepositorio0Ede0Ecodigo/story01.htm</link><description>&lt;p&gt;&lt;img alt="Etiquetando, serie de Branching" src="http://img.genbetadev.com/2012/05/portada.jpg" class="centro" /&gt;&lt;/p&gt; &lt;p&gt;Una de las cosas que más me sorprenden y escandalizan es &lt;strong&gt;la cantidad de empresas y compañeros que trabajan sin un repositorio de código&lt;/strong&gt;. No conocen las virtudes de configurar un punto único en donde almacenar, versionar y recuperar las cientos o miles de horas/hombre invertidas en millones de líneas de programación.&lt;/p&gt; &lt;p&gt;Cuando toca juntar las fuentes de dos o tres personas es un auténtico dolor, pero la cosa se hace imposible cuando lo ha de realizar todo un equipo o departamento. Haciéndose &lt;strong&gt;una costumbre el perder código&lt;/strong&gt;, o tener una árbol de carpetas de &amp;#8220;&lt;em&gt;copias de seguridad&lt;/em&gt;&amp;#8220; en el ordenador que se utiliza para hacer las publicaciones y que, generalmente, es el del líder del equipo.&lt;/p&gt; &lt;p&gt;Pero incluso cuando se establece, por fin, un repositorio de código, se trabaja continuadamente en un mismo tronco (&lt;em&gt;trunk&lt;/em&gt;). El cual soporta las modificaciones y actualizaciones más variopintas. Sufriendo roturas a causa de errores o el no poder publicar hasta que se termine la decimonovena modificación o arreglo.&lt;/p&gt; &lt;p&gt;A estos equipos les invito a &lt;strong&gt;dar un paso en la escalera de la madurez&lt;/strong&gt; del ecosistema y a leer esta serie que trata sobre la técnica de &lt;strong&gt;branching&lt;/strong&gt;. Es decir, la forma de construir software alrededor de un núcleo estable, minimizando las causas de ruptura o de no disponibilidad.&lt;/p&gt; &lt;p&gt;Y que voy a &lt;strong&gt;iniciar con el etiquetado&lt;/strong&gt; de las versiones.&lt;/p&gt; &lt;p&gt;&lt;!--more--&gt;&lt;br /&gt; &lt;h2&gt;Las herramientas&lt;/h2&gt;&lt;br /&gt; &lt;img alt="Team Foundation Service" src="http://img.genbetadev.com/2012/05/TFSServices.jpg" class="centro_sinmarco" /&gt;&lt;/p&gt; &lt;p&gt;En el núcleo tengo el repositorio de código, control de versiones y gestor de proyectos: el &lt;strong&gt;Team Foundation Service Preview&lt;/strong&gt;. Que es una versión en la nube del Team Foundation Server 11; a la que me han dado acceso por invitación. De precios y costes aún no se ha anunciado nada, pero es un servicio muy completo que me permite hacer prácticamente todo lo que puedo hacer con &lt;strong&gt;un &lt;span class="caps"&gt;TFS&lt;/span&gt; 11 beta pero con la flexibilidad, escalabilidad, accesibilidad y disponibilidad que nos provee un sistema basado en la Cloud&lt;/strong&gt;. Un ejemplo más del desarrollo del concepto SaaS.&lt;/p&gt; &lt;p&gt;Para el que tenga máquina o que quiera trastear en un entorno local, puede utilizar el &lt;a href="http://www.microsoft.com/visualstudio/11/es-es/downloads"&gt;Team Foundation Server 11 Beta&lt;/a&gt;, que está disponible para su descarga y uso sin coste, hasta que salga la versión definitiva de pago. Y aún entonces, se va a publicar una versión gratuita. &lt;/p&gt; &lt;p&gt;El acceso al repositorio de código lo hago desde &lt;strong&gt;Visual Studio 11 beta&lt;/strong&gt;, el cual ha remozado totalmente el interfaz de la antigua versión. Y que llevo utilizando desde la versión Developer Preview presentada en el evento &lt;span class="caps"&gt;BUILD&lt;/span&gt; del año pasado.&lt;/p&gt; &lt;p&gt;Pero tanto ahora como en el futuro &lt;strong&gt;puedo utilizar cualquier fabricante o versión de repositorio de código&lt;/strong&gt; para poner en práctica el branching. Por ejemplo, un Visual Studio 2010 contra un &lt;span class="caps"&gt;SVN&lt;/span&gt;; o un Eclipse contra un &lt;span class="caps"&gt;TFS&lt;/span&gt;, o un Git; o incluso un muy poco aconsejable y anticuado sourcesafe.&lt;/p&gt; &lt;p&gt;&lt;h2&gt;Etiquetas, un primer paso&lt;/h2&gt;&lt;br /&gt; Una vez que he conseguido instalar el repositorio; y el equipo supere las primeras suspicacias y pérdidas de código por un uso inesperadamente sorprendente de los check-in, los check-out y las malas prácticas de copy, paste &amp;#38; move de ficheros físicos; llega el momento en que &lt;strong&gt;se hace parte de la cultura corporativa&lt;/strong&gt; tener todo el trabajo en un solo sitio compartido, seguro y que se realice el versionado de forma automática y sencilla.&lt;/p&gt; &lt;p&gt;¿Pero qué pasa cuando hemos realizado una publicación en integración; y encontramos varios errores que hay que solucionar; y a los dos días nos damos cuenta que hemos roto la versión publicada y que hay que volver a la última válida? Pues &lt;strong&gt;que tenemos un desastre a la vista&lt;/strong&gt;, ya que en esos dos días algunos ficheros han sido modificados, otros han sido borrados y la mayoría no se han tocado. Y, además, el impacto de cada uno de ellos en el resto de la aplicación depende de muchos otros factores.&lt;/p&gt; &lt;p&gt;La forma más sencilla de poder acceder a una versión específica de mi código, es por medio del uso de &lt;em&gt;etiquetas&lt;/em&gt;. Es decir, &lt;strong&gt;hago una instantánea de la evolución de mi aplicación en un momento dado&lt;/strong&gt; y le doy un nombre para poder recuperarla como una unidad. Así no tengo que preocuparme de saber qué versión de cada fichero es la correcta para el momento específico, ni cual ha sido cambiada anterior o posteriormente. Es una especie de backup de los hitos importantes en el desarrollo de la aplicación. &lt;/p&gt; &lt;p&gt;&lt;img alt="Etiquetando TFS11beta" src="http://img.genbetadev.com/2012/05/label01.jpg" class="centro" /&gt;&lt;/p&gt; &lt;p&gt;En &lt;span class="caps"&gt;TFS&lt;/span&gt;, realizar etiquetados es algo tan sencillo como entrar en la pestaña del Team Explorer, y seleccionar el enlace del &lt;em&gt;Source Control Explorer&lt;/em&gt; para abrir la ventana del &lt;em&gt;Explorador de Código&lt;/em&gt;. Aquí pulso el botón derecho del ratón encima del nodo raíz del proyecto, o el nodo que queramos etiquetar, y selecciono &amp;#8220;&lt;em&gt;Apply label&lt;/em&gt;&amp;#8220;. Así abrimos una ventana emergente en donde debemos introducir el título de la etiqueta y su descripción.&lt;/p&gt; &lt;p&gt;Mi consejo: &lt;strong&gt;sé cuidadoso&lt;/strong&gt;. En el título incluye la fecha y describe de forma expresiva lo que caracteriza a esta versión del código. Ten en cuenta que para recuperar esta instantánea tendrás que hacer un &lt;em&gt;Get specific version&lt;/em&gt; por etiqueta. Y en el listado que se abre en una nueva ventana emergente, seleccionar la que almacena la versión que deseas recuperar. Por lo cual el título, cuanto más descriptivo mejor.&lt;/p&gt; &lt;p&gt;&lt;img alt="Etiquetando don TFS11beta" src="http://img.genbetadev.com/2012/05/label02.jpg" class="centro" /&gt;&lt;br /&gt; &lt;h2&gt;Aquí no se acaba&lt;/h2&gt;&lt;br /&gt; Ahora si, puedo estar haciendo diabluras en el código y romper todo lo rompible, y &lt;strong&gt;puedo en cualquier momento recuperar un punto específico&lt;/strong&gt; en donde las cosas aún funcionaban de forma correcta. Pero esto, insisto, es una solución muy básica. &lt;/p&gt; &lt;p&gt;Los problemas empiezan a crecer cuando dos o más desarrolladores están modificando el mismo código al mismo tiempo. Ya que el sistema de etiquetas es lineal, por lo cual tarde o temprano&lt;strong&gt; tendremos un nudo gordiano&lt;/strong&gt; en donde no hay forma de tener una versión estable del proyecto sin un gran y doloroso esfuerzo.&lt;/p&gt; &lt;p&gt;Y aquí llegamos a los troncos y las ramas: &lt;strong&gt;branching&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;Más información | &lt;a href="http://vsarbranchingguide.codeplex.com/"&gt;Visual Studio Team Foundation Server Branching and Merging Guide&lt;/a&gt;, &lt;a href="http://www-cs-students.stanford.edu/~blynn/gitmagic/intl/es/ch04.html "&gt;Git. Magia Con Los Branches&lt;/a&gt;&lt;br /&gt; En GenbetaDev | &lt;a href="http://www.genbetadev.com/herramientas/manejo-de-ramas-de-desarrollo-con-git"&gt;Manejo de ramas de desarrollo con git&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='http://weblogssl.feedsportal.com/c/33859/f/609642/s/1f116027/mf.gif' border='0'/&gt;&lt;div class='mf-viral'&gt;&lt;table border='0'&gt;&lt;tr&gt;&lt;td valign='middle'&gt;&lt;a href="http://share.feedsportal.com/viral/sendEmail.cfm?lang=es&amp;title=Etiquetando%2Chaciendo+crecer+nuestro+%C3%A1rbol+del+repositorio+de+c%C3%B3digo&amp;link=http%3A%2F%2Fwww.genbetadev.com%2Fgestores-de-contenido%2Fetiquetando-haciendo-crecer-nuestro-arbol-del-repositorio-de-codigo" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/emailthis2_es.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark_es.cfm?title=Etiquetando%2Chaciendo+crecer+nuestro+%C3%A1rbol+del+repositorio+de+c%C3%B3digo&amp;link=http%3A%2F%2Fwww.genbetadev.com%2Fgestores-de-contenido%2Fetiquetando-haciendo-crecer-nuestro-arbol-del-repositorio-de-codigo" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/bookmark_es.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://da.feedsportal.com/r/133515288259/u/49/f/609642/c/33859/s/1f116027/kg/320/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/133515288259/u/49/f/609642/c/33859/s/1f116027/kg/320/a2.img" border="0"/&gt;&lt;/a&gt;&lt;img width="1" height="1" src="http://pi.feedsportal.com/r/133515288259/u/49/f/609642/c/33859/s/1f116027/kg/320/a2t.img" border="0"/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.weblogssl.com/~ff/genbetadev?a=xMcVWh3u5cQ:LkFn89JS164:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/genbetadev?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.weblogssl.com/~ff/genbetadev?a=xMcVWh3u5cQ:LkFn89JS164:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/genbetadev?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><pubDate>Mon, 07 May 2012 04:00:00 GMT</pubDate><author>Juan Quijano</author><guid isPermaLink="false">http://www.genbetadev.com/gestores-de-contenido/etiquetando-haciendo-crecer-nuestro-arbol-del-repositorio-de-codigo</guid></item><item><title>¿Por qué las APIs no deberían usar el modelo de autenticación login/password?</title><link>http://weblogssl.feedsportal.com/c/33859/f/609642/s/1f0e9956/l/0L0Sgenbetadev0N0Cseguridad0Einformatica0Cpor0Eque0Elas0Eapis0Eno0Edeberian0Eusar0Eel0Emodelo0Ede0Eautenticacion0Elogin0Epassword/story01.htm</link><description>&lt;p&gt;&lt;img alt="autenticado con login y password" src="http://img.genbetadev.com/2012/05/650_1000_autenticado-login-password.jpg" class="centro_simarco" /&gt;&lt;/p&gt; &lt;p&gt;Cada vez es más común que las aplicaciones móviles o clientes externos usen las &lt;strong&gt;&lt;span class="caps"&gt;API&lt;/span&gt;s&lt;/strong&gt; para &lt;strong&gt;acceder e interactuar con los datos de un usuario&lt;/strong&gt;. Para permitir este acceso, existen varias alternativas. Quizás la que con más fuerza se está imponiendo es usar OAuth para conceder acceso, pero aún quedan muchas &lt;span class="caps"&gt;API&lt;/span&gt;s que sigue usando el modelo de &lt;strong&gt;solicitar un login y password en los métodos de autenticación&lt;/strong&gt; que ofrecen a los desarrolladores interesados en crear alguna aplicación. &lt;/p&gt; &lt;p&gt;Este modelo de solicitar login y password conlleva una serie de &lt;strong&gt;inconvenientes y problemas, tanto para el usuario como para los desarrolladores&lt;/strong&gt; que tienen que trabajar con la &lt;span class="caps"&gt;API&lt;/span&gt;, y posteriormente enviar estos datos al servicio de la &lt;span class="caps"&gt;API&lt;/span&gt;. &lt;/p&gt; &lt;p&gt;&lt;!--more--&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;Confianza&lt;/strong&gt;. Por supuesto, esta es la más obvia. ¿Confiarías en una aplicación que te solicita tu login y password de tu cuenta de correo? Este quizás sea el ejemplo más extremo, pero por qué debería confiar en ceder esos datos a un desarrollador que hace uso de la &lt;span class="caps"&gt;API&lt;/span&gt; del servicio del que tengo cuenta de usuario.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Phishing&lt;/strong&gt;. Incluso si el usuario se siente cómodo proporcionando su contraseña a la aplicación podría sufrir suplantación de la identidad cediendo los datos a aplicaciones de terceros que no son tales. Por ejemplo, un cliente falso de Twitter (Ojo, Twitter usa OAuth así que no deberías acceder directamente con tu contraseña desde una aplicación de tercero)&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Acceso total a la cuenta de usuario&lt;/strong&gt;. Al darle nuestra clave de acceso le estamos dando acceso total a nuestra cuenta. Si usáramos el modelo de tokens de oAuth la &lt;span class="caps"&gt;API&lt;/span&gt; podría gestionar distintos privilegios y acceso limitado a funcionalidades.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Si el usuario cambia la contraseña no se puede acceder&lt;/strong&gt; a sus datos. Multiplica esto si el usuario tiene esa cuenta en distintos dispositivos.&lt;/li&gt; &lt;li&gt;Por otro lado, si el usuario quiere revocar el acceso a una aplicación no le queda otra alternativa que &lt;strong&gt;cambiar de contraseña de acceso&lt;/strong&gt;. Con OAuth, podríamos revocar el acceso a una aplicación en concreto sin afectar al resto.&lt;/li&gt; &lt;li&gt;Dificultad para implementar una autenticación fuerte. &lt;strong&gt;La &lt;span class="caps"&gt;API&lt;/span&gt; puede sufrir fácilmente ataques para acceder a los datos de un usuario&lt;/strong&gt; a través de la llamadas de login/password. Para evitarlo se complica el acceso teniendo que usar &lt;span class="caps"&gt;CAPTCHA&lt;/span&gt;s.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Alternativas como &lt;a href="http://oauth.net/"&gt;OAuth 2.0&lt;/a&gt;&lt;/strong&gt; permite a las aplicaciones que usen la &lt;span class="caps"&gt;API&lt;/span&gt; acceder de forma segura, sin requerir ni el usuario ni el passord del usuario. Además su expansión hace que sea fácilmente utilizado por los desarrolladores, ya que se está convirtiendo en un método estándar de seguridad, según &lt;a href="http://www.programmableweb.com/apis/directory/1?auth=OAuth"&gt;Programmable Web en Febrero de 2012&lt;/a&gt; ya hay más de 300 &lt;span class="caps"&gt;API&lt;/span&gt;s en la web que usan OAuth como método de autenticación.&lt;/p&gt; &lt;p&gt;Más información | &lt;a href="http://oauth.net/"&gt;OAuth&lt;/a&gt;&lt;br /&gt; En Genbeta Dev | &lt;a href="http://www.genbetadev.com/desarrollo-web/el-crecimiento-imparable-de-las-apis-fundamentales-en-el-desarrollo-de-webs-y-aplicaciones-moviles-actualmente"&gt;El crecimiento imparable de las &lt;span class="caps"&gt;API&lt;/span&gt;s, fundamentales en el desarrollo de webs y aplicaciones móviles actualmente&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='http://weblogssl.feedsportal.com/c/33859/f/609642/s/1f0e9956/mf.gif' border='0'/&gt;&lt;div class='mf-viral'&gt;&lt;table border='0'&gt;&lt;tr&gt;&lt;td valign='middle'&gt;&lt;a href="http://share.feedsportal.com/viral/sendEmail.cfm?lang=es&amp;title=%C2%BFPor+qu%C3%A9+las+APIs+no+deber%C3%ADan+usar+el+modelo+de+autenticaci%C3%B3n+login%2Fpassword%3F&amp;link=http%3A%2F%2Fwww.genbetadev.com%2Fseguridad-informatica%2Fpor-que-las-apis-no-deberian-usar-el-modelo-de-autenticacion-login-password" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/emailthis2_es.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark_es.cfm?title=%C2%BFPor+qu%C3%A9+las+APIs+no+deber%C3%ADan+usar+el+modelo+de+autenticaci%C3%B3n+login%2Fpassword%3F&amp;link=http%3A%2F%2Fwww.genbetadev.com%2Fseguridad-informatica%2Fpor-que-las-apis-no-deberian-usar-el-modelo-de-autenticacion-login-password" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/bookmark_es.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://da.feedsportal.com/r/133515275946/u/49/f/609642/c/33859/s/1f0e9956/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/133515275946/u/49/f/609642/c/33859/s/1f0e9956/a2.img" border="0"/&gt;&lt;/a&gt;&lt;img width="1" height="1" src="http://pi.feedsportal.com/r/133515275946/u/49/f/609642/c/33859/s/1f0e9956/a2t.img" border="0"/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.weblogssl.com/~ff/genbetadev?a=VZyR1FAMtr8:CXV1-MNEMZ4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/genbetadev?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.weblogssl.com/~ff/genbetadev?a=VZyR1FAMtr8:CXV1-MNEMZ4:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/genbetadev?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><pubDate>Sun, 06 May 2012 17:13:30 GMT</pubDate><author>Txema Rodríguez</author><guid isPermaLink="false">http://www.genbetadev.com/seguridad-informatica/por-que-las-apis-no-deberian-usar-el-modelo-de-autenticacion-login-password</guid></item><item><title>Se lanza XobotOS, un Android en .NET y C#</title><link>http://weblogssl.feedsportal.com/c/33859/f/609642/s/1f1813fa/l/0L0Sgenbetadev0N0Ccnet0Cse0Elanza0Exobotos0Eun0Eandroid0Een0Enet0Ey0Ec/story01.htm</link><description>&lt;p&gt;&lt;img alt="xobotos" src="http://img.genbetadev.com/2012/05/xobotos.jpg" class="centro" /&gt;&lt;/p&gt; &lt;p&gt;Como es sabido, &lt;strong&gt;Android se basa en Java y Java pertenece a Oracle&lt;/strong&gt;. &lt;del&gt;De momento no ha habido hostilidades pero siempre es posible que el belicoso Larry Ellison decida un día tirar de patentes y pedir dinero a espuertas&lt;/del&gt; Y las previsibles hostilidades entre Google y Oracle van subiendo de tono cada semana. Por eso la &lt;strong&gt;migración de Android a otros cimientos&lt;/strong&gt; es algo de lo que se viene hablando hace tiempo. Pues bien, ahora la gente de &lt;strong&gt;Xamarin ha portado el código en Java de Android a C#&lt;/strong&gt; (con la herramienta &lt;a href="http://community.versant.com/Projects/html/projectspaces/db4o_product_design/sharpen.html"&gt;Sharpen&lt;/a&gt;) y lo han hecho correr sobre &lt;strong&gt;.NET&lt;/strong&gt; pero no la implementación de de Microsoft sino sobre &lt;strong&gt;Mono&lt;/strong&gt; (que la misma gente de Mono había creado antes de formar la empresa). Al resultado lo han &lt;strong&gt;XobotOS&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;Este XobotOS es tan sólo un &lt;strong&gt;proyecto de investigación que no va a ser continuado&lt;/strong&gt; por la gente de Xamarin pero al ser software &lt;strong&gt;open source con una licencia Apache&lt;/strong&gt;, es posible que alguien (incluso la propia Google) se aproveche del gran trabajo previo realizado (millones de líneas de código portadas) para sacar &lt;strong&gt;un sistema operativo Android completo sin ningún atisbo de Java&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;Pd: en Xamarin afirman que los resultados de este XobotOS son mejores que los de Java con &lt;strong&gt;Dalvik&lt;/strong&gt; (el primo hermano de la &lt;span class="caps"&gt;&lt;span class="caps"&gt;JVM&lt;/span&gt;&lt;/span&gt; de Google)&lt;/p&gt; &lt;p&gt;Vía | &lt;a href="http://arstechnica.com/open-source/news/2012/05/xamarin-releases-xobotos-the-net-powered-version-of-android.ars"&gt;Ars Technica&lt;/a&gt;&lt;br /&gt; Foto | Xamarin&lt;br /&gt; Más info | &lt;a href="http://blog.xamarin.com/2012/05/01/android-in-c-sharp/"&gt;Xamarin&lt;/a&gt;&lt;br /&gt; Descarga | &lt;a href="https://github.com/xamarin/XobotOS"&gt;Github&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='http://weblogssl.feedsportal.com/c/33859/f/609642/s/1f1813fa/mf.gif' border='0'/&gt;&lt;div class='mf-viral'&gt;&lt;table border='0'&gt;&lt;tr&gt;&lt;td valign='middle'&gt;&lt;a href="http://share.feedsportal.com/viral/sendEmail.cfm?lang=es&amp;title=Se+lanza+XobotOS%2C+un+Android+en+.NET+y+C%23&amp;link=http%3A%2F%2Fwww.genbetadev.com%2Fcnet%2Fse-lanza-xobotos-un-android-en-net-y-c" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/emailthis2_es.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark_es.cfm?title=Se+lanza+XobotOS%2C+un+Android+en+.NET+y+C%23&amp;link=http%3A%2F%2Fwww.genbetadev.com%2Fcnet%2Fse-lanza-xobotos-un-android-en-net-y-c" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/bookmark_es.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.weblogssl.com/~ff/genbetadev?a=oZzT9c0ok74:18-Q1Psqrhg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/genbetadev?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.weblogssl.com/~ff/genbetadev?a=oZzT9c0ok74:18-Q1Psqrhg:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/genbetadev?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><pubDate>Sat, 05 May 2012 15:06:03 GMT</pubDate><author>Fernando Siles</author><guid isPermaLink="false">http://www.genbetadev.com/cnet/se-lanza-xobotos-un-android-en-net-y-c</guid></item><item><title>Se lanza XobotOS, un Android en .NET y C#</title><link>http://weblogssl.feedsportal.com/c/33859/f/609642/s/1f090222/l/0L0Sgenbetadev0N0Cactualidad0Cse0Elanza0Exobotos0Eun0Eandroid0Een0Enet0Ey0Ec/story01.htm</link><description>&lt;p&gt;&lt;img alt="xobotos" src="http://img.genbetadev.com/2012/05/xobotos.jpg" class="centro" /&gt;&lt;/p&gt; &lt;p&gt;Como es sabido, &lt;strong&gt;Android se basa en Java y Java pertenece a Oracle&lt;/strong&gt;. De momento no ha habido hostilidades pero siempre es posible que el belicoso Larry Ellison decida un día tirar de patentes y pedir dinero a espuertas. Por eso la &lt;strong&gt;migración de Android a otros cimientos&lt;/strong&gt; es algo de lo que se viene hablando hace tiempo. Pues bien, ahora la gente de &lt;strong&gt;Xamarin ha portado el código en Java de Android a C#&lt;/strong&gt; (con la herramienta &lt;a href="http://community.versant.com/Projects/html/projectspaces/db4o_product_design/sharpen.html"&gt;Sharpen&lt;/a&gt;) y lo han hecho correr sobre &lt;strong&gt;.NET&lt;/strong&gt; pero no la implementación de de Microsoft sino sobre &lt;strong&gt;Mono&lt;/strong&gt; (que la misma gente de Mono había creado antes de formar la empresa). Al resultado lo han &lt;strong&gt;XobotOS&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;Este XobotOS es tan sólo un &lt;strong&gt;proyecto de investigación que no va a ser continuado&lt;/strong&gt; por la gente de Xamarin pero al ser software &lt;strong&gt;open source con una licencia Apache&lt;/strong&gt;, es posible que alguien (incluso la propia Google) se aproveche del gran trabajo previo realizado (millones de líneas de código portadas) para sacar &lt;strong&gt;un sistema operativo Android completo sin ningún atisbo de Java&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;Pd: en Xamarin afirman que los resultados de este XobotOS son mejores que los de Java con &lt;strong&gt;Dalvik&lt;/strong&gt; (el primo hermano de la &lt;span class="caps"&gt;JVM&lt;/span&gt; de Google)&lt;/p&gt; &lt;p&gt;Vía | &lt;a href="http://arstechnica.com/open-source/news/2012/05/xamarin-releases-xobotos-the-net-powered-version-of-android.ars"&gt;Ars Technica&lt;/a&gt;&lt;br /&gt; Foto | Xamarin&lt;br /&gt; Más info | &lt;a href="https://github.com/xamarin/XobotOS"&gt;Github&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='http://weblogssl.feedsportal.com/c/33859/f/609642/s/1f090222/mf.gif' border='0'/&gt;&lt;div class='mf-viral'&gt;&lt;table border='0'&gt;&lt;tr&gt;&lt;td valign='middle'&gt;&lt;a href="http://share.feedsportal.com/viral/sendEmail.cfm?lang=es&amp;title=Se+lanza+XobotOS%2C+un+Android+en+.NET+y+C%23&amp;link=http%3A%2F%2Fwww.genbetadev.com%2Factualidad%2Fse-lanza-xobotos-un-android-en-net-y-c" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/emailthis2_es.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark_es.cfm?title=Se+lanza+XobotOS%2C+un+Android+en+.NET+y+C%23&amp;link=http%3A%2F%2Fwww.genbetadev.com%2Factualidad%2Fse-lanza-xobotos-un-android-en-net-y-c" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/bookmark_es.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://da.feedsportal.com/r/133515254516/u/49/f/609642/c/33859/s/1f090222/kg/315/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/133515254516/u/49/f/609642/c/33859/s/1f090222/kg/315/a2.img" border="0"/&gt;&lt;/a&gt;&lt;img width="1" height="1" src="http://pi.feedsportal.com/r/133515254516/u/49/f/609642/c/33859/s/1f090222/kg/315/a2t.img" border="0"/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.weblogssl.com/~ff/genbetadev?a=JNf2aO79aBA:GOjYzC3dmDI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/genbetadev?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.weblogssl.com/~ff/genbetadev?a=JNf2aO79aBA:GOjYzC3dmDI:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/genbetadev?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><pubDate>Sat, 05 May 2012 15:06:03 GMT</pubDate><author>Fernando Siles</author><guid isPermaLink="false">http://www.genbetadev.com/actualidad/se-lanza-xobotos-un-android-en-net-y-c</guid></item><item><title>"Había que potenciar la comunidad de JavaScript en Madrid". Entrevista a Israel Alcázar</title><link>http://weblogssl.feedsportal.com/c/33859/f/609642/s/1efec722/l/0L0Sgenbetadev0N0Centrevistas0Chabia0Eque0Epotenciar0Ela0Ecomunidad0Ede0Ejavascript0Een0Emadrid0Eentrevista0Ea0Eisrael0Ealcazar/story01.htm</link><description>&lt;p&gt;&lt;img alt="Israel Alcazar" src="http://img.genbetadev.com/2012/05/IsraelAlcazar-1.jpg" class="centro_sinmarco" /&gt;&lt;/p&gt; &lt;p&gt;En julio del 2011, esta batidora de información que es twiter me hizo saber la curiosa convocatoria de un grupo de estudio de JavaScript, ese lenguaje endemoniado que tantas veces me ha llevado por la calle de la amargura. Obviamente me apunté, &lt;strong&gt;aunque fuera para ir a conocer y ponerle cara a personas&lt;/strong&gt; que solo conocía en la Red.&lt;/p&gt; &lt;p&gt;La sorpresa fue cuando nos juntamos más de 50 personas y tuve el placer de saludar brevemente a &lt;strong&gt;Israel Alcázar, el alma mater y promotor&lt;/strong&gt; de este movimiento incipiente. Movimiento que no ha parado de crecer en capacidad de convocatoria; en calidad de los ponentes; constituyéndose en &lt;a href="http://www.meetup.com/madridjs/"&gt;MadridJS&lt;/a&gt; y enfrentándose a su primer gran evento internacional para el próximo verano de 2012.&lt;/p&gt; &lt;p&gt;He ido encontrándome con Israel en otros eventos relacionados con el agilísimo o el movimiento de emprendedores. Y desde una humildad que le honra, se ha consolidado como &lt;strong&gt;el impulsor de una viva y poderosa comunidad&lt;/strong&gt; alrededor de este lenguaje.&lt;/p&gt; &lt;p&gt;Ahora tengo la satisfacción de transcribir sus palabras con las que ha contestado las preguntas que componen esta entrevista.&lt;br /&gt; &lt;!--more--&gt;&lt;br /&gt; &lt;strong&gt;Obviamente para tí JavaScript tiene un futuro prometedor, ¿pero podrías argumentarlo desde el cerebro y no desde el corazón?&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Pues si echamos un vistazo rápido a HTML5 y a todo lo relativo a tecnologías móviles en entorno web nos encontramos con que gran parte de todo está basado en &lt;span class="caps"&gt;&lt;span class="caps"&gt;API&lt;/span&gt;&lt;/span&gt;s JavaScript. Así que hay que aprenderlo, sea como sea, porque nos lo encontraremos hasta en la sopa. Además con cosas como NodeJS también tenemos JavaScript en el servidor&amp;#8230;.¿no es alucinante?&lt;/p&gt; &lt;p&gt;&lt;strong&gt;En mi opinión, lo que menos me gusta es que es un lenguaje sin tipado fuerte, ¿qué ventajas le ofrece a JavaScript esta &amp;#8220;desventaja&amp;#8221;?&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;La principal ventaja que le veo al tipado débil es la versatilidad y el dinamismo que puedes conseguir en tu código. Aunque tiene el peligro de perder el control y no saber lo que estamos haciendo. Por eso es importante utilizar técnicas de testing para permitirnos detectar problemas rápidamente. Tampoco hay que perder de vista a CoffeeScript, que nos permite “picar” código JavaScript muy limpio y claro.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;¿Es posible hacer Programación Orientada a Objetos de forma sencilla en JavaScript?&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Digamos que JavaScript proporciona &lt;span class="caps"&gt;&lt;span class="caps"&gt;POO&lt;/span&gt;&lt;/span&gt; de una forma “distinta” a lo habitual. Estamos acostumbrados en otros tipos de lenguajes orientados a objetos como Java o C++ a utilizar el concepto de clase y herencia para implementar la orientación a objetos. Sin embargo, JavaScript nos proporciona una forma distinta, ni mejor ni peor simplemente distinta, como son las funciones y los prototipos.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Olvidándonos de JavaScript, ¿cual es tu lenguaje preferido?&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Mi “lenguaje materno” es Java. Fue el primero (sin contar a Pascal claro) que aprendí y le tengo un especial cariño. Dicen los gurus que es el nuevo Cobol pero yo creo que todavía le queda mucho recorrido!!&lt;/p&gt; &lt;p&gt;&lt;strong&gt;¿Qué piensas de los lenguajes funcionales o de cosas aún más raras como Erlang ?&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Que son algo raro, raro, raro&amp;#8230;.no, ahora en serio, creo que son lenguajes con mucha potencia pero con una curva de aprendizaje bastante alta. Otra de las cosas que me gusta de JavaScript es que permite programación funcional, aunque ya sabemos que la potencia sin control no tiene sentido.&lt;/p&gt; &lt;p&gt;De Erlang&amp;#8230;creo que con el auge de las redes sociales, el cloud computing y el manejo masivo de operaciones distribuida, etc, le ha permitido avanzar y ser mas utilizado de lo que en principio cabría esperar&amp;#8230;personalmente no es un lenguaje que me motive demasiado aunque reconozco que tiene su puntito.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;¿Cuando te diste cuenta que el desarrollo iba a ser tu profesión/pasión?&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Desde pequeño tuve claro que me encantaban los ordenadores. Empecé la universidad enfocado en los sistemas y las redes pero enseguida me di cuenta que a mi lo que me gustaba era programar. Desde entonces, con el paso del tiempo me he ido interesando por diferentes lenguajes pasando no solo de ser un trabajo sino en un hobbie.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Está claro que eres un apasionado de la programación en general, pero ¿cómo has terminado liderando la comunidad de javascript?&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;No me considero líder de nada. Había que potenciar la comunidad de JavaScript en Madrid porque era una pena que con la cantidad de gente buena que hay programando en este lenguaje, no hubiera ningún punto de encuentro donde aprender y compartir conocimientos y experiencias. ¡Había que reunir a todos los JavaScripters! Aprovechamos que en Junio se fundó el grupo de MadridJS para potenciarlo un poco.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;¿Estudias (obviamente) y/o trabajas?¿Donde?&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Estudiar, en esta profesión es el día a día, así que no paro de leer y estudiar cosas nuevas. En cuanto a trabajar, los últimos 5 años los he pasado en &lt;em&gt;atSistemas&lt;/em&gt;, consultora tecnológica donde me dedico sobre todo a ayudar a los equipos de desarrollo a hacer mejor software y programar cuando me dejan.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;¿De donde sacas el tiempo para tu familia, o tus amigos u otras actividades no relacionadas con el código?&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Todo es cuestión de planificarse bien y saber compaginarlo todo. El día y las semanas tienen muchas horas. Hay que saber compensar todos esos momentos que no puedes estar con ellos con otros en los que tienes que estar al 200%. Desde luego tengo una familia, pareja y amigos que entienden mi profesión y el tiempo que muchas veces hay que dedicarle para estar siempre a la última.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;¿Cómo se gestiona una comunidad virtual como el Grupo de Estudio de JavaScript?&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Para los que no lo conozcan, el grupo de estudio fue una iniciativa que duró 1 mes (agosto 2011) y que culminó en lo que actualmente es el grupo local MadridJS. Empezó con la intención de ser un grupo de estudio en el que todo el mundo participase en el aprendizaje pero, al final, se convirtió en algo parecido a un mini-curso ya que el nivel de los asistentes era mas bajo de lo esperado y consideramos que el formato que mejor se adaptaba era el de curso mas que grupo de estudio.&lt;/p&gt; &lt;p&gt;Lo mas complicado de gestionarlo fue el lugar donde nos reuníamos. Al ser muchas personas era lo mas complejo de encontrar. Siempre tuvimos la ayuda de &lt;em&gt;Madrid On Rails&lt;/em&gt; a los que aprovecho para agradecer su apoyo. &lt;/p&gt; &lt;p&gt;El resto de cosas fluyeron solas tanto con la gente que participó compartiendo sus conocimientos, como todos los que se acercaron a aprender. Si alguien está interesado en ver lo que hicimos, creamos esta web donde encontrar ejercicios y material de ayuda. No es demasiado pero solo estuvimos un mes.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;¿Esperabas esta capacidad de convocatoria cuando lo creaste?&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Me vi desbordado por completo. Todo empezó con un mensaje en Twitter que mandé volviendo de la playa, donde animaba a cualquiera que estuviera por Madrid en agosto a aprender JavaScript. Pensaba que siendo agosto, no llegaríamos ni a 5 personas. Que sorpresa cuando unas 30 personas se interesaron y finalmente vinieron. Semana tras semana fuimos una media de 15-20 personas. ¡Qué grande es esto de Twitter!&lt;/p&gt; &lt;p&gt;&lt;strong&gt;¿Merece la pena el lio de gestionar una de las comunidades más activas en este momento, incluso llegando a ser nominada en MeetUp?&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Merece mucho la pena claro. Siempre he dicho que todo esto lo hago por egoísmo puro (je je), yo quería aprender JavaScript y que mejor forma de hacerlo que potenciando la comunidad local. &lt;/p&gt; &lt;p&gt;A pesar del esfuerzo que exige me ha permitido conocer a personas que de otra forma no hubiera tenido oportunidad. Hay mucha gente que se acerca a saludarte que de otra forma no las hubiera conocido nunca y créeme que son gente muy interesante, con mucha ideas y muchas cosas de las que puedo aprender.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;¿A quien quisieras agradecer, como si estuvieras dando un discurso en los Oscar?&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Pues agradecer especialmente al incansable Enrique Amodeo, por toda la ayuda y el apoyo prestado tanto con el Grupo de Estudio, como posteriormente con el grupo local &lt;em&gt;MadridJS&lt;/em&gt;. Si su colaboración no hubiera sido lo mismo.&lt;/p&gt; &lt;p&gt;Y por supuesto a todos esos JavaScripters que nos siguen mes a mes y nos acompañan en cada reunión tanto presencialmente como por streaming&amp;#8230;.me consta que nos ve gente de Argentina, Colombia, Brasil, Venezuela, y muchos otros países.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;¿Cómo ves el panorama del desarrollo en España?&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Creo que por suerte nos está tocando poco la crisis en el sector (toquemos madera). Veo últimamente mucho movimiento en cuanto al desarrollo de productos se refiere. Ya sabemos que España, históricamente, es un país donde no se desarrolla mucho software (entendido como productos) y a lo que mas se dedican las empresas del sector es a subcontratar servicios y personas. &lt;/p&gt; &lt;p&gt;En ese sentido creo que las cosas están cambiando y poco a poco surgen mas empresas con ideas y productos a los que dar forma.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;¿Qué consejos le darías a un estudiante o a un recién llegado al sector para no morir en el intento?&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Pues que este sector necesita gente motivada y con pasión por lo que hace. Por desgracia, los salarios actuales no son los mismos que los de antes de la crisis así que es especialmente importante que la gente que se inicia en este sector sea gente a la que le apasione trabajar en esto.&lt;/p&gt; &lt;p&gt;A los estudiantes, que cuanto antes adquieran experiencia haciendo prácticas o becas en diferentes empresas mejor. Hace unos años era fácil encontrar trabajo sin experiencia pero con el panorama actual se piden perfiles con un poco mas de experiencia, así que cuanto antes la tengan mejor que mejor.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Y para terminar&amp;#8230;&lt;/strong&gt;&lt;br /&gt; Solo me queda agradeceros por la oportunidad que me habéis brindado con esta entrevista. Animar a todos los desarrolladores que no están interesados en JavaScript que se lo piensen, que se acerquen al lenguaje porque a pesar de ser un lenguaje con muchos años a sus espaldas, es el presente y futuro de la web, los móviles, la televisión y cualquier cosa que se os ocurra.&lt;/p&gt; &lt;p&gt;Espero veros a todos en &lt;strong&gt;la conferencia internacional sobre JavaScript (SpainJS)&lt;/strong&gt; que estamos montando en Madrid para este verano. Esperamos sea algo grande que atraiga a muchos JavaScripters internacionales y así poder seguir potenciando la comunidad local y nacional.&lt;/p&gt; &lt;p&gt;&lt;img alt="Israel Alcazar" src="http://img.genbetadev.com/2012/05/IsraelAlcazarVertical.jpg" class="centro" /&gt;&lt;/p&gt; &lt;p&gt;Twiter | &lt;a href="https://twitter.com/#!/ialcazar"&gt;@ialcazar&lt;/a&gt;&lt;br /&gt; Blog | &lt;a href="http://blog.farmerdev.com/"&gt;Farmer Dev&amp;#8217;s Blog&lt;/a&gt;&lt;br /&gt; MadridJS | &lt;a href="http://www.meetup.com/madridjs/"&gt;Meetup de MadridJS&lt;/a&gt;&lt;br /&gt; En GenbetaDev | &lt;a href="http://www.genbetadev.com/entrevistas/me-habia-pateado-todos-los-eventos-pero-sentia-que-ninguno-era-mi-lugar-entrevista-a-miquel-camps-organizador-de-betabeers"&gt;Entrevista a Miquel Camps, organizador de Betabeers&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='http://weblogssl.feedsportal.com/c/33859/f/609642/s/1efec722/mf.gif' border='0'/&gt;&lt;div class='mf-viral'&gt;&lt;table border='0'&gt;&lt;tr&gt;&lt;td valign='middle'&gt;&lt;a href="http://share.feedsportal.com/viral/sendEmail.cfm?lang=es&amp;title=%22Hab%C3%ADa+que+potenciar+la+comunidad+de+JavaScript+en+Madrid%22.+Entrevista+a+Israel+Alc%C3%A1zar&amp;link=http%3A%2F%2Fwww.genbetadev.com%2Fentrevistas%2Fhabia-que-potenciar-la-comunidad-de-javascript-en-madrid-entrevista-a-israel-alcazar" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/emailthis2_es.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark_es.cfm?title=%22Hab%C3%ADa+que+potenciar+la+comunidad+de+JavaScript+en+Madrid%22.+Entrevista+a+Israel+Alc%C3%A1zar&amp;link=http%3A%2F%2Fwww.genbetadev.com%2Fentrevistas%2Fhabia-que-potenciar-la-comunidad-de-javascript-en-madrid-entrevista-a-israel-alcazar" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/bookmark_es.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://da.feedsportal.com/r/133515198785/u/49/f/609642/c/33859/s/1efec722/kg/315-319-320/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/133515198785/u/49/f/609642/c/33859/s/1efec722/kg/315-319-320/a2.img" border="0"/&gt;&lt;/a&gt;&lt;img width="1" height="1" src="http://pi.feedsportal.com/r/133515198785/u/49/f/609642/c/33859/s/1efec722/kg/315-319-320/a2t.img" border="0"/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.weblogssl.com/~ff/genbetadev?a=9m3mvlTlHRI:5wQwU9El1yE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/genbetadev?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.weblogssl.com/~ff/genbetadev?a=9m3mvlTlHRI:5wQwU9El1yE:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/genbetadev?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><pubDate>Fri, 04 May 2012 06:00:00 GMT</pubDate><author>Juan Quijano</author><guid isPermaLink="false">http://www.genbetadev.com/entrevistas/habia-que-potenciar-la-comunidad-de-javascript-en-madrid-entrevista-a-israel-alcazar</guid></item><item><title>Descubierto bug de PHP con 8 años de antigüedad</title><link>http://weblogssl.feedsportal.com/c/33859/f/609642/s/1efda82e/l/0L0Sgenbetadev0N0Cphp0Cdescubierto0Ebug0Ede0Ephp0Econ0E80Eanos0Ede0Eantiguedad/story01.htm</link><description>&lt;div class="caption-img"&gt;&lt;img alt="bugs" src="http://img.genbetadev.com/2012/05/650_1000_bugs.jpg" class="centro" /&gt;&lt;span&gt;Una de dos: o me descubrían ya o empezaba a pedir la paga&lt;/span&gt;&lt;/div&gt; &lt;p&gt;Ocho años en el mundo del desarrollo es varios lustros en el equivalente del &lt;em&gt;mundo real&lt;/em&gt; (si, esa cosa que hay más allá de las líneas de código). Por eso sorprende (por lo menos a mi) que ahora se haya descubierto &lt;strong&gt;un bug de &lt;span class="caps"&gt;PHP&lt;/span&gt;&lt;/strong&gt; que lleva allí desde un commit &lt;strong&gt;de 2004&lt;/strong&gt;. Vamos, que unos meses más y hace la comunión el bicho.&lt;/p&gt; &lt;p&gt;El bug en cuestión afecta a las instalaciones de &lt;span class="caps"&gt;PHP&lt;/span&gt; que usen el &lt;strong&gt;modo mod_cgi de Apache&lt;/strong&gt; y viene a ser lo siguiente: si añades a una url parámetros sin que haya ningún signo &amp;#8216;=&amp;#8217; (por ejemplo &amp;#8216;?s&amp;#8217;), te hace un bonito &lt;strong&gt;dump de tu código fuente&lt;/strong&gt;. A partir de ahí, como siempre en estos casos, entra la malicia de cada uno.&lt;/p&gt; &lt;p&gt;La gente de &lt;span class="caps"&gt;PHP&lt;/span&gt; ha solucionado este bug con solera en las recientes &lt;strong&gt;actualizaciones 5.3.12 y 5.4.2&lt;/strong&gt; pero como reconocen que esto del mod_cgi es una cosa bastante pasada de moda y que es posible que la mayoría de las instalaciones afectadas sean tan vetustas que no merecen mucho la pena actualizar a unas versiones de &lt;span class="caps"&gt;PHP&lt;/span&gt; tan avanzadas, ofrecen una solución añadiendo un par de líneas similares a estas en la &lt;strong&gt;configuración de tu servidor&lt;/strong&gt;:&lt;/p&gt; &lt;pre&gt;RewriteCond %{QUERY_STRING} ^(%2d|-)[^=]+$ [NC] RewriteRule ^(.*) $1? [L]&lt;/pre&gt; &lt;p&gt;Vía | &lt;a href="http://www.php.net/archive/2012.php#id2012-05-03-1"&gt;&lt;span class="caps"&gt;PHP&lt;/span&gt;.net&lt;/a&gt;&lt;br /&gt; Imagen | Fotograma de la película &amp;#8216;Bichos&amp;#8217; de Pixar&lt;br /&gt; En Genbeta Dev | &lt;a href="http://www.genbetadev.com/php/php-5-4-a-fondo"&gt;&lt;span class="caps"&gt;PHP&lt;/span&gt; 5.4 a fondo&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='http://weblogssl.feedsportal.com/c/33859/f/609642/s/1efda82e/mf.gif' border='0'/&gt;&lt;div class='mf-viral'&gt;&lt;table border='0'&gt;&lt;tr&gt;&lt;td valign='middle'&gt;&lt;a href="http://share.feedsportal.com/viral/sendEmail.cfm?lang=es&amp;title=Descubierto+bug+de+PHP+con+8+a%C3%B1os+de+antig%C3%BCedad&amp;link=http%3A%2F%2Fwww.genbetadev.com%2Fphp%2Fdescubierto-bug-de-php-con-8-anos-de-antiguedad" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/emailthis2_es.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark_es.cfm?title=Descubierto+bug+de+PHP+con+8+a%C3%B1os+de+antig%C3%BCedad&amp;link=http%3A%2F%2Fwww.genbetadev.com%2Fphp%2Fdescubierto-bug-de-php-con-8-anos-de-antiguedad" target="_blank"&gt;&lt;img src="http://rss.feedsportal.com/images/bookmark_es.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://da.feedsportal.com/r/133515196083/u/49/f/609642/c/33859/s/1efda82e/kg/315-329/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/133515196083/u/49/f/609642/c/33859/s/1efda82e/kg/315-329/a2.img" border="0"/&gt;&lt;/a&gt;&lt;img width="1" height="1" src="http://pi.feedsportal.com/r/133515196083/u/49/f/609642/c/33859/s/1efda82e/kg/315-329/a2t.img" border="0"/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.weblogssl.com/~ff/genbetadev?a=hTldYF6O-9s:SQPR9gocYGk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/genbetadev?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.weblogssl.com/~ff/genbetadev?a=hTldYF6O-9s:SQPR9gocYGk:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/genbetadev?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><pubDate>Fri, 04 May 2012 04:30:00 GMT</pubDate><author>Fernando Siles</author><guid isPermaLink="false">http://www.genbetadev.com/php/descubierto-bug-de-php-con-8-anos-de-antiguedad</guid></item></channel></rss>

