<?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; Tecnologia</title>
	<atom:link href="http://www.ikeralbeniz.net/category/tecnologia/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>Android Application Widget</title>
		<link>http://www.ikeralbeniz.net/2010/04/06/android-application-widget/</link>
		<comments>http://www.ikeralbeniz.net/2010/04/06/android-application-widget/#comments</comments>
		<pubDate>Tue, 06 Apr 2010 13:06:01 +0000</pubDate>
		<dc:creator>Iker</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Noticias]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[market]]></category>
		<category><![CDATA[widget]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://www.ikeralbeniz.net/?p=223</guid>
		<description><![CDATA[Plugin para WordPress que permite mostrar la información de tu propia aplicación o aplicación preferida para Android. Se conecta automáticamente a Android Market descargando de forma periódica la información sobre tu aplicación como: valoración de los usuarios, descargas, comentarios, versión,.. etc.]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.ikeralbeniz.net/wp-content/uploads/2010/03/wordpress_android.png"><img class="alignright size-medium wp-image-218" title="wordpress_android" src="http://www.ikeralbeniz.net/wp-content/uploads/2010/03/wordpress_android-171x300.png" alt="" width="171" height="300" /></a>Plugin para WordPress que permite mostrar la información de tu propia aplicación o aplicación preferida para Android. Se conecta automáticamente a Android Market descargando de forma periódica la información sobre tu aplicación como: valoración de los usuarios, descargas, comentarios, versión,.. etc.</p>
<p>Además facilita la instalación de la aplicación por parte de los usuarios ya que al pulsar “Instalar” se muestra un código de barras que permite acceder a la aplicación en Android Market directamente.</p>
<p>La aplicación se conecta a Androd Market mediante una pequeña implementación de protocolo usado por Google para acceder al Market a través de los terminales Android. Esta implementación es aun muy simple y se ira mejorando en próximas versiones.</p>
<p><strong>WordPress plugin for displaying the information of your own or preferred Android application. Widget automatically connects to Android Market downloading the information about your application like: rating, downloads, reviews, release, .. etc.</strong></p>
<p><strong>It also facilitates the installation of the application by users. Pressing &#8220;Install&#8221; shows a bar code that allows access to the Android Market application directly.</strong></p>
<p><strong>The application connects to Androd Market with a small implementation of the protocol used by Google to access the Market through the Android terminals. This implementation is still very simple and it will be improved in future releases.</strong></p>
<p>Mas información/<strong>More info</strong>:</p>
<p style="text-align: center;"><span style="color: #3366ff;"><strong><a href="http://wordpress.org/extend/plugins/android-application-widget/">http://wordpress.org/extend/plugins/android-application-widget/</a></strong></span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ikeralbeniz.net/2010/04/06/android-application-widget/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Usar/Crear Filtros para las plantillas de django/Google App Engine</title>
		<link>http://www.ikeralbeniz.net/2010/03/11/usarcrear-filtros-para-las-plantillas-de-djangogoogle-app-engine/</link>
		<comments>http://www.ikeralbeniz.net/2010/03/11/usarcrear-filtros-para-las-plantillas-de-djangogoogle-app-engine/#comments</comments>
		<pubDate>Thu, 11 Mar 2010 11:17:03 +0000</pubDate>
		<dc:creator>Iker</dc:creator>
				<category><![CDATA[Google App Engine]]></category>
		<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[filters]]></category>
		<category><![CDATA[filtros]]></category>
		<category><![CDATA[gae]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[google App Engine]]></category>
		<category><![CDATA[plantillas]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[templates]]></category>

		<guid isPermaLink="false">http://www.ikeralbeniz.net/?p=193</guid>
		<description><![CDATA[Una de los temas mas interesante en Google App Engine es la posibilidad de usar plantillas. En la página de GAE existen<a href="http://code.google.com/intl/es/appengine/docs/python/gettingstarted/templates.html"> ejemplos sencillos de cómo utilizar plantillas</a>.El problema empieza cuando dentro de esas plantillas quieres hacer tratamiento de los datos para mostrar los datos correctamente. En esta articulo intentaremos explicar como usar esos filtros y como crear propios.]]></description>
			<content:encoded><![CDATA[<p>Una de los temas mas interesante en Google App Engine es la posibilidad de usar plantillas. En la página de GAE existen<a href="http://code.google.com/intl/es/appengine/docs/python/gettingstarted/templates.html"> ejemplos sencillos de cómo utilizar plantillas</a>.El problema empieza cuando dentro de esas plantillas quieres hacer tratamiento de los datos para mostrar los datos correctamente. En esta articulo intentaremos explicar como usar esos filtros y como crear propios.</p>
<p>Como habéis podido ver en el ejemplo de la pagina de GAE, la forma de mostrar un valor en la plantilla es usando la sintaxis <strong>{{ variable }}</strong>. En la mayoría de los casos dichas variables serán de tipo string o integer por lo que su visualización no tendrá mayor problema. Pero por ejemplo en el caso de variables tipo datetime u otro tipo de objeto propio, el sistema de plantillas no es capaz de mostrar el contenido de dichas variables, ya que solo es capaz de mostrar valores tipo string o integer.</p>
<p>Para los tipos de datos mas comunes existen ya filtros por defecto como es el caso de los valores datetime. La forma de aplicar un filtro es la siguiente:</p>
<div class="codesnip-container" >
<div class="python codesnip" style="font-family:monospace;"><span class="br0">&#123;</span><span class="br0">&#123;</span>variable|filtro<span class="br0">&#125;</span><span class="br0">&#125;</span></div>
</div>
<p>Y en algunos casos:</p>
<div class="codesnip-container" >
<div class="python codesnip" style="font-family:monospace;"><span class="br0">&#123;</span><span class="br0">&#123;</span>variable|filtro:argumento<span class="br0">&#125;</span><span class="br0">&#125;</span></div>
</div>
<p>En el caso de los valores datetime que hemos comentado antes, para mostrar un valor de fecha deberemos usar el filtro date de la siguiente manera:</p>
<div class="codesnip-container" >
<div class="python codesnip" style="font-family:monospace;"><span class="br0">&#123;</span><span class="br0">&#123;</span>mydatevar|date:<span class="st0">&quot;j&quot;</span><span class="br0">&#125;</span><span class="br0">&#125;</span></div>
</div>
<p>Esto seria equivalente a ejecutar una función <strong>date(mydatevar,”j”)</strong> y lo que estoy haciendo es mostrar el día del mes (<a href="http://docs.python.org/library/datetime.html#strftime-behavior">código %j</a>) similar a como se hace en otros lenguajes de programación.</p>
<p><a href="http://docs.djangoproject.com/en/dev/ref/templates/builtins/">Aquí</a> podéis encontrar un listado con los principales filtros predeterminados en django</p>
<p>El problema es cuando estas funciones no son suficientes para hacer lo que nosotros queremos, o queremos tratar tipos de objetos poco comunes o propios.</p>
<p>Por ejemplo imaginemos que queremos tenemos un libro de visitas donde los usuarios puede escribir entradas, e indican su dirección de correo. Pero no queremos que esa dirección de correo sea visible para que no pueda ser rastreada por spammers, por lo que optamos por mostrar solo los 5 primeros caracteres de el nombre de usuario de la cuenta de correo mas tres puntos suspensivos (algo parecido a lo que se hace en las listas de distribución). Es decir para <strong>estoesunaprueba@gmail.com</strong> nos generara una dirección del tipo <strong>estoe…@gmail.com</strong>.</p>
<p>Por tanto nuestra función en python seria algo así como:</p>
<div class="codesnip-container" >
<div class="python codesnip" style="font-family:monospace;"><span class="kw1">def</span> securemail <span class="br0">&#40;</span>mail<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> mail.<span class="me1">split</span><span class="br0">&#40;</span>‘@’<span class="br0">&#41;</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="br0">&#91;</span>:<span class="nu0">5</span><span class="br0">&#93;</span>+”…@”+ mail.<span class="me1">split</span><span class="br0">&#40;</span>‘@’<span class="br0">&#41;</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span></div>
</div>
<p>Es decir, dividimos la dirección en usuario y dominio con la función split y el carácter @, y generamos una nueva dirección con los primeros 5 caracteres de el usuario mas tres puntos suspensivos la arroba y el dominio.</p>
<p>Para poder usar esta función en nuestras plantillas haremos lo siguiente. Crearemos un script customfilters.py donde guardaremos todas nuestros filtros. Dicho script tendrá la siguiente forma</p>
<div class="codesnip-container" >
<div class="python codesnip" style="font-family:monospace;"><span class="kw1">from</span> google.<span class="me1">appengine</span>.<span class="me1">ext</span> <span class="kw1">import</span> webapp<br />
<span class="kw1">from</span> <span class="kw3">datetime</span> <span class="kw1">import</span> <span class="kw3">datetime</span><br />
&nbsp;<br />
register = webapp.<span class="me1">template</span>.<span class="me1">create_template_register</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp;<br />
<span class="kw1">def</span> securemail <span class="br0">&#40;</span>mail<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> mail.<span class="me1">split</span><span class="br0">&#40;</span>‘@’<span class="br0">&#41;</span><span class="br0">&#91;</span>0<span class="br0">&#93;</span><span class="br0">&#91;</span>:5<span class="br0">&#93;</span>+”…@”+ mail.<span class="me1">split</span><span class="br0">&#40;</span>‘@’<span class="br0">&#41;</span><span class="br0">&#91;</span>1<span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
register.<span class="kw2">filter</span><span class="br0">&#40;</span>securemail<span class="br0">&#41;</span></div>
</div>
<p>Para importar los filtros en nuestra aplicación añadiremos la siguiente sentencia justo después de los imports.</p>
<div class="codesnip-container" >
<div class="python codesnip" style="font-family:monospace;">webapp.<span class="me1">template</span>.<span class="me1">register_template_library</span><span class="br0">&#40;</span><span class="st0">&#8216;customfilters&#8217;</span><span class="br0">&#41;</span></div>
</div>
<p>De esta forma podremos usar nuestro filtro de la siguiente manera:</p>
<div class="codesnip-container" >
<div class="python codesnip" style="font-family:monospace;"><span class="br0">&#123;</span><span class="br0">&#123;</span>mail|securemail<span class="br0">&#125;</span><span class="br0">&#125;</span></div>
</div>
<p>Imaginemos que damos la opción al usuario que la función securemail muestre su cuenta de dos modos, uno, el por defecto que es el funcionamiento explicado anteriormente, y otro, que hace que solo se muestre el usuario sin el dominio. Por tanto deberemos definir un parámetro en la función para poder elegir el tipo de ofuscación. La función en este caso nos quedaría así:</p>
<div class="codesnip-container" >
<div class="python codesnip" style="font-family:monospace;"><span class="kw1">def</span> securemail <span class="br0">&#40;</span>mail,default=true<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> default:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> mail.<span class="me1">split</span><span class="br0">&#40;</span>‘@’<span class="br0">&#41;</span><span class="br0">&#91;</span>0<span class="br0">&#93;</span><span class="br0">&#91;</span>:5<span class="br0">&#93;</span>+”…@”+ mail.<span class="me1">split</span><span class="br0">&#40;</span>‘@’<span class="br0">&#41;</span><span class="br0">&#91;</span>1<span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> mail.<span class="me1">split</span><span class="br0">&#40;</span>‘@’<span class="br0">&#41;</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span></div>
</div>
<p>Por tanto si la variable mail tomara el valor estoesunaprueba@gmail.com este seria el resultado para las diferentes expresiones:</p>
<div class="codesnip-container" >
<div class="python codesnip" style="font-family:monospace;"><span class="br0">&#123;</span><span class="br0">&#123;</span>mail|securemail<span class="br0">&#125;</span><span class="br0">&#125;</span> <span class="co1">#estoe…@gmail.com</span><br />
<span class="br0">&#123;</span><span class="br0">&#123;</span>mail|securemail:true<span class="br0">&#125;</span><span class="br0">&#125;</span> <span class="co1">#estoe…@gmail.com</span><br />
<span class="br0">&#123;</span><span class="br0">&#123;</span>mail|securemail:false<span class="br0">&#125;</span><span class="br0">&#125;</span> <span class="co1">#estoesunaprueba</span></div>
</div>
<p>De esta forma podemos controlar y procesar la información a mostrar en nuestra plantilla cuando esta se trata de un objeto no string (o integer).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ikeralbeniz.net/2010/03/11/usarcrear-filtros-para-las-plantillas-de-djangogoogle-app-engine/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Primeros pasos con Buzz</title>
		<link>http://www.ikeralbeniz.net/2010/02/11/primeros-pasos-con-buzz/</link>
		<comments>http://www.ikeralbeniz.net/2010/02/11/primeros-pasos-con-buzz/#comments</comments>
		<pubDate>Thu, 11 Feb 2010 11:10:07 +0000</pubDate>
		<dc:creator>Iker</dc:creator>
				<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[buzz]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[rss]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://www.ikeralbeniz.net/?p=148</guid>
		<description><![CDATA[Ha llegado <a href="http://www.google.com/buzz" target="buzz">Buzz</a> y a primera vista lo que parece es un Twitter avanzado o un Facebook simplificado, como se vea. Pero mmas allá de esta primera aproximación, me interesaba concer que funcionalidades se escondian tras esta nueva funcionalidad de Google. Por tanto el mejor sitio para empezar a buscar es el propio Google y su portal de APIs.]]></description>
			<content:encoded><![CDATA[<p>Ha llegado <a href="http://www.google.com/buzz" target="_blank">Buzz</a> y a primera vista lo que parece es un Twitter avanzado o un Facebook simplificado, como se vea. Pero mas allá de esta primera aproximación, me interesaba concer que funcionalidades se escondian tras esta nueva funcionalidad de Google. Por tanto el mejor sitio para empezar a buscar es el propio Google y su portal de APIs.</p>
<p><strong><em>http://code.google.com/intl/es-ES/apis/buzz/</em></strong></p>
<p>Actualmente solo existen dos opciones de integración disponibles:</p>
<ul>
<li>De Buzz a tu Web</li>
<li>De tu Web a Buzz</li>
</ul>
<p>
<strong><u>De Buzz a tu Web</u></strong></p>
<p>Buzz permite generar un RSS con tus comentarios en Buzz con lo que es posible generar plugins al estilo Twitter para tu blog. La forma de acceder a dicho RSS es la siguiente:</p>
<p><strong><em>http://buzz.googleapis.com/feeds/{user_id}/public/posted</em></strong></p>
<p>El user id es posible obtenerlo dirigiéndote a “<em>Perfil de Google</em>”..</p>
<p>En mis caso la dirección de mi perfil es la:</p>
<p><strong><em>http://www.google.com/profiles/111738004311961586383</em></strong></p>
<p>Por lo que mi user_id es 111738004311961586383 y mi url de RSS</p>
<p><strong><em>http://buzz.googleapis.com/feeds/111738004311961586383/public/posted</em></strong></p>
<p>
<strong><u>De tu Web a Buzz</u></strong></p>
<p>Buzz automáticamente permite que se integren en Buzz tus aplicaciones de Google, es decir, se generará un comentario cada vez que añadas una imagen a Picasa o subas un video a Youtube..</p>
<p>Si quieres que se genere un comentario cada vez que añades una entrada a tu blog debes conectar tu blog y Buzz bidireccionalmente:</p>
<p>Por un lado debes añadir una etiqueta en la cabecera de tu pagina de la siguiente manera:</p>
<p><strong>&lt;link rel=&#8221;me&#8221; type=&#8221;text/html&#8221; href=&#8221;{user_id}&#8221;/&gt;</strong></p>
<p>En mi caso será de la siguiente manera</p>
<p><strong>&lt;link rel=&#8221;me&#8221; type=&#8221;text/html&#8221; href=&#8221;http://www.google.com/profiles/111738004311961586383&#8243;/&gt;</strong></p>
<p>Además debes añadir tu Web como Web de confianza,  para ello dirígete a tu perfil de Google:</p>
<p><strong>http://www.google.com/profiles/me/editprofile</strong></p>
<p>y en la sección <em>Enlaces</em> añade un enlace a tu Web</p>
<p>Una vez terminado este proceso cada entrada nueva será comentada en tu Buzz.
</p>
<p>Listo!</p>
<p><a href="http://www.ikeralbeniz.net/2010/02/11/primeros-pasos-con-buzz-segunda-parte-un-widget-de-buzz-para-wordpress/"> segunda parte &raquo;</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ikeralbeniz.net/2010/02/11/primeros-pasos-con-buzz/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>Primeros pasos en ChromeOS (Parte I)</title>
		<link>http://www.ikeralbeniz.net/2009/11/26/primeros-pasos-en-chromeos-i/</link>
		<comments>http://www.ikeralbeniz.net/2009/11/26/primeros-pasos-en-chromeos-i/#comments</comments>
		<pubDate>Thu, 26 Nov 2009 14:15:55 +0000</pubDate>
		<dc:creator>Iker</dc:creator>
				<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[chorme]]></category>
		<category><![CDATA[chromeOS]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[OS]]></category>
		<category><![CDATA[VMWare]]></category>

		<guid isPermaLink="false">http://www.ikeralbeniz.net/?p=58</guid>
		<description><![CDATA[<img class="alignleft" src="http://farm3.static.flickr.com/2519/4135594059_7599c193a2.jpg" alt="Pantalla Principal (Loging) de ChomeOS" title="Pantalla Principal (Loging) de ChomeOS" longdesc="Pantalla Principal (Login) de ChromeOS de color azul donde insertar usuario y contrase&#038;ntildea" width="200" height="117" />Aquí so dejo un tutorial paso de paso de cómo empezar a probar Google ChromeOS instalándola en una Maquina Virtual mediante VMWare. A primera vista decir que es un sistema operativo es un pelín exagerado ya que básicamente se trata de una distribución GNU/Linux, mas concretamente una Ubuntu, con las xorg y librerías GTK instaladas. Lo suficiente para lanzar el navegador Web de Google llamado, como no, Chrome.]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;">La verdad es que hace unos días que ya estaba disponible el nuevo sistema operativo de Google, pero hasta hoy no me he puesto a probarlo y cacharrear con el. A primera vista decir que es un sistema operativo es un pelin exagerado ya que básicamente se trata de una distribución GNU/Linux, mas concretamente una Ubuntu, con las xorg y librerías GTK instaladas. Lo suficiente para lanzar el navegador Web de Google llamado, como no, Chrome. Básicamente podemos hacer los mismo instalando una Ubuntu Server, las xorg y añadir una línea en rc.local para que lance un navegador al iniciar la sesión. Aun así, en el caso de Chrome OS es algo un poco mas elaborado ya que dispone de un sistema de login que se autentica a través de http con Google usando tu cuenta de Google. Por tanto ChromeOS, como ya habian manifestado de de Google, es un sistema operativo basado en su navegador y en “aplicaciones en la nube”.</p>
<p style="text-align: left;"><strong>Manos a la obra</strong></p>
<p style="text-align: left;">Para empezar lo mejor es instalar ChromeOs en una VMWare y hacer las pruebas desde la maquina virtual. Para lo cual podemos bajarnos una imagen desde:</p>
<p style="text-align: left;"><a href="http://gdgt.com/google/chrome-os/download/" target="_blank">http://gdgt.com/google/chrome-os/download/</a></p>
<p style="text-align: left;">Una vez descargada la imagen crearemos una nueva maquina virtual.</p>
<p style="text-align: center;"><img class="aligncenter" src="http://farm3.static.flickr.com/2753/4135548465_3d19a8f6ef_o.jpg" alt="VmWare: Accedemos a Archivo, Nuevo, Maquina Virtual" title="VmWare: Accedemos a Archivo, Nuevo, Maquina Virtual" longdesc="VmWare: En la barra de menu accedemos a Archivo, Nuevo, Maquina Virtual" width="528" height="131" /></p>
<p style="text-align: left;">Crearemos una Maquina virtual típica y seleccionaremos “Instalare el sistema operativo mas tarde”. Como sistema operativo seleccionaremos Linux y la distribución UBUNTU.</p>
<p style="text-align: center;"><img class="aligncenter" src="http://farm3.static.flickr.com/2796/4135548593_8ddcc45911_o.jpg" alt="WmWare: elejimos tipica" title="WmWare: elejimos tipica" longdesc="VmWare: En el menu de seleccion de tipo de maquina virtual elejimos tipica" width="432" height="372" /><img class="alignnone" src="http://farm3.static.flickr.com/2785/4135548595_58c213502c_o.jpg" alt="" width="432" height="372" /><img class="alignnone" src="http://farm3.static.flickr.com/2548/4135548599_8b45893560_o.jpg" alt="" width="432" height="372" /><img class="alignnone" src="http://farm3.static.flickr.com/2579/4135548603_49c5a26152_o.jpg" alt="" width="432" height="372" /></p>
<p style="text-align: left;">En nuestro caso llamaremos a nuestra Maquina Virtual ChromeOS. Una vez creada descomprimiremos la imagen de Crome descargada anteriormente y la copiaremos dentro del directorio ChromeOS donde hemos creado la maquina virtual.</p>
<p style="text-align: center;"><img class="aligncenter" src="http://farm3.static.flickr.com/2776/4135548607_f4f7d83edf_o.jpg" alt="" /></p>
<p style="text-align: center;"><img class="alignnone" src="http://farm3.static.flickr.com/2752/4135550435_563cb6d464_o.jpg" alt="" /></p>
<p style="text-align: left;">A continuación añadiremos la imagen descargada y la configuraremos como disco duro principal. Para lo cual iremos a configuración. En el listado de Hardware pulsaremos Añadir y elegiremos añadir un Disco Duro. En nuestro caso elegiremos usar una Imagen ya existente.</p>
<p style="text-align: center;"><img class="alignnone" src="http://farm3.static.flickr.com/2550/4135550437_f713160efa_o.jpg" alt="" /></p>
<p style="text-align: left;"><img class="aligncenter" src="http://farm3.static.flickr.com/2619/4135550441_57fd1a7708_o.jpg" alt="" width="432" height="372" /></p>
<p style="text-align: left;">Por tanto seleccionaremos la imagen descargada y la añadiremos manteniendo el formato original. Una vez añadida la nueva imagen podemos eliminar la imagen creada por defecto.</p>
<p style="text-align: center;"><img class="aligncenter" src="http://farm3.static.flickr.com/2692/4135550443_2d313fb6a0_o.jpg" alt="" width="565" height="367" /><img class="aligncenter" src="http://farm3.static.flickr.com/2768/4135550445_77628cfc89_o.jpg" alt="" width="506" height="233" /></p>
<p style="text-align: left;">Ya tenemos la Maquina Virtual instalada por lo que ya solo nos queda ejecutar la maquina virtual y empezar a usar ChromeOS.</p>
<p style="text-align: center;"><img class="aligncenter" src="http://farm3.static.flickr.com/2519/4135594059_7599c193a2.jpg" alt="" width="500" height="293" /></p>
<p style="text-align: left;">Para logearnos deberemos usar nuestra cuenta de Google. En caso de tener problemas con la conexión aseguraros que la tarjeta de red esta en modo bridge.</p>
<p style="text-align: center;"><img class="aligncenter" src="http://farm3.static.flickr.com/2560/4136311470_1a682e317c_o.jpg" alt="" width="514" height="590" /></p>
<p style="text-align: left;">Si aun así no conseguis logearos podéis usar el usuario local.</p>
<p style="text-align: left;"><strong>Username:</strong> chronos<br />
<strong>Password:</strong> &lt;en_blanco&gt;<strong><br />
</strong></p>
<p style="text-align: left;">En las próximas entradas explicare como acceder como root a la consola y configurar ChromeOS en Castellano y la posibilidad de conectarse a través de un Proxy.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ikeralbeniz.net/2009/11/26/primeros-pasos-en-chromeos-i/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GeoLocalizacion a través de la IP</title>
		<link>http://www.ikeralbeniz.net/2009/11/18/geolocalizacion-a-traves-de-la-ip/</link>
		<comments>http://www.ikeralbeniz.net/2009/11/18/geolocalizacion-a-traves-de-la-ip/#comments</comments>
		<pubDate>Wed, 18 Nov 2009 10:04:00 +0000</pubDate>
		<dc:creator>Iker</dc:creator>
				<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[geoip]]></category>
		<category><![CDATA[ip]]></category>
		<category><![CDATA[maxmind]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://www.ikeralbeniz.net/?p=18</guid>
		<description><![CDATA[Hoy en una lista de distribución alguien ha hecho una consulta sobre GeoLocalizacion a través de la IP. La verdad es que he hecho muchas pruebas con diferentes entornos de programación utilizando las librerías que proporciona MaxMind. Por eso en este artículo voy a explicar como implementar un sistema de GeoLocalicacion basado en IP usando PHP y Python]]></description>
			<content:encoded><![CDATA[<p>Hoy en una lista de distribución alguien ha hecho una consulta sobre GeoLocalizacion a través de la IP. La verdad es que he hecho muchas pruebas con diferentes entornos de programación utilizando las librerías que proporciona MaxMind. Por eso en este artículo voy a explicar como implementar un sistema de GeoLocalicacion basado en IP usando PHP y Python.</p>
<p><strong>PHP</strong></p>
<p>Empezaremos por PHP ya que quizá sea la opción mas útil y mas fácil de implementar. En esta ruta podéis descargaros las librerías necesarias y algunos ejemplos:</p>
<p><a href="http://geolite.maxmind.com/download/geoip/api/php/">http://geolite.maxmind.com/download/geoip/api/php/</a></p>
<p>Por tanto para empezar con el ejemplo nos bajaremos los siguientes archivos:<br />
<a href="http://geolite.maxmind.com/download/geoip/api/php/geoipcity.inc">http://geolite.maxmind.com/download/geoip/api/php/geoipcity.inc</a><br />
<a href="http://geolite.maxmind.com/download/geoip/api/php/geoipregionvars.php">http://geolite.maxmind.com/download/geoip/api/php/geoipregionvars.php</a><br />
<a href="http://geolite.maxmind.com/download/geoip/api/php/geoip.inc">http://geolite.maxmind.com/download/geoip/api/php/geoip.inc</a></p>
<p>También deberemos bajarnos la base de datos donde se encuentran todas las relaciones entre IP y su localización.</p>
<p><a href="http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz">http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz</a></p>
<p>Por tanto copiamos los archivos .inc en nuestra ruta de pruebas /var/www/prueba y extraemos en GeoLiteCity.dat en la misma ruta. Finalmente creamos un GeoipTest.php con el siguiente código:</p>
<fieldset>&lt;?php<br />
include(&#8220;geoipcity.inc&#8221;);<br />
include(&#8220;geoipregionvars.php&#8221;);</p>
<p>$ip = $_SERVER['REMOTE_ADDR'];</p>
<p>$gi = geoip_open(&#8220;./GeoLiteCity.dat&#8221;,GEOIP_STANDARD);<br />
$record = geoip_record_by_addr($gi,$ip);</p>
<p>echo &#8220;&lt;br/&gt;&#8221;.$record-&gt;city;<br />
echo &#8220;&lt;br/&gt;&#8221;.$record-&gt;country_code;<br />
echo &#8220;&lt;br/&gt;&#8221;.$GEOIP_REGION_NAME[$record-&gt;country_code][$record-&gt;region];<br />
echo &#8220;&lt;br/&gt;&#8221;.latitude($record-&gt;latitude);<br />
echo &#8220;&lt;br/&gt;&#8221;.longitude($record-&gt;longitude);</p>
<p>?&gt;</fieldset>
<p><strong>Python</strong></p>
<p>La mejor manera de instalar las librerías para python si estáis en un entorno Debian es usar apt-get:</p>
<p>En este caso la instalación guarda los diferentes archivos (librerías y base de datos) en sus rutas por defecto, por tanto nos abstraeremos de esa información (el caso de querer definir una ruta o usar una base de datos determinada usar la definición de GeoIP.Open comentada en el ejemplo).</p>
<fieldset>apt-get install python-geoip</fieldset>
<p>Para usar las librerías usaremos el siguiente ejemplo GeoipTest.py</p>
<fieldset>Import GeoIP</p>
<p>ip =&lt;metodo_para_obtener_ip&gt;<br />
gi = GeoIP.new(GeoIP.GEOIP_MEMORY_CACHE)<br />
# gi = GeoIP.open(&#8220;/usr/local/share/GeoIP/GeoIPCity.dat&#8221;,GeoIP.GEOIP_STANDARD)<br />
gir = gi.record_by_addr(ip)</p>
<p>if gir != None:<br />
&nbsp;&nbsp;print gir['city']<br />
&nbsp;&nbsp;print gir['country_code']<br />
&nbsp;&nbsp;print gir['region_name']<br />
&nbsp;&nbsp;print gir['latitude']<br />
&nbsp;&nbsp;print gir['longitude']</fieldset>
<p>Con este código obtendríamos la misma información que en el caso anterior (con PHP).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ikeralbeniz.net/2009/11/18/geolocalizacion-a-traves-de-la-ip/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Lanzar rutinas con Postfix</title>
		<link>http://www.ikeralbeniz.net/2009/02/09/lanzar-rutinas-con-postfix/</link>
		<comments>http://www.ikeralbeniz.net/2009/02/09/lanzar-rutinas-con-postfix/#comments</comments>
		<pubDate>Mon, 09 Feb 2009 16:47:58 +0000</pubDate>
		<dc:creator>Iker</dc:creator>
				<category><![CDATA[Tecnologia]]></category>

		<guid isPermaLink="false">http://www.ikeralbeniz.net/?p=6</guid>
		<description><![CDATA[En este post voy a explicar como añadir un filtro o rutina a Postfix. Esto nos puede servir para desarrollar cualquier aplicación basada en el correo electrónico, como puede ser el control remoto de tu maquina, administración de contenidos de una Web u otro tipo de aplicaciones gestionadas a trabes del correo electrónico.]]></description>
			<content:encoded><![CDATA[<p>En este post voy a explicar como añadir un filtro o rutina a Postfix. Esto nos puede servir para desarrollar cualquier aplicación basada en el correo electrónico, como puede ser el control remoto de tu maquina, administración de contenidos de una Web u otro tipo de aplicaciones gestionadas a trabes del correo electrónico.</p>
<p>La configuración de postfix en una maquina GNU/Linux es bastante sencilla, basta con hacer:<br />
</p>
<fieldset>$&gt; apt-get install postfix</fieldset>
<p>
y configurar Postfix para que acepte correos de nuestros dominios editando el archivo /etc/postfix/main.cf<br />
</p>
<fieldset>$&gt; vi /etc/postfix/main.cf</fieldset>
<p></p>
<fieldset>
<legend>/etc/postfix/main.cf</legend>
<p>myhostname = biospam.pandasoftware.local<br />
alias_maps = hash:/etc/aliases<br />
alias_database = hash:/etc/aliases<br />
myorigin = /etc/mailname<br />
mydestination = localhost, midominio.com<br />
relayhost =<br />
mynetworks = 127.0.0.0/8</p>
</fieldset>
<p>
Una vez comprobado que recibimos nuestro correo correctamente pasamos a configurar Postfix para que ejecute un script cada vez que llegue un correo. Por tanto editaremos el archivo /etc/postfix/master.cf de la siguiente manera:</p>
<p>Al principio del documento añadiremos (en negrita):<br />
</p>
<fieldset>
<legend>/etc/postfix/master.cf</legend>
<p># =============================================================<br />
# service type  private unpriv  chroot  wakeup  maxproc command<br />
#               (yes)   (yes)   (yes)   (never) (100)<br />
# =============================================================<br />
smtp      inet  &#8230;other stuff here, do not change&#8230;   smtpd<br />
-o content_filter=filter:dummy<br />
</fieldset>
<p>
Para decirle que aplique la rutina <em>filter</em> por cada conexión smtp entrante.</p>
<p>Abajo definimos la rutina filter de la siguiente manera:<br />
</p>
<fieldset>
<legend>/etc/postfix/master.cf</legend>
<p># =============================================================<br />
# service type  private unpriv  chroot  wakeup  maxproc command<br />
#               (yes)   (yes)   (yes)   (never) (100)<br />
# =============================================================<br />
filter    unix  &#8211;       n       n       &#8211;       10      pipe<br />
flags=Rq user=filter argv=/path/to/script -f ${sender} &#8212; ${recipient}<br />
</fieldset>
<p>
donde argv será la ruta al script que lanzara nuestra aplicación.</p>
<p>Un ejemplo de script podría ser este:<br />
</p>
<fieldset>
1 #!/bin/sh<br />
2<br />
3 # Simple shell-based filter. It is meant to be invoked as follows:<br />
4 #       /path/to/script -f sender recipients&#8230;<br />
5<br />
6 # Localize these. The -G option does nothing before Postfix 2.3.<br />
7 INSPECT_DIR=/var/spool/filter<br />
8 SENDMAIL=&#8221;/usr/sbin/sendmail -G -i&#8221; # NEVER NEVER NEVER use &#8220;-t&#8221; here.<br />
9<br />
10 # Exit codes from<br />
11 EX_TEMPFAIL=75<br />
12 EX_UNAVAILABLE=69<br />
13<br />
14 # Clean up when done or when aborting.<br />
15 trap &#8220;rm -f in.$$&#8221; 0 1 2 3 15<br />
16<br />
17 # Start processing.<br />
18 cd $INSPECT_DIR || {<br />
19     echo $INSPECT_DIR does not exist; exit $EX_TEMPFAIL; }<br />
20<br />
21 cat &gt;in.$$ || {<br />
22     echo Cannot save mail to file; exit $EX_TEMPFAIL; }<br />
23<br />
24 # Specify your content filter here.<br />
25 python filter.py<br />
26    echo Message content rejected; exit $EX_UNAVAILABLE; }<br />
27<br />
28 $SENDMAIL &#8220;$@&#8221;<br />
29<br />
30 exit $?<br />
</fieldset>
<p>
Donde podríamos llamar a nuestro script en python filter.py que parsearia el mensaje realizando las diferentes funciones. Por ejemplo podríamos recoger el subject del mensaje y lanzarlo como un comando. De tal manera que si mandáramos un mensaje con el subject “halt” podríamos apagar la maquina de forma remota.</p>
<p>Espero que os haya sido de gran ayuda!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ikeralbeniz.net/2009/02/09/lanzar-rutinas-con-postfix/feed/</wfw:commentRss>
		<slash:comments>1</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>
		<item>
		<title>Instalando ANDROID + ECLIPSE en WINDOWS (2000 o XP)</title>
		<link>http://www.ikeralbeniz.net/2007/11/15/instalando-android-eclipse-en-windows-2000-o-xp/</link>
		<comments>http://www.ikeralbeniz.net/2007/11/15/instalando-android-eclipse-en-windows-2000-o-xp/#comments</comments>
		<pubDate>Thu, 15 Nov 2007 10:37:34 +0000</pubDate>
		<dc:creator>Iker</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Manuales]]></category>
		<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://www.ikeralbeniz.net/?p=131</guid>
		<description><![CDATA[En el artículo anterior explicábamos como <a href="http://bendertheandroid.blogspot.com/2007/11/instalando-android-eclipse-en-ubuntu.html">instalar ANDROID y  ECLIPSE  en UBUNTU</a>. Ahora toca el turno a Windows y puesto que la configuración de eclipse es la misma en ambos sistemas operativos solo se explicara como se instalan el SDK y ECILPSE en el ordenador.]]></description>
			<content:encoded><![CDATA[<p>En el artículo anterior explicábamos como <a href="http://bendertheandroid.blogspot.com/2007/11/instalando-android-eclipse-en-ubuntu.html">instalar ANDROID y  ECLIPSE  en UBUNTU</a>. Ahora toca el turno a Windows y puesto que la configuración de eclipse es la misma en ambos sistemas operativos solo se explicara como se instalan el SDK y ECILPSE en el ordenador.</p>
<p>El primer paso es instalar el SDK, para lo cual nos lo descargaremos de esta dirección:</p>
<p><a href="http://dl.google.com/android/android_sdk_windows_m3-rc20a.zip">http://dl.google.com/android/android_sdk_windows_m3-rc20a.zip</a></p>
<p>Una vez descargado y descomprimida cambiamos el nombre de la carpeta  <b>“android_sdk_windows_m3-rc20a”</b> por <b>“android_sdk”</b> y la movemos a nuestro <b>C:\Archivos de Programa\</b>.</p>
<p>Para terminar la instalación solo falta añadir la ruta del SDK al path, para lo cual vamos a <b>INICIO> Configuración > Panel de Control</b> y entramos en <b>Sistema</b>.</p>
<p><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_YsgLljqoEIQ/Rzwoy0NpOiI/AAAAAAAAAB8/ibv9pc1xZSM/s1600-h/android.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_YsgLljqoEIQ/Rzwoy0NpOiI/AAAAAAAAAB8/ibv9pc1xZSM/s320/android.png" alt="" id="BLOGGER_PHOTO_ID_5133022528769964578" border="0" /></a></p>
<p>Dentro del panel de Sistema vamos a la pestaña <b>Opciones Avanzadas</b> y pulsamos en <b>Variables de Entorno</b></p>
<p><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_YsgLljqoEIQ/RzwpPENpOjI/AAAAAAAAACE/yaMAYr1LG6U/s1600-h/android1.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_YsgLljqoEIQ/RzwpPENpOjI/AAAAAAAAACE/yaMAYr1LG6U/s320/android1.png" alt="" id="BLOGGER_PHOTO_ID_5133023014101269042" border="0" /></a></p>
<p>Se nos mostraran dos listas de variables: <b>Variables de usuario para usuario</b> y <b>variables del sistema</b>. En nuestro caso añadiremos una variable y cambiaremos el path en la lista de <b>Variables del sistema</b> para que todos los usuarios tengan acceso al SDK.</p>
<p>Por tanto pulsaremos en <b>Nueva</b> y nos aparecerá un cuadro de dialogo donde meteremos el nombre de la variable y su ruta. En el caso del SDK pondremos como nombre SDK_ROOT y la ruta C:\Archivos de Programa\android_sdk y pulsamos <b>Aceptar</b>. La nueva variable se añadirá a la lista.</p>
<p><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_YsgLljqoEIQ/RzwpaUNpOkI/AAAAAAAAACM/mcUYYG9UVg8/s1600-h/android2.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_YsgLljqoEIQ/RzwpaUNpOkI/AAAAAAAAACM/mcUYYG9UVg8/s320/android2.png" alt="" id="BLOGGER_PHOTO_ID_5133023207374797378" border="0" /></a></p>
<p>Ya solo falta añadir la ruta al path, por tanto, buscamos la variable <b>PATH</b> de la lista de Variables del sistema, y pulsamos sobre ella dos veces. Se nos aparecerá el mismo cuadro de dialogo de antes peor esta vez completo con el nombre PATH un montón de rutas que están añadidas al path separadas por <b>“;”</b>. Por tanto añadiremos los siguiente al final del campo Valor de la variable: <b>;%SDK_ROOT%\tools</b></p>
<p>NOTA: no olvidar el <b>“;”</b> ni los <b>“%”</b></p>
<p><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_YsgLljqoEIQ/RzwplkNpOlI/AAAAAAAAACU/C7A-PMFrZ-A/s1600-h/android3.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_YsgLljqoEIQ/RzwplkNpOlI/AAAAAAAAACU/C7A-PMFrZ-A/s320/android3.png" alt="" id="BLOGGER_PHOTO_ID_5133023400648325714" border="0" /></a></p>
<p>Pulsamos <b>Aceptar</b> a todas las ventanas hasta cerrarlas todas y ya tenemos el SDK instalado.</p>
<p>Y asolo faltaría instalar <a href="http://www.eclipse.org/">Eclipse</a>. Para instalar eclipse solo hay que descargarse eclipse del siguiente <a href="http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/20071103/eclipse-java-europa-fall2-win32.zip&amp;url=http://ftp-stud.fht-esslingen.de/pub/Mirrors/eclipse/technology/epp/downloads/release/20071103/eclipse-java-europa-fall2-win32.zip&amp;mirror_id=17">enlace</a>, descomprimirlo y mover la carpeta a <b>C:\Archivos de Programa\</b>. (para que esté todo mas ordenado..)</p>
<p>A partir de aquí faltaría configurar y plugin de android para eclipse. Los pasos son idénticos que en Ubuntu así que podéis seguir los mismos pasos que se indican en el articulo anterior.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ikeralbeniz.net/2007/11/15/instalando-android-eclipse-en-windows-2000-o-xp/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Instalando ANDROID + ECLIPSE en UBUNTU</title>
		<link>http://www.ikeralbeniz.net/2007/11/14/instalando-android-eclipse-en-ubuntu/</link>
		<comments>http://www.ikeralbeniz.net/2007/11/14/instalando-android-eclipse-en-ubuntu/#comments</comments>
		<pubDate>Wed, 14 Nov 2007 10:44:11 +0000</pubDate>
		<dc:creator>Iker</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Manuales]]></category>
		<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[manual]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.ikeralbeniz.net/?p=135</guid>
		<description><![CDATA[En este artículo vamos a explicar mas detalladamente la instalación de <a href="http://code.google.com/android">ANDROID SDK</a>, <a href="http://www.eclipse.org/">ECLIPSE</a> y el PLUGIN DE ANDROID para eclipse en <a href="http://www.ubuntu.com/">UBUNTU</a>. Básicamente son las mismas instrucciones que aparecen en la pagina de google pero un poco mas comentadas y con imágenes, para que aquellos que siempre se os atraviesan las instalaciones lo tengáis mas fácil.]]></description>
			<content:encoded><![CDATA[<p>En este artículo vamos a explicar mas detalladamente la instalación de <a href="http://code.google.com/android">ANDROID SDK</a>, <a href="http://www.eclipse.org/">ECLIPSE</a> y el PLUGIN DE ANDROID para eclipse en <a href="http://www.ubuntu.com/">UBUNTU</a>. Básicamente son las mismas instrucciones que aparecen en la pagina de google pero un poco mas comentadas y con imágenes, para que aquellos que siempre se os atraviesan las instalaciones lo tengáis mas fácil.</p>
<p>NOTA: En esta guía supondremos que hacemos una instalación para el usuario de nombre &#8220;user&#8221;.</p>
<p>Lo primero descargar ABDROID SDK, podes hacerlo con vuestro navegador o por consola con wget. Por tanto abrimos una consola y nos situamos en nuestro home. Descomprimimos y cambiamos en nombre del directorio &#8220;android_sdk_linux_m3-rc20a&#8221; por &#8220;android_sdk&#8221;</p>
<fieldset><span style="font-size:85%;"><span style="font-family:courier new;">user@ubuntu:~$ wget http://dl.google.com/android/android_sdk_linux_m3-rc20a.zip</span><br />
<span style="font-family:courier new;">user@ubuntu:~$ unzip android_sdk_linux_m3-rc20a.zip</span><br />
<span style="font-family:courier new;">user@ubuntu:~$ mv android_sdk_linux_m3-rc20a android_sdk</span></span><br />
</fieldset>
<p>Finalmente para terminar la instalación tendremos que añadir el SDK al path, por tanto editaremos el archivo .bashrc de nuestro /home con cualquier editor de texto (vi, gedit, kate&#8230;) y añadiremos las siguientes des lineas al final del documento:</p>
<fieldset><span style="font-size:85%;"><span style="font-family:courier new;">user@ubuntu:~$ vi /home/user/.bashrc</span></p>
<p><span style="font-family:courier new;">export SDK_ROOT=/home/user/android_sdk</span><br />
<span style="font-family:courier new;">export PATH=$SDK_ROOT/tools:$PATH</span></span><br />
</fieldset>
<p>Y atenemos el SDK instalado y es posible acceder a sus aplicaciones desde consola, por tanto ahora nos queda instalar un IDE para programar cómodamente nuestras aplicaciones. Para eso el IDE idóneo es ECLIPSE ya que existen plugins para trabajar con ABDROID de forma sencilla.</p>
<p>Por tanto, en caso de que no lo hubiéramos instalado, pasamos a instalar ECLIPSE:</p>
<fieldset><span style="font-size:85%;"><span style="font-family:courier new;">user@ubuntu:~$ apt-get install eclipse</span></span><br />
</fieldset>
<p>Tras descargarse, se instalara automáticamente gracias a APT por lo que una vez finalizada la instalación ya podremos lanzar eclipse. En caso de que no dispongas de ningún acceso directo a la aplicación podéis acceder por consola.</p>
<fieldset><span style="font-size:85%;"><span style="font-family:courier new;">user@ubuntu:~$ eclipse</span></span><br />
</fieldset>
<p>Una vez iniciado eclipse nos vamos al menú <b>Help > Software Updates > Find and Install&#8230;</b>.</p>
<p><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_YsgLljqoEIQ/Rzt5m0EMMiI/AAAAAAAAAAc/Gg6FoyFjXcs/s1600-h/android.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_YsgLljqoEIQ/Rzt5m0EMMiI/AAAAAAAAAAc/Gg6FoyFjXcs/s320/android.png" alt="" id="BLOGGER_PHOTO_ID_5132829908037022242" border="0" /></a></p>
<p>Seleccionamos <b>Search for new features to install</b> y pulsamos  <b>Next</b>.</p>
<p><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_YsgLljqoEIQ/Rzt52UEMMjI/AAAAAAAAAAk/w5W0gHD4o_s/s1600-h/android1.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_YsgLljqoEIQ/Rzt52UEMMjI/AAAAAAAAAAk/w5W0gHD4o_s/s320/android1.png" alt="" id="BLOGGER_PHOTO_ID_5132830174324994610" border="0" /></a></p>
<p>Pulsamos <b>New Remote Site</b> y se nos mostrara un dialogo que nos pedirá una URL y un nombre para identificar el “repositorio”. Por nombre podemos poner “Android” y en la URL introducimos la siguiente dirección:</p>
<p>https://dl-ssl.google.com/android/eclipse/</p>
<p>y pulsamos <b>OK</b>.</p>
<p><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_YsgLljqoEIQ/Rzt6EEEMMkI/AAAAAAAAAAs/_NR0xvsg3Ds/s1600-h/android2.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_YsgLljqoEIQ/Rzt6EEEMMkI/AAAAAAAAAAs/_NR0xvsg3Ds/s320/android2.png" alt="" id="BLOGGER_PHOTO_ID_5132830410548195906" border="0" /></a></p>
<p>Se nos añadirá un repositorio a la lista, lo seleccionamos (si no lo esta) y pulsamos <b>Finish</b>.</p>
<p>Nos aparecerá ahora un árbol con la siguiente estructura: <b>Android Plugin > Eclipse Integration > Android Development Tools</b>, los seleccionamos todos y pulsamos <b>Next</b>.</p>
<p><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_YsgLljqoEIQ/Rzt6S0EMMlI/AAAAAAAAAA0/lq1BgYdD2xo/s1600-h/android3.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_YsgLljqoEIQ/Rzt6S0EMMlI/AAAAAAAAAA0/lq1BgYdD2xo/s320/android3.png" alt="" id="BLOGGER_PHOTO_ID_5132830663951266386" border="0" /></a></p>
<p>Aceptamos las condiciones de la licencia y pulsamos <b>Next</b>.</p>
<p><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_YsgLljqoEIQ/Rzt6eUEMMmI/AAAAAAAAAA8/bofiajTlTt8/s1600-h/android4.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_YsgLljqoEIQ/Rzt6eUEMMmI/AAAAAAAAAA8/bofiajTlTt8/s320/android4.png" alt="" id="BLOGGER_PHOTO_ID_5132830861519762018" border="0" /></a></p>
<p>Finalmente nos aparecerá una lista de tareas a instalar, y nos aparecerá “Android Developm..”, y pulsamos <b>Finish</b>.</p>
<p><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_YsgLljqoEIQ/Rzt6mkEMMnI/AAAAAAAAABE/nkNXO3tNUQE/s1600-h/android5.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_YsgLljqoEIQ/Rzt6mkEMMnI/AAAAAAAAABE/nkNXO3tNUQE/s320/android5.png" alt="" id="BLOGGER_PHOTO_ID_5132831003253682802" border="0" /></a></p>
<p>El instalador descargara el paquete y lo instalara automáticamente.</p>
<p><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_YsgLljqoEIQ/Rzt6ukEMMoI/AAAAAAAAABM/QbuWq3iPGR0/s1600-h/android6.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_YsgLljqoEIQ/Rzt6ukEMMoI/AAAAAAAAABM/QbuWq3iPGR0/s320/android6.png" alt="" id="BLOGGER_PHOTO_ID_5132831140692636290" border="0" /></a></p>
<p>NOTA: El plugin ADT no esta firmado por lo que deberemos aceptar su instalación a pesar de ello.. por lo que pulsaremos <b>Install All</b>.</p>
<p><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_YsgLljqoEIQ/Rzt62kEMMpI/AAAAAAAAABU/zOiq0vI5o7A/s1600-h/android7.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_YsgLljqoEIQ/Rzt62kEMMpI/AAAAAAAAABU/zOiq0vI5o7A/s320/android7.png" alt="" id="BLOGGER_PHOTO_ID_5132831278131589778" border="0" /></a></p>
<p>Ya esta el plugin completamente instalado, y solo falta reiniciar eclipse.</p>
<p><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_YsgLljqoEIQ/Rzt7BUEMMqI/AAAAAAAAABc/QZ2Ds5OxJI8/s1600-h/android8.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_YsgLljqoEIQ/Rzt7BUEMMqI/AAAAAAAAABc/QZ2Ds5OxJI8/s320/android8.png" alt="" id="BLOGGER_PHOTO_ID_5132831462815183522" border="0" /></a></p>
<p>Una vez reiniciado solo falta configurar el plugin indicándole la ruta al SDK, por lo tanto accedemos al menú <b>Window > Preferences&#8230;</b></p>
<p><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_YsgLljqoEIQ/Rzt7I0EMMrI/AAAAAAAAABk/vMO55BovNqM/s1600-h/android9.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_YsgLljqoEIQ/Rzt7I0EMMrI/AAAAAAAAABk/vMO55BovNqM/s320/android9.png" alt="" id="BLOGGER_PHOTO_ID_5132831591664202418" border="0" /></a></p>
<p>seleccionamos <b>ANDROID</b> e introducimos la ruta a nuestro SDK, que en nuestro ejemplo era <b>/home/user/android_sdk/</b>.</p>
<p><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_YsgLljqoEIQ/Rzt7S0EMMsI/AAAAAAAAABs/yOzWcwInd9Y/s1600-h/android10.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_YsgLljqoEIQ/Rzt7S0EMMsI/AAAAAAAAABs/yOzWcwInd9Y/s320/android10.png" alt="" id="BLOGGER_PHOTO_ID_5132831763462894274" border="0" /></a></p>
<p>Finalmente pulsamos <b>Apply</b> y nos aparecerá una ventana con un aviso de que el plugin ya esta instalado y configurado correctamente.</p>
<p><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_YsgLljqoEIQ/Rzt7cUEMMtI/AAAAAAAAAB0/wv0u1Arq4nI/s1600-h/android11.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_YsgLljqoEIQ/Rzt7cUEMMtI/AAAAAAAAAB0/wv0u1Arq4nI/s320/android11.png" alt="" id="BLOGGER_PHOTO_ID_5132831926671651538" border="0" /></a></p>
<p>Ya tenemos nuestro entorno de desarrollo completamente instalado. En siguientes artículos explicaremos como hacer pequeñas aplicaciones paso a paso!!!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ikeralbeniz.net/2007/11/14/instalando-android-eclipse-en-ubuntu/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
