<?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>Just another blog &#187; python</title> <atom:link href="http://www.mcalamelli.net/category/python/feed/" rel="self" type="application/rss+xml" /><link>http://www.mcalamelli.net</link> <description>Just another blog... si, lo tengo così</description> <lastBuildDate>Mon, 06 Feb 2012 00:22:58 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=3.3.1</generator> <atom:link rel='hub' href='http://www.mcalamelli.net/?pushpress=hub'/> <item><title>Project Euler, la nuova droga</title><link>http://www.mcalamelli.net/2009/05/29/project-euler-la-nuova-droga/</link> <comments>http://www.mcalamelli.net/2009/05/29/project-euler-la-nuova-droga/#comments</comments> <pubDate>Thu, 28 May 2009 22:42:26 +0000</pubDate> <dc:creator>mcalamelli</dc:creator> <category><![CDATA[python]]></category> <category><![CDATA[svago]]></category> <category><![CDATA[matematica]]></category> <category><![CDATA[projecteuler]]></category> <guid
isPermaLink="false">http://www.mcalamelli.net/?p=673</guid> <description><![CDATA[Ecco cosa accade quando alla passione per la programmazione si unisce la sfida per trovare una soluzione elettronica a quesiti di matematica. Accade che non si riesce più a smettere, e si entra nel tunnel del Progetto Eulero, liberamente tradotto in italiano. Project Euler è un sito, nato nel 2001, il cui obiettivo è quello [...]]]></description> <content:encoded><![CDATA[<p>Ecco cosa accade quando alla passione per la programmazione si unisce la sfida per trovare una soluzione <em>elettronica</em> a quesiti di matematica.<br
/> Accade che non si riesce più a smettere, e si entra nel tunnel del <a
href="http://projecteuler.net" target="_blank">Progetto Eulero</a>, liberamente tradotto in italiano.</p><p>Project Euler è un sito, nato nel 2001, il cui obiettivo è quello di proporre questiti matematici (più di 200, <strong>246</strong> per l&#8217;esattezza, e il 247imo è schedulato per venerdì 29 maggio 2009 alle 9.00 PM [GMT]) di diversa complessità, da quelli risolvibili con un foglio e una matita a quelli richiedenti un <strong>buon linguaggio</strong> di programmazione, un programmatore <strong>attento</strong> e una forte dose di <strong>ottimizzazione</strong>.</p><p>Già, perchè pur non essendoci un limite di tempo per la scrittura del programma, questo ultimo deve essere in grado di trovare la soluzione al problema nel tempo massimo di <strong>60 secondi</strong>! Questo vincolo richiede una particolare attenzione nella scrittura dell&#8217;algoritmo risolutivo, e spesso ci si rende conto che un approccio <em>brute-force</em> non è quello più efficace.</p><p>Ho cominciato a risolvere i quesiti da poco più di una settimana partendo dall&#8217;inizio, e ora sono alle prese con il dodicesimo:</p><div
class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table
cellspacing="0" cellpadding="0"><tbody><tr><td
style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br
/>2<br
/>3<br
/>4<br
/>5<br
/>6<br
/>7<br
/>8<br
/>9<br
/>10<br
/>11<br
/>12<br
/>13<br
/>14<br
/>15<br
/>16<br
/>17<br
/></div></td><td><div
class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&lt;p&gt;The sequence of triangle numbers is generated by adding the natural numbers. So the 7^(th) triangle number would be 1 + 2 + 3 + 4 + 5 + 6 + 7 = 28. The first ten terms would be:<br
/> <br
/> 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ...<br
/> <br
/> Let us list the factors of the first seven triangle numbers:<br
/> <br
/> 1: 1<br
/> 3: 1,3<br
/> 6: 1,2,3,6<br
/> 10: 1,2,5,10<br
/> 15: 1,3,5,15<br
/> 21: 1,3,7,21<br
/> 28: 1,2,4,7,14,28<br
/> <br
/> We can see that 28 is the first triangle number to have over five divisors.<br
/> <br
/> What is the value of the first triangle number to have over five hundred divisors?</div></td></tr></tbody></table></div><p>Come previsto e predetto, l&#8217;approccio a forza bruta non sta funzionando bene; considerando i numeri primi, e non i numeri triangolari come richiesto, il calcolo del numero di divisori di 70000000 (settanta milioni), il quale risulta averne 128, di divisori, richiede 56,5&#8243;.<br
/> Sono troppo vicino ai 60&#8243;, e troppo lontano dai 500 divisori richiesti.</p><p>A parte il piacere della programmazione e la soddisfazione per la scrittura di un algoritmo particolarmente efficiente, la risoluzione di alcuni problemi mi ha portato a qualche considerazione:</p><p>* il linguaggio Python è estremamente facile da utilizzare, e piuttosto efficiente;<br
/> * il linguaggio C è stramaledettamente veloce;<br
/> * purtroppo è passato troppo tempo dall&#8217;ultima volta che ho scritto del codice Assembler (dalle superiori) per paragonarlo al C;<br
/> * il decorator <a
href="http://en.wikipedia.org/wiki/Memoization" target="_blank">memoize</a> è una figata unica, trovo questo approccio semplicemente geniale;</p><p>Una ottima fonte di riferimento al progetto è <a
href="http://stacktrace.it" target="_blank">Stacktrace</a>: <a
href="http://stacktrace.it/2008/02/progetto-eulero-problema-15/" target="_blank">qui</a> e <a
href="http://stacktrace.it/2009/05/una-scatola-degli-attrezzi-euleriana/" target="_blank">qui</a> due post molto belli.</p><p>Che dire? Se c&#8217;è dell&#8217;interesse verso la programmazione e la matematica, il progetto è veramente interessante. Una unica annotazione, come tutte le droghe, CREA DIPENDENZA! Programmatore avvisato&#8230;</p><p>Alla prox</p><p>Technorati Tags: <a
href="http://technorati.com/tag/projecteuler" rel="tag">projecteuler</a>, <a
href="http://technorati.com/tag/python" rel="tag"> python</a>, <a
href="http://technorati.com/tag/ottimizzaizone" rel="tag"> ottimizzaizone</a>, <a
href="http://technorati.com/tag/algoritmi" rel="tag"> algoritmi</a></p> ]]></content:encoded> <wfw:commentRss>http://www.mcalamelli.net/2009/05/29/project-euler-la-nuova-droga/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Quando Subversion incontra lo sviluppo web</title><link>http://www.mcalamelli.net/2007/11/29/quando-subversion-incontra-lo-sviluppo-web/</link> <comments>http://www.mcalamelli.net/2007/11/29/quando-subversion-incontra-lo-sviluppo-web/#comments</comments> <pubDate>Thu, 29 Nov 2007 17:15:31 +0000</pubDate> <dc:creator>mcalamelli</dc:creator> <category><![CDATA[linux]]></category> <category><![CDATA[opensource]]></category> <category><![CDATA[php]]></category> <category><![CDATA[python]]></category> <category><![CDATA[post-commit hooks]]></category> <category><![CDATA[subversion]]></category> <category><![CDATA[web development]]></category> <guid
isPermaLink="false">http://mcalamelli.netsons.org/2007/11/29/quando-subversion-incontra-lo-sviluppo-web/</guid> <description><![CDATA[Dopo un lungo periodo di gestazione, finalmente e&#8217; venuto alla luce questo post, che personalmente reputo molto interessante (ma va??). Come introdotto dal titolo, espongo uno scenario di uso che mostra come poter integrare Subversion con lo sviluppo e il mantenimento della nostra web application. Nel dettaglio, con web application intendo un applicativo PHP installato [...]]]></description> <content:encoded><![CDATA[<p>Dopo un lungo periodo di gestazione, finalmente e&#8217; venuto alla luce questo post, che personalmente reputo molto interessante (ma va??).<br
/> Come introdotto dal titolo, espongo uno scenario di uso che mostra come poter integrare Subversion con lo sviluppo e il mantenimento della nostra web application. Nel dettaglio, con web application intendo un applicativo PHP installato in diversi server di produzione: quindi, un punto di sviluppo, tanti punti di utilizzo.<br
/> Bene, ipotizziamo ora il workflow per l&#8217;installazione per un nuovo cliente: connessione remota verso il server, quindi decompressione (se abbiamo una tarball o un archivio compresso) oppure copia (nel caso di singoli files), niente di trascendentale, quindi; il discorso si complica nel caso in cui ci accorgiamo che il nostro prodotto contiene un bug, oppure se abbiamo apportato modifiche interessanti allo stesso, e in questo caso dobbiamo operare a mano nelle n installazioni, con il rischio di sbagliare/dimenticarsi qualcosa.<br
/> E&#8217; qui che Subversion viene in nostro aiuto per realizzare una specie di sistema di installazione/aggiornamento automatizzata di tipo &#8220;push&#8221; (spero che il termine sia giusto).</p><p><span
id="more-120"></span></p><p>Prerequisiti:<br
/> 0) un server con il client Subversion installato ed utilizzabile dall&#8217;utente di Apache, nel mio caso www-data;<br
/> 1) un repository Subversion raggiungibile dal server;<br
/> 2) un linguaggio di scripting presente nel repository, utilizzabile per scrivere il post-commit hook, nel mio esempio Python;</p><p>Semplificazioni:<br
/> 0) il repository risiede nel mio PC, e ci accedo tramite il protocollo file://;<br
/> 1) i server remoti, nel dettaglio tre, sono rappresentati da tre diverse directory nella DocumentRoot di Apache;</p><p>Ecco una piccola descrizione di cio&#8217; che ho realizzato e di quello che vedrete negli snippets successivi.<br
/> Io ho sviluppato una web application general purpose, molto flessibile e adattabile a molti clienti, ed essendo un bravo programmatore utilizzo gia&#8217; subversion per mantenere i miei sorgenti. Aggiungo quindi una specie di installer per l&#8217;applicazione, in pratica una pagina PHP che invoca il checkout del progetto dal repository principale.</p><p>Ecco il codice dell&#8217;installer.</p><ol
class="codelist"><li
class="tab0 odd"><code>&lt;HTML&gt;</code></li><li
class="tab0 even"><code>&lt;HEAD&gt;</code></li><li
class="tab0 odd"><code>&lt;TITLE&gt;Redirect...&lt;/TITLE&gt;</code></li><li
class="tab0 even"><code>&lt;META HTTP-EQUIV=&quot;REFRESH&quot; CONTENT=&quot;0; URL=http://www.netsons.com/errore-404.html&quot;&gt;</code></li><li
class="tab0 odd"><code>&lt;/HEAD&gt;</code></li><li
class="tab0 even"><code>&lt;BODY&gt;</code></li><li
class="tab0 odd"><code>&lt;/BODY&gt;</code></li><li
class="tab0 even"><code>&lt;/HTML&gt;</code></li></ol><p>Che cosa succede quando invochiamo l&#8217;esecuzione dell&#8217;installer (preventivamente copiato nel server)?<br
/> Il client svn sl server preleva il progetto dal repository e crea, con i giusti permessi (quelli del webserver), la copia locale dei files.</p><p>Cominciamo con gli snippets!</p><p>Ecco il contenuto della directory che ospita il progetto iniziale della web application</p><pre style="color:Grey;font-size:12px;">
massi@aspire:~$ cd Projects/svnwebapp/
massi@aspire:~/Projects/svnwebapp$ ls -l
totale 8
-rw-r--r-- 1 massi massi 104 2007-11-11 22:35 index.php
-rw-r--r-- 1 massi massi  30 2007-11-02 06:48 updater.php
massi@aspire:~/Projects/svnwebapp$
</pre><p>Creiamo ora il repository svn</p><pre style="color:Grey;font-size:12px;">
massi@aspire:~$ svnadmin create /home/massi/svn/svnwebapp
massi@aspire:~$
</pre><p>Effettuiamo ora l&#8217;import della web application nel repository appena creato</p><pre style="color:Grey;font-size:12px;">
massi@aspire:~$ cd Projects/
massi@aspire:~/Projects$ svn import -m "Import iniziale" svnwebapp file:///home/massi/svn/svnwebapp
Aggiungo       svnwebapp/updater.php
Aggiungo       svnwebapp/index.php
Commit della Revisione 1 eseguito.
massi@aspire:~/Projects$
</pre><p>Ora ci spostiamo nella root del nostro webserver locale, ed eseguiamo il checkout del progetto per continuare a svilupparlo, sotto svn.</p><pre style="color:Grey;font-size:12px;">
massi@aspire:~$ cd /var/www/
massi@aspire:/var/www$ sudo svn co file:///home/massi/svn/svnwebapp
A    svnwebapp/updater.php
A    svnwebapp/index.php
Estratta revisione 1.
massi@aspire:/var/www$
</pre><p>Guardiamo cosa e&#8217; successo in /var/www</p><pre style="color:Grey;font-size:12px;">
massi@aspire:~$ ls /var/www/svnwebapp/
index.php  updater.php
massi@aspire:~$
</pre><p>Bene, la directory e&#8217; stata creata, cosi&#8217; come i files della web application.<br
/> Ora eseguiamola!</p><pre style="color:Grey;font-size:12px;">
massi@aspire:~$ lynx --source http://localhost/svnwebapp
&lt;html&gt;
&lt;head&gt;
&lt;/head&gt;
&lt;body&gt;
Versione PHP installata: 5.2.3-1ubuntu6
&lt;/body&gt;
&lt;/html&gt;
massi@aspire:~$
</pre><p>Per curiosita&#8217; diamo una occhiata a questo complicatissimo script (index.php).</p><ol
class="codelist"><li
class="tab0 odd"><code>&lt;HTML&gt;</code></li><li
class="tab0 even"><code>&lt;HEAD&gt;</code></li><li
class="tab0 odd"><code>&lt;TITLE&gt;Redirect...&lt;/TITLE&gt;</code></li><li
class="tab0 even"><code>&lt;META HTTP-EQUIV=&quot;REFRESH&quot; CONTENT=&quot;0; URL=http://www.netsons.com/errore-404.html&quot;&gt;</code></li><li
class="tab0 odd"><code>&lt;/HEAD&gt;</code></li><li
class="tab0 even"><code>&lt;BODY&gt;</code></li><li
class="tab0 odd"><code>&lt;/BODY&gt;</code></li><li
class="tab0 even"><code>&lt;/HTML&gt;</code></li></ol><p>Ora che abbiamo testato le funzionalita&#8217; di svn per la gestione &#8220;locale&#8221; della web application, creiamo i nostri tre server simulati (con gli opportuni permessi), copiamo in ognuno di essi l&#8217;installer e lanciamo quest&#8217;ultimo per creare le applicazioni.</p><pre style="color:Grey;font-size:12px;">
massi@aspire:~$ cd /var/www
massi@aspire:/var/www$ sudo mkdir fakesrv{1,2,3}
massi@aspire:/var/www$ sudo chown www-data:www-data fakesrv{1,2,3}
massi@aspire:/var/www$ ls
fakesrv1  fakesrv2  fakesrv3  index.html  svnwebapp
massi@aspire:/var/www$ cd
massi@aspire:~$ sudo cp svnwebapp_installer.php /var/www/fakesrv1/
massi@aspire:~$ sudo cp svnwebapp_installer.php /var/www/fakesrv2/
massi@aspire:~$ sudo cp svnwebapp_installer.php /var/www/fakesrv3/
massi@aspire:~$ lynx --source http://localhost/fakesrv1/svnwebapp_installer.php
massi@aspire:~$ lynx --source http://localhost/fakesrv2/svnwebapp_installer.php
massi@aspire:~$ lynx --source http://localhost/fakesrv3/svnwebapp_installer.php
</pre><p>Giusto per scrupolo vediamo cosa e&#8217; successo dentro a fakesrv1.</p><pre style="color:Grey;font-size:12px;">
massi@aspire:/var/www$ ls -lR fakesrv1
fakesrv1:
totale 4
drwxr-xr-x 3 www-data www-data 136 2007-11-26 13:34 svnwebapp
-rw-r--r-- 1 root     root      59 2007-11-26 13:34 svnwebapp_installer.php
fakesrv1/svnwebapp:
totale 8
-rw-r--r-- 1 www-data www-data 169 2007-11-26 13:34 index.php
-rw-r--r-- 1 www-data www-data  30 2007-11-26 13:34 updater.php
massi@aspire:/var/www$
</pre><p>Tramite lynx verifichiamo che tutto funzioni.</p><pre style="color:Grey;font-size:12px;">
massi@aspire:~$ lynx --source http://localhost/fakesrv1/svnwebapp
&lt;html&gt;
&lt;head&gt;
&lt;/head&gt;
&lt;body&gt;
Versione PHP installata: 5.2.3-1ubuntu6
&lt;/body&gt;
&lt;/html&gt;
massi@aspire:~$
</pre><p>Tralascio gli snipper delle verifiche per gli altri due &#8220;server&#8221;, tutto funziona ovviamente allo stesso modo.<br
/> Riassumiamo quello che e&#8217; successo finora: tramite l&#8217;installer ho potuto replicare la mia web application nei server dei miei ipotetici tre clienti, attingendo il codice direttamente dal repository SVN, che contiene l&#8217;ultima release del progetto.<br
/> Ora pero&#8217; mi sono accorto che la mia web application manca di un requisito fondamentale, e cioe&#8217; una stringa di testo con il mio indirizzo email, percio&#8217; sono costretto ad aggiornare le varie installazioni!<br
/> Vediamo quindi in che modo il mio sistema di installer diventa comodissimo in caso di aggiornamenti: aggiungiamo un post-commit hook al repository.<br
/> Ecco il contenuto della directory del repository.</p><pre style="color:Grey;font-size:12px;">
massi@aspire:~$ ls -l svn/svnwebapp
totale 8
drwxr-xr-x 2 massi massi 128 2007-11-11 23:20 conf
drwxr-xr-x 2 massi massi  48 2007-11-11 23:20 dav
drwxr-sr-x 5 massi massi 256 2007-11-12 00:12 db
-r--r--r-- 1 massi massi   2 2007-11-11 23:20 format
drwxr-xr-x 2 massi massi 392 2007-11-11 23:58 hooks
drwxr-xr-x 2 massi massi 104 2007-11-11 23:20 locks
-rw-r--r-- 1 massi massi 229 2007-11-11 23:20 README.txt
</pre><p>La directory che ci interessa e&#8217;, ovviamente, hooks.</p><pre style="color:Grey;font-size:12px;">
massi@aspire:~$ ls -l svn/svnwebapp/hooks/
totale 40
-rwxr-xr-x 1 massi massi  290 2007-11-11 23:58 post-commit
-rw-r--r-- 1 massi massi 1996 2007-11-11 23:20 post-commit.tmpl
-rw-r--r-- 1 massi massi 1673 2007-11-11 23:20 post-lock.tmpl
-rw-r--r-- 1 massi massi 2290 2007-11-11 23:20 post-revprop-change.tmpl
-rw-r--r-- 1 massi massi 1602 2007-11-11 23:20 post-unlock.tmpl
-rw-r--r-- 1 massi massi 2969 2007-11-11 23:20 pre-commit.tmpl
-rw-r--r-- 1 massi massi 2038 2007-11-11 23:20 pre-lock.tmpl
-rw-r--r-- 1 massi massi 2764 2007-11-11 23:20 pre-revprop-change.tmpl
-rw-r--r-- 1 massi massi 1979 2007-11-11 23:20 pre-unlock.tmpl
-rw-r--r-- 1 massi massi 2137 2007-11-11 23:20 start-commit.tmpl
massi@aspire:~$
</pre><p>Come si vede, e&#8217; presente il mio file post-commit , al quale ho dato di permessi di esecuzione.<br
/> Vediamone il contenuto.</p><ol
class="codelist"><li
class="tab0 odd"><code>&lt;HTML&gt;</code></li><li
class="tab0 even"><code>&lt;HEAD&gt;</code></li><li
class="tab0 odd"><code>&lt;TITLE&gt;Redirect...&lt;/TITLE&gt;</code></li><li
class="tab0 even"><code>&lt;META HTTP-EQUIV=&quot;REFRESH&quot; CONTENT=&quot;0; URL=http://www.netsons.com/errore-404.html&quot;&gt;</code></li><li
class="tab0 odd"><code>&lt;/HEAD&gt;</code></li><li
class="tab0 even"><code>&lt;BODY&gt;</code></li><li
class="tab0 odd"><code>&lt;/BODY&gt;</code></li><li
class="tab0 even"><code>&lt;/HTML&gt;</code></li></ol><p>Come si puo&#8217; vedere, e&#8217; un semplicissimo script Python che viene eseguito ad ogni commit (da qui&#8217; il nome post-commit): il codice mi sembra piuttosto chiaro, data una lista di URL, quelli relativi alle varie installazioni della web application, un ciclo sulla lista effettua il collegamento alla pagina updater.php di ogni installazione.<br
/> Il codice dell&#8217;updater e&#8217; molto simile a quello dell&#8217;installer, addirittura piu&#8217; semplice.</p><ol
class="codelist"><li
class="tab0 odd"><code>&lt;HTML&gt;</code></li><li
class="tab0 even"><code>&lt;HEAD&gt;</code></li><li
class="tab0 odd"><code>&lt;TITLE&gt;Redirect...&lt;/TITLE&gt;</code></li><li
class="tab0 even"><code>&lt;META HTTP-EQUIV=&quot;REFRESH&quot; CONTENT=&quot;0; URL=http://www.netsons.com/errore-404.html&quot;&gt;</code></li><li
class="tab0 odd"><code>&lt;/HEAD&gt;</code></li><li
class="tab0 even"><code>&lt;BODY&gt;</code></li><li
class="tab0 odd"><code>&lt;/BODY&gt;</code></li><li
class="tab0 even"><code>&lt;/HTML&gt;</code></li></ol><p>Ok, direi che siamo pronti a testare il tutto. Apriamo il file index.php con il nostro editor preferito, apportiamo la modifica di cui sopra e effettuiamo il commit.</p><pre style="color:Grey;font-size:12px;">
massi@aspire:/var/www/svnwebapp$ sudo vi index.php
massi@aspire:/var/www/svnwebapp$ sudo svn commit -m 'Aggiunto autore'
Trasmetto      index.php
Trasmissione dati .
Commit della Revisione 2 eseguito.
massi@aspire:/var/www/svnwebapp$
</pre><p>Ora la prova del 9, verifichiamo i tre server.</p><pre style="color:Grey;font-size:12px;">
massi@aspire:~$ lynx --source http://localhost/fakesrv1/svnwebapp
&lt;html&gt;
&lt;head&gt;
&lt;/head&gt;
&lt;body&gt;
Versione PHP installata: 5.2.3-1ubuntu6&lt;br&gt;
---&lt;br&gt;
Autore: Massimiliano Calamelli&lt;br&gt;
Email: mcalamelli@gmail.com&lt;/body&gt;
&lt;/html&gt;
massi@aspire:~$ lynx --source http://localhost/fakesrv2/svnwebapp
&lt;html&gt;
&lt;head&gt;
&lt;/head&gt;
&lt;body&gt;
Versione PHP installata: 5.2.3-1ubuntu6&lt;br&gt;
---&lt;br&gt;
Autore: Massimiliano Calamelli&lt;br&gt;
Email: mcalamelli@gmail.com&lt;/body&gt;
&lt;/html&gt;
massi@aspire:~$ lynx --source http://localhost/fakesrv3/svnwebapp
&lt;html&gt;
&lt;head&gt;
&lt;/head&gt;
&lt;body&gt;
Versione PHP installata: 5.2.3-1ubuntu6&lt;br&gt;
---&lt;br&gt;
Autore: Massimiliano Calamelli&lt;br&gt;
Email: mcalamelli@gmail.com&lt;/body&gt;
&lt;/html&gt;
</pre><p>Perfetto, tutto mi sembra ok, direi che il sistema ha funzionato!<br
/> Ovviamente sono conscio del fatto che il tutto e&#8217; realizzato in un ambiente molto differente dalla realta&#8217;, ma mi sento di poter affermare che con poche modifiche il tutto possa funzionare anche nel mondo reale; alcuni perfezionamenti che mi vengono in mente sono questi:</p><p>post-commit hook : l&#8217;elenco degli host da aggiornare potrebbe essere letto da un file, e non hard-coded all&#8217;interno dello script, in modo da poter escludere piu&#8217; facilmente host che per svariati motivi non devono essere aggiornati. Inoltre un controllo sul risultato della connessione tramite urllib2 sarebbe auspicabile, magari con una notifica via mail dell&#8217;insuccesso dell&#8217;operazione per il/i determinati hosts;</p><p>updater.php : la pagina in questione andrebbe in qualche modo protetta, cosi&#8217; da impedire eventuali chiamate non autorizzate.</p><p>Che dire, e&#8217; stato veramente interessante realizzare un sistema del genere, anche se molto semplificato rispetto ad un uso reale, un motivo in piu&#8217; per studiarsi i sistemi di controllo versione: io ho usato SVN come RCS e Python per il post-commit hook, ma nulla vieta di realizzare un sistema simile con CVS e un qualsiasi altro file eseguiibile che si chiami post-commit.<br
/> Ogni bravo programmatore dovrebbe SEMPRE usare un sistema di controllo versione.</p><p>Grazie a <a
href="http://www.fullo.net" target="_blank">Fullo</a> e Jaures per le preziose verifiche.</p><p>Alla prox</p><p>Technorati Tags: <a
href="http://technorati.com/tag/subversion" rel="tag">subversion</a>, <a
href="http://technorati.com/tag/php" rel="tag"> php</a>, <a
href="http://technorati.com/tag/python" rel="tag"> python</a>, <a
href="http://technorati.com/tag/post-commit+hooks" rel="tag"> post-commit hooks</a>, <a
href="http://technorati.com/tag/web+development" rel="tag"> web development</a></p> ]]></content:encoded> <wfw:commentRss>http://www.mcalamelli.net/2007/11/29/quando-subversion-incontra-lo-sviluppo-web/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>Python 2.5</title><link>http://www.mcalamelli.net/2007/09/18/python-25/</link> <comments>http://www.mcalamelli.net/2007/09/18/python-25/#comments</comments> <pubDate>Tue, 18 Sep 2007 11:54:01 +0000</pubDate> <dc:creator>mcalamelli</dc:creator> <category><![CDATA[javascript]]></category> <category><![CDATA[python]]></category> <category><![CDATA[windows]]></category> <guid
isPermaLink="false">http://mcalamelli.netsons.org/2007/09/18/python-25/</guid> <description><![CDATA[Dopo aver mosso i primi passi con Maya e 3D Studio, mi e&#8217; tornata la voglia di perdere un po&#8217; di tempo con la grafica 3D. Essendo il mio tempo libero gia&#8217; ridotto agli sgoccioli, ho preferito lasciare da parte affannose ricerche su Astalavista e eterni download con Emule per utilizzare qualche strumento piu&#8217; open/free, [...]]]></description> <content:encoded><![CDATA[<p>Dopo aver mosso i primi passi con Maya e 3D Studio, mi e&#8217; tornata la voglia di perdere un po&#8217; di tempo con la grafica 3D.<br
/> Essendo il mio tempo libero gia&#8217; ridotto agli sgoccioli, ho preferito lasciare da parte affannose ricerche su Astalavista e eterni download con Emule per utilizzare qualche strumento piu&#8217; open/free, e la mia scelta non poteva che cascare su <a
href="http://www.blender.org" target="_blank">Blender</a>. Comunque questo non e&#8217; un post su Blender, magari ne faro&#8217; uno se i miei esperimenti porteranno a qualcosa di buono, percio&#8217; passo a Python.<br
/> Ho scaricato l&#8217;ultima release di Blender, la 2.44, l&#8217;installer per Windows (per ora ci smanetto al lavoro nella pausa pranzo, e qui ho Xp), poi l&#8217;ho installato ed eseguito; il programma apre una finestra a console, dove finiscono i vari messaggi di esecuzione, e leggendo le varie righe mi accorgo di due cose: 0) e&#8217; stato compilato per usare Python2.5, 1) non trova un interprete Python esterno da usare.<br
/> La prima non mi stupisce, indica che Blender e&#8217; bello aggiornato, mentre la seconda mi stupisce un po&#8217;, visto che Python ce l&#8217;ho bello installato&#8230; poi ci penso un attimo e mi rendo conto che 2.5 != 2.4, quindi tutto ok. Il programma parte comunque, visto che ha il motore Python interno, ma potrei avere problemi con script che estendono il core, percio&#8217; provvedo tosto tosto all&#8217;installazione della nuova versione.<br
/> Tutto procede liscio, alla fine mi ritrovo le due versioni installate, c:\Python2.4 e c:\python2.5, e Blender, ma va!, dice che ha trovato un Python engine. Bene, chiudo Blender e aspetto di trovare un buon tutorial per partire.<br
/> Visto che mi rimane un po&#8217; di tempo prima delle 14, ne approfitto per vedere cosa e&#8217; cambiato nel mio sistema, e quindi provo a lanciare un paio dei programmi che ho scritto&#8230; e qui&#8217; la prima piacevole sorpresa: finalmente hanno sostituito quelle orrende icone con il serpentello sorridente con qualcosa di piu&#8217; bello, wow! Io da parte mia avevo gia&#8217; provveduto a cio&#8217; con un po&#8217; di lavoro grafico.</p><p>Qualche immagine per spiegarmi meglio.</p><p>Icone 2.4 (sorgente/binario)</p><p><img
src="http://mcalamelli.netsons.org/files/py_old.png" alt="Icona sorgente 2.4" />&nbsp;<img
src="http://mcalamelli.netsons.org/files/pyc_old.png" alt="Icona binario 2.4" /></p><p>Mie icone (sorgente/binario)</p><p><img
src="http://mcalamelli.netsons.org/files/py_my.png" alt="Mia icona sorgente" />&nbsp;<img
src="http://mcalamelli.netsons.org/files/pyc_my.png" alt="Mia Icona binario" /></p><p>Icone 2.5 (sorgente/binario)</p><p><img
src="http://mcalamelli.netsons.org/files/py_new.png" alt="Icona sorgente 2.5" />&nbsp;<img
src="http://mcalamelli.netsons.org/files/pyc_new.png" alt="Icona binario 2.5" /></p><p>Direi che ora le icone sono guardabili, anche se le mie continuano a piacermi parecchio&#8230;<br
/> Comunque, venendo al sodo, ho provato ad eseguire alcuni miei script, quelli console-based hanno continuato a funzionare senza problemi, mentre quelli GUI-based (GTK e WX) hanno avuto bisogno della reinstallazione delle librerie per Python2.5<br
/> Per ora non ho ancora nessuna linea di codice che utilizzi le nuove features di Python, non appena effettuero&#8217; qualche test anche su questo verrete prontamente aggiornati!</p><p>Python rulez!</p><p>Alla prox</p><p>Technorati Tags: <a
href="http://technorati.com/tag/python" rel="tag">python</a>, <a
href="http://technorati.com/tag/python2.5" rel="tag"> python2.5</a>, <a
href="http://technorati.com/tag/icone" rel="tag"> icone</a></p> ]]></content:encoded> <wfw:commentRss>http://www.mcalamelli.net/2007/09/18/python-25/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Giocando con SubversionPlaying with Subversion</title><link>http://www.mcalamelli.net/2007/07/26/giocando-con-subversionplaying-with-subversion/</link> <comments>http://www.mcalamelli.net/2007/07/26/giocando-con-subversionplaying-with-subversion/#comments</comments> <pubDate>Thu, 26 Jul 2007 14:19:41 +0000</pubDate> <dc:creator>mcalamelli</dc:creator> <category><![CDATA[blog]]></category> <category><![CDATA[linux]]></category> <category><![CDATA[opensource]]></category> <category><![CDATA[python]]></category> <category><![CDATA[subversion]]></category> <guid
isPermaLink="false">http://mcalamelli.netsons.org/2007/07/26/giocando-con-subversionplaying-with-subversion/</guid> <description><![CDATA[On yesterday evening i played a little with Subversion, I was looking for a way to do a post in my blog after a commit. I knew that there&#8217;s post-commit hooks, but only email-related. So i&#8217;ve taken my Python, and i wrote this script that connects to XML-RPC service built-in in WordPress (using xmlrpclib), and [...]]]></description> <content:encoded><![CDATA[<p>On yesterday evening i played a little with Subversion, I was looking for a way to do a post in my blog after a commit.<br
/> I knew that there&#8217;s  post-commit hooks, but only email-related. So i&#8217;ve taken my Python, and i wrote this script that connects to XML-RPC service built-in in WordPress (using xmlrpclib), and provide to create a new post that contains the commit&#8217;s message, and a list of affected files (by a call to svnlook).<br
/> The script is very easy and customizable, I hope it will be a launch for everyone.</p><p>Ah, i talked about it also in Google Project hosting user group, I hope that someone listen to me&#8230;</p><p>Here&#8217;s the code</p><div
class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table
cellspacing="0" cellpadding="0"><tbody><tr><td
style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br
/>2<br
/>3<br
/>4<br
/>5<br
/>6<br
/>7<br
/>8<br
/>9<br
/>10<br
/>11<br
/>12<br
/>13<br
/>14<br
/>15<br
/>16<br
/>17<br
/>18<br
/>19<br
/></div></td><td><div
class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp;#!/usr/bin/python<br
/> <br
/> import sys<br
/> import xmlrpclib<br
/> import os<br
/> <br
/> xmlrpc_url = &quot;http://localhost/wp/xmlrpc.php&quot;<br
/> xmlrpc_username = &quot;admin&quot;<br
/> xmlrpc_password = &quot;admin&quot;<br
/> post_title = &quot;Commit log&quot;<br
/> <br
/> repos = sys.argv[1]<br
/> rev = sys.argv[2]<br
/> <br
/> log_message = os.popen('svnlook log ' + repos).read()<br
/> affected_files = os.popen('svnlook changed ' + repos).read()<br
/> <br
/> server = xmlrpclib.Server(xmlrpc_url)<br
/> server.metaWeblog.newPost(1,xmlrpc_username,xmlrpc_password,{&quot;title&quot;:post_title, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&quot;description&quot;:&quot;Message: &quot; + log_message + &quot;Affetcted files: \n&quot; + affected_files},bool(1))</div></td></tr></tbody></table></div><p>Stay tuned</p><p>Technorati Tags: <a
href="http://technorati.com/tag/subversion" rel="tag">subversion</a>, <a
href="http://technorati.com/tag/python" rel="tag"> python</a>, <a
href="http://technorati.com/tag/XML-RPC" rel="tag"> XML-RPC</a>, <a
href="http://technorati.com/tag/post-commit+hooks" rel="tag"> post-commit hooks</a>, <a
href="http://technorati.com/tag/wordpress" rel="tag"> wordpress</a></p> ]]></content:encoded> <wfw:commentRss>http://www.mcalamelli.net/2007/07/26/giocando-con-subversionplaying-with-subversion/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Debug di uno script con due led&#8230;</title><link>http://www.mcalamelli.net/2006/11/10/debug-di-uno-script-con-due-led/</link> <comments>http://www.mcalamelli.net/2006/11/10/debug-di-uno-script-con-due-led/#comments</comments> <pubDate>Fri, 10 Nov 2006 15:10:11 +0000</pubDate> <dc:creator>mcalamelli</dc:creator> <category><![CDATA[python]]></category> <category><![CDATA[telit]]></category> <guid
isPermaLink="false">http://mcalamelli.netsons.org/2006/11/10/debug-di-uno-script-con-due-led/</guid> <description><![CDATA[&#8230; ovvero la mia esperienza con il modulo GSM/GPRS EZ10 Terminal QUAD-PY della Telit. Il modulo e&#8217; un bell&#8217;oggetto da un centinaio di Euro, con una porta RS232, 4 linee GPIO configurabili via software e, in questa versione, l&#8217;interprete Python (versione 1.5.2+) all&#8217;interno. Il contesto di utilizzo e&#8217; il seguente: una scheda elettronica, preposta all&#8217;attivazione [...]]]></description> <content:encoded><![CDATA[<p>&#8230; ovvero la mia esperienza con il modulo GSM/GPRS EZ10 Terminal QUAD-PY della Telit.<br
/> Il modulo e&#8217; un bell&#8217;oggetto da un centinaio di Euro, con una porta RS232, 4 linee GPIO configurabili via software e, in questa versione, l&#8217;interprete Python (versione 1.5.2+) all&#8217;interno.<br
/> Il contesto di utilizzo e&#8217; il seguente: una scheda elettronica, preposta all&#8217;attivazione o meno di uscite in base all&#8217;iterazione con l&#8217;utente, ha due ingressi di allarme, ai quali e&#8217; possibile collegare degli attuatori che si attivano in caso di situazioni ritenute di emergenza. Il firmware di gestione della scheda controlla lo stato degli ingressi (ovviamente optoisolati) di allarme, e lo riporta  su due delle quattro linee GPIO del modulo Telit.<br
/> All&#8217;interno del modulo gira il mio script Python, script che viene eseguito ad ogni avvio del modulo stesso. Lo scopo dello script e&#8217; il controllo delle linee GPIO di allarme, in modo da notificare via SMS a due numeri di cellulare gli eventi su queste linee con i messaggi di testo relativi.<br
/> La comunicazione tra l&#8217;interprete Python e parser dei comandi AT avviene internamente tramite una linea seriale virtuale utilizzabile all&#8217;interno dello script tramite le funzioni del modulo MDM, quindi ,tempistiche a parte, e&#8217; come se si parlasse direttamente sulla linea seriale fisica del modulo inviando direttamente i comandi AT. L&#8217;interprete mette a disponizione altri due moduli, oltre al builtin, e cioe&#8217; SER per la gestione della seriale fisica e MOD con un paio di funzioni per la gestione dei tempi.<br
/> La procedura di inserimento dello script e&#8217; piuttosto macchinosa: bisogna collegarsi via seriale al modulo (ho utilizzato Hyperterminal, e fa veramente pieta&#8217;&#8230;) impostando il baudrate a 115200, N81 per parita&#8217; e stopbit, e controllo di flusso hardware, poi digitare AT#WSCRIPT=&#8221;[nomefile.py]&#8220;,[dimensioni in byte del file] , attendere il prompt &#8220;>>>&#8221;, selezionare il menu &#8220;Invia file di testo&#8221;, selezionare il file da inviare e attendere la risposta di &#8220;OK&#8221;, poi abilitare il file .py &#8220;uploadato&#8221; con il comando AT#ESCRIPT=&#8221;[nomefile.py]&#8220;, e attendere &#8220;OK&#8221; per la conferma. Per eseguire lo script sul modulo basta chiudere la comunicazione da Hyperterminal e spegnere e riaccendere il modulo.<br
/> E ora cominciano i problemi, almeno nel mio caso&#8230;<br
/> Ho provato il classico &#8220;Hello world!&#8221;, e cioe&#8217; in questo caso la stampa della stringa sulla seriale fisica del modulo (ovviamente connessa al pc), ma non ho visto arrivare niente, e mi sono chiesto &#8220;Ma lo script e&#8217; partito? Ma ho forse fatto qualche errore di digitazione? COME FACCIO IL DEBUG?&#8221;. E il punto e&#8217; proprio questo, il debug dello script. Certo, errori di sintassi li posso escludere facendo leggere lo script da un qualche tool di controllo, ma se per caso (come mi e&#8217; successo&#8230;) scrivo MDM.sleep(10), che non esiste, al posto di MOD.sleep(10), come me la sbrigo??<br
/> La soluzione che ho utilizzato e&#8217; stata quella di collegare esternamente due led alle porte GPIO rimaste libere per avere un piccolo feedback dallo script, ma vi assicuro che e&#8217; stata veramente dura arrivare alla fine, un minimo di informazioni le potevano mettere, almeno per i traceback generati dal Python!<br
/> Comunque alla fine ci sono arrivato, lo script si comporta bene, e i messaggi arrivano che e&#8217; una meraviglia.<br
/> Nonostante cio&#8217; pero&#8217; non posso esprimere un parere positivo al 100%, ritengo che questo oggetto possa andare bene per un eventuale sistema di dimostrazione, ma la macchinosita&#8217; di programmazione (del modulo, non del Python) non lo rende l&#8217;ideale in produzione: una scheda di gestione con una seriale libera e un microcontrollore adeguato avrebbe compiuto meglio il lavoro.</p><p>Alla prox</p> ]]></content:encoded> <wfw:commentRss>http://www.mcalamelli.net/2006/11/10/debug-di-uno-script-con-due-led/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Nuova patch per Phasis: modulo di configurazione</title><link>http://www.mcalamelli.net/2006/10/06/nuova-patch-per-phasis-modulo-di-configurazione/</link> <comments>http://www.mcalamelli.net/2006/10/06/nuova-patch-per-phasis-modulo-di-configurazione/#comments</comments> <pubDate>Fri, 06 Oct 2006 15:09:48 +0000</pubDate> <dc:creator>mcalamelli</dc:creator> <category><![CDATA[opensource]]></category> <category><![CDATA[python]]></category> <guid
isPermaLink="false">http://mcalamelli.netsons.org/2006/10/06/nuova-patch-per-phasis-modulo-di-configurazione/</guid> <description><![CDATA[Come da oggetto, ecco una nuova patch per Phasis relativa al (mio) modulo di configurazione. Rispetto alle altre volte ho deciso di scrivere qualche cosa perche&#8217;, pur avendo un impatto minimo su una installazione gia&#8217; funzionante, richiede comunque delle modifiche al file di configurazione default.cfg. Modifiche che comunque si riassumo in una aggiunta di diverse [...]]]></description> <content:encoded><![CDATA[<p>Come da oggetto, ecco una nuova patch per Phasis relativa al (mio) modulo di configurazione.<br
/> Rispetto alle altre volte ho deciso di scrivere qualche cosa perche&#8217;, pur avendo un impatto minimo su una installazione gia&#8217; funzionante, richiede comunque delle modifiche al file di configurazione default.cfg.<br
/> Modifiche che comunque si riassumo in una aggiunta di diverse linee di commenti opportunamente formattate, e da qui&#8217; la scarsita&#8217; dell&#8217;impatto sul sistema.<br
/> Piccola annotazione: <strong>la patch sovrascrivera&#8217; il vecchio file di configurazione, percio&#8217; consiglio un backup prima di applicarl</strong>a.<br
/> Il sistema di creazione dei controlli relativi alle opzioni e&#8217; intelligente e completamente realizzato a runtime, a meno dei controlli fondamentali come i panel, i sizer e la struttura base del notebook.<br
/> Di seguito un piccolo help per capire come e cosa ho modificato nel file di configurazione.</p><p>Vecchio file:</p><pre># ------ Impostazioni di rete
[Server]
#Address=0.0.0.0
Port = 0
# ------ Impostazioni di linguaggio
[Language]
# Italiano = IT  ; English = EN ; Spanish = SP
spk = IT</pre><p>Nuovo file:</p><pre># ------ Impostazioni di rete
[Server]
#sectAlias@@Rete
#sectDesc@@Impostazioni relative alla rete
#opt__Port@@Porta@@int@@tc
#Address=0.0.0.0
Port = 0
# ------ Impostazioni di linguaggio
[Language]
#sectAlias@@Lingua
#sectDesc@@Impostazioni relative alla lingua
#opt__spk@@Lingua@@str@@cb@@Italiano:IT%Inglese:EN%Spagnolo:SP
# Italiano = IT  ; English = EN ; Spanish = SP
spk = IT</pre><p>Le modifiche sono piuttosto chiare, ed effettivamente si limitano a dei commenti (particolari).<br
/> I miei commenti sono di due tipi, uno relativo alla sezione (Server e Language nell&#8217;esempio) e uno relativo alle opzioni (Port e spk).<br
/> I commenti di sezione cominciano con &#8220;sect&#8221;, e proseguono o con &#8220;Alias&#8221; per una stringa piu&#8217; user-friendly rispetto al nome della sezione, oppure con &#8220;Desc&#8221; per una descrizione stringata di cio&#8217; che riguarda la sezione. Il separatore, chiaramente, e&#8217; una doppia @.<br
/> I commenti di opzione sono un po&#8217; piu&#8217; complessi, dovendo contenere informazioni differenti: vediamo un po&#8217; di spiegare la formattazione.<br
/> Un template di struttura puo&#8217; essere il seguente:</p><pre>opt__nomeopzione@@alias@@dato@@controllo[@@key:val%key:val]</pre><p>Il campo opt__nomeopzione si spiega da se, come del resto il campo alias, mentre un discorso a parte va fatto per gli altri campi.<br
/> Il campo &#8220;dato&#8221; indica il tipo di dato che l&#8217;opzione puo&#8217; contenere e che viene validato in fase di modifica del campo stesso, e puo&#8217; essere &#8220;int&#8221; per un intero, &#8220;str&#8221; per una stringa o &#8220;bool&#8221; per uno 0 o un 1.<br
/> Il campo &#8220;controllo&#8221; indica il tipo di controllo che rappresenta l&#8217;opzione, e puo&#8217; essere &#8220;tc&#8221; per un TextControl, &#8220;ml&#8221; per un TextControl multilinea, &#8220;rb&#8221; per un RadioBox e &#8220;cb&#8221; per un ComboBox.<br
/> I campi indicati fino a qui (opt__nomeopzione, alias, dato, controllo) sono necessari, mentre l&#8217;ultimo campo, indicato tra parentesi quadre nell&#8217;esempio di struttura e&#8217; richiesto solo se il tipo di controllo e&#8217; &#8220;cb&#8221;, e contiene una serie di coppie chiave/valore separate da il carattere %, che andranno a riempire in ComboBox.</p><p>E questo e&#8217; quanto, in caso di altre delucidazioni contattatemi pure. Per chiudere, ribadisco che <strong>il modulo, per funzionare, ha bisogno di un file di configurazione di nuovo tipo</strong>, e che <strong>applicando la patch il vecchio file verra&#8217; sovrascritto</strong>, percio&#8217; fate un <strong>backup del vecchio</strong> prima di applicare la patch, se avete apportato modifiche.</p><p>Alla prox</p> ]]></content:encoded> <wfw:commentRss>http://www.mcalamelli.net/2006/10/06/nuova-patch-per-phasis-modulo-di-configurazione/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> </channel> </rss>
<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk: basic (Feed is rejected)
Page Caching using disk: basic

Served from: www.mcalamelli.net @ 2012-02-07 18:13:07 -->
