<?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>Iker Perez de Albeniz &#187; example</title>
	<atom:link href="http://www.ikeralbeniz.net/tag/example/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ikeralbeniz.net</link>
	<description>mi propio egolog sobre tecnología y frikadas varias</description>
	<lastBuildDate>Mon, 26 Apr 2010 15:54:10 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Primeros pasos con Buzz (segunda parte): Un widget de Buzz para Wordpress</title>
		<link>http://www.ikeralbeniz.net/2010/02/11/primeros-pasos-con-buzz-segunda-parte-un-widget-de-buzz-para-wordpress/</link>
		<comments>http://www.ikeralbeniz.net/2010/02/11/primeros-pasos-con-buzz-segunda-parte-un-widget-de-buzz-para-wordpress/#comments</comments>
		<pubDate>Thu, 11 Feb 2010 14:35:15 +0000</pubDate>
		<dc:creator>Iker</dc:creator>
				<category><![CDATA[Noticias]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[buzz]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[example]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[widget]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://www.ikeralbeniz.net/?p=153</guid>
		<description><![CDATA[<a href="http://www.ikeralbeniz.net/2010/02/11/primeros-pasos-con-buzz/">En el articulo anterior</a>  analizábamos la API de acceso a Buzz. Una vez analizada ya podemos ver como integrar Buzz en nuestra pagina. Para eso vamos a utilizar la API de Google para leer feeds y un script propio que lo que hará es mostrarnos el código HTML de los comentarios en in iframe refrescándolo cada 1 segundo. De este modo es posible crear un widget de Buzz para nuestro wordpress ]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.ikeralbeniz.net/2010/02/11/primeros-pasos-con-buzz/">En el articulo anterior</a> analizábamos la API de acceso a Buzz. Una vez analizada ya podemos ver como integrar Buzz en nuestra pagina. Para eso vamos a utilizar la API de Google para leer feeds y un script propio que lo que hará es mostrarnos el código HTML de los comentarios en in iframe refrescándolo cada 1 segundo. De este modo es posible crear un widget de Buzz para nuestro wordpress.</p>
<p>Antes de nada hay que tener en cuenta dos aspectos importantes:</p>
<ul>
<li>Al estar usando librerías Ajax de Google es necesario que solicites una clave API propia:<br />
<fieldset>
&lt;script type=&#8221;text/javascript&#8221; src=&#8221;http://www.google.com/jsapi?key=<b>ABQIAAAAMGph6fpNzf-ET0oBGVVHJxRpfcICevY5tQgqnPHEJCivekQnPxSD1FOWXFY6-VJtM6TmsT-tOJc9mg</b>&#8220;&gt;&lt;/script&gt;<br />
</fieldset>
</li>
<li>
En el lector de RSS debes indicar el RSS de tu cuanta  de Buzz en el articulo anterior te explicamos como obtenerla.</p>
<fieldset>
var feed = new google.feeds.Feed(&#8220;http://buzz.googleapis.com/feeds/<b>111738004311961586383</b>/public/posted&#8221;);<br />
</fieldset>
</li>
</ul>
<p><b><u>sample.html</u></b></p>
<div class="codesnip-container" >
<div class="html4strict codesnip" style="font-family:monospace;"><span class="sc2">&lt;<a href="http://december.com/html/4/element/html.html"><span class="kw2">html</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/head.html"><span class="kw2">head</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text/javascript&quot;</span> <span class="kw3">src</span><span class="sy0">=</span><span class="st0">&quot;http://www.google.com/jsapi?key=ABQIAAAAMGph6fpNzf-ET0oBGVVHJxRpfcICevY5tQgqnPHEJCivekQnPxSD1FOWXFY6-VJtM6TmsT-tOJc9mg&quot;</span>&gt;&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text/javascript&quot;</span> <span class="kw3">src</span><span class="sy0">=</span><span class="st0">&quot;buzz.js&quot;</span>&gt;&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/head.html"><span class="kw2">head</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/body.html"><span class="kw2">body</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/div.html"><span class="kw2">div</span></a> <span class="kw3">id</span><span class="sy0">=</span><span class="st0">&quot;buzz&quot;</span> <span class="kw3">style</span><span class="sy0">=</span><span class="st0">&quot;width:300px;background-color:#e1f3fa;&quot;</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/h1.html"><span class="kw2">h1</span></a> <span class="kw3">style</span><span class="sy0">=</span><span class="st0">&quot;font:20px Verdana;Color:#2193c5;margin:7px;&quot;</span>&gt;</span>Iker.perez<span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/h1.html"><span class="kw2">h1</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/hr.html"><span class="kw2">hr</span></a> <span class="kw3">style</span><span class="sy0">=</span><span class="st0">&quot;border: 1px dotted #CCCCCC;margin:5px 7px 0px 7px;&quot;</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/iframe.html"><span class="kw2">iframe</span></a> <span class="kw3">id</span><span class="sy0">=</span><span class="st0">&quot;buzz_msg_box&quot;</span> <span class="kw3">style</span><span class="sy0">=</span><span class="st0">&quot;margin:0px 7px 0px 7px;border:0px; width:286px; height:450px;background-color:#ffffff;&quot;</span>&gt;&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/iframe.html"><span class="kw2">iframe</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/hr.html"><span class="kw2">hr</span></a> <span class="kw3">style</span><span class="sy0">=</span><span class="st0">&quot;border: 1px dotted #CCCCCC;margin:0px 7px 0px 7px;&quot;</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/img.html"><span class="kw2">img</span></a> <span class="kw3">src</span><span class="sy0">=</span><span class="st0">&quot;buz.png&quot;</span> <span class="kw3">style</span><span class="sy0">=</span><span class="st0">&quot;margin: 7px&quot;</span> <span class="kw3">width</span><span class="sy0">=</span><span class="st0">&quot;100px&quot;</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/div.html"><span class="kw2">div</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/body.html"><span class="kw2">body</span></a>&gt;</span><br />
<span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/html.html"><span class="kw2">html</span></a>&gt;</span></div>
</div>
<p><b><u>buzz.js</u></b></p>
<div class="codesnip-container" >
<div class="javascript codesnip" style="font-family:monospace;">google.<span class="me1">load</span><span class="br0">&#40;</span><span class="st0">&quot;feeds&quot;</span><span class="sy0">,</span> <span class="st0">&quot;1&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="kw2">var</span> Editor<span class="sy0">;</span><br />
window.<span class="kw3">onload</span> <span class="sy0">=</span> <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
Editor <span class="sy0">=</span> document.<span class="me1">getElementById</span><span class="br0">&#40;</span>‘buzz_msg_box’<span class="br0">&#41;</span>.<span class="me1">contentWindow</span>.<span class="me1">document</span><span class="sy0">;</span><br />
Editor.<span class="me1">designMode</span> <span class="sy0">=</span> <span class="st0">&quot;on&quot;</span><span class="sy0">;</span></p>
<p><span class="br0">&#125;</span></p>
<p><span class="kw2">function</span> initialize<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<span class="kw2">var</span> feed <span class="sy0">=</span> <span class="kw2">new</span> google.<span class="me1">feeds</span>.<span class="me1">Feed</span><span class="br0">&#40;</span><span class="st0">&quot;http://buzz.googleapis.com/feeds/111738004311961586383/public/posted&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
feed.<span class="me1">setNumEntries</span><span class="br0">&#40;</span>20<span class="br0">&#41;</span><span class="sy0">;</span><br />
feed.<span class="me1">load</span><span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span>result<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span>result.<span class="me1">error</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<span class="kw2">var</span> alltest <span class="sy0">=</span> <span class="st0">&quot;&quot;</span><span class="sy0">;</span><br />
<span class="kw2">var</span> simplepost <span class="sy0">=</span> <span class="st0">&quot;&quot;</span><span class="sy0">;</span><br />
<span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw2">var</span> i <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span> i <span class="sy0">&lt;</span> result.<span class="me1">feed</span>.<span class="me1">entries</span>.<span class="me1">length</span><span class="sy0">;</span> i<span class="sy0">++</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
simplepost <span class="sy0">=</span> <span class="st0">&quot;&quot;</span><span class="sy0">;</span><br />
<span class="kw2">var</span> entry <span class="sy0">=</span> result.<span class="me1">feed</span>.<span class="me1">entries</span><span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="sy0">;</span></p>
<p>simplepost <span class="sy0">+</span>’ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="sy0">&lt;</span>div id<span class="sy0">=</span><span class="st0">&quot;message&quot;</span> style<span class="sy0">=</span><span class="st0">&quot;font: 12px Verdana;&quot;</span><span class="sy0">&gt;&lt;</span>b<span class="sy0">&gt;</span>’<span class="sy0">+</span>entry.<span class="me1">publishedDate</span>.<span class="me1">split</span><span class="br0">&#40;</span><span class="st0">&quot; -&quot;</span><span class="br0">&#41;</span><span class="br0">&#91;</span>0<span class="br0">&#93;</span><span class="sy0">+</span>’<span class="sy0">:&lt;/</span>b<span class="sy0">&gt;&lt;</span>br<span class="sy0">/&gt;</span>’<span class="sy0">+</span>entry.<span class="me1">content</span><span class="sy0">+</span>’<span class="sy0">&lt;/</span>div<span class="sy0">&gt;</span>\r\n’<span class="sy0">;</span><br />
simplepost <span class="sy0">=</span> simplepost <span class="sy0">+</span>’<span class="sy0">&lt;</span>hr style<span class="sy0">=</span><span class="st0">&quot;border: 1px dotted #CCCCCC;&quot;</span><span class="sy0">/&gt;</span>\r\n’<span class="sy0">;</span><br />
<span class="co1">//entry.title+&quot;&lt;br&gt;&quot;+;</span><br />
alltest <span class="sy0">=</span> alltest <span class="sy0">+</span> simplepost <span class="sy0">;</span></p>
<p><span class="br0">&#125;</span><br />
Editor.<span class="me1">body</span>.<span class="me1">innerHTML</span> <span class="sy0">=</span> alltest<span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span></p>
<p><span class="kw2">function</span> reloadComments<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
google.<span class="me1">setOnLoadCallback</span><span class="br0">&#40;</span>initialize<span class="br0">&#41;</span><span class="sy0">;</span><br />
setTimeout<span class="br0">&#40;</span>‘reloadComments<span class="br0">&#40;</span><span class="br0">&#41;</span>’<span class="sy0">,</span>1000<span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span></p>
<p>reloadComments<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</div>
<p><script src=" http://www.google.com/jsapi?key=ABQIAAAAMGph6fpNzf-ET0oBGVVHJxQQoHrY9u_rp1SaYddJxgOQxtY48RRyhqUKntvA_6AOt-9yU_OgLg6VRA" type="text/javascript"></script><script src="http://www.ikeralbeniz.net/wp-content/uploads/2010/02/buzz.js" type="text/javascript"> </script><br />
<center></p>
<div id="buzz" style="width: 300px; background-color: #e1f3fa;">
<h1 style="font: 20px Verdana; color: #2193c5; margin: 7px;">Ikalbeniz</h1>
<hr style="border: 1px dotted #CCCCCC; margin: 5px 7px 0px 7px;" />
<iframe id="buzz_msg_box" style="margin:0px 7px 0px 7px;border:0px; width:286px; height:450px;background-color:#ffffff;"></iframe></p>
<hr style="border: 1px dotted #CCCCCC; margin: 0px 7px 0px 7px;" />
<img style="margin: 7px;" src="http://www.ikeralbeniz.net/wp-content/uploads/2010/02/buz.png" alt="" width="100px" /></div>
<p></center></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ikeralbeniz.net/2010/02/11/primeros-pasos-con-buzz-segunda-parte-un-widget-de-buzz-para-wordpress/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sencillo Mirror de imágenes para tu Blog usando Google App Engine</title>
		<link>http://www.ikeralbeniz.net/2010/01/25/sencillo-mirror-de-imagenes-para-tu-blog-usando-google-app-engine/</link>
		<comments>http://www.ikeralbeniz.net/2010/01/25/sencillo-mirror-de-imagenes-para-tu-blog-usando-google-app-engine/#comments</comments>
		<pubDate>Mon, 25 Jan 2010 16:59:53 +0000</pubDate>
		<dc:creator>Iker</dc:creator>
				<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[CDN]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[Content Delivery Network]]></category>
		<category><![CDATA[example]]></category>
		<category><![CDATA[gae]]></category>
		<category><![CDATA[google App Engine]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[imagenes]]></category>
		<category><![CDATA[mirror]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[reposotorio]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://www.ikeralbeniz.net/?p=116</guid>
		<description><![CDATA[Muchos de los Hostings que usamos para albergar nuestras webs tienen una limitación de ancho de banda mensual. Por tanto es bastante interesante disponer de un sistema de almacenamiento de imágenes que nos permita disponer de dichos archivos sin consumir ancho de banda de nuestro posting. En este artículo voy a explicar como realizar una pequeña aplicación para tener nuestro mirror de imágenes.]]></description>
			<content:encoded><![CDATA[<p>Muchos de los Hostings que usamos para albergar nuestras webs tienen una limitación de ancho de banda mensual. Por tanto es bastante interesante disponer de un sistema de almacenamiento de imágenes que nos permita disponer de dichos archivos sin consumir ancho de banda de nuestro posting. En este artículo voy a explicar como realizar una pequeña aplicación para tener nuestro mirror de imágenes.</p>
<p>En este articulo no voy a dar por echo que el lector conoce y se maneja en el entorno Google App Engine por tanto me centrare en explicar el código utilizado.</p>
<p><span style="text-decoration: underline;"><strong>main.py</strong></span></p>
<fieldset>import cgi<br />
import os<br />
from google.appengine.api import users<br />
from google.appengine.ext import webapp<br />
from google.appengine.ext.webapp.util import run_wsgi_app<br />
import google.appengine.ext.webapp.util<br />
from google.appengine.ext import db<br />
from google.appengine.ext.webapp import template</p>
<p>class Mirror(db.Model):<br />
&nbsp;name = db.TextProperty()<br />
&nbsp;mime = db.TextProperty()<br />
&nbsp;picture = db.BlobProperty(default=None)</p>
<p>class GetImage(webapp.RequestHandler):<br />
&nbsp;def get(self,name):<br />
&nbsp;&nbsp;image = getImageFile(name)<br />
&nbsp;&nbsp;if (movie and movie.picture):<br />
&nbsp;&nbsp;&nbsp;self.response.headers['Content-Type'] = image.mime<br />
&nbsp;&nbsp;&nbsp;self.response.out.write(image.picture)<br />
&nbsp;&nbsp;else:<br />
&nbsp;&nbsp;&nbsp;self.response.out.write(&#8220;&lt;!DOCTYPE HTML PUBLIC \&#8221;-//IETF//DTD HTML 2.0//EN\&#8221;&gt;\r\n&#8221;)<br />
&nbsp;&nbsp;&nbsp;self.response.out.write(&#8220;&lt;html&gt;\r\n\t&lt;head&gt;\r\n&#8221;)<br />
&nbsp;&nbsp;&nbsp;self.response.out.write(&#8220;\t\t&lt;title&gt;404 Not Found&lt;/title&gt;\r\n&#8221;)<br />
&nbsp;&nbsp;&nbsp;self.response.out.write(&#8220;\t&lt;/head&gt;\r\n\t&lt;body&gt;\r\n&#8221;)<br />
&nbsp;&nbsp;&nbsp;self.response.out.write(&#8220;\t\t&lt;h1&gt;Not Found&lt;/h1&gt;\r\n&#8221;)<br />
&nbsp;&nbsp;&nbsp;self.response.out.write(&#8220;\t\t&lt;p&gt;The requested URL /%s was not found on this server.&lt;/p&gt;\r\n&#8221;%name)<br />
&nbsp;&nbsp;&nbsp;self.response.out.write(&#8220;\t&lt;/body&gt;\r\n&lt;/html&gt;\r\n&#8221;)</p>
<p>def getImageFile(name):<br />
&nbsp;images = Mirror.all()<br />
&nbsp;for image in images:<br />
&nbsp;&nbsp;if image.name == name:<br />
&nbsp;&nbsp;&nbsp;return image<br />
&nbsp;return None</p>
<p>class MainHandler(webapp.RequestHandler):</p>
<p>&nbsp;def get(self):<br />
&nbsp;&nbsp;images = Mirror.all()<br />
&nbsp;&nbsp;template_values = {<br />
&nbsp;&nbsp;&nbsp;&#8217;error&#8217;: &#8220;&#8221;,<br />
&nbsp;&nbsp;&nbsp;&#8217;images&#8217;: images,<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;path = os.path.join(os.path.dirname(__file__), &#8216;form.html&#8217;)<br />
&nbsp;&nbsp;self.response.out.write(template.render(path, template_values))</p>
<p>&nbsp;def post(self):<br />
&nbsp;&nbsp;newimage = Mirror()<br />
&nbsp;&nbsp;imagedata = self.request.get(&#8220;image&#8221;)<br />
&nbsp;&nbsp;newimage.picture = db.Blob(imagedata)<br />
&nbsp;&nbsp;newimage.name = self.request.POST[u'image'].filename<br />
&nbsp;&nbsp;newimage.mime = self.request.POST[u'image'].type<br />
&nbsp;&nbsp;newimage.put()<br />
&nbsp;&nbsp;self.redirect(&#8220;/&#8221;)</p>
<p>def main():<br />
&nbsp;application = webapp.WSGIApplication([('/', MainHandler),(r'/(.*)', GetImage)],debug=True)<br />
&nbsp;run_wsgi_app(application)</p>
<p>if __name__ == &#8216;__main__&#8217;:<br />
&nbsp;main()</fieldset>
<p>Comos sabéis la aplicación que subimos a los servidores de Google corren en una SandBox donde no es posible escribir en disco, por tanto usaremos el sistema de almacenamiento de GAE para almacenar las imágenes. Por tanto primero de todo deberemos definir un modelo de datos.</p>
<fieldset>class Mirror(db.Model):<br />
&nbsp;name = db.TextProperty()<br />
&nbsp;mime = db.TextProperty()<br />
&nbsp;picture = db.BlobProperty(default=None)</fieldset>
<p>En este caso definimos la estructura Mirror con sus propiedades name (nombre de la imagen), mime (mime de la imagen) y picture (la imagen en bruto).</p>
<p>Comos sabéis el sistema de paths de GAE es gestionado a través de SGIApplication por tanto para poder acceder a las imágenes almacenadas deberemos definir una política de paths. En este caso he definido la siguiente:</p>
<fieldset>application = webapp.WSGIApplication([('/', MainHandler),(r'/(.*)', GetImage)],debug=True)<br />
run_wsgi_app(application)</fieldset>
<p>Es decir en caso de acceder a / se nos mostrara la pagina principal a través de la clase MainHandler y en caso de que se nos muestre /<loquesea> se nos mostrara el archivos <loquesea> a través de la classe GetImage.</p>
<p><strong>La Clase MainHandler</strong></p>
<fieldset>class MainHandler(webapp.RequestHandler):</p>
<p>def get(self):<br />
&nbsp;images = Mirror.all()<br />
&nbsp;template_values = {<br />
&nbsp;&nbsp;&#8217;error&#8217;: &#8220;&#8221;,<br />
&nbsp;&nbsp;&#8217;images&#8217;: images,<br />
&nbsp;}<br />
&nbsp;path = os.path.join(os.path.dirname(__file__), &#8216;form.html&#8217;)<br />
&nbsp;self.response.out.write(template.render(path, template_values))</p>
<p>def post(self):<br />
&nbsp;newimage = Mirror()<br />
&nbsp;imagedata = self.request.get(&#8220;image&#8221;)<br />
&nbsp;newimage.picture = db.Blob(imagedata)<br />
&nbsp;newimage.name = self.request.POST[u'image'].filename<br />
&nbsp;newimage.mime = self.request.POST[u'image'].type<br />
&nbsp;newimage.put()<br />
&nbsp;self.redirect(&#8220;/&#8221;)</fieldset>
<p>La clase MainHandler en caso de se accedida mediante GET mostrara el formulario HTML (form.html) y un listado de imágenes almacenadas, para hacer mas legible el código he optado por usar la funcionalidad de platillas que ofrece GAE. </p>
<p>El formulario envía su mismo path la imagen utilizando el método POST por tanto en el tetrodo POST de la clase MainHandler donde se almacenara la imagen enviada.</p>
<p><strong>La Clase GetImage</strong></p>
<fieldset>class GetImage(webapp.RequestHandler):<br />
&nbsp;def get(self,name):<br />
&nbsp;image = getImageFile(name)<br />
&nbsp;if (movie and movie.picture):<br />
&nbsp;&nbsp;self.response.headers['Content-Type'] = image.mime<br />
&nbsp;&nbsp;self.response.out.write(image.picture)<br />
&nbsp;else:<br />
&nbsp;&nbsp;self.response.out.write(&#8220;&lt;!DOCTYPE HTML PUBLIC \&#8221;-//IETF//DTD HTML 2.0//EN\&#8221;&gt;\r\n&#8221;)<br />
&nbsp;&nbsp;self.response.out.write(&#8220;&lt;html&gt;\r\n\t&lt;head&gt;\r\n&#8221;)<br />
&nbsp;&nbsp;self.response.out.write(&#8220;\t\t&lt;title&gt;404 Not Found&lt;/title&gt;\r\n&#8221;)<br />
&nbsp;&nbsp;self.response.out.write(&#8220;\t&lt;/head&gt;\r\n\t&lt;body&gt;\r\n&#8221;)<br />
&nbsp;&nbsp;self.response.out.write(&#8220;\t\t&lt;h1&gt;Not Found&lt;/h1&gt;\r\n&#8221;)<br />
&nbsp;&nbsp;self.response.out.write(&#8220;\t\t&lt;p&gt;The requested URL /%s was not found on this server.&lt;/p&gt;\r\n&#8221;%name)<br />
&nbsp;&nbsp;self.response.out.write(&#8220;\t&lt;/body&gt;\r\n&lt;/html&gt;\r\n&#8221;)</fieldset>
<p>La clase getImage recoge en el parámetro nombre de la función get el resultado de la expresión regular definida en el <em>path r’(.*)’</em>. Por tanto en este caso name será el nombre del archivo. Mediante la función getImageFile recorremos la base de datos y buscamos el archivo solicitado. </p>
<fieldset>def getImageFile(name):<br />
&nbsp;images = Mirror.all()<br />
&nbsp;for image in images:<br />
&nbsp;&nbsp;if image.name == name:<br />
&nbsp;&nbsp;&nbsp;return image<br />
&nbsp;return None</fieldset>
<p>Si existe el archivo este es mostrado modificando la cabecera Content-Type con el mime del archivo para que el navegador lo muestre correctamente. En caso contrario se muestra un mensaje de error.</p>
<p><span style="text-decoration: underline;"><strong>form.html</strong></span></p>
<fieldset>&lt;!DOCTYPE HTML PUBLIC &#8220;-//IETF//DTD HTML 2.0//EN&#8221;&gt;<br />
&lt;html&gt;<br />
&lt;head&gt;<br />
&lt;title&gt;Upload File&lt;/title&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;h1&gt;Select File to Upload&lt;/h1&gt;<br />
&lt;form action=&#8221;" method=&#8221;POST&#8221; enctype=&#8221;multipart/form-data&#8221; &gt;<br />
&lt;input name=&#8221;image&#8221; type=&#8221;file&#8221; size=&#8221;42&#8243; /&gt;<br />
&lt;input type=&#8221;submit&#8221; value=&#8221;Upload&#8221;&gt;<br />
&lt;/form&gt;<br />
&lt;H1&gt;Index of Files&lt;/H1&gt;<br />
&lt;PRE&gt;<br />
&lt;IMG SRC=&#8221;/blank.gif&#8221; ALT=&#8221;     &#8220;&gt; &lt;A HREF=&#8221;?N=D&#8221;&gt;Name&lt;/A&gt;<br />
&lt;HR&gt;<br />
{% for image in images %}<br />
&lt;IMG SRC=&#8221;/image2.gif&#8221; ALT=&#8221;[IMG]&#8220;&gt; &lt;A HREF=&#8221;/{{image.name}}&#8221;&gt;{{image.name}}&lt;/A&gt;<br />
{% endfor %}<br />
&lt;/PRE&gt;<br />
&lt;HR&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</fieldset>
<p>Se trata de un ejemplo sencillo, no hay validación de imágenes duplicadas. Además seria posible enviar un código de control a través de la petición POST para evitar que nos suban imágenes de terceros o incluso usar el sistema de loging de Google.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ikeralbeniz.net/2010/01/25/sencillo-mirror-de-imagenes-para-tu-blog-usando-google-app-engine/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Crear un cliente de Gtalk con Adobe Air</title>
		<link>http://www.ikeralbeniz.net/2008/04/01/crear-un-cliente-de-gtalk-con-adobe-air/</link>
		<comments>http://www.ikeralbeniz.net/2008/04/01/crear-un-cliente-de-gtalk-con-adobe-air/#comments</comments>
		<pubDate>Tue, 01 Apr 2008 10:45:52 +0000</pubDate>
		<dc:creator>Iker</dc:creator>
				<category><![CDATA[Manuales]]></category>
		<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[Adobe Air]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[example]]></category>
		<category><![CDATA[Gtalk]]></category>

		<guid isPermaLink="false">http://www.ikeralbeniz.net/?p=138</guid>
		<description><![CDATA[<p>Según comentan en <a href="http://www.barrapunto.com" target="link">Barrapunto</b> <a href="http://barrapunto.com/articles/08/03/31/0937250.shtml" target="link">Adobe lanza Flex y Air para Linux</a>. A mi no me decía mucho, ya que conocía estas tecnologías de oídas, y la verdad es que no tenia ni idea de que se trataban.</p>

<p>En el artículo comentan que Air es algo similar al Prism de Mozilla, por lo que me he podido hacer una idea inicial y no he tardado en intentar hacer algún script de ejemplo.</p>]]></description>
			<content:encoded><![CDATA[<p>Según comentan en <a href="http://www.barrapunto.com" target="link">Barrapunto</b> <a href="http://barrapunto.com/articles/08/03/31/0937250.shtml" target="link">Adobe lanza Flex y Air para Linux</a>. A mi no me decía mucho, ya que conocía estas tecnologías de oídas, y la verdad es que no tenia ni idea de que se trataban.</p>
<p>En el artículo comentan que Air es algo similar al Prism de Mozilla, por lo que me he podido hacer una idea inicial y no he tardado en intentar hacer algún script de ejemplo.</p>
<h5>Instalando la SDK</h5>
<p>Lo primero que tienes que hacer es instalar el “interprete” de AIR para poder ejecutar tus aplicaciones.</p>
<p><a href="http://get.adobe.com/air/" target="link">http://get.adobe.com/air/</a><br />
o<br />
<a href="http://airdownload.adobe.com/air/win/download/1.0/AdobeAIRInstaller.exe" target="link">http://airdownload.adobe.com/air/win/download/1.0/AdobeAIRInstaller.exe</a></p>
<p>Una vez instalado el intérprete tienes que instalar la SDK que es posible descargar desde este enlace:</p>
<p><a href="http://airdownload.adobe.com/air/win/download/1.0/AdobeAIRSDK.zip" target="link">http://airdownload.adobe.com/air/win/download/1.0/AdobeAIRSDK.zip</a></p>
<p>Descomprimimos el ZIP y añadimos al PATH el directorio /bin </p>
<h5>Creando un Ejemplo Básico</h5>
<p>Creamos un Directorio llamada GTalk y dentro de este dos archivos: GTalk-app.xml y GTalk.html</p>
<p><b>Gtalk-app.xml</b></p>
<p>
<fieldset>&#60;?xml version=&#8221;1.0&#8243; encoding=&#8221;UTF-8&#8243;?&#62;<br />
&#60;application xmlns=&#8221;http://ns.adobe.com/air/application/1.0&#8243;&#62;<br />
    &#60;id&#62;google.gmail.GTalk&#60;/id&#62;</p>
<p>    &#60;version&#62;0.1&#60;/version&#62;<br />
    &#60;filename&#62;Googel Talk&#60;/filename&#62;<br />
    &#60;initialWindow&#62;<br />
        &#60;content&#62;GTalk.html&#60;/content&#62;</p>
<p>        &#60;visible&#62;true&#60;/visible&#62;<br />
        &#60;width&#62;300&#60;/width&#62;<br />
        &#60;height&#62;600&#60;/height&#62;<br />
    &#60;/initialWindow&#62;</p>
<p>&#60;/application&#62;<br />
</fieldset>
</p>
<p>Donde Indicamos propiedades como el nombre de la aplicación o las dimensiones de la ventana de la aplicación.</p>
<p><b>GTakl.html</b></p>
<p>
<fieldset>&#60;html&#62;<br />
&#60;head&#62;<br />
    &#60;title&#62;Google Talk&#60;/title&#62;<br />
&#60;/head&#62;</p>
<p>&#60;body&#62;<br />
&#60;iframe  src =&#8221;http://talkgadget.google.com/talkgadget/popout&#8221; width=&#8221;100%&#8221; height=&#8221;100%&#8221; name=&#8221;gtalk&#8221; frameborder=&#8221;0&#8243;&#62; &#60;/iframe&#62;</p>
<p>&#60;/body&#62;<br />
&#60;/html&#62;<br />
</fieldset>
</p>
<p>Es un archivo HTML normal. En el head editamos la etiqueta titulo para definir el titulo que aparecerá en la ventana. En el body editamos una etiqueta iframe que se enlazara con el cliente flash de Gtalk propio de Google.</p>
<p>Si abrimos  GTakl.html podemos ver que el cliente funciona correctamente.</p>
<p><center><img src="http://www.ikeralbeniz.net/wp-content/uploads/2008/04/gtalk1.jpg" alt="GTalk.html en Firefox" /></center></p>
<p>Por tanto es hora de probar que funciona nuestro scripr de AIR. Por tanto ejecutaremos el comando ADL</p>
<p>
<fieldset>$~ [ruta_air_sdk]\adl.exe GTalk-app.xml<br />
</fieldset>
</p>
<p>Y veremos ejecutarse nuestra aplicación de AIR.</p>
<p><center><img src="http://www.ikeralbeniz.net/wp-content/uploads/2008/04/gtalk2.jpg" alt="Gtalk ejecutandose en Adobe AIR" /></center></p>
<p>Finalmente “compilaremos” nuestra aplicación para generar un .air instalable y redistribuible.</p>
<p>Para ello deberemos primero crear un certificado.</p>
<p>
<fieldset>$~ [ruta_air_sdk]\adt -certificate -cn SelfSigned 1024-RSA sampleCert.pfx samplePassword<br />
</fieldset>
</p>
<p>Y finalmente generar a instalador.</p>
<p>
<fieldset>$~ [ruta_air_sdk]\adt -package -storetype pkcs12 -keystore sampleCert.pfx GTalk.air<br />
GTalk-app.xml GTalk.html<br />
</fieldset>
</p>
<p>Ya disponemos de una aplicación GTalk basada en Adobe AIR multiplataforma.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ikeralbeniz.net/2008/04/01/crear-un-cliente-de-gtalk-con-adobe-air/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
