<?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>PC Frikis &#187; Programación</title>
	<atom:link href="http://www.pcfrikis.com/category/programacion/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.pcfrikis.com</link>
	<description>Beta, como Goooogle</description>
	<lastBuildDate>Sat, 10 Apr 2010 10:42:11 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>APC y la cache de usuario</title>
		<link>http://www.pcfrikis.com/2010/01/11/apc-y-la-cache-de-usuario/</link>
		<comments>http://www.pcfrikis.com/2010/01/11/apc-y-la-cache-de-usuario/#comments</comments>
		<pubDate>Mon, 11 Jan 2010 22:25:04 +0000</pubDate>
		<dc:creator>Nenillo</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[Software Libre]]></category>
		<category><![CDATA[apc]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[memoria]]></category>
		<category><![CDATA[optimización]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.pcfrikis.com/?p=286</guid>
		<description><![CDATA[En un artículo anterior comentaba sobre el uso de APC para optimizar el rendimiento de los scripts PHP, de forma totalmente automática, sin modificar la programación. En ese caso APC se encargaba de almacenar una copia del bytecode de PHP para que en la próxima ejecución no fuese necesario interpretar de nuevo el código fuente. [...]]]></description>
			<content:encoded><![CDATA[<p>En un <a href="http://www.pcfrikis.com/2009/05/01/acelerando-php-con-apc/">artículo anterior</a> comentaba sobre el uso de APC para optimizar el rendimiento de los scripts PHP, de forma totalmente automática, sin modificar la programación. En ese caso APC se encargaba de almacenar una copia del bytecode de PHP para que en la próxima ejecución no fuese necesario interpretar de nuevo el código fuente.</p>
<p>Pero esa no es la única utilidad de APC, también se puede utilizar para almacenar en memoria por un tiempo determinado los datos que el programador desee. Este sistema es ideal para aplicaciones con mucha carga de base de datos ya que permite almacenar ciertos datos en memoria y aliviar la base de datos del sistema y por lo tanto, el disco duro (suponiendo que todos los servicios estén en la misma máquina).</p>
<p>Una vez instalado APC, tal como se explica en <a href="http://www.pcfrikis.com/2009/05/01/acelerando-php-con-apc/">este otro artículo</a>, el uso de la cache de usuario es extremadamente sencillo, básicamente hay que tener en cuenta dos funciones, apc_store y apc_fetch.</p>
<p>La función apc_store se encarga de almacenar datos en una determinada clave. Por ejemplo:</p>
<blockquote><p>$datos = 5;<br />
apc_store(&#8216;datos&#8217;,$datos,86400);</p></blockquote>
<p>Así de sencillo, con esa instrucción los datos quedarán guardados en memoria. El primer argumento es la clave que sirve para identificar los datos guardados y poder recuperarlos más tarde. El segundo parámetro son los valores que queremos guardar, ese parámetro puede ser cualquier variable PHP, desde enteros hasta arrays y objetos. El tercer argumento es el tiempo en segundos que APC mantendrá los datos en memoria. Superado ese tiempo los datos serán automáticamente borrados de la cache.</p>
<p>Ahora que los datos están en memoria, queda saber cómo recuperarlos. Es más sencillo todavía, se usa la función apc_fetch:</p>
<blockquote><p>$datos = apc_fetch(&#8216;datos&#8217;);</p></blockquote>
<p>A la función apc_fetch simplemente hay que pasarle la clave de los datos que queremos recuperar. Si no ha encontrado los datos devolverá &#8220;false&#8221;.</p>
<p>Esto puede usarse para almacenar los resultados de consultas que sean pesadas y evitar que se ejecuten una y otra vez si no es necesario. Por ejemplo, vamos a suponer que la tabla &#8220;posts&#8221; es muy grande y cuesta mucho ordenarla y filtrarla:</p>
<blockquote><p>$posts = apc_fetch(&#8216;posts-2010-ene-11&#8242;); // Se busca el contenido en la cache<br />
if(!$posts) {<br />
// Si el contenido no existe, se genera de nuevo<br />
$posts = array();<br />
$result = mysql_query(&#8220;SELECT * FROM posts WHERE fecha = &#8217;2010-01-11&#8242; ORDER BY titulo&#8221;);<br />
while($row = mysql_fetch_assoc($result)) $posts[] = $row;<br />
apc_store(&#8216;posts-2010-ene-11&#8242;,$posts,300); // Se guardan los posts en la cache durante 5 minutos<br />
}</p></blockquote>
<p style="text-align: left;">Eso es todo, el uso de la cache de usuario de APC es muy sencillo. Hay algunas otras funciones que se pueden ver desde <a href="http://php.net/apc">http://php.net/apc</a></p>
<p style="text-align: left;">También es interesante revisar el fichero apc.php para saber cómo está trabajando la cache.</p>
<p style="text-align: center;">
<div id="attachment_287" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.pcfrikis.com/wp-content/uploads/2010/01/apc.png" rel="lightbox[286]"><img class="size-medium wp-image-287" title="Monitorizando APC" src="http://www.pcfrikis.com/wp-content/uploads/2010/01/apc-300x201.png" alt="Monitorizando APC" width="300" height="201" /></a><p class="wp-caption-text">Monitorizando APC</p></div>
]]></content:encoded>
			<wfw:commentRss>http://www.pcfrikis.com/2010/01/11/apc-y-la-cache-de-usuario/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Uso de INSERT DELAYED en MySQL</title>
		<link>http://www.pcfrikis.com/2009/12/16/uso-de-insert-delayed-en-mysql/</link>
		<comments>http://www.pcfrikis.com/2009/12/16/uso-de-insert-delayed-en-mysql/#comments</comments>
		<pubDate>Wed, 16 Dec 2009 22:01:54 +0000</pubDate>
		<dc:creator>Nenillo</dc:creator>
				<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://www.pcfrikis.com/?p=276</guid>
		<description><![CDATA[En MySQL cuando se realiza un operación INSERT el gestor de bases de datos realiza la inserción del registro que se le haya indicado y además devuelve la id del registro si se está trabajando con una tabla que tiene un campo auto_increment. Esta operación, para mantener la consistencia y además poder ofrecer la última [...]]]></description>
			<content:encoded><![CDATA[<p>En MySQL cuando se realiza un operación INSERT el gestor de bases de datos realiza la inserción del registro que se le haya indicado y además devuelve la id del registro si se está trabajando con una tabla que tiene un campo auto_increment. Esta operación, para mantener la consistencia y además poder ofrecer la última id, se queda en espera hasta que MySQL haya acabado de realizar la inserción.</p>
<blockquote><p>mysql_query(&#8220;INSERT INTO usuarios (usuario,historial) VALUES (5,&#8217;Lorem ipsum&#8230;.&#8217;)&#8221;);<br />
// PHP espera. El resto del código no se ejecutará hasta que no termine la operación</p></blockquote>
<p>En muchos casos esto es lo ideal, ya que se suele necesitar la id que devuelve la inserción o también es posible que después de ese insert sea necesario realizar más operaciones que dependan de ese INSERT.</p>
<p>Pero en otros casos no es necesario para seguir trabajando ni la id que devuelve la inserción ni los querys siguientes dependen del último INSERT, en esos casos lo que premia es la velocidad, lanzar la instrucción de inserción y seguir trabajando sin esperar a que finalice. Para eso se puede usar INSERT DELAYED, la instrucción es completamente igual que un INSERT tradicional pero añadiendo la palabra clave &#8220;DELAYED&#8221;. Por ejemplo:</p>
<blockquote><p>mysql_query(&#8220;INSERT DELAYED INTO usuarios (usuario,historial) VALUES (5,&#8217;Lorem ipsum&#8230;.&#8217;)&#8221;);<br />
// PHP no espera. El código que haya a continuación se ejecuta sin esperar a que MySQL termine</p></blockquote>
<p>Es muy útil si en un script o aplicación (sea PHP, Python, Ruby, C o cualquier otro) necesitas insertar cientos o miles de registros sin que se quede bloqueada la aplicación esperando la inserción de cada uno de los registros. Mediante INSERT DELAYED la aplicación manda la instrucción a MySQL y éste ya se encargará de insertar los registros en la base de datos en el mejor momento. También es muy útil en servidores con mucha carga, ya que de esta manera MySQL busca el mejor momento para realizar los inserts y no justo cuando se hace la petición.</p>
<p><strong>NOTA</strong>: Sólo funciona en tablas MyISAM y MEMORY. No funciona en otros motores como por ejemplo InnoDB.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pcfrikis.com/2009/12/16/uso-de-insert-delayed-en-mysql/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Acelerando PHP con Alternative PHP Cache (APC)</title>
		<link>http://www.pcfrikis.com/2009/05/01/acelerando-php-con-apc/</link>
		<comments>http://www.pcfrikis.com/2009/05/01/acelerando-php-con-apc/#comments</comments>
		<pubDate>Fri, 01 May 2009 22:11:54 +0000</pubDate>
		<dc:creator>Nenillo</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[Servidores]]></category>
		<category><![CDATA[Web 2.0]]></category>
		<category><![CDATA[acelerador]]></category>
		<category><![CDATA[apc]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[optimización]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.pcfrikis.com/?p=153</guid>
		<description><![CDATA[En estos tiempos de Web 2.0 las aplicaciones online requieren cada vez un mejor rendimiento por parte del servidor. El mundo de la optimización de aplicaciones es un tema que da mucho para hablar, hay soluciones complejas que requieren replantear gran parte del proyecto y otras que se pueden aplicar en unos pocos minutos. Una [...]]]></description>
			<content:encoded><![CDATA[<p>En estos tiempos de Web 2.0 las aplicaciones online requieren cada vez un mejor rendimiento por parte del servidor. El mundo de la optimización de aplicaciones es un tema que da mucho para hablar, hay soluciones complejas que requieren replantear gran parte del proyecto y otras que se pueden aplicar en unos pocos minutos.</p>
<p>Una de esas optimizaciones rápidas de aplicar es mejorar la manera en la que son ejecutadas las aplicaciones PHP, para webs desarrolladas en este lenguaje, obviamente.</p>
<p>Aunque PHP sea un lenguaje interpretado, es decir, que no necesitamos más que subir los ficheros .php y directamente el intérprete se encarga de ejecutarlos, sin necesidad de haberlos compilado previamente. Pero en realidad, lo que hace el intérprete es &#8220;parsear&#8221; el código, compilarlo en bytecode y por último ejecutar este bytecode. Estas operaciones se realizan una y otra vez por una petición que se hace a un script PHP. Viendo esto, sin mucho esfuerzo podemos pensar que lo más lógico sería &#8220;parsear&#8221; y compilar en bytecode el código fuente una sola vez, mantener en memoria el bytecode mientras no se modifique el código fuente y ejecutar solamente el bytecode por cada petición.</p>
<p>Pues bien, esto es lo que hace APC. Este sistema reserva una zona de la memoria para cachear bytecodes. Cuando llega una petición a un fichero PHP, APC revisa si ese fichero ya está en la cache, si está en cache y el fichero no se ha modificado desde la última vez que se cacheó, entonces se ejecuta el bytecode que hay en cache. Si no, APC se encargará de actualizar el bytecode en cache para que las próximas peticiones sean más rápidas.</p>
<p>¿Por qué APC? Hay otros sistemas que implementan el mismo concepto, <a href="http://en.wikipedia.org/wiki/PHP_accelerator">algunos de ellos se pueden ver comparados en la Wikipedia</a>, pero APC se ha convertido en el acelerador oficial de PHP, ya que va a ser integrado su desarrollo a partir de PHP 6. Además, es muy fácil de instalar como podemos comprobar a continuación.</p>
<p>Para instalar APC en Debian se pueden seguir los pasos siguientes. Aunque en otras distribuciones el procedimiento es muy similar.</p>
<p><strong>1 &#8211; Instalamos los paquetes necesarios</strong></p>
<p><em># apt-get install apache2-prefork-dev php5-dev php-pear</em></p>
<p><strong>2 &#8211; Ejecutamos pecl, el instalador de extensiones de php</strong></p>
<p><em># pecl install apc</em></p>
<p><strong>3 &#8211; Modificamos el fichero /etc/php5/apache2/php.ini y añadimos al final:</strong></p>
<p><em>extension=apc.so</em></p>
<p><strong>4- Reiniciar apache</strong></p>
<p># /etc/init.d/apache2 restart</p>
<p>Listo. Para comprobar que todo ha funcionado correctamente tan solo tenemos que crear un fichero con la instrucción phpinfo(); para ver si aparece la extensión APC.</p>
<p style="text-align: center;"><img class="alignnone size-medium wp-image-154" title="APC phpinfo" src="http://www.pcfrikis.com/wp-content/uploads/2009/05/apc-phpinfo-259x300.gif" alt="APC phpinfo" width="259" height="300" /></p>
<p>Por último, para monitorizar el funcionamiento de APC podemos copiar el script que hay en /usr/share/php/apc.php a un directorio accesible desde http y al entrar en él http://xx.xx.xx.xx/apc.php, se pueden ver varios gráficos y tablas de información con el estado de APC. También es posible modificar el archivo apc.php para indicar una contraseña y así acceder a la zona privada con algunos datos más sobre el cacheo de scripts.</p>
<p>Después de haber instalado el APC en algunos servidores, la impresión es que la carga se ha reducido notablemente. Es una impresión personal, ya que no he tenido tiempo de hacer mediciones más serias.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pcfrikis.com/2009/05/01/acelerando-php-con-apc/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Migrar de PHP4 a PHP5</title>
		<link>http://www.pcfrikis.com/2007/07/25/migrar-de-php4-a-php5/</link>
		<comments>http://www.pcfrikis.com/2007/07/25/migrar-de-php4-a-php5/#comments</comments>
		<pubDate>Wed, 25 Jul 2007 09:17:28 +0000</pubDate>
		<dc:creator>Friki</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[Servidores]]></category>
		<category><![CDATA[Software Libre]]></category>

		<guid isPermaLink="false">http://www.pcfrikis.com/2007/07/25/migrar-de-php4-a-php5/</guid>
		<description><![CDATA[Dado que ya tiene fecha para el funeral nuestro querido PHP4 me decidí a migrar el servidor a PHP5. La instalación se hizo en un par de minutos gracias a la colaboración de Debian y Aptitude. PHP5 viene con el soporte para MySQL desactivado así que había que activarlo en php.ini Llegaba el momento de [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Dado que ya tiene fecha para el funeral nuestro querido PHP4 me decidí a migrar el servidor a PHP5</strong>. La instalación se hizo en un par de minutos gracias a la colaboración de Debian y Aptitude. PHP5 viene con el soporte para MySQL desactivado así que había que activarlo en php.ini</p>
<p><strong>Llegaba el momento de comprobar el resultado, todas las webs iban bien menos una (siempre tiene que haber alguien para joder la marrana)</strong>, daba problemas con los Warnings. Según parece PHP4 viene con estos avisos desactivados mientras que PHP5 si los muestra. La solución era fácil, editar el php.ini.</p>
<p><strong>Después de esto y algunos pequeños cambios más en el archivo de configuración (a gusto del consumidor) la migración ha sido un éxito</strong>, supongo que en parte porque casi todas las webs se basan en scripts precocinados y preparados para PHP5 aunque el único problema seria con los TAGS de PHP.</p>
<p><a href="http://www.hosting-facil.com/" title="Hosting-Facil" target="_blank">Hosting web con soporte PHP5</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.pcfrikis.com/2007/07/25/migrar-de-php4-a-php5/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Error con php y magic.mime</title>
		<link>http://www.pcfrikis.com/2007/06/09/error-con-php-y-magicmime/</link>
		<comments>http://www.pcfrikis.com/2007/06/09/error-con-php-y-magicmime/#comments</comments>
		<pubDate>Sat, 09 Jun 2007 13:52:44 +0000</pubDate>
		<dc:creator>Nenillo</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[Servidores]]></category>
		<category><![CDATA[Software Libre]]></category>

		<guid isPermaLink="false">http://www.pcfrikis.com/2007/06/09/error-con-php-y-magicmime/</guid>
		<description><![CDATA[Recientemente he actualizado mi distribución debian (unstable) y ahora al ejecutar cualquier script php siempre aparece el siguiente error: PHP Warning: mime_magic: type search/400 \\input text/x-tex invalid in Unknown on line 0 PHP Warning: mime_magic: type search/400 \\section text/x-tex invalid in Unknown on line 0 PHP Warning: mime_magic: type search/400 \\setlength text/x-tex invalid in Unknown [...]]]></description>
			<content:encoded><![CDATA[<p>Recientemente he actualizado mi distribución debian (unstable) y ahora al ejecutar cualquier script php siempre aparece el siguiente error:</p>
<p><em>PHP Warning:  mime_magic: type search/400       \\input         text/x-tex invalid in Unknown on line 0<br />
PHP Warning:  mime_magic: type search/400       \\section       text/x-tex invalid in Unknown on line 0<br />
PHP Warning:  mime_magic: type search/400       \\setlength     text/x-tex invalid in Unknown on line 0<br />
PHP Warning:  mime_magic: type search/400       \\documentstyle text/x-tex invalid in Unknown on line 0<br />
PHP Warning:  mime_magic: type search/400       \\chapter       text/x-tex invalid in Unknown on line 0<br />
PHP Warning:  mime_magic: type search/400       \\documentclass text/x-tex invalid in Unknown on line 0<br />
PHP Warning:  mime_magic: type regex            [Cc]onstant[[:space:]]+[Ss]torytext/x-inform invalid in Unknown on line 0</em></p>
<p>La solución es bien sencilla, hay que ir al fichero /usr/share/file/magic.mime y comentar las siguientes líneas (ponerle un # delante):</p>
<p><em>#0      search/400      \\input         text/x-tex<br />
#0      search/400      \\section       text/x-tex<br />
#0      search/400      \\setlength     text/x-tex<br />
#0      search/400      \\documentstyle text/x-tex<br />
#0      search/400      \\chapter       text/x-tex<br />
#0      search/400      \\documentclass text/x-tex  </em></p>
<p>Y esta:</p>
<p><em> #0      regex           [Cc]onstant[[:space:]]+[Ss]tory text/x-inform</em></p>
<p>Una vez guardado el archivo ya no ocurrirá más.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pcfrikis.com/2007/06/09/error-con-php-y-magicmime/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Desarrollo de videojuegos: El camino a seguir</title>
		<link>http://www.pcfrikis.com/2007/06/05/desarrollo-videojuegos-camino-a-seguir/</link>
		<comments>http://www.pcfrikis.com/2007/06/05/desarrollo-videojuegos-camino-a-seguir/#comments</comments>
		<pubDate>Tue, 05 Jun 2007 19:09:22 +0000</pubDate>
		<dc:creator>Nenillo</dc:creator>
				<category><![CDATA[Consolas]]></category>
		<category><![CDATA[Juegos]]></category>
		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://www.pcfrikis.com/2007/06/05/desarrollo-videojuegos-camino-a-seguir/</guid>
		<description><![CDATA[Me pareció realmente interesante el artículo de Geoff Howland, fundador de Lupine Games, que opina, en resumidas cuentas, que para aprender a hacer juegos hay que hacer juegos, ni más ni menos. Aparte de aprender a programar, hay que programar videojuegos, pero no querer programar un Quake, un World of Warcraft o un Need For [...]]]></description>
			<content:encoded><![CDATA[<p>Me pareció realmente interesante el artículo de Geoff Howland, fundador de <a href="http://en.wikipedia.org/wiki/Lupine_Games" target="_blank">Lupine Games</a>, que opina, en resumidas cuentas, que para aprender a hacer juegos hay que hacer juegos, ni más ni menos. Aparte de aprender a programar, hay que programar videojuegos, pero no querer programar un Quake, un World of Warcraft o un Need For Speed, hay que empezar por lo sencillo. Empieza haciendo juegos sencillos que te permitan empezar a adentrarte en los conceptos del arte de crear videojuegos.</p>
<p>El autor recomienda empezar haciendo un Tetris,  seguidamente un Breakout, un Pac-Man, un juego con scroll tipo Super Mario, etc. No soy ningún experto en desarrollo de videojuegos, de hecho mi experienca es mínima, pero estoy totalmente de acuerdo con este camino. Para tu primer juego, será mucho más fácil de alcanzar un juego tipo Tetris que no un Half Life, marcarse un objetivo razonable hará que sea más fácil llegar a un juego aceptable, jugable y que además te habrá permitido aprender muchos conceptos básicos. En el Tetris por ejemplo puedes aprender lo que es el bucle principal del juego, los casos especiales (selección de opciones, final del juego, etc). Cada juego te aportará un nivel más de experiencia, un peldaño más hacia la cima del desarrollador de videojuegos.</p>
<p><a href="http://www.gamedev.net/reference/design/features/makegames/default.asp" target="_blank">El artículo</a> puede leerse completo en GameDev.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pcfrikis.com/2007/06/05/desarrollo-videojuegos-camino-a-seguir/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Firebug: La evolución del desarrollo web</title>
		<link>http://www.pcfrikis.com/2007/06/04/firebug-la-evolucion-del-desarrollo-web/</link>
		<comments>http://www.pcfrikis.com/2007/06/04/firebug-la-evolucion-del-desarrollo-web/#comments</comments>
		<pubDate>Mon, 04 Jun 2007 18:36:33 +0000</pubDate>
		<dc:creator>Nenillo</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Software Libre]]></category>
		<category><![CDATA[Web 2.0]]></category>

		<guid isPermaLink="false">http://www.pcfrikis.com/2007/06/04/firebug-la-evolucion-del-desarrollo-web/</guid>
		<description><![CDATA[Si alguna vez has tenido que desarrollar alguna aplicación web con gran cantidad de código JavaScript seguro que te has encontrado con algún error. Seguramente te habrás dado cuenta de que en esos casos IE no es tu mejor aliado. Los mensajes de error que genera el IE son bastante malos en mi opinión, en [...]]]></description>
			<content:encoded><![CDATA[<p>Si alguna vez has tenido que desarrollar alguna aplicación web con gran cantidad de código JavaScript seguro que te has encontrado con algún error. Seguramente te habrás dado cuenta de que en esos casos IE no es tu mejor aliado. Los mensajes de error que genera el IE son bastante malos en mi opinión, en algunos casos no acierta ni la línea que contiene el error.</p>
<p>Si en vez de IE pruebas suerte con firefox, almenos tienes una consola donde aparece un error mucho más detallado y al hacer doble click en él vas al código problemático directamente.</p>
<p>Pero aún así, esto se puede mejorar muchísimo, gracias a <a href="http://www.getfirebug.com/">firebug</a>, una extensión de firefox que permite ver errores de javascript detalladamente, ejecutar código al vuelo, ver todo el árbol DOM, añadir breakpoints, observar variables,ver las peticiones HTTP, incluso las de AJAX (esto es realmente útil) y hasta puedes ver cómo evoluciona el uso del ancho de banda que genera tu web al cargarse. También es de gran utilidad la herramienta &#8220;Inspect&#8221;, que te permite mediante el ratón seleccionar un área de la web y visualizar instantaneamente el código referente a ella. Otra característica a destacar es que puedes editar CSS al vuelo y se aplica instantaneamente en la web, ideal para hacer pruebas y dar espaciados, cambiar colores, tamaños, etc.</p>
<p>Te recomiendo que la pruebes, es totalmente libre y gratuita y te permitirá avanzar mucho más rápido en el desarrollo de tus páginas web.</p>
<p>Si no puedes desarrollar con firefox también puedes probar la <a href="http://www.getfirebug.com/lite.html">versión especial de firebug para otros navegadores</a>, incluido IE.</p>
<p align="center"><a href="http://www.pcfrikis.com/wp-content/uploads/2007/06/firebug-pcfrikis.png" title="Firebug en PC Frikis" rel="lightbox[130]"><img src="http://www.pcfrikis.com/wp-content/uploads/2007/06/firebug-pcfrikis.thumbnail.png" alt="Firebug en PC Frikis" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.pcfrikis.com/2007/06/04/firebug-la-evolucion-del-desarrollo-web/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>En JavaScript los arrays asociativos no existen</title>
		<link>http://www.pcfrikis.com/2007/01/22/en-javascript-los-arrays-asociativos-no-existen/</link>
		<comments>http://www.pcfrikis.com/2007/01/22/en-javascript-los-arrays-asociativos-no-existen/#comments</comments>
		<pubDate>Mon, 22 Jan 2007 18:35:39 +0000</pubDate>
		<dc:creator>Nenillo</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://www.pcfrikis.com/2007/01/22/en-javascript-los-arrays-asociativos-no-existen/</guid>
		<description><![CDATA[Sí, es cierto, lo acabo de descubrir, y luego explicaré los detalles, pero antes quiero contar qué es lo que me ha llevado a afirmar esto. La semana pasada me tocó analizar junto a un compañero un código JavaScript que no funcionaba correctamente, utilizaba arrays asociativos para almacenar distintas categorías, por ejemplo: var paises = [...]]]></description>
			<content:encoded><![CDATA[<p>Sí, es cierto, lo acabo de descubrir, y luego explicaré los detalles, pero antes quiero contar qué es lo que me ha llevado a afirmar esto.</p>
<p>La semana pasada me tocó analizar junto a un compañero un código JavaScript que no funcionaba correctamente, utilizaba arrays asociativos para almacenar distintas categorías, por ejemplo:</p>
<p>var paises = new Array();<br />
paises['es'] = &#8216;España&#8217;;<br />
paises['pt'] = &#8216;Portugal&#8217;;<br />
paises['us'] = &#8216;Estados Unidos&#8217;;<br />
paises['uk'] = &#8216;Reino Unido&#8217;;</p>
<p>Hasta aquí, todo parece normal, es un array asociativo, como clave guardo el código del país y como valor el nombre, igual que lo haría en PHP por ejemplo. Pero luego, al intentar ordenarlo con opciones.sort(); que supuestamente ordena el array, no funcionaba, ni siquiera pasándole como parámetro una función personalizada para la ordenación (<a title="Especificación del método sort" target="_blank" href="http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:sort">Especificación del método sort</a>)<br />
Supusimos que el método sort() no soportaba arrays asociativos e implementamos la solución utilizando arrays normales y corrientes, con claves numéricas, a la vez que nos preguntábamos cómo podía ser que JavaScript tuviese esa falta tan grave.</p>
<p>Hoy me disponía a comentar este error y buscar una nueva implementación de sort que soportara arrays asociativos (o incluso hacerla yo mismo si no hubiese encontrado ninguna) cuando sin quererlo me he encontrado con que JavaScript no tiene arrays asociativos, no existen. Entonces, ¿Cómo es que el ejemplo anterior funciona? (Sin contar el método sort)</p>
<p>Funciona porque lo que estamos haciendo es añadirle propiedades al objeto de tipo Array. En JavaScript, cuando hacemos variable['nombre'] lo que ocurre es que añadimos una nueva propiedad con el nombre &#8220;nombre&#8221; al objeto &#8220;variable&#8221;. Por eso, si hacemos:</p>
<p>var paises = new Array();<br />
paises['es'] = &#8216;España&#8217;;<br />
paises['pt'] = &#8216;Portugal&#8217;;<br />
paises['us'] = &#8216;Estados Unidos&#8217;;<br />
paises['uk'] = &#8216;Reino Unido&#8217;;<br />
alert(paises.length);</p>
<p>Si existiesen los arrays asociativos debería aparecer una ventanita con un 4 ¿verdad? Pues como no existen, sale un 0, porque no le estamos añadiendo valores al array, si no propiedades al objeto.</p>
<p>Otros hechos que hacen sospechar de que JavaScript no tiene soporte para arrays asociativos es que no hay forma de definir un array asociativo ni con el constructor del objeto Array ni con la sintaxis para crear un array de forma literal.</p>
<p>Me he sorprendido mucho al leer esto en http://www.andrewdupont.net/2006/05/18/javascript-associative-arrays-considered-harmful/ , pues llevo años viendo como en muchos tutoriales explican equívocamente cómo utilizar arrays asociativos en JavaScript, tal y como yo lo he hecho.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pcfrikis.com/2007/01/22/en-javascript-los-arrays-asociativos-no-existen/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Gnope, el Instalador de PHP-GTK</title>
		<link>http://www.pcfrikis.com/2007/01/17/gnope-el-instalador-de-php-gtk/</link>
		<comments>http://www.pcfrikis.com/2007/01/17/gnope-el-instalador-de-php-gtk/#comments</comments>
		<pubDate>Wed, 17 Jan 2007 18:02:23 +0000</pubDate>
		<dc:creator>Nenillo</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[Software Libre]]></category>

		<guid isPermaLink="false">http://www.pcfrikis.com/2007/01/17/gnope-el-instalador-de-php-gtk/</guid>
		<description><![CDATA[¿Te imaginas poder bajar, instalar, organizar y por supuesto, ejecutar todas las aplicaciones desde un mismo gestor? ¿Te imaginas poder modificar el código fuente de tu aplicación favorita en un instante y volver a ejecutarla con facilidad? Y además de todo esto, ¿Que pueda funcionar en cualquier plataforma? Aunque en realidad no es todo tan [...]]]></description>
			<content:encoded><![CDATA[<p>¿Te imaginas poder bajar, instalar, organizar y por supuesto, ejecutar todas las aplicaciones desde un mismo gestor? ¿Te imaginas poder modificar el código fuente de tu aplicación favorita en un instante y volver a ejecutarla con facilidad? Y además de todo esto, ¿Que pueda funcionar en cualquier plataforma?<br />
Aunque en realidad no es todo tan bonito, y el dicho gestor ya está disponible en las distribuciones de Linux (apt, synaptic, yum), algo que se acerca bastante a la idea inicial es Gnope.</p>
<p>Sí, con Gnope puedes bajar, instalar, organizar y lanzar aplicaciones hechas en PHP-GTK. Con Gnope también puedes modificar el código fuente de la aplicación que te bajes, puesto que es PHP, volver a ejecutar la aplicación modificada y disfrutar de los cambios. Entonces, ¿Qué es lo que falla en Gnope? Pues la calidad. Tanto del gestor de aplicaciones como de las aplicaciones disponibles. En el instalador aparacen fallos durante la instalación (en la consola que se abre, aunque no afectan a la instalación, según parece) y luego, las aplicaciones que hay disponibles, además de ser pocas, son de baja calidad/utilidad y por supuesto, el hecho de que son interpretadas hace que las aplicaciones sean mucho más lentas de lo habitual.</p>
<p>Eso sí, hay que tener en cuenta que Gnope tiene poco más de 1 año de vida y es posible que en un futuro empecemos a ver aplicaciones útiles y más depuradas.</p>
<p>Si sueles programar en PHP y te interesa realizar aplicaciones &#8220;de sobremesa&#8221; con tu lenguaje favorito te recomiendo que eches un vistazo a la <a target="_blank" href="http://www.gnope.org/">web de Gnope</a> y la de <a target="_blank" href="http://gtk.php.net/">PHP-GTK</a>.</p>
<p align="center"><a title="Gnope, instalador de PHP-GTK" class="imagelink" href="http://www.pcfrikis.com/wp-content/uploads/2007/01/gnope.jpg" rel="lightbox[64]"><img alt="Gnope, instalador de PHP-GTK" id="image108" src="http://www.pcfrikis.com/wp-content/uploads/2007/01/gnope.miniatura.jpg" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.pcfrikis.com/2007/01/17/gnope-el-instalador-de-php-gtk/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Si se puede leer, se puede copiar</title>
		<link>http://www.pcfrikis.com/2007/01/16/si-se-puede-leer-se-puede-copiar/</link>
		<comments>http://www.pcfrikis.com/2007/01/16/si-se-puede-leer-se-puede-copiar/#comments</comments>
		<pubDate>Tue, 16 Jan 2007 17:49:14 +0000</pubDate>
		<dc:creator>Nenillo</dc:creator>
				<category><![CDATA[Consolas]]></category>
		<category><![CDATA[Juegos]]></category>
		<category><![CDATA[Media]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Servidores]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://www.pcfrikis.com/2007/01/16/si-se-puede-leer-se-puede-copiar/</guid>
		<description><![CDATA[Es algo obvio, trivial, para mi y para cualquiera, si un sonido se puede reproducir, también se podrá copiar, si un vídeo se puede reproducir, también se podrá copiar, si un disco con un determinado software se puede leer, también se podrá copiar. ¿Por qué siguen gastando ingentes cantidades de dinero para intentar hacer algo [...]]]></description>
			<content:encoded><![CDATA[<p>Es algo obvio, trivial, para mi y para cualquiera, si un sonido se puede reproducir, también se podrá copiar, si un vídeo se puede reproducir, también se podrá copiar, si un disco con un determinado software se puede leer, también se podrá copiar.</p>
<p>¿Por qué siguen gastando ingentes cantidades de dinero para intentar hacer algo que es imposible, por pura lógica?</p>
<p>Esto viene de las últimas noticias que estoy leyendo, sobre la copia de las primeras películas HD-DVD, la copia de los juegos de Wii y Game Cube y por supuesto, también los de Sony (PS3). Lo mejor de todo es cómo lo han hecho, con un mínimo esfuerzo, almenos en los casos de los juegos de Sony y en los HD-DVD, que son los que más me he informado.</p>
<p>Resulta que puedes copiar un juego de PS3 simplemente instalando Linux y utilizando el conocido comando <em>dd</em> de forma habitual, lo cual es de risa. Millones invertidos en buscar métodos para que los discos no puedan ser copiados para que luego, con un simple comando, que cualquier usuario medio de Linux conoce, se puedan copiar.</p>
<p>Con el HD-DVD pasa algo parecido, una gran cantidad de recursos se ha invertido para desarrollar el <a target="_blank" href="http://www.aacsla.com/home">AACS</a> para que luego, un usuario indignado por no poder reproducir correctamente su película en su monitor, al no disponer de <a target="_blank" href="http://es.wikipedia.org/wiki/High-Bandwidth_Digital_Content_Protection">HDCP</a> (sí, quieren proteger hasta las conexiones), se ponga a investigar y logre copiar la película directamente en su disco duro utilizando un pequeño programa en Java (y algo de maña en buscar las claves que decodifica un reproductor oficial, en memoria). Además, todo el trabajo de conseguir la clave de la película se lo hace un programa reproductor de HD-DVD. Lo cual también es bastante obvio, en algún punto, el programa necesitará trabajar con la clave de decodificación y la guardará en memoria, la cual podrá ser investigada con un debugger. Por lo tanto, es inútil tanta encriptación, en algún momento, algún aparato o software, tendrá que decodificar la película y ese aparato o software será manipulable.<br />
Al fin y al cabo, lo único que se consigue poniendo todas estas trabas es que el usuario final, el que compra la película, acabe teniendo un producto de menor calidad que el que puede conseguir bajándose de internet, libre de sistemas anti copia, que podrá reproducir dónde más le guste y convertirlo al formato que prefiera, para poder ver su peli favorita incluso en su reproductor de vídeo portátil o hasta en el móvil.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pcfrikis.com/2007/01/16/si-se-puede-leer-se-puede-copiar/feed/</wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
		<item>
		<title>Conviertiendo de iso-8859-15 a utf-8 fácilmente</title>
		<link>http://www.pcfrikis.com/2007/01/15/conviertiendo-de-iso-8859-15-a-utf-8-facilmente/</link>
		<comments>http://www.pcfrikis.com/2007/01/15/conviertiendo-de-iso-8859-15-a-utf-8-facilmente/#comments</comments>
		<pubDate>Mon, 15 Jan 2007 19:02:20 +0000</pubDate>
		<dc:creator>Nenillo</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Web 2.0]]></category>

		<guid isPermaLink="false">http://www.pcfrikis.com/2007/01/15/conviertiendo-de-iso-8859-15-a-utf-8-facilmente/</guid>
		<description><![CDATA[Cada vez me encuentro con más casos en los que necesito escribir caracteres especiales, más allá de la eñe (Ñ), las tildes u otros caracteres habituales entre la mayoría de europeos occidentales (ç, à, ê, å, etc). El verdadero problema llega cuando necesitas escribir en otros idomas como ruso, árabe, chino, japonés, polaco, etc, o [...]]]></description>
			<content:encoded><![CDATA[<p>Cada vez me encuentro con más casos en los que necesito escribir caracteres especiales, más allá de la eñe (Ñ), las tildes u otros caracteres habituales entre la mayoría de europeos occidentales (ç, à, ê, å, etc). El verdadero problema llega cuando necesitas escribir en otros idomas como ruso, árabe, chino, japonés, polaco, etc, o como mínimo, hacer tu web/aplicación compatible con estos juegos de caracteres.</p>
<p>El problema tiene fácil solución, se llama utf-8, un juego de caracteres especial que utiliza de 1 a 4 bytes por caracter, según sea necesario y es compatible con los canales de transmisión de 8bits. Es decir, que podemos enviar un texto con caracteres de múltiples culturas a la vez, utilizando los canales habituales, mail, web, irc, ftp, etc.<br />
Lo único que queda por saber es cómo convertir documentos de texto que tengamos en iso-8859-15 (el juego de caracteres habitual en españa) a utf-8. Esta tarea la podemos realizar utilizando el comando &#8220;iconv&#8221; en linux (o <a href="http://gnuwin32.sourceforge.net/packages/libiconv.htm" target="_blank">bajando la misma aplicación en versión para Windows</a>) y ejecutando el siguiente comando:</p>
<p><em>iconv documento.txt -f iso-8859-15 -t utf8 -o documento-utf.txt</em><br />
<em>documento.txt</em> es el nombre del fichero que queremos convertir, <em>-f iso-8859-15</em> es la codificación actual del fichero, <em>-t utf8</em> es la codificación de destino y <em>-o documento-utf.txt </em>es el fichero dónde el programa escribirá el resultado.</p>
<p>Este comando me ha resultado especialmente útil para convertir algunas de mis páginas web a utf8. Por cierto, esta web usa utf-8.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pcfrikis.com/2007/01/15/conviertiendo-de-iso-8859-15-a-utf-8-facilmente/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>El dichoso botón de &#8220;Atrás&#8221; del navegador</title>
		<link>http://www.pcfrikis.com/2006/09/22/dichoso-boton-atras-navegador/</link>
		<comments>http://www.pcfrikis.com/2006/09/22/dichoso-boton-atras-navegador/#comments</comments>
		<pubDate>Fri, 22 Sep 2006 16:25:18 +0000</pubDate>
		<dc:creator>Nenillo</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Web 2.0]]></category>

		<guid isPermaLink="false">http://www.pcfrikis.com/2006/09/22/dichoso-boton-atras-navegador/</guid>
		<description><![CDATA[Si eres un habitual desarrollador de aplicaciones web te habrás encontrar alguna web con el problema del botón de &#8220;Atrás&#8221;, esa flecha apuntando hacia la izquierda que encontramos en cualquier navegador web. Resulta que si has realizado dos peticiones POST seguidas al volver atrás el navegador te indicará que la página ha caducado o bien [...]]]></description>
			<content:encoded><![CDATA[<p>Si eres un habitual desarrollador de aplicaciones web te habrás encontrar alguna web con el problema del botón de &#8220;Atrás&#8221;, esa flecha apuntando hacia la izquierda que encontramos en cualquier navegador web. Resulta que si has realizado dos peticiones POST seguidas al volver atrás el navegador te indicará que la página ha caducado o bien nos preguntará si queremos reenviar los datos. En este punto la mayoría de usuarios, que obviamente no son desarrolladores y no entienden cómo funciona esto, se pierden. No saben si volver a enviar los datos, si seguir tirando para atrás, si volver adelante (donde se encontrarán lo mismo) o cerrar directamente la página, pensando que la página falla.</p>
<p>¿Solución? Ajax</p>
<p>Sí, esa mezcla de <a target="_blank" title="JavaScript" href="http://www.holamundo.es/lenguaje/javascript/">JavaScript</a> y otro lenguaje de servidor como <a target="_blank" title="PHP" href="http://www.holamundo.es/lenguaje/php/">PHP</a>, <a href="http://www.holamundo.es/lenguaje/asp/">ASP</a>, <a target="_blank" href="http://www.holamundo.es/lenguaje/ruby/">Ruby</a>; es una buena solución para evitar este problema, ya que la petición se hace en el fondo (background) y no altera la ruta de navegación, por lo que podemos volver atrás y adelante sin problemas haciéndole la vida más fácil al usuario. Además, como estamos hablando de formularios, no nos tendremos que preocupar por si los motores de búsqueda indexan o no ese contenido ya que, de todas formas, los &#8220;crawlers&#8221; no envían formularios.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pcfrikis.com/2006/09/22/dichoso-boton-atras-navegador/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Conexión remota a MySQL no disponible</title>
		<link>http://www.pcfrikis.com/2006/04/22/conexion-remota-a-mysql-no-disponible/</link>
		<comments>http://www.pcfrikis.com/2006/04/22/conexion-remota-a-mysql-no-disponible/#comments</comments>
		<pubDate>Sat, 22 Apr 2006 18:29:09 +0000</pubDate>
		<dc:creator>Nenillo</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[Servidores]]></category>

		<guid isPermaLink="false">http://www.pcfrikis.com/2006/04/22/conexion-remota-a-mysql-no-disponible/</guid>
		<description><![CDATA[En muchos servidores de host PHP-MySQL, algunos incluso de pago, no se permite la conexión remota a MySQL por cuestiones de seguridad. Normalmente esto no es un problema ya que la base de datos accedemos desde el propio espacio web y no se necesita la conexión remota. Pero en otros casos sí puede ser necesario. [...]]]></description>
			<content:encoded><![CDATA[<p>En muchos servidores de host PHP-MySQL, algunos incluso de pago, no se permite la conexión remota a MySQL por cuestiones de seguridad. Normalmente esto no es un problema ya que la base de datos accedemos desde el propio espacio web y no se necesita la conexión remota.</p>
<p>Pero en otros casos sí puede ser necesario. Tengo un script que recoge datos de varias webs alojadas en distintos servidores y algunos no permiten la conexión remota a MySQL así que tuve que hacer un pequeño wrapper en PHP, muy sencillo, para salir del paso.</p>
<p>Se trata de un script que recoge los parámetros de conexión, una consulta SQL, la serializa, la codifica en base64 y la envía.</p>
<blockquote><p><code>$link = mysql_connect("localhost",$_GET['user'],$_GET['pass']);<br />
mysql_select_db($_GET['db'],$link);<br />
$result = mysql_query(base64_decode($_GET['query']),$link);<br />
$output = array();<br />
while($row = @mysql_fetch_assoc($result)) { $output[] = $row; }<br />
echo base64_encode(serialize($output)); </code></p></blockquote>
<p>Este archivo se situa en el servidor que no permite el acceso remoto a MySQL. Luego para leer estos datos en el servidor que desea acceder remotamente utilizamos este script:</p>
<blockquote><p><code>$query = "SELECT * FROM table";<br />
$url = "http://www.remoto.com/wrapper.php?";<br />
$url .= "user=usuariomysql";<br />
$url .= "&amp;pass=passmysql";<br />
$url .= "&amp;db=dbmysql&amp;query=";<br />
$url .= base64_encode($query);<br />
$fp = fopen($url,'r');<br />
$read = '';<br />
while(!feof($fp)) { $read .= fgets($fp); }<br />
fclose($fp);<br />
$read = unserialize(base64_decode($read));</code></p></blockquote>
<p>Y si se protege la url http://www.remoto.com/wrapper.php con contraseña mejor todavía.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pcfrikis.com/2006/04/22/conexion-remota-a-mysql-no-disponible/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Captura de un frame de un vídeo</title>
		<link>http://www.pcfrikis.com/2006/04/01/captura-de-un-frame-de-un-video/</link>
		<comments>http://www.pcfrikis.com/2006/04/01/captura-de-un-frame-de-un-video/#comments</comments>
		<pubDate>Sat, 01 Apr 2006 21:52:05 +0000</pubDate>
		<dc:creator>Nenillo</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Software Libre]]></category>

		<guid isPermaLink="false">http://www.pcfrikis.com/2006/04/01/captura-de-un-frame-de-un-video/</guid>
		<description><![CDATA[Hoy se me ha planteado un problema, debía obtener una captura en un formato válido para web (jpg, png, gif) de un vídeo cualquiera, ya sea avi, wmv, mov de forma automatizada, es decir, yo le paso a un programa el nombre del vídeo y saca el screenshot. Recordaba que mplayer permitía muchos formatos de [...]]]></description>
			<content:encoded><![CDATA[<p>Hoy se me ha planteado un problema, debía obtener una captura en un formato válido para web (jpg, png, gif) de un vídeo cualquiera, ya sea avi, wmv, mov de forma automatizada, es decir, yo le paso a un programa el nombre del vídeo y saca el screenshot.</p>
<p>Recordaba que mplayer permitía muchos formatos de salida de vídeo, fbdev, x11, sdl&#8230; y también recordaba haber visto jpeg. Así que voy a confirmarlo&#8230;</p>
<p>mplayer -vo help</p>
<p>Y soporta todos los formatos mencionados (jpg, gif, png) y otros como tga. Ahora, si me permite indicarle una posición para empezar a reproducir y que reproduzca sólo un frame, ya lo tengo todo solucionado.</p>
<p>La opción para indicar dónde comenzar a reproducir es &#8220;ss&#8221; y para capturar un sólo frame se puede hacer con el parámetro &#8220;frames&#8221; así que ya lo tengo:</p>
<p>mplayer video.avi -ss 60 -frames 1 -vo jpeg</p>
<p>Esto captura un frame del &#8220;video.avi&#8221; en el segundo 60 y lo guarda como 0000001.jpg</p>
<p>Ahora puedo llamar a este comando desde cualquier lenguaje de programación y obtener fácilmente un screenshot del vídeo.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pcfrikis.com/2006/04/01/captura-de-un-frame-de-un-video/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Zenity, aplicaciones gráficas en 5min</title>
		<link>http://www.pcfrikis.com/2006/03/28/zenity-aplicaciones-graficas-en-5min/</link>
		<comments>http://www.pcfrikis.com/2006/03/28/zenity-aplicaciones-graficas-en-5min/#comments</comments>
		<pubDate>Tue, 28 Mar 2006 19:05:57 +0000</pubDate>
		<dc:creator>Nenillo</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://www.pcfrikis.com/2006/03/28/zenity-aplicaciones-graficas-en-5min/</guid>
		<description><![CDATA[Necesitas realizar una pequeña aplicación, algo sencillo, un par de cuadros de diálogo, una ventana de selección de ficheros, selección de fecha a través de un calendario o una simple notificación, pero&#8230; necesitas un montón de bibliotecas según el sistema que uses (GTK, QT, WxWidgets, &#8230;), configurar el entorno, inicializarlas librerías &#8230;; todo eso son [...]]]></description>
			<content:encoded><![CDATA[<p>Necesitas realizar una pequeña aplicación, algo sencillo, un par de cuadros de diálogo, una ventana de selección de ficheros, selección de fecha a través de un calendario o una simple notificación, pero&#8230; necesitas un montón de bibliotecas según el sistema que uses (GTK, QT, WxWidgets, &#8230;), configurar el entorno, inicializarlas librerías &#8230;; todo eso son varias líneas de código, y te echan para atrás, pero la solución es mucho más fácil de lo que parece y se llama <a href="http://freshmeat.net/projects/zenity" target="_blank">Zenity</a>.</p>
<p>Instala Zenity (apt-get install zenity en debian), coge tu lenguaje de programación favorito, scripting para ir más rápido (PHP, Perl, Python, Ruby, bash&#8230;), realiza tu aplicación y haz llamadas a zenity cuando necesites algún elemento gráfico sencillo.</p>
<p>Voy a hacer un pequeño ejemplo con PHP, una aplicación que pida nombre, fecha de nacimiento e indique la edad actual del usuario:</p>
<p><code>$nombre = `zenity --entry --text="Introduce tu nombre:"`;<br />
 list($dia,$mes,$anyo) = explode("/",`zenity --calendar --text="$nombre, selecciona tu fecha de nacimiento" --date-format="%d/%m/%Y"`);<br />
 list($adia,$ames,$aanyo) = explode("/",date("d/m/Y"));<br />
 $edad = $aanyo-$anyo;<br />
 if($mes > $ames) {<br />
  $edad--;<br />
 } else if($mes == $ames) {<br />
  if($dia > $adia) { $edad--; }<br />
 }<br />
 `zenity --info --info-text="$nombre, tienes $edad años"`;</code></p>
<p><a title="Descargar código PHP" href="/archivos/zenitytest.phps">Descargar código</a> </p>
<p>En este caso, las partes importantes del script son las llamadas a zenity, estas llamadas podemos hacerlas directamente en consola, si queremos probar. Por ejemplo, puedes escribir en una consola:</p>
<p><em>zenity &#8211;entry &#8211;text=&#8221;Introduce tu nombre&#8221;</em></p>
<p>Si guardas el código como zenitytest.php sólo tienes que hacer <em>php -f zenitytest.php</em> y empezará a ejecutarse.</p>
<p>Aquí tienes unas imágenes de la ejecución del script:</p>
<p align="center"><a class="imagelink" title="Ventana de Zenity, Ejemplo 1" href="http://www.pcfrikis.com/wp-content/uploads/2006/03/zenity1.gif" rel="lightbox[29]"><img id="image30" height="66" alt="Ventana de Zenity, Ejemplo 1" src="http://www.pcfrikis.com/wp-content/uploads/2006/03/zenity1.miniatura.gif" /></a><a class="imagelink" title="Ventana de Zenity, Ejemplo 2" href="http://www.pcfrikis.com/wp-content/uploads/2006/03/zenity2.gif" rel="lightbox[29]"><img id="image31" height="96" alt="Ventana de Zenity, Ejemplo 2" src="http://www.pcfrikis.com/wp-content/uploads/2006/03/zenity2.miniatura.gif" /></a><a class="imagelink" title="Ventana de Zenity, Ejemplo 3" href="http://www.pcfrikis.com/wp-content/uploads/2006/03/zenity3.gif" rel="lightbox[29]"><img id="image32" height="96" alt="Ventana de Zenity, Ejemplo 3" src="http://www.pcfrikis.com/wp-content/uploads/2006/03/zenity3.miniatura.gif" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.pcfrikis.com/2006/03/28/zenity-aplicaciones-graficas-en-5min/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

