<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Perez Rio &#187; programacion</title>
	<atom:link href="http://www.perezrio.com/tag/programacion/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.perezrio.com</link>
	<description>Blogue do rubio</description>
	<lastBuildDate>Tue, 29 Nov 2011 08:15:08 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Alternativa a Flash o Silverlight: Maqetta</title>
		<link>http://www.perezrio.com/2011/05/29/alternativa-a-flash-o-silverlight-maqetta/</link>
		<comments>http://www.perezrio.com/2011/05/29/alternativa-a-flash-o-silverlight-maqetta/#comments</comments>
		<pubDate>Sun, 29 May 2011 11:48:51 +0000</pubDate>
		<dc:creator>rubio</dc:creator>
				<category><![CDATA[Apple]]></category>
		<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Nuevas tecnologías]]></category>
		<category><![CDATA[Software Libre]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[programacion]]></category>
		<category><![CDATA[silverlight]]></category>

		<guid isPermaLink="false">http://www.perezrio.com/?p=500</guid>
		<description><![CDATA[Visto en: eweekeurope.es IBM ha anunciado una nueva herramienta visual de desarrollo de interfaces de escritorio y móviles basada en código abierto y a la que ha denominado Maqetta. Lo ha hecho en el evento anual IBM Impact 2011, que está siendo cubierto en directo por NetMediaEurope desde Las Vegas (EE.UU.). Maqetta podría revolucionar la [...]]]></description>
			<content:encoded><![CDATA[<p>Visto en: <a title="http://www.eweekeurope.es/noticias/maquetta-la-alternativa-de-codigo-abierto-a-flash-y-silverlight-11639" href="http://www.eweekeurope.es/noticias/maquetta-la-alternativa-de-codigo-abierto-a-flash-y-silverlight-11639" target="_blank">eweekeurope.es</a></p>
<p>IBM ha anunciado una nueva herramienta visual de desarrollo de  interfaces de escritorio y móviles basada en código abierto y a la que  ha denominado <strong>Maqetta</strong>. Lo  ha hecho en el evento anual <strong>IBM Impact 2011</strong>, que está siendo <a href="http://www.siliconnews.es/2011/04/11/la-necesidad-de-transformacion-no-viene-de-la-tecnologia-sino-de-las-necesidades-de-cambio-del-cliente/" target="_blank">cubierto en directo por NetMediaEurope</a> desde Las Vegas (EE.UU.).</p>
<p>Maqetta  podría revolucionar la industria de desarrollo de aplicaciones RIA  (Rich Internet Application) donde otras alternativas cerradas como Adobe  Flash y Microsoft SilverLight se encuentran asentadas. Es así porque se  trata de un conjunto de <strong>herramientas basadas en código abierto que permiten la creación de aplicaciones HTML5</strong>. De hecho, IBM contribuirá con el código fuente de Maqetta en la <strong>Fundación Dojo</strong>, que será la que hospede este proyecto.</p>
<p>Básicamente, <strong>Maqetta está construida en HTML/Ajax</strong> y no es necesario ningún tipo de plug-in adicional para poder ejecutarla en un <a title="Navegador" rel="external" href="http://www.itespresso.es/tag/navegador" target="_blank">navegador</a>.  Soporta ensamblaje de los módulos que conforman un interfaz mediante  Drag&amp;Drop y su código está disponible para que cualquier usuario  pueda personalizarla según sus necesidades. En pocas palabras, <strong>se podrán crear páginas web HTML5 desde el propio navegador y en un entorno WYSIWYG</strong>.</p>
<p>Todas las funcionalidades de Maqetta ya están disponibles para ser  renderizadas en las últimas versiones de los  navegadores: Microsoft  Internet Explorer, Mozilla Firefox, <a title="Google " rel="external" href="http://www.itespresso.es/tag/google" target="_blank">Google </a><a title="Chrome" rel="external" href="http://www.itespresso.es/tag/chrome" target="_blank">Chrome</a>,<a title="Apple" rel="external" href="http://www.gizmodo.es/category/apple" target="_blank"> Apple </a>Safari y todos los sistemas basados en movilidad como iPhone, Android, RIM, BlackBerry y Windows Phone 7.</p>
<p>Actualmente Maqetta se encuentra disponible para la comunidad de  desarrolladores de forma gratuita en versión Preview 1 desde el sitio <a href="http://maqetta.org/" target="_blank">http://maqetta.org</a>.</p>
<p>“Incorporando Maqetta a la Fundación Dojo como código abierto y  software gratuito, IBM espera construir una comunidad de usuarios y  desarrolladores open source que trabajen juntos para crear una nueva  generación de interfaces de usuarios basados en HTML5” ha indicado  durante el lanzamiento <strong>David Boloker, CTO de Tecnologías Emergentes para Internet de IBM</strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.perezrio.com/2011/05/29/alternativa-a-flash-o-silverlight-maqetta/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Consejos de programación</title>
		<link>http://www.perezrio.com/2010/11/17/consejos-de-programacion/</link>
		<comments>http://www.perezrio.com/2010/11/17/consejos-de-programacion/#comments</comments>
		<pubDate>Wed, 17 Nov 2010 19:53:56 +0000</pubDate>
		<dc:creator>rubio</dc:creator>
				<category><![CDATA[Apple]]></category>
		<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Nuevas tecnologías]]></category>
		<category><![CDATA[Software Libre]]></category>
		<category><![CDATA[Traballo]]></category>
		<category><![CDATA[programacion]]></category>

		<guid isPermaLink="false">http://www.perezrio.com/?p=459</guid>
		<description><![CDATA[Visto en este blog: Manuelpereira, es una cosita que no he parado de releer y de darle la razón al hombre&#8230; En ocasiones, compañeros de trabajo y otros conocidos acuden a mi con problemas técnicos difíciles (de programación, sistemas, etc.) incomprensibles y/o aparentemente inexplicables, tratando de que les eche una mano en la búsqueda de [...]]]></description>
			<content:encoded><![CDATA[<p>Visto en este blog: <a title="http://manuelpereiragonzalez.blogspot.com/2010/10/10-consejos-para-la-resolucion-de.html" href="http://manuelpereiragonzalez.blogspot.com/2010/10/10-consejos-para-la-resolucion-de.html" target="_blank">Manuelpereira</a>, es una cosita que no he parado de releer y de darle la razón al hombre&#8230;</p>
<p>En ocasiones, compañeros de trabajo y otros conocidos acuden a mi con  problemas técnicos difíciles (de programación, sistemas, etc.)  incomprensibles y/o aparentemente inexplicables, tratando de que les  eche una mano en la búsqueda de una solución. Supongo que me he ganado  fama de &#8220;gurú técnico&#8221; a base de encontrar soluciones inesperadas a  problemas extraños (qué engañados les tengo a todos <img src='http://www.perezrio.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /><br />
Seguro que si trabajáis con temas técnicos, habéis escuchado multitud de veces frases como estas:</p>
<ul>
<li><strong><span class="Apple-style-span" style="font-weight: normal;"><strong><span class="Apple-style-span" style="font-weight: normal;"><strong><span class="Apple-style-span" style="font-weight: normal;"><strong>No lo entiendo! Pero si ayer funcionaba y no he tocado nada!</strong></span></strong></span></strong></span></strong></li>
<li><strong><span class="Apple-style-span" style="font-weight: normal;"><strong><span class="Apple-style-span" style="font-weight: normal;"><strong>Lo he probado todo y no soy capaz de saber por qué falla!</strong></span></strong></span></strong></li>
<li><strong><span class="Apple-style-span" style="font-weight: normal;"><strong>Esto es imposible! Pero si el programa nunca debería pasar por ahí!</strong></span></strong></li>
<li><strong>Si en mi máquina funciona y todo está igual en esta otra, ¿por qué ahí no funciona?</strong></li>
</ul>
<p>He hecho un ejercicio de reflexión para tratar de analizar las reglas  que inconscientemente aplico a la hora de tratar de resolver algún  problema, esas reglas que sólo se aprenden a lo largo de años  enfrentándote a este tipo de situaciones. Quiero compartir con vosotros  algunos consejos/conclusiones que he sacado de esta reflexión, espero  que os sirvan:</p>
<p><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: x-large;">Consejo 1: Simplifica el problema</span></span></p>
<div style="margin: 0px;"><span class="Apple-style-span" style="font-size: x-large;"> </span>Cuando  te enfrentas a un problema complejo suele haber muchas variables que  pueden influir en él. En ese caso, hay que tratar de reducir el problema  a su mínima expresión, para poder tratarlo sin tantas variables que  introducen ruido al asunto. Muchas veces, cuando estás tratando de  reducir el problema a uno más simple, das con la solución.</div>
<ul>
<li><span style="text-decoration: underline;">Ejemplo</span>:  Imagina que tienes una aplicación que estás programando, que consta de  1000 archivos y más de 100.000 líneas de código. Tienes un problema con  un archivo de la aplicación, concretamente en un método de una clase que  no se comporta como debería. En ese caso, lo ideal es aislar ese método  y tratar de probarlo independientemente del resto de la aplicación. Si  es posible, además, quitar todas las líneas del método que no sean  relevantes para el problema, hasta dejarlo reducido a su mínima  expresión. Como digo, muchas veces aplicando este procedimiento de  simplificación te das cuenta de la causa del problema.</li>
</ul>
<p><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: x-large;">Consejo 2: Se metódico en las pruebas</span></span><br />
Lo primero que hay que hacer a la hora de enfrentarse un problema, aún a  riesgo de parecer un autómata, es SER MUY METÓDICO. El más claro  ejemplo de esto es que si para comprobar que algo funciona estás  realizando las pruebas de una determinada manera, <span style="text-decoration: underline;">las realices siempre de la misma forma y en el mismo orden</span> (aunque creas que lo que estás cambiando no puede afectar al resultado!!!).</p>
<ul>
<li><span style="text-decoration: underline;">Ejemplo</span>: Si estás realizando las pruebas en una máquina,  hazlas siempre en la misma (aunque haya otra exáctamente igual). El  cambio de máquina muchas veces introduce ruido en las pruebas (siempre  suele haber problemas con idiomas distintos, encodings &#8211; UTF8, etc.).</li>
<li><span style="text-decoration: underline;">Ejemplo</span>: Si para las pruebas estás lanzando dos scripts en un  derminado orden, aunque los scripts sean independientes (teóricamente  el orden no sea relevante), lánzalos siempre en el mismo orden.</li>
</ul>
<p><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: x-large;">Consejo 3: No mates moscas a cañonazos, primero Reflexiona!</span></span><br />
Muchas veces cuando uno está enfrentándose a un problema incomprensible,  tiene la tentación de &#8220;empezar de cero&#8221;. Yo soy de la opinión de que  esta tiene que ser la última solución, antes hay que tratar de descartar  todas las otras vías. Volviendo a empezar de cero, corres el riesgo de  tardar más de lo necesario, o lo que es peor, trabajar durante días  rehaciendo algo para luego encontrarte con el mismo problema.</p>
<ul>
<li><span style="text-decoration: underline;">Ejemplo</span>: En nuestro día a día trabajamos a diario con las herramientas <em>Maven, JDK1.6, Eclipse,</em> etc. Tengo un compañero (con cariño eh!) que cada vez que no le  funciona algo se lanza a reinstalar Windows, y todas las herramientas  necesarias. Suele tardar un par de días en reinstalar todo, y algunas  veces, cuando ha terminado, vuelve a probar lo que fallaba y&#8230; sigue  fallando!. Muchas veces, si se hubiese parado a reflexionar sobre el  problema en lugar de &#8220;tirar por la tangente&#8221;, habría ahorrado mucho  tiempo y esfuerzo.</li>
</ul>
<p><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: x-large;">Consejo 4: La máquina tiene la presunción de inocencia</span></span></p>
<div style="margin: 0px;"><span class="Apple-style-span" style="font-size: x-large;"> </span></div>
<div style="font-size: medium; margin: 0px;">Lo  que he aprendido a lo largo de muchos años es que lo más probable  frente a un error es que el culpable sea el ser humano, no la máquina.  Lamentablemente en estos casos la presunción de inocencia es para la  máquina, y no para ti <img src='http://www.perezrio.com/wp-includes/images/smilies/icon_sad.gif' alt=':-(' class='wp-smiley' /> </div>
<ul style="font-size: medium;">
<li><span style="text-decoration: underline;">Ejemplo</span>:  Mucha gente, cuando algo no funciona, culpa a problemas en el hardware  (las típicas frases &#8220;Eso es que la memoria está corrupta&#8221; o &#8220;A lo mejor  el disco duro tiene clusters defectuosos&#8221;). La mayoría de las veces  suele ser problema del programa, no del hardware.</li>
<li><span style="text-decoration: underline;">Ejemplo</span>: Siempre me acuerdo de un antiguo compañero de  trabajo que a menudo, cuando encontraba algún problema en Java  aparentemente inexplicable, culpaba a la Java Virtual Machine. &#8220;<span style="text-decoration: underline;">Tiene que ser un error de la JVM!!</span>&#8221; &#8211; decía. Siempre se confirmó que eran errores suyos en el código.</li>
</ul>
<p><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: x-large;">Consejo 5: A veces es más fácil hallar la solución que la causa</span></span></p>
<div style="font-size: medium; margin: 0px;">En ocasiones la gente se  ofusca tratando de buscar la causa a un problema. Pasan días tratando de  encontrar el por qué&#8230; cuando a veces existe un &#8220;atajo&#8221; (los ingleses  lo llaman <em>workaround</em>) que te hace solucionar el problema, aunque  no encuentres qué era lo que lo producía. Hay ocasiones en las que hay  que saber rendirse ante el enemigo, y siendo prácticos, dejar atrás  nuestra necesidad innata de conocer el por qué de las cosas. Ojo porque  tampoco hay que abusar de esto, puede convertirse en un arma de doble  filo (cada uno tiene que saber poner límites prácticos a su curiosidad,  sobre todo si te pagan por producir <img src='http://www.perezrio.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </div>
<ul>
<li><span style="text-decoration: underline;">Ejemplo</span>:  Un conocido tenía un problema con un programa en Java que se suponía  que era compatible con la JDK1.3 y superiores. El tipo llevaba semanas  persiguiendo el problema ejecutando el software con la JDK1.4, y no era  capaz de encontrar la causa. Después de varios intentos fallidos de  conocer la causa, le pregunté si había probado a ejecutarlo con la  JDK1.3. Su respuesta fue que la 1.4 era compatible con versiones  anteriores, por tanto si funcionaba con la 1.3 debería de hacerlo con la  1.4. &#8220;Muy bien&#8221; &#8211; le dije &#8211; &#8220;¿pero lo has probado?&#8221;. Insistí en ello, y  al probarlo con la 1.3 el error dejó de producirse. Nos quedamos con  ganas de saber qué es lo que producía el error&#8230; pero solucionamos el  problema!</li>
<li><span style="text-decoration: underline;">Ejemplo</span>: La semana pasada un tipo me llamó porque estaba  detectando errores de intentos fallidos en la conexión a SQL Server en  un servidor. Después de darle muchas vueltas, probé a detener el  servicio &#8220;Microsoft Reporting Services&#8221;, y el error dejó de producirse.  El tipo dijo: &#8220;<em>¿Pero por qué ese servicio trata de conectarse a SQL Server? No lo entiendo</em>&#8220;, a lo cuál le respondí con otra pregunta: &#8220;<em>¿Usas el servicio de Reporting Services o lo vas a usar en un futuro?</em>&#8220;. &#8220;<em>No</em>&#8221; &#8211; respondió. &#8220;<em>Entonces me da igual saber por qué trata de conectarse, dejamos el servicio apagado y problema solucionado</em>&#8220;.</li>
</ul>
<p><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: x-large;">Consejo 6: Si ayer funcionaba y hoy no, algo ha cambiado</span></span></p>
<div style="margin: 0px;">Cuando alguien viene a mi con la típica frase &#8220;<em>Pero si ayer funcionaba y no ha cambiado nada!</em>&#8221; siempre le respondo lo mismo: &#8220;<em>Como mínimo ha cambiado algo: La fecha</em>&#8220;.  Si estás en la típica situación en la que te fuiste el día anterior  dejando algo funcionando y hoy ya no funciona, intenta pensar <strong>verdaderamente </strong>qué  puede haber cambiado, y echa para atrás todo lo que haya cambiado para  volver a la situación en la que funcionaba. Después vuelve a hacer los  cambios probando uno a uno, para ver cuál es el que introduce el  problema.</div>
<ul>
<li><span style="text-decoration: underline;">Ejemplo</span>: El día 19 de Septiembre estuve mejorando el Crawler para el BOCM del proyecto <a href="http://www.booletin.es/">www.booletin.es</a>. Para identificar hasta dónde llega la fecha de un boletín en una cadena de texto (Por ej: &#8220;19<em> de Septiembre de 2010. Bla bla bla</em>&#8220;), estaba buscando &#8220;<em>20</em>&#8221;  en la cadena de texto, y así identificaba dónde se encontraba el año en  la fecha, y sabía por dónde cortar. Todo funcionaba bien con los  boletines desde el 1 de Septiembre hasta el 19. Sin embargo, al día  siguiente (20 de Septiembre) volví a probar el programa y fallaba. &#8220;<em>Pero si no he cambiado nada!</em>&#8220;-  pensé. Sin embargo sí que había cambiado algo, el día del mes. El  algoritmo funcionaba con todos los días del mes menos el día 20, ya que  cortaba la cadena &#8220;<em>20 de Septiembre de 2010. Bla bla bla</em>&#8221; justo después del primer &#8220;<em>20</em>&#8220;, y no después del año como pretendía.</li>
</ul>
<p><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: x-large;">Consejo 7: Pregúntale (bien) a Google</span></span></p>
<div>No creo que exagere si afirmo que el 90% de los problemas extraños  se resuelven sabiendo buscar correctamente en Google. Cuando nos  enfrentamos a un problema, lo más probable es que ya le haya pasado  antes a alguien. Internet está lleno de foros en los que la gente  plantea sus dudas/problemas, y en los que hay multitud de respuestas a  ellos.Cuando me enfrento con un problema y ando perdido, acudo a Google y  le pregunto. Es muy importante <strong>saber buscar bien</strong>, para encontrar lo que buscas. Para buscar algo, trato de buscar<strong> palabras distintivas </strong>de  lo que ando buscando (es decir, palabras que debería de contener el  documento que estoy buscando, y no deberían de contenerlas otros  documentos que no busco).</div>
<div>
<ul>
<li><span style="text-decoration: underline;">Ejemplo</span>: La semana  pasada un compañero de trabajo experto en tecnología J2EE (un arquitecto  de los buenos) estaba buscando la solución a un problema con la  herramienta Maven. Llevaba más de dos horas buscando en google y no  encontraba nada. Me pidió que le echase una mano, y en cinco minutos  (buscando los términos correctos en google) dimos con la solución.</li>
</ul>
<p>A veces pienso que deberían darse cursos sobre cómo utilizar  correctamente los buscadores, sería el tiempo mejor invertido por muchos  (como dicen los economistas, tendría un ROI muy atractivo, se  recuperaría la inversión en cuestión de días y el resto de la vida sería  todo ganancias <img src='http://www.perezrio.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> .</div>
<div></div>
<div><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: x-large;">Consejo 8: Si no hay más remedio, baja de nivel de abstracción</span></span></div>
<div>Cuando  todo lo demás falla y el problema parece inexplicable, debemos  plantearnos que a lo mejor estamos buscando en el lugar inadecuado.  Siempre que hablamos de tecnología, nos movemos en un determinado nivel  de abstracción (Ej: Hardware &lt; BIOS &lt; Sistema Operativo &lt; JVM  &lt; Programa Java) . En ocasiones el problema que estamos buscando no  está en el nivel de abstracción en el que nos movemos, sino en un nivel  inferior (por ej. a veces buscamos un error en el programa&#8230; y el error  está en el Sistema Operativo). Tenemos que bajar a buscarlo ahí.</div>
<div>
<ul>
<li><span style="text-decoration: underline;">Ejemplo</span>:  Esta semana he tenido un problema en un servidor: Al ejecutar un  programa en este servidor se quedaba colgado. Sin embargo al ejecutarlo  en mi máquina local (con la misma configuración) el programa funcionaba  sin problemas. Finalmente, el problema no estaba en el programa, ni  siquiera en el Sistema Operativo&#8230; pero tampoco en el Hardware!. El  problema estaba en un nivel de abstracción que se encontraba escondido  entre el Sistema Operativo y el Hardware. Resulta que se trataba de un  servidor virtual, que se estaba ejecutando como una máquina virtual de  VMWare. VMWare estaba teniendo problemas con el acceso a la cabina de  discos, y esto estaba causando el fallo en la ejecución.</li>
</ul>
</div>
<div><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: x-large;">Consejo 9: Muchos ojos ven más que dos</span></span></div>
<p>Cuando  estés atascado, pregunta!. Aunque pienses que las personas a las que  puedes consultar no tengan la respuesta a tu problema, quizás te puedan  aportar alguna pista (o a lo mejor tienen la respuesta y tú no lo  sabes). Como poco, el contárselo a alguien te servirá también para  aclarar tus propias ideas.</p>
<ul>
<li><span style="text-decoration: underline;">Ejemplo</span>: Esta anécdota es de mis favoritas. Hace muchos  años hice una aplicación en Java que tenía que realizar un cálculo para  cada hora de cada día del año. El programa empezaba con las 00:00h del 1  de Enero, e iba incrementando hora a hora hasta que acababa a las  23:00h del 31 de Diciembre. Al ejecutar el programa e ir incrementando  hora a hora, llegaba un momento en el que se realizaba el cálculo <strong>dos veces para la misma hora</strong>.  Yo no entendía qué podía estar pasando, ya que el programa funcionaba  bien, pero en un momento concreto del tiempo (el 29 de Octubre de 2000)  se duplicaba la hora. Después de dos días persiguiendo el fallo, me  levanté muy enfadado de la silla y grité en alto &#8220;<strong>¿Pero qué demonios pasa el 29 de Octubre?</strong>&#8220;.  Para mi sorpresa, un compañero me miró y me dijo muy tranquilo: &#8220;ese  día es el cambio de hora&#8221;. Claro! No había caído en la cuenta de que el  29 de Octubre de ese año era el día en que se retrasaba la hora, por lo  que a las 3h de la madrugada volvían a ser las 2h&#8230; y de ahí el hecho  de que se duplicase. Mi compañero había dado en dos segundos con la  solución al problema que yo llevaba buscando días.</li>
</ul>
<p><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: x-large;">Consejo 10: A veces la mejor solución a un problema es irse a dormir</span></span></p>
<div style="margin: 0px;">Muchas veces nos obcecamos en resolver un  problema, alargando la jornada hasta las tantas de la madrugada buscando  la solución. Después de muchos años he aprendido que a veces la mejor  solución es descansar. Cuando te levantas por la mañana, tienes la mente  fresca y lúcida, y en ocasiones se te ocurren vías de solución que por  la noche no habías imaginado. En otras ocasiones, mientras duermes, el  cerebro sigue dándole vueltas al asunto y se aclaran las ideas: ¿a quién  no le ha pasado el irse a dormir con un problema en la cabeza y  levantarse con la solución?:</div>
<ul>
<li><span style="text-decoration: underline;">Ejemplo</span>:  De pequeño solía jugar mucho al ajedrez. Con 13 años acostumbraba a  resolver problemas de ajedrez complejos, buscando soluciones  imaginativas a los problemas que se planteaban en libros y revistas. En  una ocasión estuve varias horas pensando sobre un problema de &#8220;mate en  4&#8243; sin encontrar solución. Mi sorpresa fue cuándo me fui a acostar, y  por la mañana me desperté habiendo encontrado la solución al problema  (la cabeza había estado trabajando solita por la noche!).</li>
</ul>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">En ocasiones, compañeros de trabajo y otros conocidos acuden a mi con  problemas técnicos difíciles (de programación, sistemas, etc.)  incomprensibles y/o aparentemente inexplicables, tratando de que les  eche una mano en la búsqueda de una solución. Supongo que me he ganado  fama de &#8220;gurú técnico&#8221; a base de encontrar soluciones inesperadas a  problemas extraños (qué engañados les tengo a todos <img src='http://www.perezrio.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /><br />
Seguro que si trabajáis con temas técnicos, habéis escuchado multitud de veces frases como estas:</p>
<ul>
<li><strong><span class="Apple-style-span" style="font-weight: normal;"><strong><span class="Apple-style-span" style="font-weight: normal;"><strong><span class="Apple-style-span" style="font-weight: normal;"><strong>No lo entiendo! Pero si ayer funcionaba y no he tocado nada!</strong></span></strong></span></strong></span></strong></li>
<li><strong><span class="Apple-style-span" style="font-weight: normal;"><strong><span class="Apple-style-span" style="font-weight: normal;"><strong>Lo he probado todo y no soy capaz de saber por qué falla!</strong></span></strong></span></strong></li>
<li><strong><span class="Apple-style-span" style="font-weight: normal;"><strong>Esto es imposible! Pero si el programa nunca debería pasar por ahí!</strong></span></strong></li>
<li><strong>Si en mi máquina funciona y todo está igual en esta otra, ¿por qué ahí no funciona?</strong></li>
</ul>
<p>He hecho un ejercicio de reflexión para tratar de analizar las reglas  que inconscientemente aplico a la hora de tratar de resolver algún  problema, esas reglas que sólo se aprenden a lo largo de años  enfrentándote a este tipo de situaciones. Quiero compartir con vosotros  algunos consejos/conclusiones que he sacado de esta reflexión, espero  que os sirvan:</p>
<p><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: x-large;">Consejo 1: Simplifica el problema</span></span></p>
<div style="margin: 0px;"><span class="Apple-style-span" style="font-size: x-large;"> </span>Cuando  te enfrentas a un problema complejo suele haber muchas variables que  pueden influir en él. En ese caso, hay que tratar de reducir el problema  a su mínima expresión, para poder tratarlo sin tantas variables que  introducen ruido al asunto. Muchas veces, cuando estás tratando de  reducir el problema a uno más simple, das con la solución.</div>
<ul>
<li><span style="text-decoration: underline;">Ejemplo</span>:  Imagina que tienes una aplicación que estás programando, que consta de  1000 archivos y más de 100.000 líneas de código. Tienes un problema con  un archivo de la aplicación, concretamente en un método de una clase que  no se comporta como debería. En ese caso, lo ideal es aislar ese método  y tratar de probarlo independientemente del resto de la aplicación. Si  es posible, además, quitar todas las líneas del método que no sean  relevantes para el problema, hasta dejarlo reducido a su mínima  expresión. Como digo, muchas veces aplicando este procedimiento de  simplificación te das cuenta de la causa del problema.</li>
</ul>
<p><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: x-large;">Consejo 2: Se metódico en las pruebas</span></span><br />
Lo primero que hay que hacer a la hora de enfrentarse un problema, aún a  riesgo de parecer un autómata, es SER MUY METÓDICO. El más claro  ejemplo de esto es que si para comprobar que algo funciona estás  realizando las pruebas de una determinada manera, <span style="text-decoration: underline;">las realices siempre de la misma forma y en el mismo orden</span> (aunque creas que lo que estás cambiando no puede afectar al resultado!!!).</p>
<ul>
<li><span style="text-decoration: underline;">Ejemplo</span>: Si estás realizando las pruebas en una máquina,  hazlas siempre en la misma (aunque haya otra exáctamente igual). El  cambio de máquina muchas veces introduce ruido en las pruebas (siempre  suele haber problemas con idiomas distintos, encodings &#8211; UTF8, etc.).</li>
<li><span style="text-decoration: underline;">Ejemplo</span>: Si para las pruebas estás lanzando dos scripts en un  derminado orden, aunque los scripts sean independientes (teóricamente  el orden no sea relevante), lánzalos siempre en el mismo orden.</li>
</ul>
<p><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: x-large;">Consejo 3: No mates moscas a cañonazos, primero Reflexiona!</span></span><br />
Muchas veces cuando uno está enfrentándose a un problema incomprensible,  tiene la tentación de &#8220;empezar de cero&#8221;. Yo soy de la opinión de que  esta tiene que ser la última solución, antes hay que tratar de descartar  todas las otras vías. Volviendo a empezar de cero, corres el riesgo de  tardar más de lo necesario, o lo que es peor, trabajar durante días  rehaciendo algo para luego encontrarte con el mismo problema.</p>
<ul>
<li><span style="text-decoration: underline;">Ejemplo</span>: En nuestro día a día trabajamos a diario con las herramientas <em>Maven, JDK1.6, Eclipse,</em> etc. Tengo un compañero (con cariño eh!) que cada vez que no le  funciona algo se lanza a reinstalar Windows, y todas las herramientas  necesarias. Suele tardar un par de días en reinstalar todo, y algunas  veces, cuando ha terminado, vuelve a probar lo que fallaba y&#8230; sigue  fallando!. Muchas veces, si se hubiese parado a reflexionar sobre el  problema en lugar de &#8220;tirar por la tangente&#8221;, habría ahorrado mucho  tiempo y esfuerzo.</li>
</ul>
<p><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: x-large;">Consejo 4: La máquina tiene la presunción de inocencia</span></span></p>
<div style="margin: 0px;"><span class="Apple-style-span" style="font-size: x-large;"> </span></div>
<div style="font-size: medium; margin: 0px;">Lo  que he aprendido a lo largo de muchos años es que lo más probable  frente a un error es que el culpable sea el ser humano, no la máquina.  Lamentablemente en estos casos la presunción de inocencia es para la  máquina, y no para ti <img src='http://www.perezrio.com/wp-includes/images/smilies/icon_sad.gif' alt=':-(' class='wp-smiley' /> </div>
<ul style="font-size: medium;">
<li><span style="text-decoration: underline;">Ejemplo</span>:  Mucha gente, cuando algo no funciona, culpa a problemas en el hardware  (las típicas frases &#8220;Eso es que la memoria está corrupta&#8221; o &#8220;A lo mejor  el disco duro tiene clusters defectuosos&#8221;). La mayoría de las veces  suele ser problema del programa, no del hardware.</li>
<li><span style="text-decoration: underline;">Ejemplo</span>: Siempre me acuerdo de un antiguo compañero de  trabajo que a menudo, cuando encontraba algún problema en Java  aparentemente inexplicable, culpaba a la Java Virtual Machine. &#8220;<span style="text-decoration: underline;">Tiene que ser un error de la JVM!!</span>&#8221; &#8211; decía. Siempre se confirmó que eran errores suyos en el código.</li>
</ul>
<p><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: x-large;">Consejo 5: A veces es más fácil hallar la solución que la causa</span></span></p>
<div style="font-size: medium; margin: 0px;">En ocasiones la gente se  ofusca tratando de buscar la causa a un problema. Pasan días tratando de  encontrar el por qué&#8230; cuando a veces existe un &#8220;atajo&#8221; (los ingleses  lo llaman <em>workaround</em>) que te hace solucionar el problema, aunque  no encuentres qué era lo que lo producía. Hay ocasiones en las que hay  que saber rendirse ante el enemigo, y siendo prácticos, dejar atrás  nuestra necesidad innata de conocer el por qué de las cosas. Ojo porque  tampoco hay que abusar de esto, puede convertirse en un arma de doble  filo (cada uno tiene que saber poner límites prácticos a su curiosidad,  sobre todo si te pagan por producir <img src='http://www.perezrio.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </div>
<ul>
<li><span style="text-decoration: underline;">Ejemplo</span>:  Un conocido tenía un problema con un programa en Java que se suponía  que era compatible con la JDK1.3 y superiores. El tipo llevaba semanas  persiguiendo el problema ejecutando el software con la JDK1.4, y no era  capaz de encontrar la causa. Después de varios intentos fallidos de  conocer la causa, le pregunté si había probado a ejecutarlo con la  JDK1.3. Su respuesta fue que la 1.4 era compatible con versiones  anteriores, por tanto si funcionaba con la 1.3 debería de hacerlo con la  1.4. &#8220;Muy bien&#8221; &#8211; le dije &#8211; &#8220;¿pero lo has probado?&#8221;. Insistí en ello, y  al probarlo con la 1.3 el error dejó de producirse. Nos quedamos con  ganas de saber qué es lo que producía el error&#8230; pero solucionamos el  problema!</li>
<li><span style="text-decoration: underline;">Ejemplo</span>: La semana pasada un tipo me llamó porque estaba  detectando errores de intentos fallidos en la conexión a SQL Server en  un servidor. Después de darle muchas vueltas, probé a detener el  servicio &#8220;Microsoft Reporting Services&#8221;, y el error dejó de producirse.  El tipo dijo: &#8220;<em>¿Pero por qué ese servicio trata de conectarse a SQL Server? No lo entiendo</em>&#8220;, a lo cuál le respondí con otra pregunta: &#8220;<em>¿Usas el servicio de Reporting Services o lo vas a usar en un futuro?</em>&#8220;. &#8220;<em>No</em>&#8221; &#8211; respondió. &#8220;<em>Entonces me da igual saber por qué trata de conectarse, dejamos el servicio apagado y problema solucionado</em>&#8220;.</li>
</ul>
<p><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: x-large;">Consejo 6: Si ayer funcionaba y hoy no, algo ha cambiado</span></span></p>
<div style="margin: 0px;">Cuando alguien viene a mi con la típica frase &#8220;<em>Pero si ayer funcionaba y no ha cambiado nada!</em>&#8221; siempre le respondo lo mismo: &#8220;<em>Como mínimo ha cambiado algo: La fecha</em>&#8220;.  Si estás en la típica situación en la que te fuiste el día anterior  dejando algo funcionando y hoy ya no funciona, intenta pensar <strong>verdaderamente </strong>qué  puede haber cambiado, y echa para atrás todo lo que haya cambiado para  volver a la situación en la que funcionaba. Después vuelve a hacer los  cambios probando uno a uno, para ver cuál es el que introduce el  problema.</div>
<ul>
<li><span style="text-decoration: underline;">Ejemplo</span>: El día 19 de Septiembre estuve mejorando el Crawler para el BOCM del proyecto <a href="http://www.booletin.es/">www.booletin.es</a>. Para identificar hasta dónde llega la fecha de un boletín en una cadena de texto (Por ej: &#8220;19<em> de Septiembre de 2010. Bla bla bla</em>&#8220;), estaba buscando &#8220;<em>20</em>&#8221;  en la cadena de texto, y así identificaba dónde se encontraba el año en  la fecha, y sabía por dónde cortar. Todo funcionaba bien con los  boletines desde el 1 de Septiembre hasta el 19. Sin embargo, al día  siguiente (20 de Septiembre) volví a probar el programa y fallaba. &#8220;<em>Pero si no he cambiado nada!</em>&#8220;-  pensé. Sin embargo sí que había cambiado algo, el día del mes. El  algoritmo funcionaba con todos los días del mes menos el día 20, ya que  cortaba la cadena &#8220;<em>20 de Septiembre de 2010. Bla bla bla</em>&#8221; justo después del primer &#8220;<em>20</em>&#8220;, y no después del año como pretendía.</li>
</ul>
<p><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: x-large;">Consejo 7: Pregúntale (bien) a Google</span></span></p>
<div>No creo que exagere si afirmo que el 90% de los problemas extraños  se resuelven sabiendo buscar correctamente en Google. Cuando nos  enfrentamos a un problema, lo más probable es que ya le haya pasado  antes a alguien. Internet está lleno de foros en los que la gente  plantea sus dudas/problemas, y en los que hay multitud de respuestas a  ellos.Cuando me enfrento con un problema y ando perdido, acudo a Google y  le pregunto. Es muy importante <strong>saber buscar bien</strong>, para encontrar lo que buscas. Para buscar algo, trato de buscar<strong> palabras distintivas </strong>de  lo que ando buscando (es decir, palabras que debería de contener el  documento que estoy buscando, y no deberían de contenerlas otros  documentos que no busco).</div>
<div>
<ul>
<li><span style="text-decoration: underline;">Ejemplo</span>: La semana  pasada un compañero de trabajo experto en tecnología J2EE (un arquitecto  de los buenos) estaba buscando la solución a un problema con la  herramienta Maven. Llevaba más de dos horas buscando en google y no  encontraba nada. Me pidió que le echase una mano, y en cinco minutos  (buscando los términos correctos en google) dimos con la solución.</li>
</ul>
<p>A veces pienso que deberían darse cursos sobre cómo utilizar  correctamente los buscadores, sería el tiempo mejor invertido por muchos  (como dicen los economistas, tendría un ROI muy atractivo, se  recuperaría la inversión en cuestión de días y el resto de la vida sería  todo ganancias <img src='http://www.perezrio.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> .</div>
<div></div>
<div><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: x-large;">Consejo 8: Si no hay más remedio, baja de nivel de abstracción</span></span></div>
<div>Cuando  todo lo demás falla y el problema parece inexplicable, debemos  plantearnos que a lo mejor estamos buscando en el lugar inadecuado.  Siempre que hablamos de tecnología, nos movemos en un determinado nivel  de abstracción (Ej: Hardware &lt; BIOS &lt; Sistema Operativo &lt; JVM  &lt; Programa Java) . En ocasiones el problema que estamos buscando no  está en el nivel de abstracción en el que nos movemos, sino en un nivel  inferior (por ej. a veces buscamos un error en el programa&#8230; y el error  está en el Sistema Operativo). Tenemos que bajar a buscarlo ahí.</div>
<div>
<ul>
<li><span style="text-decoration: underline;">Ejemplo</span>:  Esta semana he tenido un problema en un servidor: Al ejecutar un  programa en este servidor se quedaba colgado. Sin embargo al ejecutarlo  en mi máquina local (con la misma configuración) el programa funcionaba  sin problemas. Finalmente, el problema no estaba en el programa, ni  siquiera en el Sistema Operativo&#8230; pero tampoco en el Hardware!. El  problema estaba en un nivel de abstracción que se encontraba escondido  entre el Sistema Operativo y el Hardware. Resulta que se trataba de un  servidor virtual, que se estaba ejecutando como una máquina virtual de  VMWare. VMWare estaba teniendo problemas con el acceso a la cabina de  discos, y esto estaba causando el fallo en la ejecución.</li>
</ul>
</div>
<div><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: x-large;">Consejo 9: Muchos ojos ven más que dos</span></span></div>
<p>Cuando  estés atascado, pregunta!. Aunque pienses que las personas a las que  puedes consultar no tengan la respuesta a tu problema, quizás te puedan  aportar alguna pista (o a lo mejor tienen la respuesta y tú no lo  sabes). Como poco, el contárselo a alguien te servirá también para  aclarar tus propias ideas.</p>
<ul>
<li><span style="text-decoration: underline;">Ejemplo</span>: Esta anécdota es de mis favoritas. Hace muchos  años hice una aplicación en Java que tenía que realizar un cálculo para  cada hora de cada día del año. El programa empezaba con las 00:00h del 1  de Enero, e iba incrementando hora a hora hasta que acababa a las  23:00h del 31 de Diciembre. Al ejecutar el programa e ir incrementando  hora a hora, llegaba un momento en el que se realizaba el cálculo <strong>dos veces para la misma hora</strong>.  Yo no entendía qué podía estar pasando, ya que el programa funcionaba  bien, pero en un momento concreto del tiempo (el 29 de Octubre de 2000)  se duplicaba la hora. Después de dos días persiguiendo el fallo, me  levanté muy enfadado de la silla y grité en alto &#8220;<strong>¿Pero qué demonios pasa el 29 de Octubre?</strong>&#8220;.  Para mi sorpresa, un compañero me miró y me dijo muy tranquilo: &#8220;ese  día es el cambio de hora&#8221;. Claro! No había caído en la cuenta de que el  29 de Octubre de ese año era el día en que se retrasaba la hora, por lo  que a las 3h de la madrugada volvían a ser las 2h&#8230; y de ahí el hecho  de que se duplicase. Mi compañero había dado en dos segundos con la  solución al problema que yo llevaba buscando días.</li>
</ul>
<p><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: x-large;">Consejo 10: A veces la mejor solución a un problema es irse a dormir</span></span></p>
<div style="margin: 0px;">Muchas veces nos obcecamos en resolver un  problema, alargando la jornada hasta las tantas de la madrugada buscando  la solución. Después de muchos años he aprendido que a veces la mejor  solución es descansar. Cuando te levantas por la mañana, tienes la mente  fresca y lúcida, y en ocasiones se te ocurren vías de solución que por  la noche no habías imaginado. En otras ocasiones, mientras duermes, el  cerebro sigue dándole vueltas al asunto y se aclaran las ideas: ¿a quién  no le ha pasado el irse a dormir con un problema en la cabeza y  levantarse con la solución?:</div>
<ul>
<li><span style="text-decoration: underline;">Ejemplo</span>:  De pequeño solía jugar mucho al ajedrez. Con 13 años acostumbraba a  resolver problemas de ajedrez complejos, buscando soluciones  imaginativas a los problemas que se planteaban en libros y revistas. En  una ocasión estuve varias horas pensando sobre un problema de &#8220;mate en  4&#8243; sin encontrar solución. Mi sorpresa fue cuándo me fui a acostar, y  por la mañana me desperté habiendo encontrado la solución al problema  (la cabeza había estado trabajando solita por la noche!).</li>
</ul>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.perezrio.com/2010/11/17/consejos-de-programacion/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mono 2.0, ejecuta .NET en Linux</title>
		<link>http://www.perezrio.com/2008/10/11/mono-20-ejecuta-net-en-linux/</link>
		<comments>http://www.perezrio.com/2008/10/11/mono-20-ejecuta-net-en-linux/#comments</comments>
		<pubDate>Sat, 11 Oct 2008 16:51:16 +0000</pubDate>
		<dc:creator>rubio</dc:creator>
				<category><![CDATA[Natureza]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[mono]]></category>
		<category><![CDATA[programacion]]></category>

		<guid isPermaLink="false">http://www.perezrio.com/?p=223</guid>
		<description><![CDATA[El proyecto Mono trata de ofrecer una plataforma de desarrollo similar a la que .NET ofrece en Windows. La compatibilidad entre ambas iniciativas es notable y ha aumentado de forma crítica en esta última revisión de Mono, que da soporte a C# 3.0 en Linux y Mac OS X. Esta implementación de Código Abierto de [...]]]></description>
			<content:encoded><![CDATA[<p>El proyecto <a title="http://www.mono-project.com/Main_Page" href="http://www.mono-project.com/Main_Page" target="_blank">Mono</a> trata de ofrecer una plataforma de desarrollo similar a la que .NET ofrece en Windows. La compatibilidad entre ambas iniciativas es notable y ha aumentado de forma crítica en esta última revisión de Mono, que da soporte a C# 3.0 en Linux y Mac OS X.</p>
<p>Esta implementación de Código Abierto de la plataforma .NET de Microsoft lleva ya años en el candelero, pero en esta última e importante edición, Mono 2.0 ofrece una mejora muy importante: la compatibilidad con .NET 2.0 y con C# 3.0 en una amplia gama de plataformas y arquitecturas.</p>
<p> </p>
<p>La idea de Mono fue de Miguen de Icaza, creador también del escritorio GNOME y que es uno de los personajes más célebres del panorama Open Source. Con esta nueva versión se han incluido compiladores para C# 3.0 y Visual Basic 8, y además también se da soporte a APIs como Windows.Forms 2.0 para el desarrollo de aplicaciones de escritorio.</p>
<p>Visto en <a title="http://www.theinquirer.es/2008/10/08/mono-20-ejecuta-net-en-linux.html" href="http://www.theinquirer.es/2008/10/08/mono-20-ejecuta-net-en-linux.html" target="_blank">theinquirer.es</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.perezrio.com/2008/10/11/mono-20-ejecuta-net-en-linux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>20 recursos para programadores de PHP</title>
		<link>http://www.perezrio.com/2008/07/29/20-recursos-para-programadores-de-php/</link>
		<comments>http://www.perezrio.com/2008/07/29/20-recursos-para-programadores-de-php/#comments</comments>
		<pubDate>Tue, 29 Jul 2008 17:13:14 +0000</pubDate>
		<dc:creator>rubio</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Nuevas tecnologías]]></category>
		<category><![CDATA[Software Libre]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programacion]]></category>

		<guid isPermaLink="false">http://www.perezrio.com/2008/07/29/20-recursos-para-programadores-de-php/</guid>
		<description><![CDATA[Visto en: Linuxhispano Muchos de vosotros habréis tenido alguna vez que programar en PHP y otros muchos que no lo hayáis hecho os interesará hacerlo. A través de Danubuntu, que a su vez es una traducción del original en inglés en Mashtable, encuentro este interesante post donde se muestran 20 interesantes recursos para todos los [...]]]></description>
			<content:encoded><![CDATA[<p>Visto en: <a href="http://linuxhispano.net/portal/node/186" title="http://linuxhispano.net/portal/node/186" target="_blank">Linuxhispano</a></p>
<p>Muchos de vosotros habréis tenido alguna vez que programar en PHP y otros muchos que no lo hayáis hecho <span style="text-decoration: line-through"></span>os interesará hacerlo. A través de <a href="http://danubuntu.wordpress.com/2008/07/24/20-recursos-para-programadores-de-php/" target="_blank">Danubuntu</a>, que a su vez es una traducción del original en inglés en <a href="http://mashable.com/2007/09/26/php-toolbox/" target="_blank">Mashtable</a>, encuentro este interesante post donde se muestran 20 interesantes recursos para todos los que programamos o queremos programar con el lenguaje del lado del servidor que más ha cambiado la red en los últimos años, PHP:</p>
<ol>
<li><a href="http://killerphp.com/" title="KillerPHP.com">KillerPHP.com</a> &#8211; Página con unos 20 vídeo tutoriales de PHP que enseñan desde los pasos básicos de PHP hasta las técnicas más avanzadas.</li>
<li><a href="http://phpvideotutorials.com/" title="PHPVideoTutorials.com">PHPVideoTutorials.com</a> &#8211;  13 vídeo tutoriales sobre PHP (duran entre 6 y 22 minutos).</li>
<li><a href="http://www.xml.lt/Resources/Framework" title="DIY Framework">DIY Framework</a> &#8211; Entorno de desarrollo PHP minimalista.</li>
<li><a href="http://www.phpbuddy.com/" title="PHPBuddy.com">PHPBuddy.com</a> &#8211; Sitio lleno de recursos para el desarrollador principiante de PHP, incluyendo muchos scripts para ayudar a salvar los obstáculos del principiante.</li>
<li><a href="http://c.anvas.es/">Canvas</a> &#8211; Un entorno de desarrollo para PHP5 con la facilidad de uso como principal atractivo.</li>
<li><a href="http://www.codeigniter.com/" title="CodeIgniter">CodeIgniter</a> &#8211; Un entorno de desarrollo PHP pensando especialmente para páginas alojadas en servidores compartidos.</li>
<li><a href="http://www.horde.org/horde/" title="Horde.org">Horde.org</a> &#8211; Otro entorno de desarrollo de aplicaciones PHP. Tiene facilidades para otros idiomas que no sean el inglés.</li>
<li><a href="http://www.phpopenbiz.org/jim/" title="PHPOpenBiz">PHPOpenBiz</a> &#8211; Entorno de desarrollo PHP centrado en aplicaciones para empresas.</li>
<li><a href="http://www.dagondesign.com/articles/secure-php-form-mailer-script/" title="formularios PHP de DagonDesign">Script para formularios de DagonDesign</a> &#8211; Script en PHP para ayudarte a crear formularios de cualquier longitud.</li>
<li><a href="http://www.coders4fun.com/en/" title="Coders4fun">Coders4fun</a> &#8211; Blog sobre programación que incluye un montón de pequeños fragmentos de código PHP para ayudarte a aprender nuevos trucos.</li>
<li><a href="http://www.phpclasses.org/" title="PHPClasses.org">PHPClasses.org</a> &#8211; Unos cuantos scripts PHP para ahorrarte el trabajo de programar las tareas más simples.</li>
<li><a href="http://php.resourceindex.com/" title="The PHP Resource Index">The PHP Resource Index</a> &#8211; Gran cantidad de recursos; a destacar su archivo de más de 3600 scripts de PHP para todo lo que puedas imaginar.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.perezrio.com/2008/07/29/20-recursos-para-programadores-de-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>La versión 2.0 de Mono facilitará la migración de aplicaciones a plataformas libres</title>
		<link>http://www.perezrio.com/2008/05/18/la-version-20-de-mono-facilitara-la-migracion-de-aplicaciones-a-plataformas-libres/</link>
		<comments>http://www.perezrio.com/2008/05/18/la-version-20-de-mono-facilitara-la-migracion-de-aplicaciones-a-plataformas-libres/#comments</comments>
		<pubDate>Sun, 18 May 2008 10:02:19 +0000</pubDate>
		<dc:creator>rubio</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Nuevas tecnologías]]></category>
		<category><![CDATA[Software Libre]]></category>
		<category><![CDATA[Traballo]]></category>
		<category><![CDATA[desarrollo]]></category>
		<category><![CDATA[mono]]></category>
		<category><![CDATA[programacion]]></category>

		<guid isPermaLink="false">http://www.perezrio.com/2008/05/18/la-version-20-de-mono-facilitara-la-migracion-de-aplicaciones-a-plataformas-libres/</guid>
		<description><![CDATA[El proyecto Mono viene de anunciar que el API Windows.Forms es funcional y compatible con el disponible en .NET 2.0. Este API, que cuenta con 12.776 métodos, es en el que recaen las funcionalidades del manejo de ventanas en la plataforma .NET, y el hecho de disponer de una API al 100% permitirá que aplicaciones [...]]]></description>
			<content:encoded><![CDATA[<p align="justify">El <a href="http://www.mono-project.com/Main_Page" target="_blank" title="http://www.mono-project.com/Main_Page" _base_href="http://www.mancomun.org/">proyecto Mono</a> viene de anunciar que el API Windows.Forms es funcional y compatible con el disponible en .NET 2.0. Este API, que cuenta con 12.776 métodos, es en el que recaen las funcionalidades del manejo de ventanas en la plataforma .NET, y el hecho de disponer de una API al 100% permitirá que aplicaciones hasta lo de ahora disponibles sólo en plataformas Windows puedan ser ejecutadas en otros sistemas (GNU/Linux, Mac Los, Solaris, &#8230;).</p>
<p align="justify">
El desarrollo de esta implementación había dado comenzo el 8 de Julio de 2004 y llevó más de 6.400 añadidos en el SVN incluso la actual versión 1.9.1 (2.0 Beta). Actualmente hay tres backends para X11, OSX y Win32, se están a hacer avances en el marco del <a href="http://code.google.com/p/google-highly-open-participation-mono/" target="_blank" title="http://code.google.com/p/google-highly-open-participation-mono/" _base_href="http://www.mancomun.org/">Google Summer of Code</a> para la integración con los sistemas operativos, mejorando el soporte para accesibilidade y automatización de la interface gráfica, incluyendo soporte RTL y otras <a href="http://tirania.org/blog/archive/2008/May-13.html" target="_blank" title="http://tirania.org/blog/archive/2008/May-13.html" _base_href="http://www.mancomun.org/">noticias características</a>.</p>
<p align="justify">&nbsp;</p>
<p align="justify">Winforms 2.0 era la pieza que faltaba para completar los objetivos para la versión Mono 2.0. La versión actual está en beta y avisan que es posible que aparezcan <a href="http://www.mono-project.com/Bugs" target="_blank" title="http://www.mono-project.com/Bugs" _base_href="http://www.mancomun.org/">bugs</a>.</p>
<p>Fuente:<br />
<a href="http://www.go-mono.com/monologue/" target="_blank" title="http://www.go-mono.com/monologue/" _base_href="http://www.mancomun.org/">Planet de Mono.NET</a></p>
<p>Mancomun.org</p>
<p><a href="http://www.go-mono.com/monologue/" target="_blank" title="http://www.go-mono.com/monologue/" _base_href="http://www.mancomun.org/"></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.perezrio.com/2008/05/18/la-version-20-de-mono-facilitara-la-migracion-de-aplicaciones-a-plataformas-libres/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cómo borrar la caché de credenciales de Eclipse</title>
		<link>http://www.perezrio.com/2008/03/01/como-borrar-la-cache-de-credenciales-de-eclipse/</link>
		<comments>http://www.perezrio.com/2008/03/01/como-borrar-la-cache-de-credenciales-de-eclipse/#comments</comments>
		<pubDate>Sat, 01 Mar 2008 10:50:47 +0000</pubDate>
		<dc:creator>rubio</dc:creator>
				<category><![CDATA[Apple]]></category>
		<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Nuevas tecnologías]]></category>
		<category><![CDATA[Software Libre]]></category>
		<category><![CDATA[Traballo]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[programacion]]></category>

		<guid isPermaLink="false">http://www.perezrio.com/2008/03/01/como-borrar-la-cache-de-credenciales-de-eclipse/</guid>
		<description><![CDATA[Si trabajas con Eclipse y Subversion (plugin Subclipse) tal vez te haya pasado: has metido mal el login y/o password en la ventana de autenticación y quieres poner el correcto. O bien, has puesto el correcto pero al día siguiente te comunican que ha cambiado. Eclipse no te dejará cambiarlo, se acordará constantemente del viejo. [...]]]></description>
			<content:encoded><![CDATA[<p>Si trabajas con Eclipse y Subversion (plugin Subclipse) tal vez te haya pasado: has metido mal el login y/o password en la ventana de autenticación y quieres poner el correcto. O bien, has puesto el correcto pero al día siguiente te comunican que ha cambiado. Eclipse no te dejará cambiarlo, se acordará constantemente del viejo. ¿Cómo arreglarlo? Borrándole la memoria <img src='http://www.perezrio.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  Es decir, borrando el fichero caché de credenciales que en mi PC se guarda aquí:</p>
<p>~/.eclipse/org.eclipse.platform_3.3.0_1543616141/configuration/org.eclipse.core.runtime/.keyring</p>
<p>Espero que al menos os sirva para ahorraros el quebradero de cabeza que he sufrido (y a mí para recordarlo en el futuro…)</p>
<p>Visto en: <a href="http://diariolinux.com" title="http://diariolinux.com" target="_blank">DiarioLinux.com</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.perezrio.com/2008/03/01/como-borrar-la-cache-de-credenciales-de-eclipse/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JEdit, Editor para programadores</title>
		<link>http://www.perezrio.com/2007/12/15/jedit-editor-para-programadores/</link>
		<comments>http://www.perezrio.com/2007/12/15/jedit-editor-para-programadores/#comments</comments>
		<pubDate>Sat, 15 Dec 2007 14:41:20 +0000</pubDate>
		<dc:creator>rubio</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Software Libre]]></category>
		<category><![CDATA[programacion]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.perezrio.com/2007/12/15/jedit-editor-para-programadores/</guid>
		<description><![CDATA[Generalmente cuando tengo que escribir codigo empleo Eclipse, pero cuando necesito tomar una nota rapida, o preparar una documentacion no empleo este entorno de desarrollo y prefiero usar un editor de texto mas liviano. Ultimamente he empezado a utilizar JEdit, es un editor de texto enfocado a programadores, pero tambien puede ser empleado por un [...]]]></description>
			<content:encoded><![CDATA[<p class="entry"><a href="http://ubuntulife.net/wordpress/wp-content/uploads/2007/12/jedit.jpg" title="jedit.jpg"><img src="http://ubuntulife.net/wordpress/wp-content/uploads/2007/12/jedit.jpg" alt="jedit.jpg" /></a></p>
<p>Generalmente cuando tengo que escribir codigo empleo <em>Eclipse</em>, pero cuando necesito tomar una nota rapida, o preparar una documentacion no empleo este entorno de desarrollo y prefiero usar un editor de texto mas liviano. Ultimamente he empezado a utilizar <a href="http://www.jedit.org/index.php">JEdit</a>, es un editor de texto enfocado a programadores, pero tambien puede ser empleado por un usuario normal, como sustituto a los editores de texto que vienen incorporados en el escritorio.</p>
<p>Soporta resaltado de <a href="http://www.jedit.org/index.php?page=features">sintaxis</a> para muchos lenguajes de programacion.</p>
<p>Me gusta pues es bastante extensible mediante Plugins. Hay plugins para formatear el texto, ejecutar SQL, e incluso para conectar y editar textos remotamente mediante FTP.</p>
<p>Nota: requiere de Java para que funcione en tu maquina. Para instalarlo realizamos los siguientes pasos:</p>
<p>Añadimos las siguientes lineas al fichero <strong>/etc/apt/sources.list </strong></p>
<pre>deb http://dl.sourceforge.net/sourceforge/jedit ./

deb-src http://dl.sourceforge.net/sourceforge/jedit ./</pre>
<p>Despues ejecutamos:</p>
<p><code>$ sudo apt-get update<br />
$ apt-get install jedit</code></p>
<p>Para iniciarlo ejecutamos:</p>
<p><code>$ jedit</code></p>
<p>No te olvides de añadir el plugin BufferTabs, te permite tener pestañas con todos los ficheros abiertos. Para añadirlo seleccionas la opcion: <strong>Plugins &gt; Plugin Manager &gt; Install </strong>y marcas para instalar la opcion “BufferTabs”.</p>
<p>Una vez instalado lo configuras desde  <strong>Plugins &gt; Plugins Options</strong>, por ejemplo cambiando la orientacion de las pestañas a la parte superior, por defecto aparecen en la parte inferior.</p>
<p><a href="http://www.jedit.org/index.php?page=screenshots">Pantallazos JEdit</a><br />
<a href="http://plugins.jedit.org/list.php">Listado de Plugins</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.perezrio.com/2007/12/15/jedit-editor-para-programadores/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

