<?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>pseudotecnico:blog &#187; python</title>
	<atom:link href="http://www.pseudotecnico.org/blog/category/python/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.pseudotecnico.org/blog</link>
	<description>gli omini del computer domineranno il mondo</description>
	<lastBuildDate>Sun, 22 Jan 2012 13:22:05 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>La genesi della Twittersfera</title>
		<link>http://www.pseudotecnico.org/blog/2007/05/23/la-genesi-della-twittersfera/</link>
		<comments>http://www.pseudotecnico.org/blog/2007/05/23/la-genesi-della-twittersfera/#comments</comments>
		<pubDate>Wed, 23 May 2007 04:00:58 +0000</pubDate>
		<dc:creator>pseudotecnico</dc:creator>
				<category><![CDATA[python]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://www.pseudotecnico.org/blog/2007/05/23/la-genesi-della-twittersfera/</guid>
		<description><![CDATA[Come richiesto espressamente da Maurizio, in questo post vi spiegherò con dovizia di particolari come ho ottenuto l&#8217;immagine presente in questo post L&#8217;idea L&#8217;idea di base è semplice: realizzare un&#8217;immagine in grado di rappresentare le relazioni che collegano i miei amici (friends) in Twitter e gli &#8220;amici degli amici&#8221;, in pratica due livelli di twitter-relazioni [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>Come <a href="http://www.pseudotecnico.org/blog/2007/05/21/gli-amici-degli-amici-twittersfera/#comment-32994">richiesto espressamente</a> da Maurizio, in questo post vi spiegherò con dovizia di particolari come ho ottenuto l&#8217;immagine presente in <a href="http://www.pseudotecnico.org/blog/2007/05/21/gli-amici-degli-amici-twittersfera/">questo post</a> <img src='http://www.pseudotecnico.org/blog/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley colorbox-835' /> </p>
<p><strong>L&#8217;idea</strong></p>
<p>L&#8217;idea di base è semplice: realizzare un&#8217;immagine in grado di rappresentare le relazioni che collegano i miei amici (friends) in Twitter e gli &#8220;amici degli amici&#8221;, in pratica due livelli di twitter-relazioni a partire dal sottoscritto.</p>
<p>Doverosa premessa: non sono un programmatore, queste sono le prime righe che scrivo in <a href="http://www.python.org/">Python</a> e non ho mai frequentato i grafi in vita mia <img src='http://www.pseudotecnico.org/blog/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley colorbox-835' /> </p>
<p><strong>Python</strong></p>
<p>Ecco un elenco dei software indispensabili (nel mio caso il tutto è stato realizzato su Mac Os X):</p>
<ul>
<li><a href="http://www.python.org/download/">Python</a>: l&#8217;ultima versione è la 2.5.1, per Mac Os X è disponibile un comodo installer</li>
<li><a href="http://www.python.org/pypi/setuptools">Setuptools </a></li>
<li><a href="http://code.google.com/p/python-twitter/">Python Twitter</a> comprensivo di semplici istruzioni di installazione<a href="http://code.google.com/p/python-twitter/"><br />
</a></li>
</ul>
<p><strong>Generazione del file .dot</strong></p>
<p>Per la generazione del file .dot ho scritto qualche riga di codice in Python (è la volta buona che mi costringo ad impararlo&#8230;).</p>
<pre lang="python">
#!/usr/bin/python

import twitter, simplejson, time
class ApiEstesa (twitter.Api):
  ''' Estende Api per recuperare i friends di un user diverso dal proprio '''

  def __init__(self):
      twitter.Api.__init__(self)

  def GetAnotherOneFriends(self, username, password, identificativo):
      url = 'http://twitter.com/statuses/friends/'+str(identificativo)+'.json'
      json = self._FetchUrl(url, username=username, password=password)
      data = simplejson.loads(json)
      return [twitter.User.NewFromJsonDict(x) for x in data]

def aggiungi_soggetti (utenti, relazioni, id):
  '''Aggiunge gli id dei friends dell'utente con identificativo ID al dizionario id_soggetti'''

  try:
    friends = api.GetAnotherOneFriends(user, password, id)
  except:
    print 'Errore nel recupero dei dati da Twitter: attendo 10 secondi e riprovo'
    time.sleep(10)
    friends = api.GetAnotherOneFriends(user, password, id)

  for friend in friends:
    utenti.setdefault(friend.id, friend.screen_name)
    relazioni.append('  '+str(id)+' -- '+str(friend.id)+'n')

api = ApiEstesa()

user = 'vostro_user'
password= 'vostra_password'
identificativo = 'vostro_id'
screen_name = 'vostro_nome_visualizzato'

# Recupero i friends del soggetto principale
friends = api.GetFriends(user, password)

# Uso un dizionario per evitare la duplicazione degli utenti; aggiungo subito il soggetto principale
id_utenti = {}
id_utenti.setdefault(identificativo, screen_name)
relazioni = []

for friend in friends:
    # Aggiungo i friends del soggetto principale al dizionario id_utenti
    id_utenti.setdefault(friend.id, friend.screen_name)
    # Aggiungo le relazioni del soggetto principale
    relazioni.append('  '+identificativo+' -- '+str(friend.id)+'n')
    # Aggiungo i friends e le relazioni del friend che sto controllando
    aggiungi_soggetti(id_utenti, relazioni, friend.id)
    print 'Aggiungo soggetto e relazioni di '+friend.screen_name

lista_utenti = id_utenti.items() # Trasformo il dizionario in una lista
inizio_file = '''graph relazioni_twitter {
  graph [bgcolor=black, overlap="scale", ratio="auto"];
  node [fontcolor="white", fontsize="10", shape="circle", color="antiquewhite"];
  edge [color="gold1"];n'''

f = open('grafico_prova.dot','w')

# Scrivo su file la parte iniziale del grafo
f.writelines(inizio_file)

# Scrivo la label del nodo root (soggetto principale)
f.writelines('  %s [label="%s", root="1", fontcolor="red",shape="circle"];n' % (identificativo, screen_name))

# Scrivo su file tutti i soggetti raccolti in lista_utenti
print '%s nodi, %s relazioni' % (str(len(lista_utenti)),str(len(relazioni)))

for utente in lista_utenti:
  f.write('  %s [label="%s"];n' % utente)

f.writelines('n')

for relazione in relazioni:
  f.write(relazione)

f.writelines('}n')
f.close()</pre>
<p>Primo problema: per qualche strano motivo il modulo per Twitter non prevede una funzione per leggere i friends di un utente diverso dal proprio, funzionalità prevista dalle API di Twitter. A questo punto è stato necessario estendere la classe originaria con una nuova funzione: <em>getAnotherOneFriends</em>.</p>
<p>Descrizione del codice (<a href="http://www.pseudotecnico.org/blog/wp-content/uploads/2007/05/twittersfera_py.txt">qui</a> lo potete scaricare come file di testo):</p>
<ul>
<li>creo delle variabili con il mio <em>identificativo</em>, il mio <em>user</em>, la mia <em>password</em> e il mio <em>screen_name</em> (nome visualizzato)<em><br />
</em></li>
<li>ottengo una lista dei miei friends (<em>friends</em>)</li>
<li>scorro la lista: ogni friend viene aggiunto al dizionario <em>id_utenti</em> e, tramite la funzione <em>aggiungi_soggetti</em>, aggiungo i suoi  friends al dizionario e le relazioni alla lista omonima</li>
<li>alla fine non resta che scrivere su file l&#8217;elenco dei nodi e le relazioni (<a href="http://www.pseudotecnico.org/blog/wp-content/uploads/2007/05/filedot.txt">questo</a> è file .dot generato)</li>
</ul>
<p>L&#8217;algoritmo è volutamente semplice: così come è strutturato, ad esempio, non sarebbe in grado di rilevare delle relazioni di terzo grado senza generare una marea di ripetizioni inutili. Il <em>time.sleep(10) </em>serve ad evitare che un down di Twitter (già verificatosi 3 volte stasera) blocchi completamente la generazione <img src='http://www.pseudotecnico.org/blog/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley colorbox-835' /> </p>
<p>Appena ho un attimo di tempo conto di ristrutturare il codice in modo da permettere di analizzare le relazioni per n-livelli (anche se in quel caso il problema sarà il grafo&#8230;)</p>
<p><strong>Generazione del grafo </strong></p>
<p>Questa è la parte più complicata e, al momento, parzialmente irrisolta. Per Mac Os X esiste un <a href="http://www.pixelglow.com/graphviz/">ottimo software</a> che però è vecchio e non più supportato (il che significa, tra le altre cose, che funziona in emulazione con Rosetta sul mio iMac Core 2 Duo). Sullo schermo riuscivo chiaramente a leggere i nomi sui nodi, nell&#8217;esportazione in png il file è stato ridimensionato drasticamente rendendo i nomi invisibili. Per generare l&#8217;immagine ho comunque utilizzato PixelGlow con l&#8217;impostazione Energy Minimized.</p>
<p>Al momento sto provando a ricreare un grafico usando <strong>neato</strong> e <strong>twopi</strong> da linea di comando ma incontro qualche problema: segmentation fault ed errori simili, che elimino solo impostando delle dimensioni inferiori per il grafo, peccato solo che rendano i nodi incomprensibili.</p>
<p>In queste ore sto anche provando a generare il grafo sul PowerBook G4 con PixelGlo; stamattina sul P4 3.0Ghz in ufficio (Windows XP) sono arrivato ad occupazioni di memoria di 3GB senza ottenere grandi risultati.</p>
<p><strong>Domande in sospeso</strong></p>
<ol>
<li>Avete suggerimenti per la realizzazione del grafo? Sbaglio qualcosa nella sintassi del file .dot?</li>
<li>Python: qualcuno è in grado di spiegarmi perché, pur utilizzando un dizionario e setdefault, mi ritrovo un nodo (quindi una chiave) ripetuto per ben 3 volte? Il nodo incriminato è quello del soggetto principale.</li>
</ol>
<div class="tag_technorati">Tag Technorati: <a href="http://technorati.com/tag/graphviz" rel="tag">graphviz</a>, <a href="http://technorati.com/tag/twittersfera" rel="tag"> twittersfera</a>, <a href="http://technorati.com/tag/python" rel="tag"> python</a></div>
<div class="shr-publisher-835"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div class='shareaholic-like-buttonset' style='float:right;height:30px;'><a class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fwww.pseudotecnico.org%2Fblog%2F2007%2F05%2F23%2Fla-genesi-della-twittersfera%2F' data-shr_title='La+genesi+della+Twittersfera'></a></div><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><!-- End Shareaholic LikeButtonSetBottom Automatic --><img class="colorbox-835"  src="http://www.pseudotecnico.org/blog/?ak_action=api_record_view&id=835&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.pseudotecnico.org/blog/2007/05/23/la-genesi-della-twittersfera/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Gli amici degli amici (TwitterSfera)</title>
		<link>http://www.pseudotecnico.org/blog/2007/05/21/gli-amici-degli-amici-twittersfera/</link>
		<comments>http://www.pseudotecnico.org/blog/2007/05/21/gli-amici-degli-amici-twittersfera/#comments</comments>
		<pubDate>Mon, 21 May 2007 09:07:18 +0000</pubDate>
		<dc:creator>pseudotecnico</dc:creator>
				<category><![CDATA[python]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://www.pseudotecnico.org/blog/2007/05/21/gli-amici-degli-amici-twittersfera/</guid>
		<description><![CDATA[Da sabato scorso sto facendo qualche prova con Python, le API di Twitter e GraphViz: per il momento sono riuscito ad ottenere un&#8217;immagine, incomprensibile ma affascinante L&#8217;idea di fondo è semplice: rappresentare i miei amici (friends) e gli amici dei miei amici (amici di 2° grado). Sembrano pochi dati, in realtà siamo già ad un [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>Da sabato scorso sto facendo qualche prova con <a href="http://www.python.org/">Python</a>, le API di <a href="http://twitter.com">Twitter</a> e <a href="http://www.graphviz.org/">GraphViz</a>: per il momento sono riuscito ad ottenere un&#8217;immagine, incomprensibile ma affascinante <img src='http://www.pseudotecnico.org/blog/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley colorbox-834' /> </p>
<p>L&#8217;idea di fondo è semplice: rappresentare i miei amici (friends) e gli amici dei miei amici (amici di 2° grado). Sembrano pochi dati, in realtà siamo già ad un file di testo di 8160 righe.</p>
<p>Ecco il risultato:</p>
<p style="text-align: center"><a href="http://www.flickr.com/photos/flod/507408956/" title="Photo Sharing"><img src="http://farm1.static.flickr.com/222/507408956_d95c1e425e.jpg" class="immaginepost colorbox-834" alt="Gli amici degli amici (TwitterSfera)" height="468" width="500" /></a></p>
<p>L&#8217;utente in fondo a destra che genera una raggiera di relazioni è TheMacPack <img src='http://www.pseudotecnico.org/blog/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley colorbox-834' /> </p>
<div class="tag_technorati">Tag Technorati: <a href="http://technorati.com/tag/Twitter" rel="tag">Twitter</a>, <a href="http://technorati.com/tag/TwitterSfera" rel="tag"> TwitterSfera</a></div>
<div class="shr-publisher-834"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div class='shareaholic-like-buttonset' style='float:right;height:30px;'><a class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fwww.pseudotecnico.org%2Fblog%2F2007%2F05%2F21%2Fgli-amici-degli-amici-twittersfera%2F' data-shr_title='Gli+amici+degli+amici+%28TwitterSfera%29'></a></div><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><!-- End Shareaholic LikeButtonSetBottom Automatic --><img class="colorbox-834"  src="http://www.pseudotecnico.org/blog/?ak_action=api_record_view&id=834&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.pseudotecnico.org/blog/2007/05/21/gli-amici-degli-amici-twittersfera/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
	</channel>
</rss>

