<?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>Nerdsopolis &#187; python</title>
	<atom:link href="http://www.nerdsopolis.net/wp/tag/python/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.nerdsopolis.net/wp</link>
	<description>Klaatu barada nikto!</description>
	<lastBuildDate>Wed, 18 Jan 2012 11:14:49 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.4</generator>
		<item>
		<title>Una volta ogni 823 anni, sbufalata con Python</title>
		<link>http://www.nerdsopolis.net/wp/2010/09/02/una-volta-ogni-823-anni-sbufalata-con-python/</link>
		<comments>http://www.nerdsopolis.net/wp/2010/09/02/una-volta-ogni-823-anni-sbufalata-con-python/#comments</comments>
		<pubDate>Thu, 02 Sep 2010 17:48:52 +0000</pubDate>
		<dc:creator>Pongi</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[bufale]]></category>
		<category><![CDATA[fengshui]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://www.nerdsopolis.net/wp/?p=2334</guid>
		<description><![CDATA[Qualche giorno fa mi arriva questo sms, da un numero a me sconosciuto: In Agosto 2010 ci sn 5 domeniche, 5 lunedì e 5 martedì. Ciò accade ogni 823 anni, il fengshui cinese, dice ke se lo fai presente a 8 persone, avrai molti soldi. Non so voi, ma a me queste catene smuovono il [...]]]></description>
			<content:encoded><![CDATA[<p>Qualche giorno fa mi arriva questo sms, da un numero a me sconosciuto:</p>
<blockquote>
<div id="_mcePaste">In Agosto 2010 ci sn 5</div>
<div id="_mcePaste">domeniche, 5 lunedì e 5</div>
<div id="_mcePaste">martedì. Ciò accade ogni</div>
<div id="_mcePaste">823 anni, il fengshui</div>
<div id="_mcePaste">cinese, dice ke se lo fai</div>
<div id="_mcePaste">presente a 8 persone,</div>
<div id="_mcePaste">avrai molti soldi.</div>
</blockquote>
<p>Non so voi, ma a me queste catene smuovono il sistema nervoso: chi è il deficiente che perde tempo a far perder tempo altra gente? A mandare questi sms si fa la fortuna e i soldi solo delle compagnie telefoniche, mi pare evidente. Il mio cervello ha etichettato il pensiero come spam e l&#8217;ho archiviato.Tuttavia durante la giornata ho ripensato a questo messaggio, chiedendomi se fosse vero che questa combinazione non succede da 823 anni.</p>
<p>E&#8217; possibile? A occhio e croce mi sembrava una bufala, e non avevo torto: volevo la prova scientifica.</p>
<p><span id="more-2334"></span></p>
<p>Avrei potuto scorrere una qualsiasi applicazione di calendario alla ricerca di questi agosto portafortuna, ma sarebbe stata un lavoro inutile, così la risposta mi si è palesata in breve. Uno script Python, no?</p>
<pre class="brush:python">from datetime import datetime, timedelta

risultato = []
anno = 2010
mese = 8
ungiorno = timedelta(days=1)

while anno != 2010 - 823:
	dom = lun = mar = 0
	giorno = datetime(anno, mese, 1)
	while giorno.month == 8:
		if giorno.weekday() == 6: # domenica
			dom += 1
		elif giorno.weekday() == 0: # lunedi
			lun += 1
		elif giorno.weekday() == 1: # martedi
			mar += 1
		giorno = giorno + ungiorno

	if dom == lun == mar == 5:
		risultato.append(giorno.year)

	anno = anno - 1	

print risultato, len(risultato)</pre>
<p>Il risultato è che tra il 2010 e 823 anni fa, un agosto così si è già visto 116 volte. L&#8217;ultima volta? Nel 2004.</p>
<blockquote><p>Falso! Nell&#8217;agosto 2004 ci sono state 5 domeniche, 5 lunedì e 5 martedì. Negli ultimi 823 anni è successo 116 volte. Piantala con questi sms idioti.</p></blockquote>
<p>Sono stato cattivo? Troppo cattivo? Scrivete uno script Python per dimostrarlo.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nerdsopolis.net/wp/2010/09/02/una-volta-ogni-823-anni-sbufalata-con-python/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Numeri binari e digitali</title>
		<link>http://www.nerdsopolis.net/wp/2009/10/01/numeri-binari-e-digitali/</link>
		<comments>http://www.nerdsopolis.net/wp/2009/10/01/numeri-binari-e-digitali/#comments</comments>
		<pubDate>Thu, 01 Oct 2009 21:00:51 +0000</pubDate>
		<dc:creator>Pongi</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[cosa non fare]]></category>
		<category><![CDATA[how not to]]></category>
		<category><![CDATA[how to]]></category>
		<category><![CDATA[introduzione]]></category>
		<category><![CDATA[numeri binari]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://nerdsopolis.wordpress.com/?p=1936</guid>
		<description><![CDATA[Riprendo la mia rubrica sulla programmazione sul mio amato linguaggio di programmazione Python. Prendete questo articolo come un piccolo tutorial al contrario, ovvero come non programmare in Python; sbatterete la testa contro costrutti illogici, impossibili e controproducenti, ma alla fine ne uscirete rinati in finissimi programmatori. Non posso. Non ce la faccio. Non posso crederci. [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_1949" class="wp-caption alignleft" style="width: 250px"><em><a href="http://nerdsopolis.files.wordpress.com/2009/06/python2-web.png"><img class="size-full wp-image-1949" title="Python" src="http://nerdsopolis.files.wordpress.com/2009/06/python2-web.png" alt="Python" width="240" height="240" /></a></em><p class="wp-caption-text">Python</p></div>
<p><em>Riprendo la mia rubrica sulla programmazione sul mio amato linguaggio di programmazione Python. Prendete questo articolo come un piccolo tutorial al contrario, ovvero <strong>come non programmare</strong> in Python; sbatterete la testa contro costrutti illogici, impossibili e controproducenti, ma alla fine ne uscirete rinati in finissimi programmatori</em>.</p>
<p>Non posso. Non ce la faccio. Non posso crederci. Ho riguardato tante volte il codice, ma mi stupisco a ogni passaggio. Sarà stato intenzionale oppure è opera di un <em>troll</em>, un utente che vuole fare scherzi? In ciascun caso si tratterrebbe di estrema malvagità oppure di estrema stupidità. E non riesco a credere né all&#8217;una né all&#8217;altra. Su ActiveState Code è stato rinvenuto un frammento di codice la cui didascalia recita:</p>
<blockquote><p>This is a python program that can convert bianry number( binary is a language that computers use to comunicate with other) to a normal digital number and the other way around.</p>
<p><em>Questo è un programma python che converte i numeri binari (il binario è un linguaggio che i computer usano per comunicare con altro) in un normale numero digitale e il contrario.</em></p></blockquote>
<p>La prima domanda sorge spontanea: cosa sono i numeri digitali?</p>
<p><span id="more-1936"></span>E&#8217; già chiaro che l&#8217;autore (o chi impersona tale essere) non ha capito niente: i numeri in base 2 sono i numeri binari, ma i numeri in base 10, normalmente usati dagli esseri umani, si chiamano numeri <strong>decimali, non numeri digitali.</strong><em> </em>Questa definizione ha scatenato in me un gusto grottesco di irrisione nei confronti dell&#8217;autore, che ho soddisfatto leggendo a fondo tutto il codice che ha scritto. Ho poi tramutato questa sensazione in qualcosa di buono: scrivere una sorta di tutorial su <strong>come non scrivere</strong> in Python. Un <strong>HOW NOT TO.</strong> Per godere della seguente lettura è bene conoscere un po&#8217; di programmazione, anche se forse basta solo la curiosità.</p>
<p>Per chi dunque non avesse mai visto un programma Python gli basti sapere questo: i blocchi non sono delimitati da parentesi graffe o altro, ma sono semplicemente indentati, e le funzioni vengono definite con il costrutto <strong>def </strong><em><strong>nomefunzione</strong></em><strong>(<em>parametri</em>):</strong>.</p>
<pre class="brush:python">def mainmenu():
    while True:
        os.system('cls')
        menu = """What du you want to do?

1) Convert digital to binary
2) Convert binary to digital
3) Credits
4) Exit

pick choice [1-4] : """
        choice = raw_input(menu)
        if choice == "1":
            digitalToBinary()
        if choice == "2":
            binaryToDigital()
        if choice == "3":
            credit()
        if choice == "4":
            sys(exit)
mainmenu()</pre>
<p>Questa è la prima funzione chiamata, che si mette in un ciclo infinito (while True) in attesa di input dall&#8217;utente (raw_input). Non è il massimo, ma siamo ancora nella norma. Un grave errore è invece &#8220;os.system(&#8216;cls&#8217;)&#8221;: questa è una chiamata diretta alla shell di sistema con un comando (cls) tipicamente Windows. Eseguendo questo script su Linux o Os X abbiamo già un grosso problema.</p>
<p>Va bene, diciamo che vogliamo &#8220;56&#8243;, convertire un numero da decimale a binario.</p>
<pre class="brush:python">def binaryToDigital():
    os.system('cls')
    while True:
        print "To go back to the main menu type 'e' and press enter"
        print
        print """Binary numbers consist of only '1's and '0's
        """
        binary = raw_input('Type in the binary number: ')
        if binary == "e":
            mainmenu()
        else:
            binarylist = list(binary)
            no = len(binarylist)
            no = no -1
            diginum = 0
            i = 0
            while no &gt; -1:
                if binarylist[no] == '1':
                    kj = 2**i
                    diginum = diginum + kj
                no = no -1
                i = i +1
            print diginum
            raw_input()</pre>
<p>Alla riga 12 prende il numero inserito (che viene passato da raw_input come stringa) e lo trasforma in lista. <strong>Errore! Le stringhe sono già iterabili, cioè le posso scorrere e posso indicizzarle direttamente con la sintassi [indice].</strong> Poi legge la lunghezza di questa lista, e successivamente toglie uno. Poi apre un contatore (i) e il numero che poi restituirà. Parliamo della riga 17: non poteva fare direttamente così?</p>
<pre class="brush:python">while len(binary) &gt; 0:</pre>
<p>Ma andiamo avanti: siamo al ciclo while, quello che scorre le cifre del numero che hai inserito, da sinistra verso destra. E qui c&#8217;è il colpo di genio: solo se la cifra è uguale a 1 (r.18), somma a diginum (r.20) 2 elevato alla i (r.19). Ho fatto prima a scriverlo io a parole che lui a scriverlo in python! Se proprio proprio io avrei fatto:</p>
<pre class="brush:python">if binarylist[no] == "1":
    diginum += 2**i</pre>
<p>Ma tutto il ciclo avrebbe potuto essere:</p>
<pre class="brush:python">diginum = sum(2**i for i, c in enumerate(binary.reverse()) if c == "1")</pre>
<p>Ovvero: prendi binary (che è una stringa), la giri (reverse), la scorri (enumerate) prendendo l&#8217;indice (i) e la cifra (c). Se questa non è &#8220;1&#8243;, fai due alla i. Questa cosa, dentro a sum, è una espressione che crea (in sostanza) una lista di numeri. Questa viene sommata (sum) e attribuita infine a diginum.</p>
<p>Ora che avete circa capito come funziona python, e come NON usarlo, fatevi un giro sulla <em>recipe</em> originale:</p>
<p><a href="http://code.activestate.com/recipes/496778/">http://code.activestate.com/recipes/496778/</a></p>
<p>E guardate queste righe (nell&#8217;originale 54:57):</p>
<pre class="brush:python">                    if bx == '0' or bx == '2' or bx == '4' or bx == '6' or bx == '8':
                        binarynum.append('0')
                    if bx == '1' or bx == '3' or bx == '5' or bx == '7' or bx == '9':
                        binarynum.append('1')</pre>
<p>Avete capito bene: è un controllo per vedere se un numero è pari o dispari.  Anzi: sono due controlli. il primo per vedere se è pari. Il secondo per controllare, comunque, che sia dispari.</p>
<p>Se proprio volessi controllare se un carattere fa parte di una lista posso usare l&#8217;operatore &#8220;in&#8221;, e soprattutto mi basterebbe fare un semplice else per il caso contrario:</p>
<pre class="brush:python">if bx in ('0','2','4','6','8'):
    binarynum.append('0')
else:
    binarynum.append('0')</pre>
<p>Ma poi, che diamine, è questo il modo per controllare se un numero è pari?? Ovviamente no!</p>
<pre class="brush:python">if int(bx) % 2 == 0:
    binarynum.append('0')
else:
    binarynum.append('0')</pre>
<p>Ora che abbiamo scorso questo codice potete capire come io non possa credere né alla teoria della stupidità né in quella della malvagità; in compenso avrete sicuramente condiviso con me la totale bellezza del python! Infine, vi lascio con una versione un po&#8217; più ristretta dello stesso programma qui sopra:</p>
<pre class="brush:python"># da binario a decimale
int("101",2)</pre>
<p>oppure</p>
<pre class="brush:python"># da decimale a binario
bin(5)</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.nerdsopolis.net/wp/2009/10/01/numeri-binari-e-digitali/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

