<?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>Mauricio Pastrana - Since 1982 &#187; Freelance</title>
	<atom:link href="http://mauriciopastrana.com/category/freelance/feed/" rel="self" type="application/rss+xml" />
	<link>http://mauriciopastrana.com</link>
	<description>Ad Rem, Ad Hominem, Ad Lib!</description>
	<lastBuildDate>Mon, 05 Oct 2009 21:49:54 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Esquemas URI</title>
		<link>http://mauriciopastrana.com/gente/esquemas-uri/</link>
		<comments>http://mauriciopastrana.com/gente/esquemas-uri/#comments</comments>
		<pubDate>Tue, 13 May 2008 20:53:03 +0000</pubDate>
		<dc:creator>Mauricio Pastrana</dc:creator>
				<category><![CDATA[Freelance]]></category>
		<category><![CDATA[Gadgets y Tecnologia]]></category>
		<category><![CDATA[Gente]]></category>
		<category><![CDATA[Listas]]></category>

		<guid isPermaLink="false">http://mauriciopastrana.com/?p=93</guid>
		<description><![CDATA[No es mas que un repost (Gracias! Gregorio), que: como todo aquello en este blog, existe solo con el proposito de no olvidarme de su existencia (aquello de la mala memoria). Al parecer, aparte de los &#8220;usuales&#8221; enlaces mailto: y callto: existe una larga lista de esquemas URI no-universalmente aceptados por los navegadores&#8230; ahora, primero, que es un [...]]]></description>
			<content:encoded><![CDATA[<p>No es mas que <a href="http://tempusfugit.ionosfera.com/2008/04/15/esquemas-uri-no-oficiales-callto-msnim-etc" target="_blank">un repost</a> (Gracias! <a href="http://tempusfugit.ionosfera.com/acerca-de" target="_blank">Gregorio</a>), que: como todo aquello en este blog, existe solo con el proposito de no olvidarme de su existencia (<a href="http://mauriciopastrana.com/gadgets-y-tecnologia/por-lo-menos-con-mi-memoria-no-cuento/" target="_blank">aquello de la mala memoria</a>).</p>
<p>Al parecer, aparte de los &#8220;usuales&#8221; enlaces <strong>mailto:</strong> y <strong>callto:</strong> existe una <a href="http://www.iana.org/assignments/uri-schemes.html" target="_blank">larga lista de esquemas URI</a> <em>no-universalmente aceptados por los navegadores&#8230;</em> ahora<em>,</em> primero, que es un URI?</p>
<p>Segun <a href="http://en.wikipedia.org/wiki/URI_scheme" target="_blank">el documento que lo especifica</a> (<a href="http://tools.ietf.org/html/rfc3986">rfc3986</a>), la URI (o, <a href="http://www.google.com/search?q=define%3A+uri&amp;rls=com.microsoft:*&amp;ie=UTF-8&amp;oe=UTF-8&amp;startIndex=&amp;startPage=1" target="_blank"><em>Uniform Resource Identifier</em></a>) es el puente sintactico entre tu navegador, el protocolo de comunicacion y el servidor. En su uso mas comun este refiere a websites, y asi como hay mucha habla sobre <a href="http://www.codinghorror.com/blog/archives/001109.html" target="_blank">la eliminacion del &#8220;tripledobleu&#8221;</a>, este es otro de aquellos que espero ver menos a medida que pasa el tiempo.</p>
<p>La sintaxis URI <a href="http://en.wikipedia.org/wiki/URI_scheme#Examples" target="_blank">trabaja del siguiente modo</a>:</p>
<p style='font-size:.7em'>  foo://usuario:clave@ejemplo.com:8042/pagpor/alla/index.dtb;tipo=animal?nombre=gato#nariz<br />
   \ /     \___________/\__________/ \__/\__________/ \___/ \_/ \_________/ \_________/ \__/<br />
    |           |            |        |          |         |         |                 |       |              |<br />
esquema info_usuario   dominio    puerto   ruta      archivo extension parametro(s)/consulta<br />
    |    \______________________________/<br />
    |                autoridad<br />
    |     ______________________<br />
   / \ /                                      \<br />
  urn:ejemplo:animal:gato:nariz</p>
<p>En su blog, Gregorio da una fila de los mas utiles:</p>
<ul>
<li style="TEXT-ALIGN: left"><strong>VoIP (general)</strong>: <em>callto:&lt;screenname&gt;</em> o <em>callto:&lt;phonenumber&gt;</em></li>
<li style="TEXT-ALIGN: left"><strong>Windows Live Messenger</strong>: <em>msnim:[add|chat|voice|video]?contact=&lt;username&gt;</em></li>
<li style="TEXT-ALIGN: left"><strong>GTalk</strong>: <em>gtalk:&lt;username&gt;</em></li>
<li style="TEXT-ALIGN: left"><strong>Yahoo! Messenger</strong>: <em>ymsgr:sendIM?&lt;screenname&gt;</em></li>
<li style="TEXT-ALIGN: left"><strong>Jabber</strong>: <em>xmpp:&lt;username&gt;</em></li>
<li style="TEXT-ALIGN: left"><strong>AOL Instant Messenger</strong>: <em>aim:[goim|addbuddy|buddyicon]?&lt;parameters&gt;</em></li>
<li style="TEXT-ALIGN: left"><strong>Skype</strong>: <em>skype:&lt;username|phonenumber&gt;[?[add|call|chat|sendfile|userinfo]]</em></li>
<li style="TEXT-ALIGN: left"><strong>Feeds</strong>: <em>feed:&lt;absolute_uri&gt;</em> or <em>feed://&lt;hierarchical part&gt;</em></li>
<li style="TEXT-ALIGN: left"><strong>IRC</strong>: <em>irc://&lt;host&gt;[:&lt;port&gt;]/[&lt;channel&gt;[?&lt;password&gt;]]</em></li>
<li style="TEXT-ALIGN: left"><strong>Last.fm</strong>: <em>lastfm://&lt;radio_stream&gt;</em> or <em>lastfm://globaltags/&lt;genre&gt;</em> o <em>lastfm://user/&lt;username&gt;/&lt;stuff&gt;</em></li>
<li style="TEXT-ALIGN: left"><strong>eDonkey2000</strong>: <em>ed2k://|file|&lt;filename&gt;|&lt;size of file&gt;|&lt;hash of file&gt;|/</em> o <em>ed2k://|server|&lt;host&gt;|&lt;port&gt;|/</em></li>
<li style="TEXT-ALIGN: left"><strong>iCalendar</strong>: <em>webcal://&lt;hierarchical part&gt;</em></li>
</ul>
<p style="TEXT-ALIGN: left">pero aca una lista que demuestra de que tan <span style="text-decoration: line-through;">inutiles</span> detallados estos pueden llegar a ser,</p>
<ul>
<li>
<div style="TEXT-ALIGN: left"><strong>Andrew File System global file names</strong> afs://</div>
</li>
<li>
<div style="TEXT-ALIGN: left"><strong>Prospero Directory Service</strong> prospero://</div>
</li>
<li>
<div style="TEXT-ALIGN: left"><strong>xmlrpc.beeps</strong>: xmlrpc.beeps://</div>
</li>
<li>
<div style="TEXT-ALIGN: left"><strong>Uniform Resource Names</strong> urn://</div>
</li>
<li>
<div style="TEXT-ALIGN: left"><strong>opaquelocktokent </strong>opaquelocktoken:// </div>
</li>
<li>
<div style="TEXT-ALIGN: left"><strong>Diameter: Protocol</strong> aaa://</div>
</li>
<li>
<div style="TEXT-ALIGN: left"><strong>Diameter: Protocol with Secure Transport</strong> aaas://</div>
</li>
</ul>
<p style="TEXT-ALIGN: left">&#8230; y mi favorito en inutilidad,</p>
<ul>
<li>
<div style="TEXT-ALIGN: left"><strong>TV-Anytime Content Reference Identifier </strong>crid://</div>
</li>
</ul>
<p style="TEXT-ALIGN: left">Entonces, sabiendo esto, tecnicamente yo podria decir: <a href="callto:6467367748">llamame</a>(<a href="skype://mauriciopastrana" target="_blank">skype</a>) o <a href="msnim:chat?contact=mauricio@pastrana.co.uk" target="_blank">buscame</a> <a href="webcal://www.michaelronkin.com/webcalendar/wc200602.html" target="_blank">hoy en la tarde</a>, que van a presentar algo sobre <a href="crid://bbc.co.uk/olympics/2008/ " target="_self">las proximas olimpiadas</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://mauriciopastrana.com/gente/esquemas-uri/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>IOS Solutions</title>
		<link>http://mauriciopastrana.com/freelance/ios-solutions/</link>
		<comments>http://mauriciopastrana.com/freelance/ios-solutions/#comments</comments>
		<pubDate>Thu, 28 Feb 2008 17:25:01 +0000</pubDate>
		<dc:creator>Mauricio Pastrana</dc:creator>
				<category><![CDATA[Freelance]]></category>
		<category><![CDATA[IOS]]></category>
		<category><![CDATA[Trabajo]]></category>

		<guid isPermaLink="false">http://mauriciopastrana.com/freelance/ios-solutions/</guid>
		<description><![CDATA[A continuacion les presento mi proximo proyecto: IOS Solution (&#8220;Beyond Paperless&#8220;) y el motivo por el cual ando desaparecido. Que año tan dificil! &#8230; un poco de la compañia: &#8220;IOS is the leading, full-service provider of paperless solutions. We combine a unique set of services and easy to implement software to help you make the [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://mauriciopastrana.com/freelance/ios-solutions/ios-logo/" rel="attachment wp-att-90" title="IOS Logo"><img src="http://mauriciopastrana.com/wp-content/uploads/2008/02/index_r1_c1.jpg" alt="IOS Logo" align="left" border="0" hspace="10" vspace="10" /><img align="left" border="0" hspace="10" vspace="10" /></a>A continuacion les presento mi proximo proyecto: <a href="http://www.iossolution.com" target="_blank">IOS Solution</a> (&#8220;<a href="http://iossolution.com/aboutus.html" target="_blank">Beyond Paperless</a>&#8220;) y el motivo por el cual ando desaparecido. Que año tan dificil!</p>
<p>&#8230; un poco de la compañia: &#8220;<strong>IOS</strong> is the leading, full-service provider of paperless solutions. We combine a unique set of services and easy to implement software to help you make the full transition to an efficient, paperless environment. No more lost papers, expensive storage, and IT headaches. We provide you with secure, 24/7, world-wide access to your information, where you want it and when you want it.&#8221;</p>
]]></content:encoded>
			<wfw:commentRss>http://mauriciopastrana.com/freelance/ios-solutions/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Guia: Descarga tus contactos de facebook a Outlook</title>
		<link>http://mauriciopastrana.com/gente/guia-descarga-tus-contactos-de-facebook-a-outlook/</link>
		<comments>http://mauriciopastrana.com/gente/guia-descarga-tus-contactos-de-facebook-a-outlook/#comments</comments>
		<pubDate>Fri, 11 Jan 2008 00:40:33 +0000</pubDate>
		<dc:creator>Mauricio Pastrana</dc:creator>
				<category><![CDATA[Freelance]]></category>
		<category><![CDATA[Gadgets y Tecnologia]]></category>
		<category><![CDATA[Gente]]></category>
		<category><![CDATA[codigo]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programacion]]></category>

		<guid isPermaLink="false">http://mauriciopastrana.com/gente/guia-descarga-tus-contactos-de-facebook-a-outlook/</guid>
		<description><![CDATA[Cada 4 a seis meses me encuentro con el siguiente problema: 400 contactos en outlook, 500 contactos en Facebook. Dejando de lado la discusión de si son &#8220;amigos&#8221; o no, yo mas bien me pregunto: quienes son esos extra 100? (o 200, 300?). De costumbre, me gusta tener todos mis contactos en Outlook, que a [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://mauriciopastrana.com/wp-content/uploads/2008/01/picture-1asa.png" rel="lightbox[84]" title="fb friends"><img src="http://mauriciopastrana.com/wp-content/uploads/2008/01/picture-1asa.png" alt="fb friends" align="left" border="0" hspace="5" vspace="5" /></a>Cada 4 a seis meses me encuentro con el siguiente problema: 400 contactos en outlook, 500 contactos en Facebook. Dejando de lado la discusión de si son &#8220;amigos&#8221; o no, yo mas bien me pregunto: quienes son esos extra 100? (o 200, 300?).</p>
<p>De costumbre, me gusta tener todos mis contactos en Outlook, que a su ves se vuelve mi lista de números en el iphone, mac address book y otro sinnúmero de lugares gracias al <a href="http://www.plaxo.com/info">plaxo sync</a>. Así que amigo o no amigo, igual clasifica como contacto.</p>
<p>De costumbre, y gracias al hecho que facebook no permite hacer descargas de listas a Outlook (o a cualquier cosa ya que va en contra del <a href="http://www.facebook.com/terms.php" target="_blank">EULA</a>), por los últimos 2 años me he llevado a la costumbre de planear una noche, mañana o día para que, en viñetas únicas de firefox, cargue cada uno de mis contactos y, con mucho café en mano; me dedico a copiar la información a Outlook, uno a uno. Si ya se, que tedio!.</p>
<p>Hoy decidí hacerle corte a este vicio. De hecho, con los 530-yalgo contactos que encuentro bajo mi perfil de Facebook, estaría viendo unos dos o tres días de labor manual, esta guia explica el como solucione mi problema con un poco de PHP, MySQL y paciencia.</p>
<p>De antemano me disculpo si el articulo cae un poco, técnico. Traten de seguirme la bola. <a href="http://www.dataportability.org/" target="_blank">Algún día muy pronto, Facebook y Plaxo harán un import/export tool</a>, pero por ahora, es así o así.</p>
<p><span id="more-84"></span></p>
<h2>Screen Scraping &#8211; Que es?</h2>
<p>Primero que todo, no esta bien visto esto del &#8220;scraping&#8221;. A través de PHP, es la practica de programar un website para que &#8220;a mano automatizada&#8221; lea otro website (ej: programar una pagina _mía_ que da los precios del NASDAQ en el instante que cargue, leyendolos del código fuente de CNNMoney.com). Y que es lo que pasa con el scraping? no solo anota visitas &#8220;falsas&#8221; del lado de CNNMoney, sino que trae a luz moderna la vieja practica del &#8220;hotlinking&#8221;, donde yo en esencia me estoy robando ancho de banda de otros al colgar imágenes en mis paginas, que no estén hospedadas en mi servidor.</p>
<h2>Estrategia</h2>
<p>Primero lo primero. Para aquellos que no lo tengan bien medido, hay tres (si, tres) portales de facebook (en la plataforma publica). Facebook estandar (en <a href="http://www.facebook.com/" target="_blank">www.facebook.com</a>), Facebook Mobile (en <a href="http://m.facebook.com" target="_blank">m.facebook.com</a>) y Facebook para iphone (en <a href="http://iphone.facebook.com" target="_blank">iphone.facebook.com</a>). Para los curiosos, facebook tambien tiene portales privados (en los casos de compañias que compran facebook corporate -ejemplo: <a href="http://www.scribd.com/doc/81162/RedBull-Case-Study-FINAL" target="_blank">redbull</a>). Para este proyecto voy a explotar la diferencia entre portales, mas importantemente; el hecho que facebook mobile es un mini-facebook en html plano (de minimo uso de ancho de banda), que le da la vuelta al problema que en los otros portales, los llamados de datos son tablas en ajax o flash, para el caso de PHP cURL, es lo que llaman un &#8220;showstopper&#8221;.</p>
<p>De hecho, los invito a pasarse por m.facebook.com, desde firefox o desde el celular (el portal de iphone tambien sirve!).</p>
<p>El proyecto entonces, gracias a las <a href="http://textsnippets.com/posts/show/1204" target="_blank">herramientas disponibles</a>, lo armo del siguiente modo:</p>
<ul>
<li> Paso 1: Un levante de información que trae a mi base de datos una lista de todos mis contactos y su identificador privado dentro de Facebook</li>
</ul>
<ul>
<li> Paso 2: Un proceso iterativo que se base en la lista generada en el paso 1, que mire cada pagina de perfil de usuario según el id privado, levante cuanta información pueda de este y la anote a otra tabla en la base de datos</li>
</ul>
<ul>
<li> Paso 3: Un script que deje descargar los datos desde la base de datos en formato vcard (vcf)</li>
</ul>
<p>Retos y problemas previstos? Uno, y grande. Facebook no presenta las direcciones de email en texto plano sino en ves genera una imagen con el email impreso (trata de hacer copy paste de cualquier email en algun perfil de usuario!). De todos modos, para traer la foto del perfil del usuario <a href="http://www.facebook.com/applications/Fonebook/2442338999" target="_blank">existen soluciones simples</a>.</p>
<h2>Un poco de codigo</h2>
<p>Asi que, manos a la obra.</p>
<h3>Paso 1:</h3>
<p>Primero voy a generar un script que me deje emular el sistema de login a facebook mobile, para este; voy a explotar el hecho que www.facebook.com (un login por html), envía una variable que genera una redirección. Para aquellos que no saben nada de cURL, <a href="http://www.higherpass.com/php/Tutorials/Using-Curl-To-Query-Remote-Servers/" target="_blank">aca hay una guia</a>.</p>
<p>Las variables importantes acá son:<br />
<strong>curl_setopt($ch, CURLOPT_URL, &#8216;https://login.facebook.com/login.php?m&amp;next=http%3A%2F%2Fm.facebook.com%2Fhome.php&#8217;);curl_setopt($ch, CURLOPT_POSTFIELDS,&#8217;email=&#8217;.urlencode($login_email).&#8217;&amp;pass=&#8217;.urlencode($login_pass).&#8217;&amp;login=Login&#8217;);</strong></p>
<p>Y ojo que también hay que decirle a cURL donde dejar las cookies que entregue Facebook (ojo que el archivo tiene que existir, y <em>debe de tener privilegios de acceso para escritura, osea: chmod 777</em>):<br />
<strong> curl_setopt($ch, CURLOPT_COOKIEJAR, &#8220;myCookieFile.txt&#8221;);<br />
curl_setopt($ch, CURLOPT_COOKIEFILE, &#8220;myCookieFile.txt&#8221;);</strong></p>
<p>Y una mas, a facebook no le gustan los headers básicos de cURL, asi que toca simular que somos alguien en un browser normal, ya que planeo ejecutar el codigo desde el browser, voy a decirle a cURL que recicle el agente:<br />
<strong> curl_setopt($ch, CURLOPT_POST, 1);<br />
curl_setopt($ch, CURLOPT_HEADER, 0);<br />
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);<br />
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);<br />
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);<br />
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);</strong></p>
<p>Va? Nuestro script entero, para hacer login a facebook y traerse el contenido entero al browser entonces es:</p>
<p><strong>//login a fb<br />
$login_email = &#8216;FACEBOOK@EMAIL.COM&#8217;;<br />
$login_pass = &#8216;PASSWORD&#8217;;</strong></p>
<p><strong>$ch = curl_init();<br />
curl_setopt($ch, CURLOPT_URL, &#8216;https://login.facebook.com/login.php?m&amp;next=http%3A%2F%2Fm.facebook.com%2Fhome.php&#8217;);<br />
curl_setopt($ch, CURLOPT_POSTFIELDS,&#8217;email=&#8217;.urlencode($login_email).&#8217;&amp;pass=&#8217;.urlencode($login_pass).&#8217;&amp;login=Login&#8217;);<br />
curl_setopt($ch, CURLOPT_POST, 1);<br />
curl_setopt($ch, CURLOPT_HEADER, 0);<br />
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);<br />
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);<br />
curl_setopt($ch, CURLOPT_COOKIEJAR, &#8220;myCookieFile.txt&#8221;);<br />
curl_setopt($ch, CURLOPT_COOKIEFILE, &#8220;myCookieFile.txt&#8221;);<br />
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);<br />
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);<br />
curl_exec($ch);</strong></p>
<p><strong>//So what? bueno, ahora hagamos un llamado con cURL! <img src='http://mauriciopastrana.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </strong></p>
<p><strong>curl_setopt($ch, CURLOPT_POST, 0);<br />
curl_setopt($ch, CURLOPT_URL, &#8216;http://m.facebook.com/home.php&#8217;);<br />
$page = curl_exec($ch);<br />
print_r($page);</strong></p>
<p>Guarda, abre el script desde firefox (ojo a los permisos del archivo txt de cookies -myCookieFile.txt) y:</p>
<p><a href="http://mauriciopastrana.com/wp-content/uploads/2008/01/ytre.png" rel="lightbox[84]" title="facebook mobile"></a></p>
<p style="text-align: center"><a href="http://mauriciopastrana.com/wp-content/uploads/2008/01/ytre.png" rel="lightbox[84]" title="facebook mobile"><img src="http://mauriciopastrana.com/wp-content/uploads/2008/01/ytre.png" alt="facebook mobile" border="0" height="416" width="501" /></a></p>
<p>Fácil ah? Bueno, ahora lo divertido.</p>
<p>Primero, me dirijo a la pagina que me interesa http://m.facebook.com/friends.php?a, y le digo a cURL que envie todo a una variable $html :</p>
<p><strong>curl_setopt($ch, CURLOPT_POST, 0);<br />
curl_setopt($ch, CURLOPT_URL, &#8220;http://m.facebook.com/friends.php?a&#8221;);<br />
$page = curl_exec($ch);</strong></p>
<p><strong>curl_setopt($ch, CURLOPT_FAILONERROR, true);<br />
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);<br />
curl_setopt($ch, CURLOPT_AUTOREFERER, true);<br />
curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);<br />
curl_setopt($ch, CURLOPT_TIMEOUT, 10);<br />
$html= curl_exec($ch);<br />
if (!$html) {<br />
echo &#8220;&lt;br /&gt;cURL error number:&#8221; .curl_errno($ch);<br />
echo &#8220;&lt;br /&gt;cURL error:&#8221; . curl_error($ch);<br />
exit;<br />
}</strong></p>
<p>y despues, le digo a PHP que lo traduzca a un DOM&#8230;</p>
<p><strong>$dom = new DOMDocument();<br />
@$dom-&gt;loadHTML($html);</strong></p>
<p>&#8230; se pesque solo los items &lt;a href&gt; (links)&#8230;</p>
<p><strong>$xpath = new DOMXPath($dom);<br />
$hrefs = $xpath-&gt;evaluate(&#8220;/html/body//a&#8221;);</strong></p>
<p>&#8230; y finalmente, lo pongo en un loop a analizar cada enlace por si solo:</p>
<p><strong>//iteramos &#8230;<br />
for ($i = 0; $i &lt; $hrefs-&gt;length; $i++) {<br />
$href = $hrefs-&gt;item($i);<br />
$profile_url = $href-&gt;getAttribute(&#8216;href&#8217;);</strong></p>
<p><strong>//&#8230; filtrando solo los enlaces que lleven a perfiles<br />
if((strpos($profile_url,&#8221;/profile.php?id=&#8221;) !== false) &amp;&amp; strpos($profile_url,&#8221;http://m.facebook.com/&#8221;) === false){</strong></p>
<p><strong>//&#8230; y nos guardamos en la base de datos el nombre del contacto y la URL que apunta al perfil<br />
$profile_name = $href-&gt;nodeValue;<br />
storeLink($profile_url,$profile_name);<br />
echo &#8220;&lt;br /&gt;Profile URL Stored: $profile_name ($profile_url)&#8221;;</strong></p>
<p><strong>} //end filter</strong></p>
<p><strong>}//end single page reading</strong></p>
<p>BTW, esa funcion que guarda en la base de datos (storeLink), la arme del siguiente modo (usando ADOdb):</p>
<p><strong>function storeLink($url,$profile_name) {<br />
global $db;<br />
$query = &#8220;INSERT INTO fb_profiles_list (profile_url, profile_name) VALUES (&#8216;$url&#8217;, &#8216;$profile_name&#8217;)&#8221;;<br />
$insert = $db-&gt;Execute($query);<br />
}</strong></p>
<p>Listos? bueno pues falta. resulta que la pagina que estamos mirando solo muestra 10 records, asi que hay que iterar, segun la cantidad de contactos, la estructura es la siguiente: http://m.facebook.com/friends.php?a&amp;p=$page_counter. Personalmente, tengo el loop estructurado a mano, asi que; como poseo 532 contactos, a 10 contactos por pagina; pues me preparo un loop que cuente 54 pasadas de pagina.</p>
<p><strong>$num_pageflips = 54;<br />
for  ($page_counter = 1; $page_counter &lt;= $num_pageflips; $page_counter++) {<br />
&#8230;<br />
curl_setopt($ch, CURLOPT_URL, &#8220;http://m.facebook.com/friends.php?a&amp;p=$page_counter&#8221;);<br />
&#8230;</strong></p>
<p>Asi que, nuestro script para el paso 1 (incluyendo el archivo de los cookies), lee asi (Phew!):</p>
<p><strong>&lt;?<br />
/*******************************<br />
*    Facebook Downloader (to MySQL)<br />
*    Mauricio Pastrana<br />
*    http://www.via-the-internet.com<br />
*    January 2008<br />
*<br />
*    Many Thanks to:     Christian Flickinger (http://nexdot.net/blog) and (http://textsnippets.com/posts/show/1204)<br />
*                Justin Laing (http://www.merchantos.com/makebeta/php/scraping-links-with-php/)<br />
*<br />
*        **DONT RUN BLINDLY, DONT DISTRIBUTE SO FREELY, WATCH OUT FOR LINES 26, 27 and 56<br />
*<br />
*******************************/</strong></p>
<p><strong>//get our database (using ADODB: http://adodb.sourceforge.net/)<br />
require(&#8216;includes/database/connection.inc&#8217;);</strong></p>
<p><strong>//a function to write to the database<br />
function storeLink($url,$profile_name) {<br />
global $db;<br />
$query = &#8220;INSERT INTO fb_profiles_list (profile_url, profile_name) VALUES (&#8216;$url&#8217;, &#8216;$profile_name&#8217;)&#8221;;<br />
$insert = $db-&gt;Execute($query);<br />
}</strong></p>
<p><strong>//login to fb<br />
$login_email = &#8216;FACEBOOK@EMAIL.COM&#8217;;<br />
$login_pass = &#8216;PASSWORD&#8217;;</strong></p>
<p><strong>$ch = curl_init();<br />
curl_setopt($ch, CURLOPT_URL, &#8216;https://login.facebook.com/login.php?m&amp;next=http%3A%2F%2Fm.facebook.com%2Fhome.php&#8217;);<br />
curl_setopt($ch, CURLOPT_POSTFIELDS,&#8217;email=&#8217;.urlencode($login_email).&#8217;&amp;pass=&#8217;.urlencode($login_pass).&#8217;&amp;login=Login&#8217;);<br />
curl_setopt($ch, CURLOPT_POST, 1);<br />
curl_setopt($ch, CURLOPT_HEADER, 0);<br />
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);<br />
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);<br />
curl_setopt($ch, CURLOPT_COOKIEJAR, &#8220;myCookieFile.txt&#8221;);<br />
curl_setopt($ch, CURLOPT_COOKIEFILE, &#8220;myCookieFile.txt&#8221;);<br />
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);<br />
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);<br />
curl_exec($ch);</strong></p>
<p><strong>//need to test this? comment the uncomment this, comment everything else below it and browse to the script, you should get the m.facebook.com home page <img src='http://mauriciopastrana.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </strong></p>
<p><strong>/*curl_setopt($ch, CURLOPT_POST, 0);<br />
curl_setopt($ch, CURLOPT_URL, &#8216;http://m.facebook.com/home.php&#8217;);<br />
$page = curl_exec($ch);<br />
print_r($page);<br />
*/</strong></p>
<p><strong>//ok, we&#8217;re in! now head over to friends, if you have more than 10 (most likely), then we will have to iterate</strong></p>
<p><strong>// ok so: I know this can be done on automatic, but it makes the script more readable if you do some manual work (ugh).<br />
// It&#8217;s real easy, find out how many friends you have (login, then go to:  http://m.facebook.com/friends.php?a), and<br />
// divide the number by 10! Easy, see? now input the number here:<br />
$num_pageflips = 54;<br />
// I have 532 &#8220;friends&#8221; at the moment, so expect 54 pages of friends and set $num_pageflips = 54</strong></p>
<p><strong>for  ($page_counter = 1; $page_counter &lt;= $num_pageflips; $page_counter++) {</strong></p>
<p><strong>//head over to our friend page, note the first page is &amp;p=1<br />
curl_setopt($ch, CURLOPT_POST, 0);<br />
curl_setopt($ch, CURLOPT_URL, &#8220;http://m.facebook.com/friends.php?a&amp;p=$page_counter&#8221;);<br />
$page = curl_exec($ch);</strong></p>
<p><strong>curl_setopt($ch, CURLOPT_FAILONERROR, true);<br />
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);<br />
curl_setopt($ch, CURLOPT_AUTOREFERER, true);<br />
curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);<br />
curl_setopt($ch, CURLOPT_TIMEOUT, 10);<br />
$html= curl_exec($ch);<br />
if (!$html) {<br />
echo &#8220;&lt;br /&gt;cURL error number:&#8221; .curl_errno($ch);<br />
echo &#8220;&lt;br /&gt;cURL error:&#8221; . curl_error($ch);<br />
exit;<br />
}</strong></p>
<p><strong>// parse the html into a DOMDocument<br />
$dom = new DOMDocument();<br />
@$dom-&gt;loadHTML($html);</strong></p>
<p><strong>// grab all the links on the page<br />
$xpath = new DOMXPath($dom);<br />
$hrefs = $xpath-&gt;evaluate(&#8220;/html/body//a&#8221;);</strong></p>
<p><strong>//now iterate through the whole HTML to grab what we need<br />
for ($i = 0; $i &lt; $hrefs-&gt;length; $i++) {<br />
$href = $hrefs-&gt;item($i);<br />
$profile_url = $href-&gt;getAttribute(&#8216;href&#8217;);</strong></p>
<p><strong>//filter out only the profile links and names!<br />
if((strpos($profile_url,&#8221;/profile.php?id=&#8221;) !== false) &amp;&amp; strpos($profile_url,&#8221;http://m.facebook.com/&#8221;) === false){</strong></p>
<p><strong>//get the actual person&#8217;s name (from the link as well), and store it on the db. also, let me know how it&#8217;s going<br />
$profile_name = $href-&gt;nodeValue;<br />
storeLink($profile_url,$profile_name);<br />
echo &#8220;&lt;br /&gt;Profile URL Stored: $profile_name ($profile_url)&#8221;;</strong></p>
<p><strong>} //end filter</strong></p>
<p><strong>}//end single page reading</strong></p>
<p><strong>}//end pageflips<br />
?&gt;</strong></p>
<p>Bien ejecutado, este script les debe de dejar una base de datos con un listado de todos los contactos, mas las URL que refieren a su pagina de perfil. Como si no fuera suficiente, aca va el SQL que genera la tabla referente al paso 1:</p>
<p><strong>CREATE TABLE `fb_profiles_list` (<br />
`id` int(11) NOT NULL auto_increment,<br />
`profile_url` varchar(255) default NULL,<br />
`profile_name` varchar(255) default NULL,<br />
PRIMARY KEY  (`id`)<br />
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;</strong></p>
<h3>Paso 2:</h3>
<p>Bueno, ya tenemos ahora una lista larga de URLs, no? ahora la estrategia es la siguiente. Vamos a iterar y pasar por cada uno de estos URL (usando la estructura del paso 1 para hacer &#8220;login&#8221;), y de este; leer el HTML que nos de items de interes. Voy a preparar una funcion en PHP que me rebote todo el texto en un string entre un punto de inicio y un final:</p>
<p><strong>// Funcion para extraer algo atrapado entre dos strings definidas por el usuario.<br />
// Ejemplo: $string = &#8220;&lt;div style=&#8217;blablabla&#8217;&gt;texto&lt;/div&gt;&#8221;<br />
// get_string_between($string,&#8221;&lt;div style=&#8217;&#8221;,&#8221;&#8216;&gt;texto&#8221;) &#8211;&gt; entrega blablabla<br />
//<br />
function get_string_between($string, $start, $end){<br />
$string = &#8221; &#8220;.$string;<br />
$ini = strpos($string,$start);<br />
if ($ini == 0) return &#8220;&#8221;;<br />
$ini += strlen($start);<br />
$len = strpos($string,$end,$ini) &#8211; $ini;<br />
return substr($string,$ini,$len);<br />
}</strong></p>
<p>Listo? bueno, ahora esta facil, repito la estructura del script del paso 1, solo que ahora mirando a una pagina de perfil: http://m.facebook.com/profile.php?id=12345&amp;full (y ojo a incluir la variable &amp;full!)</p>
<p><strong>curl_setopt($ch, CURLOPT_POST, 0);<br />
curl_setopt($ch, CURLOPT_URL, &#8220;http://m.facebook.com/profile.php?id=&#8221;.$profile_id.&#8221;&amp;full&#8221;);<br />
$page = curl_exec($ch);</strong></p>
<p>y estando adentro del perfil, no es sino identificar que item queremos enviar a la base de datos, generamos una variable que lo archive, y al final hacemos un &#8220;mega&#8221;llamado a store, ejemplo:</p>
<p><strong>//AIM<br />
$aim = get_string_between($page, &#8216;AIM:  &#8216;, &#8216;&lt;br /&gt;&#8217;);<br />
echo &#8220;AIM: &#8220;.$aim.&#8221;&lt;br /&gt;&#8221;;</strong></p>
<p><strong>//Yahoo<br />
$yahoo = get_string_between($page, &#8216;Yahoo:  &#8216;, &#8216;&lt;br /&gt;&#8217;);<br />
echo &#8220;Yahoo: &#8220;.$yahoo.&#8221;&lt;br /&gt;&#8221;;</strong></p>
<p>y al final:</p>
<p><strong>storeProfileData($first_name, $last_name, $website, $aim, $yahoo, $windows_live, $skype, $tel, $current_address, $current_town, $home_town, $birthday, $work_info, $position);</strong></p>
<p>donde:</p>
<p><strong>function storeProfileData($first_name, $last_name, $website, $aim, $yahoo, $windows_live, $skype, $tel, $current_address, $current_town, $home_town, $birthday, $work_info, $position){<br />
global $db;<br />
$query = &#8220;INSERT INTO fb_specific_profiles (first_name, last_name, website, aim, yahoo, windows_live, skype, tel, current_address, current_town, home_town, birthday, work_info, position) VALUES (&#8216;$first_name&#8217;, &#8216;$last_name&#8217;, &#8216;$website&#8217;, &#8216;$aim&#8217;, &#8216;$yahoo&#8217;, &#8216;$windows_live&#8217;, &#8216;$skype&#8217;, &#8216;$tel&#8217;, &#8216;$current_address&#8217;, &#8216;$current_town&#8217;, &#8216;$home_town&#8217;, &#8216;$birthday&#8217;, &#8216;$work_info&#8217;, &#8216;$position&#8217;)&#8221;;<br />
$insert = $db-&gt;Execute($query);<br />
}</strong></p>
<p>LISTOS! Ahora iteramos por todo el data set del paso 1, para generar el del paso 2!</p>
<p>Ya a estas alturas creo, no hay nadie conmigo. &#8230; pero si tuvieron la paciencia, acá esta el script entero de la parte 2:</p>
<p><strong>&lt;?<br />
/*******************************<br />
*    Facebook Downloader (to MySQL)<br />
*    Mauricio Pastrana<br />
*    http://www.via-the-internet.com<br />
*    January 2008<br />
*<br />
*    Many Thanks to:     Christian Flickinger (http://nexdot.net/blog) and (http://textsnippets.com/posts/show/1204)<br />
*                Justin Laing (http://www.merchantos.com/makebeta/php/scraping-links-with-php/)<br />
*<br />
*        **DONT RUN BLINDLY, DONT DISTRIBUTE SO FREELY, NOTE YOU NEED TO RUN THE FIRST SCRAPER FIRST<br />
*<br />
*******************************/</strong></p>
<p><strong>//get our database (using ADODB: http://adodb.sourceforge.net/)<br />
require(&#8216;includes/database/connection.inc&#8217;);</strong></p>
<p><strong>//a function to write to the database<br />
function storeProfileData($first_name, $last_name, $website, $aim, $yahoo, $windows_live, $skype, $tel, $current_address, $current_town, $home_town, $birthday, $work_info, $position){<br />
global $db;<br />
$query = &#8220;INSERT INTO fb_specific_profiles (first_name, last_name, website, aim, yahoo, windows_live, skype, tel, current_address, current_town, home_town, birthday, work_info, position) VALUES (&#8216;$first_name&#8217;, &#8216;$last_name&#8217;, &#8216;$website&#8217;, &#8216;$aim&#8217;, &#8216;$yahoo&#8217;, &#8216;$windows_live&#8217;, &#8216;$skype&#8217;, &#8216;$tel&#8217;, &#8216;$current_address&#8217;, &#8216;$current_town&#8217;, &#8216;$home_town&#8217;, &#8216;$birthday&#8217;, &#8216;$work_info&#8217;, &#8216;$position&#8217;)&#8221;;<br />
$insert = $db-&gt;Execute($query);<br />
}</strong></p>
<p><strong>//a function to get the text between to user defined strings<br />
function get_string_between($string, $start, $end){<br />
$string = &#8221; &#8220;.$string;<br />
$ini = strpos($string,$start);<br />
if ($ini == 0) return &#8220;&#8221;;<br />
$ini += strlen($start);<br />
$len = strpos($string,$end,$ini) &#8211; $ini;<br />
return substr($string,$ini,$len);<br />
}</strong></p>
<p><strong>//login to fb<br />
$login_email = &#8216;FACEBOOK@EMAIL.COM&#8217;;<br />
$login_pass = &#8216;PASSWORD&#8217;;</strong></p>
<p><strong>$ch = curl_init();<br />
curl_setopt($ch, CURLOPT_URL, &#8216;https://login.facebook.com/login.php?m&amp;next=http%3A%2F%2Fm.facebook.com%2Fhome.php&#8217;);<br />
curl_setopt($ch, CURLOPT_POSTFIELDS,&#8217;email=&#8217;.urlencode($login_email).&#8217;&amp;pass=&#8217;.urlencode($login_pass).&#8217;&amp;login=Login&#8217;);<br />
curl_setopt($ch, CURLOPT_POST, 1);<br />
curl_setopt($ch, CURLOPT_HEADER, 0);<br />
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);<br />
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);<br />
curl_setopt($ch, CURLOPT_COOKIEJAR, &#8220;myCookieFile.txt&#8221;);<br />
curl_setopt($ch, CURLOPT_COOKIEFILE, &#8220;myCookieFile.txt&#8221;);<br />
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);<br />
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);<br />
curl_exec($ch);</strong></p>
<p><strong>//need to test this? comment the uncomment this, comment everything else below it and browse to the script, you should get the m.facebook.com home page <img src='http://mauriciopastrana.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </strong></p>
<p><strong>/*curl_setopt($ch, CURLOPT_POST, 0);<br />
curl_setopt($ch, CURLOPT_URL, &#8216;http://m.facebook.com/home.php&#8217;);<br />
$page = curl_exec($ch);<br />
print_r($page);<br />
*/</strong></p>
<p><strong>//ok, we&#8217;re in! now head over to each specific profile page, we&#8217;re going to have to loop through the whole dataset and use a LOT of substring magic</strong></p>
<p><strong>//first, we find out where we are as far as id&#8217;s in the db (if you&#8217;re lucky, yours starts at 1, i did some testing, so my first profile begins at id=127!)</strong></p>
<p><strong>echo &#8220;profiles found in db: &#8220;.$num_profiles = $db-&gt;GetOne(&#8220;SELECT COUNT(*) FROM fb_profiles_list&#8221;).&#8221;&lt;br /&gt;&#8221;;<br />
echo &#8220;first profile id: &#8220;.$first_profile_id = $db-&gt;GetOne(&#8220;SELECT id FROM fb_profiles_list&#8221;).&#8221;&lt;br /&gt;&#8221;;</strong></p>
<p><strong>for  ($profile_counter = 0; $profile_counter &lt; $num_profiles; $profile_counter++) {</strong></p>
<p><strong>//be a little verbose<br />
echo $profile_counter.&#8221;&lt;br /&gt;&lt;br /&gt;&#8221;;<br />
$profile_id = get_string_between($db-&gt;GetOne(&#8220;SELECT profile_url FROM fb_profiles_list WHERE id=&#8221;.($first_profile_id+$profile_counter)), &#8216;/profile.php?id=&#8217;, &#8216;&amp;r&#8217;);<br />
echo &#8220;Now Trying: &#8221; .<br />
$db-&gt;GetOne(&#8220;SELECT profile_name FROM fb_profiles_list WHERE id=&#8221;.($first_profile_id+$profile_counter)) . //profile_name<br />
&#8221; (&#8221; . $profile_id . &#8220;) &lt;br /&gt;&#8221;; // profile_id</strong></p>
<p><strong>curl_setopt($ch, CURLOPT_POST, 0);<br />
curl_setopt($ch, CURLOPT_URL, &#8220;http://m.facebook.com/profile.php?id=&#8221;.$profile_id.&#8221;&amp;full&#8221;);<br />
$page = curl_exec($ch);<br />
//print_r($page);</strong></p>
<p><strong>//Name<br />
$name = explode(&#8221; &#8220;,get_string_between($page, &#8216;&lt;title&gt;Facebook | &#8216;, &#8216;\&#8217;s Profile&lt;/title&gt;&#8217;));</strong></p>
<p><strong>$first_name = $name[0];<br />
$last_name = $name[1];</strong></p>
<p><strong>echo &#8220;First Name :$first_name &lt;br /&gt;&#8221;;<br />
echo &#8220;Last Name :$last_name &lt;br /&gt;&#8221;;</strong></p>
<p><strong>//Website<br />
$website = get_string_between($page, &#8216;Website:  &lt;a href=&#8221;&#8216;, &#8216;?refid=17&#8243;&gt;&#8217;);<br />
echo &#8220;Website: &#8220;.$website.&#8221;&lt;br /&gt;&#8221;;</strong></p>
<p><strong>//AIM<br />
$aim = get_string_between($page, &#8216;AIM:  &#8216;, &#8216;&lt;br /&gt;&#8217;);<br />
echo &#8220;AIM: &#8220;.$aim.&#8221;&lt;br /&gt;&#8221;;</strong></p>
<p><strong>//Yahoo<br />
$yahoo = get_string_between($page, &#8216;Yahoo:  &#8216;, &#8216;&lt;br /&gt;&#8217;);<br />
echo &#8220;Yahoo: &#8220;.$yahoo.&#8221;&lt;br /&gt;&#8221;;</strong></p>
<p><strong>//Windows Live<br />
$windows_live = get_string_between($page, &#8216;Windows Live:  &#8216;, &#8216;&lt;br /&gt;&#8217;);<br />
echo &#8220;Windows Live: &#8220;.$windows_live.&#8221;&lt;br /&gt;&#8221;;</strong></p>
<p><strong>//Skype<br />
$skype = get_string_between($page, &#8216;Skype:  &#8216;, &#8216;&lt;br /&gt;&#8217;);<br />
echo &#8220;Skype: &#8220;.$skype.&#8221;&lt;br /&gt;&#8221;;</strong></p>
<p><strong>//Tel<br />
$tel = get_string_between($page, &#8216;&lt;a href=&#8221;tel:&#8217;, &#8216;&#8221;&gt;&#8217;);<br />
echo &#8220;Tel: &#8220;.$tel.&#8221;&lt;br /&gt;&#8221;;</strong></p>
<p><strong>//Current Address<br />
$current_address = get_string_between($page, &#8216;Current Address:  &#8216;, &#8216;&lt;br /&gt;&#8217;);<br />
echo &#8220;Current Address: &#8220;.$current_address.&#8221;&lt;br /&gt;&#8221;;</strong></p>
<p><strong>//Current Town<br />
$current_town = get_string_between($page, &#8216;Current Town:  &#8216;, &#8216;&lt;br /&gt;&#8217;);<br />
echo &#8220;Current Town: &#8220;.$current_town.&#8221;&lt;br /&gt;&#8221;;</strong></p>
<p><strong>//Home Town<br />
$home_town = get_string_between($page, &#8216;Hometown:  &#8216;, &#8216;&lt;br /&gt;&#8217;);<br />
echo &#8220;Home Town: &#8220;.$home_town.&#8221;&lt;br /&gt;&#8221;;</strong></p>
<p><strong>//Birthday<br />
$birthday = get_string_between($page, &#8216;Birthday:  &#8216;, &#8216;&lt;br /&gt;&#8217;);<br />
echo &#8220;Birthday: &#8220;.$birthday.&#8221;&lt;br /&gt;&#8221;;</strong></p>
<p><strong>//Work Info<br />
$work_info = get_string_between($page, &#8216;Company:  &#8216;, &#8216;&lt;br /&gt;&#8217;);<br />
echo &#8220;Work Info: &#8220;.$work_info.&#8221;&lt;br /&gt;&#8221;;</strong></p>
<p><strong>//Position<br />
$position = get_string_between($page, &#8216;Position:  &#8216;, &#8216;&lt;br /&gt;&#8217;);<br />
echo &#8220;Position: &#8220;.$position.&#8221;&lt;br /&gt;&#8221;;</strong></p>
<p><strong>storeProfileData($first_name, $last_name, $website, $aim, $yahoo, $windows_live, $skype, $tel, $current_address, $current_town, $home_town, $birthday, $work_info, $position);</strong></p>
<p><strong>echo &#8220;&lt;hr&gt;&#8221;;<br />
}//end pageflips<br />
?&gt;</strong></p>
<p>Ojo con Facebook!<br />
Tengan cuidado, hay que tener en cuenta que cuando llaman este script, lo hacen desde su propia cuenta de FaceBook. Si hacen algo muy dañino (como, golpear los servidores con miles de hits de una sentada), los pueden rastrear! Ya hay mas de un caso donde <a href="http://nexdot.net/blog" target="_blank">Facebook tumba scripts de usuarios propagando otros &#8220;facebook downloaders</a>.</p>
<p>Acá de paso dejo los archivos fuente que use, ojo a los comentarios; ahí les incluyo el paso 3, que es un script extra para extraer la informacion de la base de datos a vcards (que lee outlook). Otra sugerencia? Busquense algun <a href="http://www.facebook.com/applications/Fonebook/2442338999" target="_blank">app de facebook que coordine las fotos de los contactos online con las offline</a>. Y estamos!</p>
<p><a href="http://mauriciopastrana.com/wp-content/uploads/2008/01/contacts.png" rel="lightbox[84]" title="contacts"></a></p>
<p style="text-align: center"><a href="http://mauriciopastrana.com/wp-content/uploads/2008/01/contacts.png" rel="lightbox[84]" title="contacts"><img src="http://mauriciopastrana.com/wp-content/uploads/2008/01/contacts.png" alt="contacts" border="0" height="340" hspace="5" vspace="5" width="426" /></a></p>
<p style="text-align: center"><a href="http://mauriciopastrana.com/wp-content/uploads/2008/01/contacts.png" rel="lightbox[84]" title="contacts"> </a><a href="http://mauriciopastrana.com/wp-content/uploads/2008/01/contactnum.png" rel="lightbox[84]" title="contact number"><img src="http://mauriciopastrana.com/wp-content/uploads/2008/01/contactnum.png" alt="contact number" border="0" /></a></p>
<p>Tiempo total de desarrollo: 20 horas-hombre. Wow! Que lastima no poder hacer un servicio web fuera de este.</p>
<p><a href="http://mauriciopastrana.com/wp-content/uploads/2008/01/facebook-downloader.zip" target="_blank"><em>Aca puedes descargar los archivos fuente que incluyen los tres scripts y la conexion a la base de datos.</em></a></p>
]]></content:encoded>
			<wfw:commentRss>http://mauriciopastrana.com/gente/guia-descarga-tus-contactos-de-facebook-a-outlook/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Webblast 2007: blog-blog-blog it all&#8230;</title>
		<link>http://mauriciopastrana.com/gente/webblast-2007-blog-blog-blog-it-all/</link>
		<comments>http://mauriciopastrana.com/gente/webblast-2007-blog-blog-blog-it-all/#comments</comments>
		<pubDate>Tue, 11 Dec 2007 08:54:59 +0000</pubDate>
		<dc:creator>Mauricio Pastrana</dc:creator>
				<category><![CDATA[Freelance]]></category>
		<category><![CDATA[Gente]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[techcrunch]]></category>
		<category><![CDATA[webblast]]></category>

		<guid isPermaLink="false">http://mauriciopastrana.com/gente/webblast-2007-blog-blog-blog-it-all/</guid>
		<description><![CDATA[hoy llego, por fin! (ok, Ayer! Pero pasa por &#8220;hoy&#8221; en el hemisferio americano )&#8230; Que llego? La respuesta a mi invitacion en waiting list del webblast 2007. Webblast resulta ser el techcrunch 40 asiatico&#8230; Solo que son 14 y&#8230; Por no tener a flock o powerset, nos presentan a geeks on the grass o [...]]]></description>
			<content:encoded><![CDATA[<p>hoy llego, por fin! (ok, Ayer! Pero pasa por &#8220;hoy&#8221; en el hemisferio americano <img src='http://mauriciopastrana.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  )&#8230; Que llego? La respuesta a mi invitacion en waiting list del <a href="http://www.webblast.org">webblast 2007</a>.</p>
<p>Webblast resulta ser el <a href="http://www.techcrunch40.com">techcrunch 40</a> asiatico&#8230; Solo que son 14 y&#8230; Por no tener a <a href="http://www.flock.com">flock</a> o <a href="http://www.powerset.com">powerset</a>, nos presentan a <a href="http://www.geekwhisperer.com">geeks on the grass</a> o <a href="http://www.tangler.com/group/6952">beer 2.0</a>, uno de los cuales nisiquiera tiene su propio website!</p>
<p>Aun asi, webblast resulta ser organizado (<em>sponsored</em>) por <a href="http://www.redsquare.com.au">red square</a>, la compañia de tony &#8220;redhair&#8221; redhair quien me alojo hace un año mientras hacia montaje html de sus <a href="http://sydneykings.corporatejames.com">hojas de estilos de A$25,000</a> (btw, otro recorderis que los departamentos mas importantes son ventas y cartera).</p>
<p>Tony no solo trato de convertirme hacia el &#8220;dark side&#8221; de las plataformas de desarrollo (<a href="http://www.adobe.com/products/flex/">flex</a>) sino que se tomo el tiempo de explicarme como &#8220;funciona el negocio&#8221; (el de el) y como, aunque no lo parezca, tener un rec room al lado del sector desarrollo si sirve de algo. En ultimas, supongo que le debo algo al hombre y si este implica una pasada por un bar a <a href="http://www.flickr.com/photos/kittynn/172269672">lanzar sonrisas</a>, so be it.</p>
<p>De paso si la vieron? Este <em>who&#8217;s who</em> resulta ser, en un bar. Aussies. Sigh.</p>
<p style="text-align: center"><a href="http://www.webblast.org"><img src="http://www.webblast.org/images/header.jpg" border="0" height="188" width="495" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://mauriciopastrana.com/gente/webblast-2007-blog-blog-blog-it-all/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>21 dias down.</title>
		<link>http://mauriciopastrana.com/personal/21-dias-down/</link>
		<comments>http://mauriciopastrana.com/personal/21-dias-down/#comments</comments>
		<pubDate>Mon, 10 Dec 2007 03:21:52 +0000</pubDate>
		<dc:creator>Mauricio Pastrana</dc:creator>
				<category><![CDATA[Freelance]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[]]></category>
		<category><![CDATA[estudio]]></category>
		<category><![CDATA[techcrunch]]></category>
		<category><![CDATA[web2.0]]></category>

		<guid isPermaLink="false">http://mauriciopastrana.com/personal/21-dias-down/</guid>
		<description><![CDATA[Van 3 semanas&#8230; casi. 20 días enterítos desde que complete lo que ojala sea mi ultima pausa de vida, en este caso; estudio. Con este, entonces, son 3 semanas en las cuales me ha tocado retomar las riendas de todo lo que deje botado antes de &#8220;retirarme&#8221; (Fue una maestria de 18 meses!). Este Blog, [...]]]></description>
			<content:encoded><![CDATA[<p align="justify">Van 3 semanas&#8230; casi. 20 días enterítos desde que complete lo que ojala sea mi ultima pausa de vida, en este caso; <a href="http://farm3.static.flickr.com/2395/2059461220_e32d43ea33_b.jpg" rel="lightbox[67]" target="_blank">estudio</a>.</p>
<p align="justify">Con este, entonces, son 3 semanas en las cuales me ha tocado retomar las riendas de <a href="http://www.vipahealth.com" target="_blank">todo</a> <a href="http://www.nauro.com" target="_blank">lo</a> <a href="http://www.designloom.com/" target="_blank">que</a> <a href="http://www.cxpo.com" target="_blank">deje</a> <a href="http://www.via-the-internet.com">botado</a> antes de &#8220;<a href="http://www.econ.usyd.edu.au/course/FC050.html" target="_blank">retirarme</a>&#8221; (Fue una maestria de 18 meses!). Este Blog, cualquier <a href="http://www.google.com/adwords">freelance</a> <a href="http://www.joseito.net" target="_blank">pendiente</a>, hasta de hecho arreglar mi <a href="http://home.ingdirect.com">desorden</a> <a href="http://www.etrade.com" target="_blank">financiero</a> (ya que, dificil planear bien sin poder cuadrar horas de trabajo estables).</p>
<p align="justify">Y ahora, que? Pues bueno, primero, toca solucionar el hecho que de acá a febrero (que acabe <a href="http://www.handbook.unsw.edu.au/postgraduate/courses/2008/FINS5513.html" target="_blank">el ultimo curso pendiente</a> y salga de Sydney) no hay como irse haciendo compromisos fuertes&#8230; en Australia, eso es.</p>
<p align="justify">Así mismo, <a href="http://www.techcrunch.com/2007/12/09/the-twice-shy-entrepreneur/" target="_blank">hoy vi un comentario que me llamo la atención</a>: Al parecer, no hubo mejor momento que este para acabar mi estudio y &#8220;atacar&#8221; el mercado que mas me llama la atención (aunque honestamente me hubiese gustado vivir el puntocom original). Resulta que cada ves hay mas gente como yo, con <a href="http://www.fayerwayer.com/2007/11/carta-al-lector-de-fayerwayer/" target="_blank">metas similares</a> y atrapados por <a href="http://www.blog.yami.cl/2007/09/14/google-maps-para-santiago-de-chile/" target="_blank">proyectos de calibre similar</a>. Bajo su análisis, <a href="http://www.techcrunch.com/about-michael-arrington/" target="_blank">Michael Arrington</a>, de fama en <a href="http://www.techcrunch.com" target="_blank">Techcrunch.com</a>, encuentra que cada ves hay mas jóvenes que no se toparon con &#8220;la burbuja&#8221;, y hoy día representan lo que es la <a href="http://youtube.com/watch?v=fi4fzvQ6I-o" target="_blank">oleada web2</a>. Dice el, en su análisis, que esto no es cosa de tener memoria corta sino de el estar viviendo crecimiento real, y de hecho, que los veteranos de la oleada original son el &#8220;freno de mano&#8221; a la inversión fuerte de hoy!</p>
<p align="justify">Por ahora, aunque este sea lento, parece que ya mismo hay oportunidades por perseguir y cosas <em>meaningful </em>por hacer. Que dice esto por mi? ni modo saber, todavía&#8230; supongo.</p>
<p align="justify">&#8230; 3 semanas! <em>Ya</em>?</p>
]]></content:encoded>
			<wfw:commentRss>http://mauriciopastrana.com/personal/21-dias-down/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
