<?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>Adobe User Group Granada &#187; tutoriales</title>
	<atom:link href="http://www.adobe-user-group-granada.es/category/tutoriales/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.adobe-user-group-granada.es</link>
	<description>Grupo de usuarios de Adobe orientado a Dreamweaver y Spry en la ciudad de Granada</description>
	<lastBuildDate>Sat, 21 Jan 2012 19:10:40 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Progreso de subida de ficheros únicamente con HTML5</title>
		<link>http://www.adobe-user-group-granada.es/progreso-de-subida-de-ficheros-unicamente-con-html5/</link>
		<comments>http://www.adobe-user-group-granada.es/progreso-de-subida-de-ficheros-unicamente-con-html5/#comments</comments>
		<pubDate>Sun, 11 Dec 2011 12:42:06 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[artículos]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[tutoriales]]></category>
		<category><![CDATA[html5]]></category>

		<guid isPermaLink="false">http://www.adobe-user-group-granada.es/?p=1023</guid>
		<description><![CDATA[Uno de los mayores problemas con los que nos hemos encontrado a la  hora de hacer aplicaciones que suben ficheros, es mostrar al usuario  cuánto se ha subido y así poder saber cuánto queda. Ahora con HTML5 y  XMLHttpRequest Level 2 podemos mostrarlo sin necesidad de parte del  servidor.
El script hace [...]]]></description>
			<content:encoded><![CDATA[<p>Uno de los mayores problemas con los que nos hemos encontrado a la  hora de hacer aplicaciones que suben ficheros, es mostrar al usuario  cuánto se ha subido y así poder saber cuánto queda. Ahora con HTML5 y  XMLHttpRequest Level 2 podemos mostrarlo sin necesidad de parte del  servidor.</p>
<p>El script hace uso de <a href="http://www.w3.org/TR/progress-events/">Evento de Progreso</a> de HTML5 para poder mostrar:</p>
<ul>
<li><strong>total</strong>: total de bytes</li>
<li><strong>loaded</strong>: bytes subidos</li>
<li><strong>lengthComputable</strong>: indica si el tamaño del fichero es conocido</li>
<li><strong>transferSpeed</strong>: velocidad de transferencia</li>
<li><strong>timeRemaining</strong>: tiempo que falta (en formato Date)</li>
</ul>
<p>Por ahora solo es compatible con Firefox, Chrome y Safari.</p>
<p>En el post lo explican con gran detalle.</p>
<p><a href="http://www.matlus.com/html5-file-upload-with-progress/">Html5 File Upload with Progress </a></p>
<p>Nuestra fuente: <a href="http://sentidoweb.com/2011/11/19/progreso-de-subida-de-ficheros-unicamente-con-html5.php?utm_source=feedburner&amp;utm_medium=feed&amp;utm_campaign=Feed%3A+sentidoweb+%28Sentido+Web%29&amp;utm_content=Google+International" target="_blank">Sentidoweb</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.adobe-user-group-granada.es/progreso-de-subida-de-ficheros-unicamente-con-html5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Guía de supervivencia con Apache</title>
		<link>http://www.adobe-user-group-granada.es/guia-de-supervivencia-con-apache/</link>
		<comments>http://www.adobe-user-group-granada.es/guia-de-supervivencia-con-apache/#comments</comments>
		<pubDate>Thu, 17 Nov 2011 18:31:50 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[apache]]></category>
		<category><![CDATA[artículos]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[tutoriales]]></category>

		<guid isPermaLink="false">http://www.adobe-user-group-granada.es/?p=1019</guid>
		<description><![CDATA[El servidor web Apache es uno de los más extendidos y con más opciones de configuración, esto implica que es complejo. Vamos a ver cómo sobrevivir con Apache.


Guía de supervivencia con Apache

Otras veces ya hemos visto como realizar una instalación de Apache con PHP y eAccelerator, una vez instalado los ficheros ejecutables importantes son:

apachectl: Mediante [...]]]></description>
			<content:encoded><![CDATA[<p>El <strong>servidor web Apache</strong> es uno de los más extendidos y con más opciones de configuración, esto implica que es complejo. Vamos a ver <strong>cómo sobrevivir con Apache</strong>.</p>
<p><span id="more-1019"></span></p>
<div id="attachment_3639">
<p><a href="http://systemadmin.es/wp-content/uploads/2011/11/supervivencia-con-Apache.jpg"></a>Guía de supervivencia con Apache</p>
</div>
<p>Otras veces ya hemos visto como realizar una <a href="http://systemadmin.es/2009/08/instalacion-de-un-servidor-lamp-v-apache-con-php-y-eaccelerator">instalación de Apache con PHP y eAccelerator</a>, una vez instalado los ficheros ejecutables importantes son:</p>
<ul>
<li><strong>apachectl</strong>: Mediante este script podremos:
<ul>
<li>Gestionar el arranque y parada del daemon (<strong>start</strong>/<strong>stop</strong>)</li>
<li>Comprobar la configuración (<strong>configtest</strong>):
<pre># /usr/local/apache22/bin/apachectl configtest
Syntax OK</pre>
</li>
<li>Recargar la configuración en caliente, sin apagar el daemon (<strong>graceful</strong>)</li>
</ul>
</li>
<li><strong>httpd</strong>: Binario del daemon, con dicho fichero podemos:
<ul>
<li>Indicar que fichero de configuración cargar (<strong>opción -f</strong>)</li>
<li>Ver el listado de módulos que carga (<strong>opción -M</strong>):
<pre># /usr/local/apache22/bin/httpd -M
Loaded Modules:
 core_module (static)
(...)
 jrun_module (shared)</pre>
</li>
<li>Al igual que con <strong>apachectl</strong>, comprobar la configuración con la <strong>opción -t</strong>:
<pre># /usr/local/apache22/bin/httpd -t
Syntax OK</pre>
</li>
<li>Ver el resumen de configuración de los <strong>VirtualHosts</strong> con la <strong>opción -S</strong>:
<pre># /usr/local/apache22/bin/httpd -S
VirtualHost configuration:
wildcard NameVirtualHosts and _default_ servers:
*:80                   is a NameVirtualHost
         default server shuvak.systemadmin.es (/usr/local/apache22/conf/extra/httpd-vhosts.conf:7)
         port 80 namevhost shuvak.systemadmin.es (/usr/local/apache22/conf/extra/httpd-vhosts.conf:7)
         port 80 namevhost systemadmin.es (/usr/local/apache22/conf/extra/vhosts/systemadmin.es.conf:1)
         port 80 namevhost foro.systemadmin.es (/usr/local/apache22/conf/extra/vhosts/foro.systemadmin.es.conf:1)
Syntax OK</pre>
</li>
</ul>
</li>
</ul>
<p>Un ejemplo de <strong>configuración típica de un VirtualHost</strong> sería la siguiente:</p>
<pre>&lt;VirtualHost *:80&gt;
        DocumentRoot "/var/www/systemadmin.es/htdocs"
        DirectoryIndex index.php
        ServerName systemadmin.es
        ServerAlias foro.systemadmin.es

        &lt;Directory /var/www/systemadmin.es/htdocs&gt;
            Options FollowSymLinks
            AllowOverride all
            Order deny,allow
            Allow from all
        &lt;/Directory&gt;

        ErrorLog  "| /usr/local/sbin/cronolog -S /var/www/systemadmin.es/logs/current.error.log /var/www/systemadmin.es/logs/%Y/%m/%d/error.log"
        CustomLog "| /usr/local/sbin/cronolog -S /var/www/systemadmin.es/logs/current.custom.log /var/www/systemadmin.es/logs/%Y/%m/%d/custom.log" combined

&lt;/VirtualHost&gt;</pre>
<p>Las directivas importantes son:</p>
<ul>
<li><strong>DocumentRoot</strong>: Directorio base desde el cual  serviremos el contenido. Deberemos acompañarlo de la directiva Directory  para establecer si se puede servir o no su contenido</li>
<li><strong>DirectoryIndex</strong>: Cuando se intente servir la raíz o  cualquier directorio (sin especificar fichero), cual se debería servir.  Típicamente se usa index.algo, pero podría ser cualquier fichero. Esta  directiva indica que fichero servir y en que orden de prioridad. Por  ejemplo:
<pre>DirectoryIndex index.php index.html index.htm</pre>
<p>Primero miraría si existe un fichero <strong>index.php</strong>, en caso que no exista buscaría el siguiente (<strong>index.html</strong>) y así el listado que indiquemos. En caso que no exista ninguno, <strong>se serviría un 404</strong></li>
<li><strong>ServerName</strong> y <strong>ServerAlias</strong>: Nombres a los que responde según el <a href="http://systemadmin.es/2010/08/especificar-que-host-header-debe-usar-el-curl">header Host</a>. Se pueden <strong>especificar wildcards</strong> tanto pode delante (<strong>*.systemadmin.es</strong>) como por detrás (<strong>webmail.*</strong>). La diferencia entre <strong>ServerName</strong> y <strong>ServerAlias</strong> a la practica tiene poca importancia.</li>
</ul>
<p>En cuanto a la <strong>gestión de logs</strong>, personalmente uso <a href="http://systemadmin.es/2009/01/rotacion-de-logs-de-apache-mediante-cronolog">cronolog</a> ya que una vez configurado cómo queremos almacenar los logs no  deberemos hacer mantenimiento a no se que queramos eliminar los  antiguos. Para ello suelo emplear un simple script que haga limpieza:</p>
<pre>#!/bin/bash
for i in $(find /var/www/ -maxdepth 2 -iname logs);
do

        #eliminacion de los mas antiguos de 10 dias
        find $i -mtime +10 -type f -exec rm {} \;

        #eliminacion de directios vacios
        find $i -empty -type d -exec rmdir {} \; 2&gt;/dev/null

        #compresión de logs ya rotados
        find $i -type f -iname \*\.log -mtime +2 -exec gzip {} \;

done</pre>
<p>Deberemos <strong>adaptar el find del for</strong> para que encuentre los directorios raíz dónde tenemos los logs.</p>
<p>Para conocer el estado del Apache existe el <a href="http://systemadmin.es/2009/02/instalacion-del-server-status-mod_status-de-apache">modulo mod_status</a>, que nos indica que esta haciendo dicho daemon. Generalmente se instala en <strong>/server-staus</strong> con <strong>acceso limitado por IP de origen</strong>.</p>
<p>En el <strong>scoreboard</strong> veremos los estado del los <strong>apachitos</strong> (procesos apache) y podremos ver si existe algún problema con algún VirtualHost. Típicamente podremos ver:</p>
<ul>
<li>Se nos llena el scoreboard de <strong>W</strong>: Cuando un slot esta en estado W significa que esta contestando, pero si vemos que se nos acumulan <strong>W</strong> posiblemente esta contestando muy lentamente por algún motivo o bien  simplemente se queda colgado. Generalmente indica problemas en la base  de datos.Si habilitamos la opción
<pre>ExtendedStatus On</pre>
<p>Tendremos un listado de todas las peticiones y su estado, para cuanto  tiempo lleva un slot en el estado actual deberemos fijarnos en la  columna <strong>SS</strong>. Por lo tanto, las peticiones <strong>en estado W que tenga el SS alto</strong> son las primeras que deberemos investigar. Evidentemente, si servimos contenido estático (un <strong>mp3</strong>) es lógico que tarde en ser entregado y por lo tanto que <strong>su SS sea alto</strong>.</li>
<li>Se nos llena el scoreboard de <strong>K</strong>: Tendremos que ver  si nos interesa reducir el tiempo de KeepAlive de las conexiones. Por  defecto lo tenemos a 5 segundos, pero lo podemos dejar en 1 o 2 segundos  según la aplicación.</li>
</ul>
<p>En otra ocasión ya hablamos de en que debemos fijarnos para <a href="http://systemadmin.es/2010/04/encontrar-la-raiz-del-problema-en-un-entorno-lamp-i">entender el problema que tenga un entorno LAMP</a></p>
<p>Otra cosa a tener en cuenta es la <a href="http://systemadmin.es/2009/04/diferencia-entre-serverlimit-y-maxclients-de-apache">diferencia entre ServerLimit y MaxClients</a>: <strong>ServerLimit</strong> es el límite fijo que no puede ser modificado mediante una recarga de configuración (graceful) mientras que <strong>MaxClients</strong> es el límite actual.</p>
<p>Actualmente <strong>mod_status</strong> no muestra los slots de Apache que quedan deshabilitados por la directiva <strong>MaxClients</strong>, por lo que nos puede dar pie a error al suponerlos libres. En su momento hice un patch para evitar esto y <strong>será incluido en la próxima release de Apache</strong> (2.4), actualmente <a href="http://systemadmin.es/2011/03/apache-2-4-beta-httpd-2-3-11">ya se encuentra disponible en la versión beta desde la versión 2.3.11</a>.</p>
<p>Nuestra fuente: <a href="http://systemadmin.es/2011/11/guia-de-supervivencia-con-apache" target="_blank">Systemadmin</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.adobe-user-group-granada.es/guia-de-supervivencia-con-apache/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Almacenar la salida de un comando SQL en formato CSV</title>
		<link>http://www.adobe-user-group-granada.es/almacenar-la-salida-de-un-comando-sql-en-formato-csv/</link>
		<comments>http://www.adobe-user-group-granada.es/almacenar-la-salida-de-un-comando-sql-en-formato-csv/#comments</comments>
		<pubDate>Fri, 15 Jul 2011 18:35:27 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[artículos]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[tutoriales]]></category>

		<guid isPermaLink="false">http://www.adobe-user-group-granada.es/?p=1004</guid>
		<description><![CDATA[El formato CSV resulta muy cómodo tanto de generar  como leer, por eso muchos programas lo aceptan. Se trata simplemente de  valores separados por comas (Comma-Separated Values). Vamos a ver como generar un fichero desde MySQL para almacenar datos.
Para generar el fichero desde un comando SQL en MySQL deberemos indicar INTO OUTFILE con [...]]]></description>
			<content:encoded><![CDATA[<p>El <strong>formato CSV</strong> resulta muy cómodo tanto de generar  como leer, por eso muchos programas lo aceptan. Se trata simplemente de  valores separados por comas (<strong>Comma-Separated Values</strong>). Vamos a ver como generar un fichero desde <strong>MySQL</strong> para almacenar datos.</p>
<p>Para generar el fichero desde un comando <strong>SQL</strong> en <strong>MySQL</strong> deberemos indicar <strong>INTO OUTFILE</strong> con el nombre de fichero y las siguientes opciones:</p>
<ul>
<li><strong>FIELDS TERMINATED BY</strong>: Indicamos como terminan los campos, en este caso deben ser separados por comas <strong>‘,’</strong></li>
<li><strong>OPTIONALLY ENCLOSED BY</strong>: Como se deben indicar en el caso que tengan el separador como valor. En este caso mediante comillas dobles <strong>‘”‘</strong></li>
<li><strong>ESCAPED BY</strong>: Indicamos como debemos escapar los carácteres, en este caso mediante la contrabarra <strong>‘\\’</strong></li>
<li><strong>LINES TERMINATED BY</strong>: Indicamos como especificamos una nueva fila, en este caso mediante un intro <strong>‘\n’</strong></li>
</ul>
<p>Por lo tanto el comando <strong>SQL</strong> quedaría:</p>
<pre>mysql&gt;  select * from loquesea
INTO OUTFILE "/tmp/inventari.txt"
FIELDS TERMINATED BY  ','
OPTIONALLY ENCLOSED BY '"'
ESCAPED BY  '\\'
LINES TERMINATED BY '\n' from RackObject;
Query OK, 168 rows affected (0.29 sec)</pre>
<p>Nuestra fuente: <a href="http://systemadmin.es/2011/06/almacenar-la-salida-de-un-comando-sql-en-formato-csv" target="_blank">Systemadmin.es</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.adobe-user-group-granada.es/almacenar-la-salida-de-un-comando-sql-en-formato-csv/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Modos de la query cache</title>
		<link>http://www.adobe-user-group-granada.es/modos-de-la-query-cache/</link>
		<comments>http://www.adobe-user-group-granada.es/modos-de-la-query-cache/#comments</comments>
		<pubDate>Mon, 23 May 2011 17:56:27 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[tutoriales]]></category>

		<guid isPermaLink="false">http://www.adobe-user-group-granada.es/?p=985</guid>
		<description><![CDATA[La query cache es un mecanismo mediante el cual si ejecuta la misma query multiples veces, sin que los datos se hayan modificado, devuelve los resultados de una zona de memoria que los conserva para no tener que tener que ir a buscarlos de nuevo si son pedidos repetidas veces.
Mediante SHOW VARIABLES podemos ver si tenemos la query cache disponible [...]]]></description>
			<content:encoded><![CDATA[<p>La <strong>query cache</strong> es un mecanismo mediante el cual <strong>si ejecuta la misma query multiples veces</strong>, sin que los datos se hayan modificado, devuelve los resultados de una <strong>zona de memoria</strong> que los conserva para no tener que tener que ir a buscarlos de nuevo si son pedidos repetidas veces.</p>
<p>Mediante <strong>SHOW VARIABLES</strong> podemos ver si tenemos la <strong>query cache</strong> disponible en el servidor de <strong>MySQL</strong>:</p>
<pre>mysql&gt; show variables like 'have_query_cache';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| have_query_cache | YES   |
+------------------+-------+
1 row in set (0.00 sec)</pre>
<p><span id="more-985"></span></p>
<p>En caso de tenerla disponible deberemos consultar las variables <strong>query_cache_size</strong>y <strong>query_cache_type</strong> para saber si esta habilitada y con que tamaño.</p>
<p>La variable <strong>query_cache_type</strong> puede tener tres valores:</p>
<ul>
<li><strong>0</strong> o <strong>OFF</strong>: La query cache esta <strong>deshabilitada</strong></li>
<li><strong>1</strong> o <strong>ON</strong>: La query cache esta <strong>habilitada para todas las queries</strong> menos las que indiquemos con el <strong>hint SQL_NO_CACHE</strong></li>
<li><strong>2</strong> o <strong>DEMAND</strong>: La query cache esta <strong>deshabilitada para todas las queries</strong> menos las que indiquemos con el <strong>hint SQL_CACHE</strong></li>
</ul>
<p>Por otro lado mediante <strong>query_cache_size</strong> también podemos deshabilitar la query cache, simplemente deberemos definir el <strong>tamaño a cero</strong>. En caso que definamos un valor positivo en este parámetro, la query cache estará habilitada o no según este definida la <strong>query_cache_type</strong>.</p>
<p>Nuestra fuente: <a href="http://systemadmin.es/2011/04/modos-de-la-query-cache" target="_blank">Systemadmin</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.adobe-user-group-granada.es/modos-de-la-query-cache/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Subir y exportar documentos usando Google Docs y PHP</title>
		<link>http://www.adobe-user-group-granada.es/subir-y-exportar-documentos-usando-google-docs-y-php/</link>
		<comments>http://www.adobe-user-group-granada.es/subir-y-exportar-documentos-usando-google-docs-y-php/#comments</comments>
		<pubDate>Fri, 01 Apr 2011 09:17:33 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[tutoriales]]></category>
		<category><![CDATA[google]]></category>

		<guid isPermaLink="false">http://www.adobe-user-group-granada.es/?p=957</guid>
		<description><![CDATA[Uno de los problemas con los que nos podemos encontrar es tener un documento en un formato y tener que exportarlo en otro formato. La exportación se puede realizar utilizando Google Docs, quizás un tanto rebuscada la solución, aunque quizás no tanto.
Os paso un script que sube el fichero a Google Docs dentro de una [...]]]></description>
			<content:encoded><![CDATA[<p>Uno de los problemas con los que nos podemos encontrar es tener un documento en un formato y tener que exportarlo en otro formato. La exportación se puede realizar utilizando Google Docs, quizás un tanto rebuscada la solución, aunque quizás no tanto.</p>
<p>Os paso un script que sube el fichero a Google Docs dentro de una carpeta y acto seguido lo exporta a otro formato, en este caso subo un PPT y lo convierto en PDF (me hubiese encantado que fuera a HTML pero no acepta esa opción).</p>
<p><span id="more-957"></span></p>
<pre><code>
// Datos de login a la API de Google
$clientlogin_url = "https://www.google.com/accounts/ClientLogin";
$clientlogin_post = <a href="http://www.php.net/array">array</a>(
    "accountType" =&gt; "GOOGLE",
    "Email" =&gt; "miemail@gmail.com",
    "Passwd" =&gt; "mipassword",
    "service" =&gt; "writely",
    "source" =&gt; "WPDOCS"
);

// Inicializamos el CURL
$curl = curl_init($clientlogin_url);

// Obtenemos el string de autenticaciÃ³n
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $clientlogin_post);
curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($curl);
<a href="http://www.php.net/preg_match">preg_match</a>("/Auth=([a-z0-9_\-]+)/i", $response, $matches);
$auth = $matches[1];

// Cabeceras de autenticaciÃ³n
$headers = <a href="http://www.php.net/array">array</a>(
    "Authorization: GoogleLogin auth=" . $auth,
    "GData-Version: 3.0",
);

// Recuperamos los ficheros y carpetas que tenemos en Google Docs para no crear dos veces la misma carpeta
curl_setopt($curl, CURLOPT_URL, "http://docs.google.com/feeds/default/private/full?showfolders=true");
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_POST, false);
$listado = curl_exec($curl);
$nombre_carpeta = 'WPDOCS';

// Si no se ha creado la carpeta, la creamos
if (<a href="http://www.php.net/strpos">strpos</a>($listado, '&lt;title&gt;'.$nombre_carpeta.'&lt;/title&gt;') === FALSE) {
  // Make the request
  $h = <a href="http://www.php.net/array_merge">array_merge</a>($headers,<a href="http://www.php.net/array">array</a>('Content-Type: application/atom+xml'));
  $xml = '&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;entry xmlns="http://www.w3.org/2005/Atom"&gt;&lt;category scheme="http://schemas.google.com/g/2005#kind" term="http://schemas.google.com/docs/2007#folder"/&gt;&lt;title&gt;'.$nombre_carpeta.'&lt;/title&gt;&lt;/entry&gt;';
  curl_setopt($curl, CURLOPT_URL, "http://docs.google.com/feeds/default/private/full");
  curl_setopt($curl, CURLOPT_HTTPHEADER, $h);
  curl_setopt($curl, CURLOPT_POSTFIELDS, $xml);
  curl_setopt($curl, CURLOPT_POST, true);

  $response = curl_exec($curl);
  $response = simplexml_load_string($response);
  $id_folder = $response-&gt;id;
} else {
  // Recuperamos la ID de la carpeta creada anteriormente
  <a href="http://www.php.net/preg_match">preg_match</a>("#&lt;title&gt;$nombre_carpeta&lt;/title&gt;&lt;content type='application/atom\+xml;type=feed' src='([^']+)'#", $listado, $m);
  $id_folder = $m[1];
}

// Subimos el PPT
$h = <a href="http://www.php.net/array_merge">array_merge</a>($headers,<a href="http://www.php.net/array">array</a>('Content-Type: application/vnd.ms-powerpoint', 'Slug: fichero'));
$filepath='/path/fichero.ppt';
$data=((<a href="http://www.php.net/fread">fread</a>(<a href="http://www.php.net/fopen">fopen</a>($filepath, "rb"), <a href="http://www.php.net/filesize">filesize</a>($filepath))));
curl_setopt($curl, CURLOPT_URL, "http://docs.google.com/feeds/default/private/full");
curl_setopt($curl, CURLOPT_HTTPHEADER, $h);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
curl_setopt($curl, CURLOPT_POST, true);
$response = curl_exec($curl);
$response = simplexml_load_string($response);
$id_doc = $response-&gt;id;

// Limpiamos los IDs de los ficheros devueltos por Google, solo nos interesa del %3A para adelante
<a href="http://www.php.net/preg_match">preg_match</a>('/%3A(.+)/', $id_doc, $m);
$id_doc = $m[1];
<a href="http://www.php.net/preg_match">preg_match</a>('/%3A(.+)/', $id_folder, $m);
$id_folder = $m[1];

// Lo movemos a la carpeta
$h = <a href="http://www.php.net/array_merge">array_merge</a>($headers,<a href="http://www.php.net/array">array</a>('Content-Type: application/atom+xml'));
$data = '&lt;?xml version=\'1.0\' encoding=\'UTF-8\'?&gt;&lt;entry xmlns="http://www.w3.org/2005/Atom"&gt;&lt;id&gt;https://docs.google.com/feeds/default/private/full/document%3A'.$id_doc.'&lt;/id&gt;&lt;/entry&gt;';
curl_setopt($curl, CURLOPT_URL, "http://docs.google.com/feeds/default/private/full/folder%3A".$id_folder);
curl_setopt($curl, CURLOPT_HTTPHEADER, $h);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
curl_setopt($curl, CURLOPT_POST, true);
$response = curl_exec($curl);

//header('Content-type: text/xml');
//echo $response;
// Parse the response

// Exportamos a HTML
curl_setopt($curl, CURLOPT_URL, "http://docs.google.com/feeds/download/presentations/Export?docID=$id_doc&amp;exportFormat=pdf");
curl_setopt($curl, CURLOPT_HTTPHEADER, $h);
curl_setopt($curl, CURLOPT_POST, false);
<a href="http://www.php.net/header">header</a>('Content-type: application/pdf');
<a href="http://www.php.net/echo">echo</a> curl_exec($curl);

curl_close($curl);</code></pre>
<p>Nuestra fuente: <a href="http://sentidoweb.com/2011/03/27/subir-y-exportar-documentos-usando-google-docs-y-php.php?utm_source=feedburner&amp;utm_medium=feed&amp;utm_campaign=Feed%3A+sentidoweb+%28Sentido+Web%29&amp;utm_content=Google+International" target="_blank">Sentidoweb</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.adobe-user-group-granada.es/subir-y-exportar-documentos-usando-google-docs-y-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tutorial sobre Facebook Connect</title>
		<link>http://www.adobe-user-group-granada.es/tutorial-sobre-facebook-connect/</link>
		<comments>http://www.adobe-user-group-granada.es/tutorial-sobre-facebook-connect/#comments</comments>
		<pubDate>Tue, 02 Feb 2010 20:12:09 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[tutoriales]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[facebook connect]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://www.adobe-user-group-granada.es/?p=281</guid>
		<description><![CDATA[Facebook Connect es una API de FB que nos permite usar nuestra cuenta de FB en otras webs. A mi personalmente, la ayuda que ofrece FB no me apasiona demasiado, y cuando quieres realizar algo con Facebook Connect te tienes que pelear bastante con cosas que haces mal o que te faltan por hacer. Por [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://developers.facebook.com/connect.php">Facebook Connect</a> es una API de FB que nos permite usar nuestra cuenta de FB en otras webs. A mi personalmente, la ayuda que ofrece FB no me apasiona demasiado, y cuando quieres realizar algo con Facebook Connect te tienes que pelear bastante con cosas que haces mal o que te faltan por hacer. Por ello, creo que este tutorial es bastante interesante para aquellos que quieren desarrollar algo con FB Connect y no saben por dónde empezar.</p>
<p>El tutorial nos mostrará los siguientes puntos:</p>
<ol>
<li>Crear una aplicación en Facebook</li>
<li>Copiar en tu sitio el fichero xd_receiver.htm</li>
<li>Descargar la API PHP de FB en tu web</li>
<li>Modificar tu tabla de usuarios</li>
<li>Crear una página para loguearse con FB Connect</li>
<li>Enlazar a fbclogin.php desde tu login</li>
<li>Otros puntos a seguir</li>
</ol>
<p><a href="http://www.barattalo.it/facebook-connect-tutorial/">Facebook Connect Tutorial</a></p>
<p>Vía / <a href="http://www.phpdeveloper.org/news/13868">PHPDeveloper.org</a></p>
<p>Nuestra Fuente: <a href="http://sentidoweb.com/2010/02/02/tutorial-sobre-facebook-connect.php" target="_blank">SentidoWeb.com</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.adobe-user-group-granada.es/tutorial-sobre-facebook-connect/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Enviando contenido desde PHP a la consola de Firebug</title>
		<link>http://www.adobe-user-group-granada.es/enviando-contenido-desde-php-a-la-consola-de-firebug/</link>
		<comments>http://www.adobe-user-group-granada.es/enviando-contenido-desde-php-a-la-consola-de-firebug/#comments</comments>
		<pubDate>Wed, 20 Jan 2010 19:18:56 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[tutoriales]]></category>
		<category><![CDATA[firebug]]></category>
		<category><![CDATA[log]]></category>

		<guid isPermaLink="false">http://www.adobe-user-group-granada.es/?p=178</guid>
		<description><![CDATA[Hace unos días ante un proyecto un tanto complicado necesitaba poder ir analizando como se comportaba mi script en diversas partes del mismo.
Por lo general solía utilizar otros métodos a titulo de log como ser enviar la información a un archivo utilizando error_log() o enviar la información como comentario html para luego al ver el [...]]]></description>
			<content:encoded><![CDATA[<p>Hace unos días ante un proyecto un tanto complicado necesitaba poder ir analizando como se comportaba mi script en diversas partes del mismo.</p>
<p>Por lo general solía utilizar otros métodos a titulo de log como ser enviar la información a un archivo utilizando <strong>error_log()</strong> o enviar la información como <em>comentario html</em> para luego al ver el código fuente poder analizar los resultados, etc..</p>
<p>Para cambiar un poco quería jugar con algo conocido y muy usado cuando trabajo con <a href="http://es.wikipedia.org/wiki/AJAX" target="_blank"><strong>Ajax</strong></a>&#8230;utilizar la consola de <a href="http://getfirebug.com/" target="_blank">Firebug </a> como &#8220;log&#8221;.</p>
<p>Con lo anterior en la cabeza realice esta pequeña función que espero resulte de utilidad para alguien.<span id="more-178"></span></p>
<pre>function smrPhp2Firebug( $element, $titulo="" ) {
echo "&lt;script language=\"javascript1.1\" type=\"text/javascript\"&gt;\r\n";
echo "if ( typeof loadFirebugConsole == 'function' ) {\r\n";
if ( $titulo!="") {
echo sprintf( "console.log(%s);\r\n", json_encode($titulo ) ) ;
}
echo sprintf( "console.log(%s)\r\n", json_encode($element ) ) ;
echo "}\r\n";
echo "&lt;/script&gt;\r\n";
}</pre>
<p>La función ya forma parte de mi archivo de rutinas (<a href="http://www.adobe-user-group-granada.es/repositorio/rutinas.inc.zip" target="_blank">rutinas.inc.php</a>) y nos permitirá enviar el contenido deseado a la consola de <a href="http://getfirebug.com/" target="_blank">Firebug </a>con una descripción si lo desean.</p>
<p>Si te preguntas para que me serviría esto? Pues piensa en poder saber cómo está siendo armada tú consulta <strong>SQL </strong>ante los parámetros que recibe&#8230;. ó el contenido de una matriz&#8230; ó qué valor tiene una variable en determinado momento&#8230; ó como está la variable esa que contiene el mensaje que estoy a punto de enviar por correo electrónico&#8230; o tantas cosas más&#8230;</p>
<p>La forma de uso es sencilla puedes probar ejecutando este pequeño ejemplo:</p>
<pre>&lt;?php
#-=[ Incluir la libreria de rutinas ]=-
require_once("rutinas.inc.php");
#-=[ Genero una matriz de 1 dimensión ]=-
$frutas=array("manzana", "pera", "naranja", "kiwi", "mandarina", "mango");
#-=[ Genero una matriz asociativa ]=-
$comunidades=array( "Andalucía" =&gt; array("Huelva", "Sevilla", "Córdoba", "Jaén", "Cádiz", "Málaga", "Granada", "Almería")
,"Cataluña" =&gt; array("LLeida", "Tarragona", "Barcelona", "Girona")
);
#-=[ Leer Variable que llega por GET lipiando su contenido ]=-
$nombre=smrLimpiarVariables("GET","nombre","0");
?&gt;
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8" /&gt;
&lt;title&gt;Enviando contenido desde PHP a la consola de Firebug&lt;/title&gt;
&lt;/head&gt;

&lt;body&gt;
&lt;a href="http://www.adobe-user-group-granada.es"&gt;Adobe User Group Granada&lt;/a&gt;
&lt;?php
smrPhp2Firebug($frutas, "Matriz de Frutas"); // Muestra de contenido con un título
smrPhp2Firebug($comunidades); // Muestra de contenido sin título
smrPhp2Firebug($nombre, "Variable ingresada por GET");
?&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>Al ejecutarlo podrán ver en la consola del <a href="http://getfirebug.com/" target="_blank">Firebug</a> algo como la pantalla siguiente (clic en la miniatura para ampliarla):</p>
<p><a href="http://www.adobe-user-group-granada.es/wp-content/uploads/Clipboard01.jpg" target="_blank"><img class="aligncenter size-thumbnail wp-image-181" title="Vista de la consola de Firebug" src="http://www.adobe-user-group-granada.es/wp-content/uploads/Clipboard01-150x150.jpg" alt="" width="150" height="150" /></a></p>
<p>y si pulsamos cobre el <em><strong>Object </strong></em>podremos expandir su contenido como muestra la siguiente pantalla (clic en la miniatura para ampliarla)</p>
<p><a href="http://www.adobe-user-group-granada.es/wp-content/uploads/Clipboard02.jpg" target="_blank"><img class="aligncenter size-thumbnail wp-image-182" title="Vista de la matriz asociativa" src="http://www.adobe-user-group-granada.es/wp-content/uploads/Clipboard02-150x150.jpg" alt="" width="150" height="150" /></a></p>
<p>* Recuerda hacer las llamadas a <strong>smrPhp2Firebug()</strong> dentro de tu etiqueta <strong>body</strong>. Ya sabrás porque <img src='http://www.adobe-user-group-granada.es/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Es importante que les comente que luego de hacer esto se me ocurrió ver si la rueda no estaba inventada. Obviamente debería haberlo hecho antes pero bueno la función tampoco es que tenga mucha tarea <img src='http://www.adobe-user-group-granada.es/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> . Al investigar un poco encontré que en la red tenemos algunos post de utilidad con respecto al aprovechamiento de <a href="http://getfirebug.com/" target="_blank">FireBug </a>como ser estos:</p>
<ul>
<li><a href="http://www.elbleg.com/web-dev/10-buenas-razones-para-usar-firebug.html" target="_blank">10 buenas razones para usar Firebug</a></li>
<li><a href="http://www.elwebmaster.com/articulos/firephp-ampliacion-de-firebug-para-debug-de-codigo-php" target="_blank">FirePHP: Ampliación de Firebug para debug de código PHP</a></li>
<li><a href="http://www.desarrolloweb.com/articulos/utilizar-firephp-desde-php.html" target="_blank">Cómo utilizar el código PHP de FirePHP para mostrar mensajes de debug, que podremos visualizar en la consola de Firebug.</a></li>
<li><a href="http://www.webmasterlibre.com/2007/01/30/joe-hewitt-nos-demuestra-como-usar-firebug/" target="_blank">Joe Hewitt nos demuestra cómo usar Firebug</a></li>
</ul>
<p>Así que como siempre digo&#8230; Sobre gustos <img src='http://www.adobe-user-group-granada.es/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  pero bueno lo importante es que le saquemos el mayor provecho a esta herramienta llamada <a href="http://getfirebug.com/" target="_blank"><strong>FireBug</strong></a>. Que no tienes idea de donde bajarlo pues de aquí: <a href="http://getfirebug.com/" target="_blank">http://getfirebug.com/</a></p>
<p>Ah y el ejemplo queda <a href="http://www.adobe-user-group-granada.es/tutoriales/php2firebug/" target="_blank">aquí</a> por si quereís verlo&#8230; recuerda tener el Firebug activo!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.adobe-user-group-granada.es/enviando-contenido-desde-php-a-la-consola-de-firebug/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

