<?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; how to</title>
	<atom:link href="http://www.nerdsopolis.net/wp/tag/how-to/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>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>
		<item>
		<title>Spostare db mysql senza dump</title>
		<link>http://www.nerdsopolis.net/wp/2009/01/09/spostare-db-mysql-senza-dump/</link>
		<comments>http://www.nerdsopolis.net/wp/2009/01/09/spostare-db-mysql-senza-dump/#comments</comments>
		<pubDate>Fri, 09 Jan 2009 08:59:29 +0000</pubDate>
		<dc:creator>fry</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[guide tecniche]]></category>
		<category><![CDATA[how to]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[ripristino]]></category>

		<guid isPermaLink="false">http://nerdsopolis.wordpress.com/?p=1205</guid>
		<description><![CDATA[Mi sono trovato nella condizione di dover ripristinare una serie di database mysql da un server completamente rotto ad uno nuovo. Per completamente rotto intendo che non si accendeva proprio più.. ma per fortuna l&#8217;harddisk era ancora perfettamente funzionante. Naturalmente il dump più recente che avevo fatto risaliva al 1980.. L&#8217;operazione di spostamento del db [...]]]></description>
			<content:encoded><![CDATA[<p>Mi sono trovato nella condizione di dover ripristinare una serie di database mysql da un server completamente rotto ad uno nuovo. Per completamente rotto intendo che non si accendeva proprio più.. ma per fortuna l&#8217;harddisk era ancora <strong>perfettamente funzionante</strong>.</p>
<p>Naturalmente il dump più recente che avevo fatto risaliva al 1980..</p>
<p><span id="more-1205"></span>L&#8217;operazione di spostamento del db <strong>è comunque estremamamente facile</strong>: tutti i db e le tabelle sono in realtà memorizzati in directory e files.</p>
<p>Ecco come fare:</p>
<ol>
<li>cp -R backup/var/lib/mysql/miodb /var/lib/mysql/</li>
<li>cd /var/lib/mysql</li>
<li>chown -R mysql.mysql miodb/</li>
</ol>
<p>Nota bene:</p>
<ul>
<li>Il percorso dove mysql mette i propri files potrebbe essere diverso a seconda della distribuzione</li>
<li>Io ho precedentemente montato il vecchio harddisk nella cartella /backup</li>
<li>Ho spostato solo la cartella &#8220;miodb&#8221; e tutto il suo contenuto, attenzione a non spostare i files nella radice principale di mysql perchè potrebbero creare dei conflitti con quelli nuovi.</li>
<li>Cambiare i permessi SOLO alla cartella che si è copiato. Per motivi di sicurezza le altre cartelle devono rimanere intatte.</li>
</ul>
<p>Fatto. Ora aprendo phpmyadmin il buon vecchio database è al suo posto sano e salvo!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nerdsopolis.net/wp/2009/01/09/spostare-db-mysql-senza-dump/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

