<?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; python</title>
	<atom:link href="http://www.ikeralbeniz.net/tag/python/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>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>Consulta tu PageRank de Google con Python</title>
		<link>http://www.ikeralbeniz.net/2010/03/05/contulta-tu-pagerank-de-google-con-python/</link>
		<comments>http://www.ikeralbeniz.net/2010/03/05/contulta-tu-pagerank-de-google-con-python/#comments</comments>
		<pubDate>Fri, 05 Mar 2010 07:17:49 +0000</pubDate>
		<dc:creator>Iker</dc:creator>
				<category><![CDATA[Noticias]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[PageRank]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://www.ikeralbeniz.net/?p=187</guid>
		<description><![CDATA[A todos los que os interese el SEO seguramente habréis consultado alguna vez el <a href="http://www.guia-buscadores.com/posicionamiento/el-pagerank.html">PageRank</a> de vuestra pagina. La forma mas sencilla de obtenerlo es instalando la <a href="http://www.google.com/intl/es/toolbar/ff/index.html">ToolBar de Google</a> en vuestro navegador. Pero seguramente si queréis realizar un seguimiento de vuestra pagina a lo largo del tiempo necesitareis automatizar un proceso que consulte el PageRank. La API de acceso al PageRank de google no es abierta, pero googleando un poco (o con <a href="http://www.wireshark.org/">Wireshark</a>) es posible obtener el modo de consultar este dato. Parece que Google no le interesa que consultemos este dato, por lo que modifica la API bastante a menudo. En este artículo, te muestro una implementación en Python de un cliente para consultar el PageRank de una pagina, usando la API mas actual.]]></description>
			<content:encoded><![CDATA[<p>A todos los que os interese el SEO seguramente habréis consultado alguna vez el <a href="http://www.guia-buscadores.com/posicionamiento/el-pagerank.html">PageRank</a> de vuestra pagina. La forma mas sencilla de obtenerlo es instalando la <a href="http://www.google.com/intl/es/toolbar/ff/index.html">ToolBar de Google</a> en vuestro navegador. Pero seguramente si queréis realizar un seguimiento de vuestra pagina a lo largo del tiempo necesitareis automatizar un proceso que consulte el PageRank. La API de acceso al PageRank de google no es abierta, pero googleando un poco (o con <a href="http://www.wireshark.org/">Wireshark</a>) es posible obtener el modo de consultar este dato. Parece que Google no le interesa que consultemos este dato, por lo que modifica la API bastante a menudo. En este artículo, te muestro una implementación en Python de un cliente para consultar el PageRank de una pagina, usando la API mas actual.</p>
<div class="codesnip-container" >
<div class="python codesnip" style="font-family:monospace;"><span class="co1">#!/usr/bin/env python</span><br />
<span class="co1"># -*- coding: utf-8 -*-</span><br />
<span class="co1"># GPL (C) 2010 Iker Perez de Albeniz</span><br />
<span class="co1"># ported in Python from the Php code by HM2K (http://www.hm2k.com/projects/pagerank)</span><br />
<span class="co1"># http://www.ikeralbeniz.net/2010/03/05/contulta-tu-pagerank-de-google-con-python/</span></p>
<p><span class="kw1">import</span> <span class="kw3">sys</span><br />
<span class="kw1">import</span> <span class="kw3">urllib</span><br />
&nbsp;<br />
<span class="kw1">from</span> <span class="kw3">urllib</span> <span class="kw1">import</span> urlencode<br />
<span class="kw1">from</span> <span class="kw3">pprint</span> <span class="kw1">import</span> <span class="kw3">pprint</span></p>
<p><span class="kw1">def</span> strToNum<span class="br0">&#40;</span>Str, Check, Magic<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; Int32Unit = 4294967296<br />
&nbsp; &nbsp; &nbsp; &nbsp; length = <span class="kw2">len</span><span class="br0">&#40;</span>Str<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> i <span class="kw1">in</span> <span class="kw2">range</span><span class="br0">&#40;</span>0,length<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Check <span class="sy0">*</span>= Magic<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>Check <span class="sy0">&gt;</span>= Int32Unit<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Check = <span class="br0">&#40;</span>Check &#8211; Int32Unit <span class="sy0">*</span> <span class="kw2">int</span><span class="br0">&#40;</span>Check/Int32Unit<span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> Check <span class="sy0">&lt;</span> -2147483648:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Check = Check + Int32Unit<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Check += <span class="kw2">ord</span><span class="br0">&#40;</span>Str<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> Check<br />
&nbsp; &nbsp; <br />
<span class="kw1">def</span> hashURL<span class="br0">&#40;</span><span class="kw3">string</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; check1 = strToNum<span class="br0">&#40;</span><span class="kw3">string</span>, 0&#215;1505, 0&#215;21<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; check2 = strToNum<span class="br0">&#40;</span><span class="kw3">string</span>, 0, 0&#215;1003F<span class="br0">&#41;</span><br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; check1 <span class="sy0">&gt;&gt;</span>= 2<br />
&nbsp; &nbsp; &nbsp; &nbsp; check1 = <span class="br0">&#40;</span><span class="br0">&#40;</span>check1 <span class="sy0">&gt;&gt;</span> 4<span class="br0">&#41;</span> <span class="sy0">&amp;</span> 0&#215;3FFFFC0 <span class="br0">&#41;</span> | <span class="br0">&#40;</span>check1 <span class="sy0">&amp;</span> 0&#215;3F<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; check1 = <span class="br0">&#40;</span><span class="br0">&#40;</span>check1 <span class="sy0">&gt;&gt;</span> 4<span class="br0">&#41;</span> <span class="sy0">&amp;</span> 0&#215;3FFC00 <span class="br0">&#41;</span> | <span class="br0">&#40;</span>check1 <span class="sy0">&amp;</span> 0&#215;3FF<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; check1 = <span class="br0">&#40;</span><span class="br0">&#40;</span>check1 <span class="sy0">&gt;&gt;</span> 4<span class="br0">&#41;</span> <span class="sy0">&amp;</span> 0&#215;3C000 <span class="br0">&#41;</span> | <span class="br0">&#40;</span>check1 <span class="sy0">&amp;</span> 0&#215;3FFF<span class="br0">&#41;</span><br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; T1 = <span class="br0">&#40;</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="br0">&#40;</span>check1 <span class="sy0">&amp;</span> 0&#215;3C0<span class="br0">&#41;</span> <span class="sy0">&lt;&lt;</span> 4<span class="br0">&#41;</span> | <span class="br0">&#40;</span>check1 <span class="sy0">&amp;</span> 0&#215;3C<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">&lt;&lt;</span>2 <span class="br0">&#41;</span> | <span class="br0">&#40;</span>check2 <span class="sy0">&amp;</span> 0xF0F <span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; T2 = <span class="br0">&#40;</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="br0">&#40;</span>check1 <span class="sy0">&amp;</span> 0xFFFFC000<span class="br0">&#41;</span> <span class="sy0">&lt;&lt;</span> 4<span class="br0">&#41;</span> | <span class="br0">&#40;</span>check1 <span class="sy0">&amp;</span> 0&#215;3C00<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">&lt;&lt;</span> 0xA<span class="br0">&#41;</span> | <span class="br0">&#40;</span>check2 <span class="sy0">&amp;</span> 0xF0F0000 <span class="br0">&#41;</span><br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="br0">&#40;</span>T1 | T2<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <br />
<span class="kw1">def</span> checkHash<span class="br0">&#40;</span>hashnum<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; checkByte = <span class="nu0">0</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; flag = <span class="nu0">0</span><span class="sy0">;</span><br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; HashStr = <span class="st0">&#8216;%s&#8217;</span> <span class="sy0">%</span> hashnum<br />
&nbsp; &nbsp; &nbsp; &nbsp; length = <span class="kw2">len</span><span class="br0">&#40;</span>HashStr<span class="br0">&#41;</span><br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> i <span class="kw1">in</span> <span class="kw2">range</span><span class="br0">&#40;</span>0,length<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Re = <span class="kw2">int</span><span class="br0">&#40;</span>HashStr<span class="br0">&#91;</span><span class="br0">&#40;</span>length &#8211; 1<span class="br0">&#41;</span>-i<span class="br0">&#93;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>1 == <span class="br0">&#40;</span>flag <span class="sy0">%</span> 2<span class="br0">&#41;</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Re += Re<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Re = <span class="kw2">int</span><span class="br0">&#40;</span><span class="br0">&#40;</span>Re / 10<span class="br0">&#41;</span> + <span class="br0">&#40;</span>Re <span class="sy0">%</span> 10<span class="br0">&#41;</span><span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; checkByte += <span class="kw2">int</span><span class="br0">&#40;</span>Re<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; flag = flag + 1</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; checkByte <span class="sy0">%</span>= 10<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>0 <span class="sy0">!</span>= checkByte<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; checkByte = 10 &#8211; checkByte<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>1 == <span class="br0">&#40;</span>flag <span class="sy0">%</span> 2<span class="br0">&#41;</span> <span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>1 == <span class="br0">&#40;</span>checkByte <span class="sy0">%</span> 2<span class="br0">&#41;</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; checkByte += 9<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; checkByte <span class="sy0">&gt;&gt;</span>= 1<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="st0">&#8216;7%s%s&#8217;</span> <span class="sy0">%</span><span class="br0">&#40;</span>checkByte,HashStr<span class="br0">&#41;</span></p>
<p><span class="kw1">def</span> getCh<span class="br0">&#40;</span>url<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="kw1">return</span> checkHash<span class="br0">&#40;</span>hashURL<span class="br0">&#40;</span>url<span class="br0">&#41;</span><span class="br0">&#41;</span></p>
<p><span class="kw1">def</span> main<span class="br0">&#40;</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; response = <span class="st0">&quot;Error: No URL defined.<span class="es0">\n</span>Usage: googrng.py &lt;url&gt; [[proxyuser:proxypass@]proxyhost:poxyport]&quot;</span><br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="kw2">len</span><span class="br0">&#40;</span><span class="kw3">sys</span>.<span class="me1">argv</span><span class="br0">&#41;</span> <span class="sy0">&gt;</span> 1:<br />
&nbsp; &nbsp; &nbsp; &nbsp; myurl = <span class="kw3">sys</span>.<span class="me1">argv</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; url = <span class="st0">&quot;http://toolbarqueries.google.es/search?features=Rank&amp;sourceid=navclient-ff&amp;client=navclient-auto-ff&amp;googleip=O;208.117.235.17;97&amp;iqrn=8VdB&amp;querytime=4P&amp;orig=0X557&amp;swwk=-1&amp;ch=%s&amp;q=info:%s&quot;</span> <span class="sy0">%</span><span class="br0">&#40;</span>getCh<span class="br0">&#40;</span>myurl<span class="br0">&#41;</span>,<span class="kw3">urllib</span>.<span class="me1">quote_plus</span><span class="br0">&#40;</span>myurl<span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="kw2">len</span><span class="br0">&#40;</span><span class="kw3">sys</span>.<span class="me1">argv</span><span class="br0">&#41;</span> <span class="sy0">&gt;</span> <span class="nu0">2</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; proxies = <span class="br0">&#123;</span><span class="st0">&#8216;http&#8217;</span>: <span class="st0">&#8216;http://&#8217;</span>+<span class="kw3">sys</span>.<span class="me1">argv</span><span class="br0">&#91;</span>1<span class="br0">&#93;</span><span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; f = <span class="kw3">urllib</span>.<span class="me1">urlopen</span><span class="br0">&#40;</span>url, proxies=proxies<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; f = <span class="kw3">urllib</span>.<span class="me1">urlopen</span><span class="br0">&#40;</span>url<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; response = f.<span class="me1">read</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; f.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw1">print</span> response</p>
<p><span class="kw1">if</span> __name__ == <span class="st0">&quot;__main__&quot;</span>:<br />
&nbsp; &nbsp; main<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.ikeralbeniz.net/2010/03/05/contulta-tu-pagerank-de-google-con-python/feed/</wfw:commentRss>
		<slash:comments>1</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>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>
	</channel>
</rss>
