tag:blogger.com,1999:blog-67224005798149229442024-03-06T02:54:57.964+01:00Impressioni InformaticheUna collezioncina di trucchi informatici incentrati nel mondo dell'open source con un'occhio di riguardo a linuxvaleriushttp://www.blogger.com/profile/18409632335227000779noreply@blogger.comBlogger22125tag:blogger.com,1999:blog-6722400579814922944.post-21090978995085893982011-05-14T15:29:00.000+02:002011-05-14T15:29:31.797+02:00Ubuntu 11.04 e unity 2DTempo fa ho installato sul mio ebook il nuovo ubuntu 11.04.<br />
La novità di questo aggiornamento è la nuova interfaccia grafica <b>Unity</b> che avrebbe dovuto mostrarmi meraviglie su meraviglie.<br />
Con mia triste sorpresa, una volta riavviata la macchina dopo l'upgrade di release mi sono imbattuto in un inesorabile messaggio di incompatibilità tra la mia scheda video e <i>compiz</i> e di conseguenza anche con Unity.<br />
Lo stupore si è dipinto sul mio volto (oltre che sul mio monitor) poichè nella release precedente di ubuntu per netbook unity in fase sperimentale era funzionante.<br />
In ogni caso ho cercato di far partire compiz sul mio emachines <i>em350</i> ma senza successo poichè non ho trovato nessuno che aveva il mio stesso problema con questo modello ed allora mi sono preparato a tornare a utilizzare la vecchia interfaccia di <i>Gnome</i>.<br />
Dopo qualche giorno con qualche ricerca casuale su internet ho scovato una versione di unity che gira senza compiz nome in codice <b>Unity 2d</b>.<br />
<br />
<br />
L'ho installata e l'ho trovata decente.<br />
<br />
Ecco come ho fatto:<br />
<br />
sudo apt-get install unity-2d-default-settings<br />
<br />
<br />
dopodichè mi sono sloggato e ho selezionato Unity come sessione dalla finestra di log in di Ubuntu.valeriushttp://www.blogger.com/profile/18409632335227000779noreply@blogger.com0tag:blogger.com,1999:blog-6722400579814922944.post-34078701207833881942010-12-23T16:41:00.001+01:002010-12-23T16:59:17.568+01:00perl powerful renamerL'altro giorno dovevo rinominare tutti i file che rispondevano ad un certo nome aggiungendo loro un certo suffisso.<br />
<br />
Ci sono un sacco di utilities che lo fanno egregiamente ma mi sono divertito a farlo in maniera semplice e geekosa con il buon vecchio perl.<br />
<br />
Ecco come ho fatto<br />
<br />
<br />
perl -e '`mv $_ $_-sample` while(<cdr-parser-rufus*.ini>)'<br />
<br />
in questo modo ho appeso '-sample' ad ogni file cercato.valeriushttp://www.blogger.com/profile/18409632335227000779noreply@blogger.com0tag:blogger.com,1999:blog-6722400579814922944.post-57551960771904874692010-12-20T14:48:00.000+01:002010-12-20T14:48:08.904+01:00Vim autocompletamentoNon mi piace usare l'autocompletamento di <b>vim</b> che utilizza il primo nome trovato sul filesystem quando si apre un file. Ho ovviato con il seguente comando (che ho messo in .vimrc):<br />
<br />
<blockquote>set wim=list:longest</blockquote><br />
In questo modo si ha il comportamento standard che si ha anche con <b>bash</b>.valeriushttp://www.blogger.com/profile/18409632335227000779noreply@blogger.com0tag:blogger.com,1999:blog-6722400579814922944.post-71159449796954376832010-09-19T15:48:00.000+02:002010-09-19T15:48:02.530+02:00Come trasformare un vecchio portatile in un player di filmsQuesto week end mi sono sbizzarrito prendendo un vecchio portatile Sony Vaio 9h2m (il mio primo portatile ...) e configurandolo come player di divx per il televisore di casa.<br />
Avrei potuto utilizzare uno di quei lettori DVD/mp4 che si trovano in commercio a pochi euro ma è molto più divertente utilizzare un vecchio ferrovecchio, e poi funziona molto meglio poiché posso tranquillamente aggiornare i codec se qualcosa non funziona.<br />
<br />
Dunque visto che il portatile ha circa 35 giga di hard disk e 512 MB di memoria ho installato l'ultima release di xubuntu 10.4 e l'ho attaccato via ethernet al router che per l'occasione ho spostato dalla camera da letto alla cucina.<br />
<br />
Ho configurato gli ip in maniera statica modificando il file <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">/etc/network/interfaces</span> aggiungendo una configurazione statica<br />
<br />
<br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">auto eth0</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">iface eth0 inet static</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">address 192.168.1.2</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">netmask 255.255.255.0</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">network 192.168.1.0</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">broadcast 192.168.1.255</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">gateway 192.168.1.1</span><br />
<div><br />
</div><div>in cui <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">eth0</span> è l'interfaccia di rete del mio vaio, <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">192.168.1.2</span> è l'indirizzo che gli ho assegnato nella rete domestica (<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">192.168.1.0</span>) in cui il router (gateway) ha l'ip <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">192.168.1.1</span>.</div><div><br />
</div><div>ho preso tutti i computer di casa e dopo aver copiato la chiave pubblica sull'account principale del laptop con la seguente procedura</div><div><br />
</div><div><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">scp .ssh/id_rsa.pub gattinux@192.168.1.2:/tmp</span> (gattinux è l'utente con cui accedo al vaio)</div><div><br />
</div><div>ed una volta loggato su <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">192.168.1.2</span> (ovvero il portatile vaio)</div><div><br />
</div><div><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">cat /tmp/id_rsa.pub >> .ssh/authorized_keys</span></div><div><br />
</div><div>ho associato 192.168.1.2 ad un nome host sotto /etc/hosts per poter accedere più facilmente al vaio.</div><div><br />
</div><div><div><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">192.168.1.2</span><span class="Apple-tab-span" style="white-space: pre;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"> </span></span><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">vaio</span></div></div><div><br />
</div><div>adesso posso loggarmi senza inserire la password su gattinux@vaio</div><div><br />
</div><div>Adesso si entra nel cuore del problema.</div><div>A me garberebbe poter utilizzare vaio come unico punto di accesso per poter vedere i film sul televisore o sui computer di casa senza dover spostare i files da un computer all'altro.</div><div><br />
</div><div>Primo problema i 35 GB del vaio sono un po pochini ecco perchè ho collegato via usb un hard disk esterno da 1,5 Tera. </div><div>Ho poi modificato /etc/fstab in modo da aggiungere la nuova partizione e montarla sotto /mnt</div><div><br />
</div><div><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">/dev/sdb2 /mnt ext4 errors=remount-ro 0 0</span></div><div><br />
</div><div>A questo punto l'enorme spazio è accedibile da qualsiasi utente si colleghi a vaio.</div><div><br />
</div><div>Adesso è possibile: vedere un film dal vaio sul televisore ma io vorrei non dovermi alzare per farlo ed usare un qualsiasi altro laptop di casa per comandare il vaio e dirgli di riprodurre un film.</div><div><br />
</div><div>Facile da fare con la seguente procedura</div><div><br />
</div><div><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">ssh gattinux@vaio </span></div><div><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">export DISPLAY=:0.0 </span> </div><div>così l'output di default viene redirezionato sul pc locale cioè sul vaio che è collegato al televisore</div><div><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">mplayer film.avi -mc 0.0001</span></div><div>mplayer è il player che preferisco ma essendo alcuni film ad alta definizione senza l'opzione -mc vedo i film a scatti, con -mc 0.0001 il problema mi si risolve.</div><div><br />
</div><div>Adesso quindi sono in grado di utilizzare un mio laptop come "telecomando" per il televisore scegliendo il film che voglio vedere direttamente dal divano!</div><div><br />
</div><div><br />
</div><div><br />
</div>valeriushttp://www.blogger.com/profile/18409632335227000779noreply@blogger.com1tag:blogger.com,1999:blog-6722400579814922944.post-77290597341611849152010-05-17T21:48:00.001+02:002010-05-17T21:50:37.244+02:00La tecnica del pomodoro<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIxTUP1yJySB1a7SfrIciGkXg9WPKwiK5feeQXYKrf1tSjeZay5A5U95RUujdjptmXhOI6GxsTTJCRjUGwzJtIf4hocIAUZJAe57N3GRNEGQ7dlhcY0ESup34XHT3BjNAxzoovwE8UGrA/s1600/pomodoro.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIxTUP1yJySB1a7SfrIciGkXg9WPKwiK5feeQXYKrf1tSjeZay5A5U95RUujdjptmXhOI6GxsTTJCRjUGwzJtIf4hocIAUZJAe57N3GRNEGQ7dlhcY0ESup34XHT3BjNAxzoovwE8UGrA/s320/pomodoro.jpg" /></a></div>Al Pycon4 ho comperato un libro eccellente, non <span class="goog-spellcheck-word" style="background: none repeat scroll 0% 0% yellow;">direttamente</span> legato all'informatica, bensì orientato a migliorare le proprie prestazioni "<span class="goog-spellcheck-word" style="background: none repeat scroll 0% 0% yellow;">intellettuali</span>".<br />
Il principio è tanto banale quanto efficace.<br />
<br />
<i>Fare una sola cosa per volta</i><br />
<br />
Per farlo è necessario un <span class="goog-spellcheck-word" style="background: none repeat scroll 0% 0% yellow;">timer</span> ed utilizzarlo, settandolo su un tempo variabile, solitamente intorno ai 25 minuti per fare un compito e solo quello fino a che non suona.<br />
<br />
Ovviamente non è detto che un compito sia esprimibile in un solo pomodoro (poiché il <span class="goog-spellcheck-word" style="background: none repeat scroll 0% 0% yellow;">timer</span> utilizzato dall'inventore del metodo era un <span class="goog-spellcheck-word" style="background: none repeat scroll 0% 0% yellow;">timer</span> da cucina dalla forma del rosso ortaggio, oggigiorno il metodo ha preso quel nome) quindi in tal caso si valuta quanti pomodori occorrono per completarlo e ci si mette all'opera fino a che, 25 minuti alla volta, non lo si è terminato.<br />
<br />
<br />
Questo è il <span class="goog-spellcheck-word" style="background: none repeat scroll 0% 0% yellow;">funzionamento</span> di base e vi assicuro che soltanto questo ha portato il mio rendimento ad un <span class="goog-spellcheck-word" style="background: none repeat scroll 0% 0% yellow;">miglioramento</span> non <span class="goog-spellcheck-word" style="background: none repeat scroll 0% 0% yellow;">trascurabile</span>: prima di questa "filosofia" ero portato ad <span class="goog-spellcheck-word" style="background: none repeat scroll 0% 0% yellow;">interrompere</span> una cosa che stavo facendo o <span class="goog-spellcheck-word" goog-spell-original="perchè">perché</span> mi veniva chiesto o <span class="goog-spellcheck-word" goog-spell-original="perchè">perché</span> mi veniva in mente che ne dovevo fare una altrettanto urgente o forse di più.<br />
<br />
Con la tecnica del pomodoro invece la mia coscienza è a posto <span class="goog-spellcheck-word" goog-spell-original="perchè">perché</span> so che per la durata del <span class="goog-spellcheck-word" style="background: none repeat scroll 0% 0% yellow;">timer</span> mi occuperò solo di un compito (o di una sua parte) e se qualcuno mi interrompe nel mezzo della mia "iterazione" per un compito più urgente chiedo lui (gentilmente) se può aspettare il termine dei miei 25 minuti.<br />
<br />
Se questo accade, perfetto ho ottenuto quello che volevo e se ciò non avviene <span class="goog-spellcheck-word" style="background: none repeat scroll 0% 0% yellow;">semplicemente</span> azzero il <span class="goog-spellcheck-word" style="background: none repeat scroll 0% 0% yellow;">timer</span> e "scarto" il pomodoro: a fine giornata conterò i pomodori portati a termine e così potrò valutare quale è il mio carico di lavoro includendo in esso anche tutte le <span class="goog-spellcheck-word" style="background: none repeat scroll 0% 0% yellow;">interruzioni</span>.<br />
<br />
E' veramente una lettura illuminante e vi rimando al libro della <span class="goog-spellcheck-word" style="background: none repeat scroll 0% 0% yellow;">Pragmatic</span> <span class="goog-spellcheck-word" style="background: none repeat scroll 0% 0% yellow;">Programmers</span> che ho <a href="http://www.anobii.com/anobi/person_main.php?v=016e0d60c429b32a0e&sta=5&pid=84&lid=">letto</a> pochi giorni fa; esiste anche il <a href="http://www.pomodorotechnique.com/">sito ufficiale</a> della tecnica su cui si può trovare sia il <a href="http://www.pomodorotechnique.com/resources/cirillo/ThePomodoroTechnique_v1-3.pdf">manuale</a> anche in formato <a href="http://www.pomodorotechnique.com/downloads/pomodoro_cheat_sheet.pdf">bignami</a>.valeriushttp://www.blogger.com/profile/18409632335227000779noreply@blogger.com0tag:blogger.com,1999:blog-6722400579814922944.post-61693143681303301372010-02-13T19:24:00.000+01:002010-02-13T19:24:56.991+01:00Come trasformare un portatile in un e-readerUltimamente non si fa che parlare di kindle reader, e-readere ipad che sembrano essere il futuro tecnologico della carta stampata e in questo 2010 sembra che molti giganti dell'hardware si lanceranno nella corsa a riempire il mercato di questi nuovi gioiellini tecnologici.<br />
Ammetto che anche a me la cosa attira molto e nel frattempo con il mio mitico Elitebook 6940p e ubuntu 9.10 mi sono dato da fare ma non troppo per leggere i miei pdf preferiti.<br />
Ovviamente quello che sono riuscito ad ottenere è stato inizialmente questo<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8qryFrhjpxY5QieA7fvtbXv0zdiRBEOjVNgH_KTaf2uU9X676yvVd8rQ0V_sfkphffT018NKXn91Cg_QLIOZs9MmK8Io4RG9AQvUAe1nWBuGeh9UM3oNQinMzVEwo2aMAgJnJ_ydg014/s1600-h/IMG00134.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8qryFrhjpxY5QieA7fvtbXv0zdiRBEOjVNgH_KTaf2uU9X676yvVd8rQ0V_sfkphffT018NKXn91Cg_QLIOZs9MmK8Io4RG9AQvUAe1nWBuGeh9UM3oNQinMzVEwo2aMAgJnJ_ydg014/s320/IMG00134.jpg" /></a></div><br />
che come e-reader lascia molto a desiderare.<br />
A questo punto mi è venuto in mente di "maneggiare" il mio portatile come un libro e ho premuto CTRL-freccia sinistra e questo è il risultato.<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh22FWMLtnhGB7e4v1ZOm3FE5ChlbFVC_Q28Sc0MX56pNEHM6juXI5DYWNiVjbU2uFaefkRFYirH3ddATaWYt98y9lFUo1Sai0CMFtHRZBENQ7rsP4Pp46Ye57_HNlqSplPHlrW-qHqJmg/s1600-h/IMG00135.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh22FWMLtnhGB7e4v1ZOm3FE5ChlbFVC_Q28Sc0MX56pNEHM6juXI5DYWNiVjbU2uFaefkRFYirH3ddATaWYt98y9lFUo1Sai0CMFtHRZBENQ7rsP4Pp46Ye57_HNlqSplPHlrW-qHqJmg/s320/IMG00135.jpg" /></a></div><br />
E' decisamente meglio ed il bello è che posso usare il tasto sinistro e destro del pad per andare avanti/indietro nel mio pdf.<br />
<object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/cvONwI89XLc&hl=it_IT&fs=1&"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/cvONwI89XLc&hl=it_IT&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object>valeriushttp://www.blogger.com/profile/18409632335227000779noreply@blogger.com1tag:blogger.com,1999:blog-6722400579814922944.post-50186867890024696462010-02-05T21:08:00.003+01:002010-02-05T22:58:33.830+01:00Come stampare un pdf di una sola pagina in doppia copia sulla stessa paginaQuello che si vuole fare è il seguente:<br />
<br />
da un pdf così:<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjymCPsVU_7uLJJ6nM0QR6g5G1JdbtupD5EYO2iVkF817ij6cReO4y1dYSDKghyNcA_kFmUiCle63OT3cyKUWuYUMsZjUhF-ahBvQkbGxe2j8JdgxsL2dLKjn_MN05O2YzHXpeLMsLdcl0/s1600-h/Immagine-1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="296" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjymCPsVU_7uLJJ6nM0QR6g5G1JdbtupD5EYO2iVkF817ij6cReO4y1dYSDKghyNcA_kFmUiCle63OT3cyKUWuYUMsZjUhF-ahBvQkbGxe2j8JdgxsL2dLKjn_MN05O2YzHXpeLMsLdcl0/s400/Immagine-1.png" width="400" /></a></div><br />
si vuole stampare un pdf così<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdsUgWQoEA34mqgWgqrzCrC7U06kFvk7B9tW52mCT5BCrM_9bjIMrlIPD7MpgtvanaZkyWrCPyfo2XoNHHfqH2N7vf0Y0iTe6uHKhxyXR5j1uOEVhnJyUbWtLPPZ-Q0AN57-jwVKaPE1w/s1600-h/Immagine2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="297" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdsUgWQoEA34mqgWgqrzCrC7U06kFvk7B9tW52mCT5BCrM_9bjIMrlIPD7MpgtvanaZkyWrCPyfo2XoNHHfqH2N7vf0Y0iTe6uHKhxyXR5j1uOEVhnJyUbWtLPPZ-Q0AN57-jwVKaPE1w/s400/Immagine2.png" width="400" /></a></div><br />
senza usare strumenti "strani" l'unica cosa necessaria è o ubuntu o windows con configurata una stampante virtuale in grado di creare pdf.<br />
<br />
Il procedimento, se non si conosce la giusta sequenza può non essere molto intuitivo e per farlo occorre un passo intermedio.<br />
<br />
1) Si prende il pdf di partenza e usando la stampante virtuale si stampa la pagina in duplice copia<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-hcfCiZHeeMAFAxu0-ofdhNQt3AgKwlGVMoeHBz7TU_DD_-yGEI49ssDcRu_eBFwj4epko-Tfad77ioxFf1bp5hwTa-fKvKV1uRtKBCIfKf19-0efCqADT17pXDEWEHUeebbFy7b7RVY/s1600-h/Immagine0.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="272" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-hcfCiZHeeMAFAxu0-ofdhNQt3AgKwlGVMoeHBz7TU_DD_-yGEI49ssDcRu_eBFwj4epko-Tfad77ioxFf1bp5hwTa-fKvKV1uRtKBCIfKf19-0efCqADT17pXDEWEHUeebbFy7b7RVY/s400/Immagine0.png" width="400" /></a></div><br />
ottenendo<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTzVklvu6OnNYX_gg34d4Q97W6JM5SiOHunKyead2yeQSuBpMbvS8BzWtbpMjeuLXL96UcZHX0qawguEDGNpXP5Wo6bYFT-sZ8AiF-cdbzCqKrAb3QV3-UrSRDrZbZobHpBJvb-BwZoFo/s1600-h/Immagine3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTzVklvu6OnNYX_gg34d4Q97W6JM5SiOHunKyead2yeQSuBpMbvS8BzWtbpMjeuLXL96UcZHX0qawguEDGNpXP5Wo6bYFT-sZ8AiF-cdbzCqKrAb3QV3-UrSRDrZbZobHpBJvb-BwZoFo/s320/Immagine3.png" /></a></div><br />
e si salva il pdf in una directory temporanea ad esempio /tmp/output.pdf<br />
<br />
2) si apre il pdf /tmp/ouput.pdf e si stampa con l'opzione 2 pagine in una<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhF6GgzDEBBjY0NzDUB-fpFeE3fTCoYyAj836xvaZlcg5loxveGHNL9N-tIJB_oAHonex7FLwp04wzn-Uv1Tli23ao2_BmRizZei2rDM-g6usZV7xj8ukbCN6fPG7seJtJFJsn2fiCTk-w/s1600-h/Immagine1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="262" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhF6GgzDEBBjY0NzDUB-fpFeE3fTCoYyAj836xvaZlcg5loxveGHNL9N-tIJB_oAHonex7FLwp04wzn-Uv1Tli23ao2_BmRizZei2rDM-g6usZV7xj8ukbCN6fPG7seJtJFJsn2fiCTk-w/s400/Immagine1.png" width="400" /></a></div><br />
e quello che si ottiene è proprio quello che volevamo<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdsUgWQoEA34mqgWgqrzCrC7U06kFvk7B9tW52mCT5BCrM_9bjIMrlIPD7MpgtvanaZkyWrCPyfo2XoNHHfqH2N7vf0Y0iTe6uHKhxyXR5j1uOEVhnJyUbWtLPPZ-Q0AN57-jwVKaPE1w/s1600-h/Immagine2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="297" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdsUgWQoEA34mqgWgqrzCrC7U06kFvk7B9tW52mCT5BCrM_9bjIMrlIPD7MpgtvanaZkyWrCPyfo2XoNHHfqH2N7vf0Y0iTe6uHKhxyXR5j1uOEVhnJyUbWtLPPZ-Q0AN57-jwVKaPE1w/s400/Immagine2.png" width="400" /></a></div><br />
semplice e veloce senza usare strumenti aggiuntivi, spesso complicati da capire come funzionano.valeriushttp://www.blogger.com/profile/18409632335227000779noreply@blogger.com0tag:blogger.com,1999:blog-6722400579814922944.post-88659489949929911132009-10-24T20:30:00.000+02:002009-10-24T20:30:00.774+02:00Due giorni all'IPW09 (Italian Perl Worlshop 2009)Quest'anno per la prima volta mi sono regalato una full immersion di 2 giorni all'ipw09.<br />
E' stata una esperienza bella ed appagante e mi ha lasciato con la voglia di scrivere tanto tanto codice perl.<br />
Un'altra cosa che mi reso questa esperienza ancora più appagante è che alcuni relatori che hanno presentato progetti molto interessanti sono anche miei colleghi ed amici.<br />
La manifestazione si è tenuta al <a href="http://www.cnr.it/">Centro Nazionale delle Ricerche</a> una cornice eccellente all'alto livello della manifestazione.<br />
Fare una carrellata dei talk che si sono tenuti sarebbe un lavoro lungo e faticoso quindi per ulteriori informazioni vi rimando su <a href="http://www.perl.it/">perl.it</a>, non appena disponibili le slide le potrete trovare <a href="http://www.perl.it//documenti/talks/index.html">qui</a> (come bonus trovate anche quelle degli anni scorsi). Alcuni talk riguardavano aspetti tecnici specialistici, altri erano divulgativi (tra cui un corso completo di perl della durata di 480 minuti - scusate se è poco) ed ancora alcuni erano ironici come il talk sull'Antiquated Perl riguardante i trucchi rocamboleschi che si possono fare con il perl delle vecchie versioni, una lezione che si è rivelato un ottima introspezione sul funzionamento a basso livello del perl.<br />
Insomma molti interventi tutti caratterizzati da un elevato livello di competenza, una voglia di divulgare una propria passione ed anche di divertirsi un pochino.<br />
Una ottima iniziativa.valeriushttp://www.blogger.com/profile/18409632335227000779noreply@blogger.com0tag:blogger.com,1999:blog-6722400579814922944.post-44858421134781524862009-07-04T16:47:00.009+02:002010-02-28T11:39:26.984+01:00Git e GitosisEcco come creare un repository <span style="font-weight: bold;">git</span> e condividerlo con <span style="font-weight: bold;">gitosis</span> su ubuntu 9.04.<br />
<br />
Installare git<br />
<br />
<span style="font-family: verdana; font-style: italic;"></span><br />
<blockquote><span style="font-family: verdana; font-style: italic;">sudo apt-get install git-core</span><span style="font-family: verdana;"> </span><code style="font-family: verdana; font-style: italic;">python-setuptools</code> </blockquote><br />
Installare gitosis<br />
<br />
<blockquote style="font-family: verdana;"><span style="font-style: italic;">cd /tmp</span><br />
<span style="font-style: italic;"> git clone git://eagain.net/gitosis.git</span><br />
<br />
<span style="font-style: italic;"> cd gitosis</span><br />
<span style="font-style: italic;">python setup.py install<br />
<br />
</span></blockquote>Gitosis è un modo "semplificato" - si fa per dire - per gestire gli accessi al repository git e consiste nel modificare un file di configurazione con una serie di autorizzazioni e di chiavi pubbliche ssh associata ad ogni utente.<br />
<br />
Prima di poter utilizzare gitosis va creato un utente ad hoc e configurato come amministratore di gitosis. L'utente che andiamo a creare molto originariamente si chiamerà <span style="font-weight: bold;">git</span>.<br />
<br />
<pre><code></code>
<blockquote>sudo adduser \
--system \
--shell /bin/sh \
--gecos 'git version control' \
--group \
--disabled-password \
--home /home/git \
git</blockquote></pre>l'utente appena creato avrà come unico compito di "ospitare" il repository e di far girare <span style="font-style: italic;">gitosis</span>. Quindi i repository saranno almeno due<br />
<ul><li>il repository in cui vogliamo mettere i nostri dati da versionare (può essere più di uno)</li>
<li>il repository amministrativo di gitosis che si chiama <span style="font-style: italic;">gitosis-admin</span></li>
</ul>a questo punto bisogna fornire l'accesso al repository amministrativo ad un utente del sistema utilizzato per sviluppare (chiamiamolo <span style="font-style: italic;">valerio</span>)<br />
occorre quindi recuperare la chiave pubblica dell'utente <span style="font-style: italic;">valerio </span>da ~/.ssh/id_rsa.pub ma se non è presente va creata con<br />
<br />
<pre><code>
</code>
<blockquote>ssh-keygen -t rsa</blockquote></pre><br />
e importata nel repository amministrativo gitosis-admin con<br />
<pre><code></code>
<blockquote>sudo -H -u git gitosis-init < ~/.ssh/id_rsa.pub </blockquote></pre><br />
il quale confermerà con un<br />
<br />
<pre><code></code>
<blockquote>Initialized empty Git repository in ./
Initialized empty Git repository in ./</blockquote></pre>si lo dirà 2 volte.<br />
<br />
Bisogna aggiornare alcuni permessi poichè gitosis li imposta in maniera non corretta<br />
<pre><code></code>
<blockquote>sudo chmod 755 /home/git/repositories/gitosis-admin.git/hooks/post-update</blockquote></pre><br />
A questo punto il repository amministrativo è pronto e lo si può accedere ovviamente utilizzando git con<br />
<br />
<blockquote>git clone git@localhost:gitosis-admin.git</blockquote><br />
<br />
verrà creata una sandbox con il file e la directory<br />
<br />
<br />
<blockquote>-rw-r--r-- 1 valerio valerio 142 2009-07-04 17:31 gitosis.conf<br />
drwxr-xr-x 2 valerio valerio 80 2009-07-04 17:31 keydir</blockquote><br />
<br />
gitosis.conf contiene la configurazione degli utenti mentre keydir contiene le chiavi pubbliche di tutti gli utenti (compresa già quella di <span style="font-style: italic;">valerio</span> che è stata passata precedentemente con il comando <code>sudo -H -u git gitosis-init < ~/.ssh/id_rsa.pub </code>)<br />
<br />
gitosis.conf contiene le seguenti voci<br />
<br />
[gitosis]<br />
<br />
[group gitosis-admin]<br />
writable = gitosis-admin<br />
members = valerio@ken<br />
<br />
il che significa che attualmente il repository <span style="font-style: italic;">gitosis-admin</span> è accedibile da valerio dalla macchina ken utilizzando la chiave pubblica valerio@ken che è in<br />
<blockquote><br />
ls -l keydir/<br />
-rw-r--r-- 1 valerio valerio 393 2009-07-04 17:31 valerio@ken.pub</blockquote><br />
<br />
A questo punto l'installazione è conclusa anche se ovviamente dovrebbero essere aggiunti i repository su cui si vuole versionare il proprio codice. Supponendo di voler creare un repository chiamato <span style="font-weight: bold;">personale</span> gitosis.conf assumerà l'aspetto<br />
<br />
[gitosis]<br />
<br />
[group gitosis-admin]<br />
writable = gitosis-admin<br />
members = valerio@ken<br />
<br />
[group team]<br />
writable = personale<br />
members = valerio@ken<br />
<br />
dopodichè va fatto il commit ed il push di queste modifiche<br />
<br />
<blockquote>git commit -m "new personal repository" -a<br />
git push</blockquote><br />
<br />
a questo punto l'utente valerio@ken è in grado di creare il repository personale con<br />
<br />
<blockquote>cd /tmp<br />
mkdir personale<br />
cd personale/<br />
git init<br />
git remote add origin git@localhost:personale.git<br />
echo "il mattino ha l'oro in bocca" > readme.txt<br />
git add readme.txt<br />
git commit -m "primo file"<br />
git push origin master</blockquote><br />
<br />
e il repository <span style="font-style: italic;">personale</span> adesso è accessibile con<br />
<br />
<blockquote>git clone git@localhost:personale.git</blockquote><span style="font-weight: bold;">Utenti multipli<br />
<br />
</span>Ovviamente è possibile utilizzare utenti multipli per un singolo repository aggiungendo vari utenti alla configurazione<br />
[group team]<br />
writable = personale<br />
members = vcrini@vcrini-laptop valerio@ken<br />
<br />
qui il repository mysite è scrivibile da vcrini e valerio. In <span style="font-weight: bold;">keydir</span> va copiata a mano la chiave pubblica <span style="font-weight: bold;">vcrini@vcrini-laptop.pub<br />
<br />
Volete debuggare?<br />
<br />
<span style="font-weight: bold;"><span style="font-weight: bold;"><span style="font-weight: bold;"></span></span></span><br />
</span> Aggiungere "loglevel = DEBUG" proprio sotto la voce [gitosis] e fate attenzione agli spazi altrimenti non funziona.<br />
<br />
[gitosis]<br />
loglevel = DEBUG<br />
<br />
[group gitosis-admin]<br />
writable = gitosis-admin<br />
...<br />
<br />
<b>Maggiori informazioni?</b><br />
C'è un ottimo tutorial su Git <a href="http://excess.org/article/2008/07/ogre-git-tutorial/">qui</a>.valeriushttp://www.blogger.com/profile/18409632335227000779noreply@blogger.com0tag:blogger.com,1999:blog-6722400579814922944.post-42354955141866710792009-05-26T10:19:00.006+02:002009-05-26T16:54:26.107+02:00ubuntu e terminali multipli<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirYG4skzDKI6pzju0tclr3xJJTB9_0jqpGnb1R-ByHM-ee_sVuTUiHa292LNRkl-3PZqfmQ8SixXt5KNYHXKDR24PBbxLyxgmDTNppCzUTWNm48aVCpunfQsQ7CDSIyt31QWi5enTJDBI/s1600-h/Immagine.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 320px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirYG4skzDKI6pzju0tclr3xJJTB9_0jqpGnb1R-ByHM-ee_sVuTUiHa292LNRkl-3PZqfmQ8SixXt5KNYHXKDR24PBbxLyxgmDTNppCzUTWNm48aVCpunfQsQ7CDSIyt31QWi5enTJDBI/s400/Immagine.png" alt="" id="BLOGGER_PHOTO_ID_5340045531866360210" border="0" /></a><br />Con <span class="blsp-spelling-error" id="SPELLING_ERROR_0">linux</span> a me torna comodo avere una visualizzazione di questo tipo dei terminali<br /><br />il problema è che mi tocca fare sempre tutto a mano fino a che non ho scoperto questa riga di comando:<br /><br />gnome-terminal --<span class="blsp-spelling-error" id="SPELLING_ERROR_1">geometry</span>=160x30 && gnome-terminal --<span class="blsp-spelling-error" id="SPELLING_ERROR_2">geometry</span>=80x21+0+820 && gnome-terminal --<span class="blsp-spelling-error" id="SPELLING_ERROR_3">geometry</span>=73x21-1+820<br /><br />mettendo questo comando in uno script <span style="font-style: italic;">multi_finestra</span><br /><br /><blockquote>#!/<span class="blsp-spelling-error" id="SPELLING_ERROR_4">bin</span>/<span class="blsp-spelling-error" id="SPELLING_ERROR_5">sh</span><br />gnome-terminal --<span class="blsp-spelling-error" id="SPELLING_ERROR_6">geometry</span>=160x30 && gnome-terminal --<span class="blsp-spelling-error" id="SPELLING_ERROR_7">geometry</span>=80x21+0+820 && gnome-terminal --<span class="blsp-spelling-error" id="SPELLING_ERROR_8">geometry</span>=73x21-1+820</blockquote><br />e rendendolo eseguibile con<br /><br /><blockquote><span class="blsp-spelling-error" id="SPELLING_ERROR_9">chmod</span> u+x multi_finestra</blockquote><br /><br />adesso, associandole un tasto veloce riesco a fare tutto con una semplice combinazione di tasti<br /><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKvtUBl8UKQMIg3z5k7xmtX6ocjhdush2dytB9g8yykoD3-s1SR7KQ64Y0OGHlQ9HCij0NSn6gv0ql_ra8v6wYDyPshtHjiFsfBbc5KRutZG6BWb3_BqaXuPvsobTWoCRsmoW4EqBUGI4/s1600-h/Immagine3.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 254px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKvtUBl8UKQMIg3z5k7xmtX6ocjhdush2dytB9g8yykoD3-s1SR7KQ64Y0OGHlQ9HCij0NSn6gv0ql_ra8v6wYDyPshtHjiFsfBbc5KRutZG6BWb3_BqaXuPvsobTWoCRsmoW4EqBUGI4/s400/Immagine3.png" alt="" id="BLOGGER_PHOTO_ID_5340049575376824562" border="0" /></a>valeriushttp://www.blogger.com/profile/18409632335227000779noreply@blogger.com0tag:blogger.com,1999:blog-6722400579814922944.post-22288949457023281302009-05-16T23:24:00.007+02:002009-05-26T17:04:33.456+02:00Pycon 3 - La conferenza italiana di Python a Firenze<div>Da Venerdì 8 a Domenica 10 Maggio si è tenuta a Firenze la terza conferenza italiana sul <span class="blsp-spelling-error" id="SPELLING_ERROR_0">linguaggio python</span>.<br />Un'incontro molto interessante per chi usa il linguaggio <span class="blsp-spelling-error" id="SPELLING_ERROR_1">Python</span> e per chi (come me) è semplicemente incuriosito dal fermento che viene fatto scaturire da un incontro con persone legate da un'interessa comune come l'informatica.<br />La conferenza aveva un'ospite di eccezione quest'anno: Guido Van <span class="blsp-spelling-error" id="SPELLING_ERROR_2">Rossum</span> il papà di <span class="blsp-spelling-error" id="SPELLING_ERROR_3">Python</span> ovvero colui che lo ideò tanti anni fa che ha tenuto uno talk sulla <a href="http://www.pycon.it/conference/talks/retrospective-how-community-helped-build-python-30">nuova versione 3 del linguaggio</a> ed uno su <a href="http://www.pycon.it/conference/talks/google-app-engine-2">Google <span class="blsp-spelling-error" id="SPELLING_ERROR_4">App</span></a>.</div><br /><div>In particolare ho trovato molto interessante il talk di Martelli su le <a href="http://www.pycon.it/conference/talks/lo-zen-e-larte-della-manutenzione-delle-astrazioni">Astrazioni</a> , l'epopea della <a href="http://www.pycon.it/conference/talks/il-buono-il-brutto-il-cattivo">conversione del modulo <span class="blsp-spelling-error" id="SPELLING_ERROR_5">postgrep</span> da <span class="blsp-spelling-error" id="SPELLING_ERROR_6">python</span> 2 a <span class="blsp-spelling-error" id="SPELLING_ERROR_7">python</span> 3</a> di Federico di Gregorio e il corso di <a href="http://www.pycon.it/conference/talks/developing-financial-software">software finanziario</a> tenuto da Stefano Taschini.<br /><br />Una nota a parte per una introduzione <a href="http://www.pycon.it/conference/talks/erlang-python-lunione-di-due-mondi">all'utilizzo di <span class="blsp-spelling-error" id="SPELLING_ERROR_8">Erlang</span></a> che con <span class="blsp-spelling-error" id="SPELLING_ERROR_9">Python</span> ha ben poco a che fare ma che è stata molto gradita sia per la simpatia del suo relatore che per l'interesse che è stato destato sull'argomento.<br /><br />Insomma nel complesso una conferenza ben fatta, ben organizzata e ricca di contenuti. La cosa che più mi ha colpito è stata la grande abilità nel rendere appassionante l'incontro e questo è un grande merito trasversale all'argomento trattato.<br /><br /></div>valeriushttp://www.blogger.com/profile/18409632335227000779noreply@blogger.com0tag:blogger.com,1999:blog-6722400579814922944.post-57695111832643938452009-02-09T09:55:00.002+01:002009-02-09T09:58:26.191+01:00xml e wsdl in perlDato uno schema wsdl e il modulo SOAP::Lite di perl è semplice ottenere una modulo perl personalizzato per effettuare le chiamate semplicemente utilizzando il comando<br /><br />stubmaker.pl 'file:./schema.wsdl'<br /><br />in questo modo verrà creato il modulo <span style="font-weight: bold;">schema.wsdl</span> che contiene tutte le chiamate previste nello schemavaleriushttp://www.blogger.com/profile/18409632335227000779noreply@blogger.com0tag:blogger.com,1999:blog-6722400579814922944.post-36809807545484940692009-02-03T09:07:00.003+01:002009-02-03T09:11:37.896+01:00Ubuntu e firefox senza audio su youtubeMamma mia per mesi ho avuto l'impossibilità di sentire l'audio su youtube malgrado l'audio funzionasse correttamente il player di ubuntu.<br />Il problema si è verificato facendo l'upgrade da ubuntu 8.04 a 8.10 e questa è la soluzione:<br /><br />killall pulseaudio<br />sudo apt-get remove pulseaudio<br />sudo apt-get install esound esound-clients libao2<br />sudo rm /etc/X11/Xsession.d/70pulseaudio<br /><br />adesso posso finalmente tornare a sentire "L'uomo che usciva la gente"valeriushttp://www.blogger.com/profile/18409632335227000779noreply@blogger.com2tag:blogger.com,1999:blog-6722400579814922944.post-68099638911459530612009-01-28T10:18:00.003+01:002009-01-28T11:35:55.918+01:00validatore xml sotto linux con vimMi avrebbe evitato un'errore qualche giorno fa mentre testavo un parser di xml proprio perchè vim 7 non ha di default un formattatore e validatore di xml ma è molto semplice aggiungerne uno.<br /><br />Inserendo in vimrc la seguente riga<br /><br />vmap ,px !xmllint --format -<cr><br /><br />basta selezionare in modalità visuale ciò che si vuole verificare e digitare ',px' a questo punto se l'xml è valido viene formattato altrimenti segnala un errore e specifica anche il punto.<br /><br />Quindi si passa da<br /><br /><xml version="1.0" encoding="UTF-8" standalone="yes"> <message version="1" type="foo"> <metadata1> bla</metadata1> <metadata2> bla bla</metadata2> </message><br /><br />a<br /><br /><xml version="1.0" encoding="UTF-8" standalone="yes"> <br /><message version="1" type="foo"><br /><metadata1> bla</metadata1><br /><metadata2> bla bla</metadata2><br /></message><br /><br />ma se c'è un errore (ad esempio manca un '?' iniziale)<br /><br /><xml version="1.0" encoding="UTF-8" standalone="yes"> <message version="1" type="foo"> <metadata1> bla</metadata1> <metadata2> bla bla</metadata2> </message><br /><br />otteniamo<br /><br />-:1: parser error : attributes construct error<br /><xml version="1.0" encoding="UTF-8" standalone="yes"> <message version="1" type="" parser="" error="" couldn="" t="" find="" end="" of="" start="" tag="" xml="" line="" 1=""><xml version="1.0" encoding="UTF-8" standalone="yes"> <message version="1" type="" parser="" error="" extra="" content="" at="" end="" of="" the="" document=""><xml version="1.0" encoding="UTF-8" standalone="yes"> <message version="1" type=""><br /> <br /></message></xml></message></xml></message></xml></xml></cr><cr><xml version="1.0" encoding="UTF-8" standalone="yes"><xml version="1.0" encoding="UTF-8" standalone="yes"><message version="1" type="" parser="" error="" couldn="" t="" find="" end="" of="" start="" tag="" xml="" line="" 1=""><xml version="1.0" encoding="UTF-8" standalone="yes"><message version="1" type="" parser="" error="" extra="" content="" at="" end="" of="" the="" document=""><xml version="1.0" encoding="UTF-8" standalone="yes"><message version="1" type=""><br /></message></xml></mevaleriushttp://www.blogger.com/profile/18409632335227000779noreply@blogger.com0tag:blogger.com,1999:blog-6722400579814922944.post-50954250920721596142008-12-23T10:35:00.004+01:002008-12-23T11:38:01.905+01:00database, thread e transazioniProprio in questi giorni a lavoro mi sono imbattuto in un problema non banale riguardo le transazioni dei database.<br />Avevo 2 <span class="blsp-spelling-error" id="SPELLING_ERROR_0">thread</span> <span style="font-weight: bold;">A</span> che scriveva su <span class="blsp-spelling-error" id="SPELLING_ERROR_1">db</span> e <span style="font-weight: bold;">B</span> che doveva leggere il dato.<br />Nel mio flusso ideale la cosa avrebbe dovuto funzionare così<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiq0zc49b-Ts6WPLWYJ6h2NiPkSwfn_GMidaouKduiW7iTW6SMxQO-8VdmkAL_cKLg49ujPvtzbTLGCy8F9Ahef-U6kV-pdI8obEhDCHqU-xiMCxOy5NX3yEK0sWuDs4piR_xdOLEJB1Ds/s1600-h/path3465.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 81px; height: 166px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiq0zc49b-Ts6WPLWYJ6h2NiPkSwfn_GMidaouKduiW7iTW6SMxQO-8VdmkAL_cKLg49ujPvtzbTLGCy8F9Ahef-U6kV-pdI8obEhDCHqU-xiMCxOy5NX3yEK0sWuDs4piR_xdOLEJB1Ds/s400/path3465.png" alt="" id="BLOGGER_PHOTO_ID_5282931866606241602" border="0" /></a><br />invece dopo qualche ora spesa a cercare di capire come mai B fallisse sempre a leggere i dati e dopo aver controllato l'<span class="blsp-spelling-error" id="SPELLING_ERROR_4">access</span> <span class="blsp-spelling-error" id="SPELLING_ERROR_5">log</span> mi sono accorto che B leggeva i dati prima che A li avesse scritti!<br /><br />quindi succedeva che<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXqGpQ-G3Nc8YUs4UfdIBvjJc8DTz-TZHKwA71q10k6uiHh02h1LkOGmD6-7Uz9okoKUFjIqBgeKHD7_iAXdb4Ocv9IZfT1luVse99KJ6nCv2n8hiaUk6v7cEVutQPVv6AzziP4Xgp2ic/s1600-h/path3495.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 81px; height: 166px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXqGpQ-G3Nc8YUs4UfdIBvjJc8DTz-TZHKwA71q10k6uiHh02h1LkOGmD6-7Uz9okoKUFjIqBgeKHD7_iAXdb4Ocv9IZfT1luVse99KJ6nCv2n8hiaUk6v7cEVutQPVv6AzziP4Xgp2ic/s400/path3495.png" alt="" id="BLOGGER_PHOTO_ID_5282932313741457490" border="0" /></a><br />Visto che l'ordine di esecuzione non poteva essere previsto ho dovuto creare in B un meccanismo che tentasse di leggere il dato più volte o fino a soddisfare la lettura, o fino a raggiungere un numero massimo di tentativi ed uscire con errore.<br /><br />quindi ho fatto una cosa del genere<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFdhvcPrVVL30wf_z-MNWg2teZBI0vmenB4Ql2FaJJ7Hf8vek7q4szUtDdB_-Pu6h2Y1gkPDTxKXEEAdvviDMRCiBGK7CeTekX7KIzhNS3Wpldl_yg6E2h-JoqTI0WYSHo0IB_VsT76Ak/s1600-h/text3389.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 81px; height: 370px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFdhvcPrVVL30wf_z-MNWg2teZBI0vmenB4Ql2FaJJ7Hf8vek7q4szUtDdB_-Pu6h2Y1gkPDTxKXEEAdvviDMRCiBGK7CeTekX7KIzhNS3Wpldl_yg6E2h-JoqTI0WYSHo0IB_VsT76Ak/s400/text3389.png" alt="" id="BLOGGER_PHOTO_ID_5282932611894625506" border="0" /></a><br />Ma qui sono successe cose sinistre.<br /><br />Infatti dall'<span class="blsp-spelling-error" id="SPELLING_ERROR_6">access</span> <span class="blsp-spelling-error" id="SPELLING_ERROR_7">log</span> risultata che A aveva scritto il dato mentre B che aveva iniziato a leggerlo precedentemente falliva anche quando A aveva terminato la sua scrittura.<br />Grazie all'aiuto dei miei colleghi più esperti mi è stato spiegato che B iniziava la sua transazione prima della fine della scrittura da parte di A e B, per consistenza, manteneva lo stato iniziale di fallimento di ricerca del dato. Quindi anche se avessi letto quel valore per ore dopo che A lo aveva scritto avrei sempre trovato la situazione iniziale della base dati ovvero nessun dato trovato!<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQXfMKjUG47rZ4rErcEEWMj4eRHxiGpsFXwTODoIVZONYFcaglEWffHDpNX4HB_Wh0pT3ERFWo6gf9qX0ceJCpI3C74tBqFag3cNHrJMMhNcCoLBW5J5HE376VIkH0g3Za5v9GMHXCi7k/s1600-h/1.jpg.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 252px; height: 376px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQXfMKjUG47rZ4rErcEEWMj4eRHxiGpsFXwTODoIVZONYFcaglEWffHDpNX4HB_Wh0pT3ERFWo6gf9qX0ceJCpI3C74tBqFag3cNHrJMMhNcCoLBW5J5HE376VIkH0g3Za5v9GMHXCi7k/s400/1.jpg.png" alt="" id="BLOGGER_PHOTO_ID_5282931411455601378" border="0" /></a><br /><br />Armato di sana pazienza e spulciando la documentazione del <span class="blsp-spelling-error" id="SPELLING_ERROR_8">DB</span> (<span class="blsp-spelling-error" id="SPELLING_ERROR_9">mysql</span> in questo caso ma tutti i moderni <span class="blsp-spelling-error" id="SPELLING_ERROR_10">db</span> con supporto alla transazioni hanno l'equivalente istruzione) ho trovato alla fine il comando che disabilita questo comportamento ovvero:<br /><br />set <span class="blsp-spelling-error" id="SPELLING_ERROR_11">transaction</span> <span class="blsp-spelling-error" id="SPELLING_ERROR_12">isolation</span> <span class="blsp-spelling-error" id="SPELLING_ERROR_13">level</span> <span class="blsp-spelling-error" id="SPELLING_ERROR_14">read</span> <span class="blsp-spelling-error" id="SPELLING_ERROR_15">committed</span>;<br /><br />Con questo comando B è stato in grado di accorgersi quando il dato è divenuto disponibile ed io ho risolto il mio gravoso problema.valeriushttp://www.blogger.com/profile/18409632335227000779noreply@blogger.com0tag:blogger.com,1999:blog-6722400579814922944.post-81228640001247078472008-10-13T15:24:00.004+02:002008-10-13T15:28:16.332+02:00mysqldump singole insertLe versioni più recenti di mysqldump creano una insert multipla per gruppi di insert simili. Ad esempio con mysqldump si ottiene:<br /><br /><br />INSERT INTO `events` VALUES (6582,11,'1223390359:164321',6285,'bla bla bla',10,'2008-10-07 16:39:21','bank_id=60702&charge_id=079208%409001914','BA8CF7E8-947D-11DD-8B00-488D047A8996',NULL,NULL,'079208@9001914'),(6583,11,'1223390362:164327',NULL,'bla bla bla',10,'2008-10-07 16:39:22','bank_id=60702&charge_id=079208%409001914','BB3FCB48-947D-11DD-9E00-488D047A8996',NULL,NULL,'079208@9001914'), ...<br /><br />aggiungendo il parametro<br /><br />--extended-insert=false si ottiene<br /><br />INSERT INTO `events` VALUES (6582,11,'1223390359:164321',6285,'bla bla bla',10,'2008-10-07 16:39:21','bank_id=60702&charge_id=079208%409001914','BA8CF7E8-947D-11DD-8B00-488D047A8996',NULL,NULL,'079208@9001914');<br />INSERT INTO `events` VALUES (6583,11,'1223390362:164327',NULL,'bla bla bla',10,'2008-10-07 16:39:22','bank_id=60702&charge_id=079208%409001914','BB3FCB48-947D-11DD-9E00-488D047A8996',NULL,NULL,'079208@9001914');<br />INSERT INTO `events` VALUES (6584,11,'1223390943:167153',NULL,'bla bla bla',10,'2008-10-07 16:49:04','bank_id=60702&charge_id=079208%409001914','15DA559A-947F-11DD-B959-D093047A8996',NULL,NULL,'079208@9001914');valeriushttp://www.blogger.com/profile/18409632335227000779noreply@blogger.com0tag:blogger.com,1999:blog-6722400579814922944.post-17959691498533081942008-10-03T11:19:00.003+02:002008-10-03T11:35:22.075+02:00Perl OnelinerTalvolta mi capitano log del tipo:<br /><br /><span style="font-style: italic;">2008-10-03 09:28:55,204 [10544] Dada::Rufus INFO final status: @101: uid:'+919791100668' appid:'122301909010729816767' : 'book' -> 'ACK' in 1.120 s.</span><br /><span style="font-style: italic;">2008-10-03 09:28:56,320 [9779] Dada::Rufus INFO final status: @56: uid:'+557988275004' appid:'122301908814163698835' : 'book' -> 'NACK' in 4.345 s.</span><br /><span style="font-style: italic;">2008-10-03 09:28:57,572 [10551] Dada::Rufus INFO final status: @101: uid:'' appid:'122301909010729816767' : 'capture' -> 'NACK' in 2.106 s.</span><br /><br />supponiamo che voglia sapere quali diversi tipi di occorrenza del tipo '@...' ci siano.<br /><br />In questo caso è semplice perché ce ne sono 2<br /><br />@101 e @56<br /><br />ma se il log è lungo parecchie centinaia di mega la cosa non è semplice.<br /><br />Questa cosa, con le coreutils di linux si possono compiere velocemente, ancor più velocemente usando <span style="font-weight: bold;">perl</span>.<br /><br />per estrarre dalle righe le varie etichette eseguo per da riga di comando facendo tornare con un'espressione regolare le parole che iniziano con '@':<br /><br />perl -ne ' print "$1\n" if ($_=~/@(\w+)/)'<br /><br />quindi supponendo che queste righe siano nel mio file di log utilizzo<br /><br />cat filelog| perl -ne ' print "$1\n" if ($_=~/@(\w+)/)'<br /><br />però così facendo ottengo una serie di<br /><br />@101<br />@56<br />@101<br />@...<br /><br />io voglio conoscere le occorrenze uniche e per questo ecco 2 utilità che tornano alla mano <span style="font-weight: bold;">sort</span> e <span style="font-weight: bold;">uniq</span><br /><br />quindi il mio comando diviene<br /><br />perl -ne ' print "$1\n" if ($_=~/@(\w+)/)' | sort | uniq<br /><br />e ottengo la lista di occorrenze uniche ricercata<br /><br />N.B. per ottenere questo risultato non è necessario ricorrere al perl infatti spesso viene utilizzato awk. Per me l'utilizzo di awk se non per le cose più semplici è molto criptico e, conoscendo perl, preferisco utilizzarlo al suo posto.valeriushttp://www.blogger.com/profile/18409632335227000779noreply@blogger.com0tag:blogger.com,1999:blog-6722400579814922944.post-43124558165413703732008-09-30T15:26:00.003+02:002008-10-02T00:11:39.107+02:00virtualbox: come duplicare un hard disk virtuale<span class="blsp-spelling-error" id="SPELLING_ERROR_0">VirtualBox</span> è un <span class="blsp-spelling-error" id="SPELLING_ERROR_1">virtualizzatore</span> di macchine tipo <span class="blsp-spelling-error" id="SPELLING_ERROR_2">VMWare</span>.<br />Talvolta è necessario duplicare un hard disk virtuale ma ciò non si può fare come sembrerebbe ovvio con un '<span class="blsp-spelling-error" id="SPELLING_ERROR_3">cp</span> <span style="font-style: italic;"><span class="blsp-spelling-error" id="SPELLING_ERROR_4">nomehd</span> <span class="blsp-spelling-error" id="SPELLING_ERROR_5">nomehdnuovo</span></span>' <span class="blsp-spelling-error" id="SPELLING_ERROR_6">poichè</span> ciò creerebbe due hard disk con lo stesso <span class="blsp-spelling-error" id="SPELLING_ERROR_7">UUID</span> e <span class="blsp-spelling-error" id="SPELLING_ERROR_8">virtualbox</span> non aggiungerebbe la nuova periferica virtuale al parco hard disk.<br />Ecco invece come si deve fare:<br /><span style=";font-family:arial;font-size:100%;" ><br /><code><span class="blsp-spelling-error" id="SPELLING_ERROR_9">VBoxManage</span> <span class="blsp-spelling-error" id="SPELLING_ERROR_10">clonevdi</span> </code>/home/valerio/.VirtualBox/gentoo.vdi /home/valerio/.VirtualBox/backup-gentoo.vdi<br /></span><br />avendo cura di digitare il percorso completo degli hard disk virtuali altrimenti non funziona.valeriushttp://www.blogger.com/profile/18409632335227000779noreply@blogger.com0tag:blogger.com,1999:blog-6722400579814922944.post-8350161919971328322008-09-24T19:04:00.006+02:002008-09-27T18:19:27.769+02:00Perl e lo zenDi lavoro faccio il programmatore e ogni tanto mi balocco, nel tempo libero, con il mio coltellino svizzero: <span style="font-weight: bold;">perl</span>.<br /><br />Oggi voglio mostrare come sia possibile con un istruzione piuttosto semplice fare una cosa che nei linguaggi tipo Java o C/C++ è molto tediosa.<br /><br />Supponiamo di dover generare una sequenza di numeri del tipo<br /><br />1 0<br />2 1500<br />3 3000<br />4 6000<br />5 15000<br />6 30000<br />7 50000<br />8 100000<br />9 200000<br />10 300000<br />11 400000<br />12 500000<br />13 600000<br />14 700000<br />15 800000<br />16 900000<br />17 1000000<br />18 1100000<br />19 1200000<br />20 1300000<br />21 1400000<br />22 1500000<br />23 1600000<br />24 1700000<br />25 1800000<br />26 1900000<br />27 2000000<br />28 2100000<br />29 2200000<br />30 2300000<br />31 2400000<br />32 2500000<br />33 2600000<br />34 2700000<br />35 2800000<br />36 2900000<br /><br />(chi indovina cosa potrebbero rappresentare? )<br /><br />cerchiamo di capire come potrebbe essere risolto. Innanzi tutto la struttura più adatta che viene in mente è quella di un array in cui in ogni posizione è occupata dal valore sulla seconda colonna.<br /><br />Una soluzione banale è dichiarare un array che contenga tutti i valori.<br /><br />@array=(0, 1500, 3000, 6000, 15000, 30000, 50000, 100000, 200000, 300000, 400000, 500000, 600000, 700000, 800000, 900000, 1000000, 1100000, 1200000, 1300000, 1400000, 1500000, 1600000, 1700000, 1800000, 1900000, 2000000, 2100000, 2200000, 2300000, 2400000, 2500000, 2600000, 2700000, 2800000, 2900000)<br /><br />ma la cosa oltre che essere lunghina è poco <span style="font-style: italic;">perlosa</span>.<br /><br />Ecco come potremmo procedere dopo aver fatto la seguente osservazione: la sequenza che va da 0 fino al valore 100000 è irregolare mentre successivamente raddoppia sempre.<br /><br />Dividiamo quindi il problema in 2 sotto problemi la prima e la seconda parte della stringa<br /><br />@prima=(0, 1500, 3000, 6000, 15000, 30000, 50000)<br /><br />e<br /><br />@seconda=(100000, 200000, 300000, 400000, 500000, 600000, 700000, 800000, 900000, 1000000, 1100000, 1200000, 1300000, 1400000, 1500000, 1600000, 1700000, 1800000, 1900000, 2000000, 2100000, 2200000, 2300000, 2400000, 2500000, 2600000, 2700000, 2800000, 2900000)<br /><br />per la prima parte c'è poco da fare però può essere scritta nella forma<br /><br />@prima=qw(0 1500 3000 6000 15000 30000 50000)<br /><br />per risparmiare leggermente qualche digitazione (e per scriverla anche in modo un po più leggibile) altrimenti addirittura<br /><br />@prima=map{$_*100} qw(0 15 30 60 150 300 500)<br /><br />in cui si scrivono ancora meno caratteri grazie alla funzione <span style="font-weight: bold;">map</span> che consente di eseguire un'operazione su ogni elemento di una stringa e in questo caso moltiplica ogni elemento generato da qw(0 15 30 60 150 300 500) per 100.<br /><br />Sfruttando quest'ultima peculiarità basta osservare che l'array @seconda non è altro che una successione di valori da 1 a 29 moltiplicati per 100000.<br />quindi posso scrivere<br /><br />@secondo=map{$_*100_000} (1..29)<br /><br />ed anche il secondo elemento è generato.<br /><br />Quindi per concludere la lista dei valori viene generata da questa unica istruzione:<br /><br />@array=(map{$_*100} qw(0 15 30 60 150 300 500),map{$_*100_000} (1..29))<br /><br />un bel risparmio ...valeriushttp://www.blogger.com/profile/18409632335227000779noreply@blogger.com0tag:blogger.com,1999:blog-6722400579814922944.post-29062991875331706792008-09-19T20:20:00.004+02:002008-09-27T18:19:50.546+02:00Quarto Perl Workshop ItalianoAnche se l'argomento non riguarda esplicitamente il mondo <span class="blsp-spelling-error" id="SPELLING_ERROR_0">linux</span> mi sento in <span style="font-style: italic;">dovere</span> di recensire l'incontro che si è tenuto il 18 e il 19 Settembre a Pisa incentrato sul linguaggio <span style="font-weight: bold;"><span class="blsp-spelling-error" id="SPELLING_ERROR_1">perl</span></span>. Per chi non lo conoscesse il <span class="blsp-spelling-error" id="SPELLING_ERROR_2">perl</span> è un linguaggio interpretato nato quasi alla fine degli anni 80 che permette con il suo zucchero sintattico molto sintetico di scrivere programmi molto compatti.<br />Questa sua caratteristica è sia una cosa positiva che negativa infatti se utilizzata in maniera errata permette di scrivere programmi <a href="http://en.wikipedia.org/wiki/Obfuscated_Perl_contest">incomprensibili</a>.<br />Questo linguaggio è stato definito superficialmente un linguaggio <span style="font-weight: bold;"><span class="blsp-spelling-error" id="SPELLING_ERROR_3">bash</span> con gli steroidi</span>.<br />In realtà per me il <span class="blsp-spelling-error" id="SPELLING_ERROR_4">perl</span> è "Il linguaggio di programmazione" <span class="blsp-spelling-error" id="SPELLING_ERROR_5">perchè</span> l'ho imparato dopo aver utilizzato il C, trovandomi con un linguaggio di una potenza espressiva senza paragoni; come se avessi comprato una <span class="blsp-spelling-error" id="SPELLING_ERROR_6">smart</span> e uscissi dal concessionario con la mach 5.<br />Questo <a href="http://conferences.yapceurope.org/ipw2008/">workshop</a> ha riacceso in me la passione che avevo quasi dieci anni fa per questo linguaggio e questo è un gran merito agli organizzatori dell'evento.<br />Oggigiorno il <span class="blsp-spelling-error" id="SPELLING_ERROR_7">perl</span> è considerato un linguaggio "obsoleto" <span class="blsp-spelling-corrected" id="SPELLING_ERROR_8">perché</span> poco leggibile e <span class="blsp-spelling-error" id="SPELLING_ERROR_9">manutenibile</span> rispetto a <span class="blsp-spelling-error" id="SPELLING_ERROR_10">Python</span> e <span class="blsp-spelling-corrected" id="SPELLING_ERROR_11">soprattutto</span> <span class="blsp-spelling-error" id="SPELLING_ERROR_12">Ruby</span>, ma mi è bastato seguire un talk intitolato "<span class="blsp-spelling-error" id="SPELLING_ERROR_13">beautyful</span> <span class="blsp-spelling-error" id="SPELLING_ERROR_14">perl</span>" per ottenere ottime argomentazioni al prossimo che mi dirà che il <span class="blsp-spelling-error" id="SPELLING_ERROR_15">perl</span> è "<span class="blsp-spelling-error" id="SPELLING_ERROR_16">read</span> <span class="blsp-spelling-error" id="SPELLING_ERROR_17">only</span>".<br />E poi in realtà non sono il difensore di nessun linguaggio <span class="blsp-spelling-corrected" id="SPELLING_ERROR_18">perché</span> c'è più differenza tra un buon programmatore e un cattivo programmatore che tra un buon linguaggio e un cattivo linguaggio di programmazione.<br />Un grazie di cuore agli organizzatori che hanno ridestato il <span style="font-style: italic;">cammello</span> che è in me.valeriushttp://www.blogger.com/profile/18409632335227000779noreply@blogger.com0tag:blogger.com,1999:blog-6722400579814922944.post-68494029334139641862008-09-10T15:08:00.001+02:002008-09-27T18:20:14.151+02:00Maledetti "a capo"Usate unix e volete avere gli "a capo" in stile unix? Con il <span style="font-weight: bold;">vi</span> è facilissimo basta usare il comando<br /><br /><span>:</span><span style="font-style: italic;">set fileformat=unix</span><br /><br />e se volete fare il viceversa (ovvero convertire dallo stile dos allo stile unix)<br /><br /><span>:</span><span style="font-style: italic;">set fileformat=dos</span><br /><br />per maggiori informazioni<br /><br />:<span style="font-style: italic;">help fileformat<br /></span><span style="font-size:85%;"><br />un ringraziamento a <a href="http://diteloconunatorta.blogspot.com/">http://diteloconunatorta.blogspot.com/</a> per aver sollevato il problema</span><span style="font-style: italic;"><br /></span>valeriushttp://www.blogger.com/profile/18409632335227000779noreply@blogger.com0tag:blogger.com,1999:blog-6722400579814922944.post-2954031310047807662008-07-15T18:47:00.000+02:002008-07-16T09:12:55.544+02:00History non deve salvareProprio oggi mi è capitato di rilanciare l'ultimo comando eseguito per ricreare l'installazione dai sorgenti della mia applicazione enterprise quando, a sorpresa, ho invece lanciato un commit del mio sistema di versionamento.<br />Purtroppo il mio comando precedente era per l'appunto un commit invece che una ricompilazione come avevo creduto.<br />Come risultato mi sono trovato una riga di log e un commit non voluto sul server dei sorgenti.<br />Mi sono quindi chiesto esiste un modo per far si che la history di linux si <span style="font-weight: bold;">dimentichi</span> alcune cose?<br />Dopo aver tribolato sui motori di ricerca per formulare quello di cui avevo bisogno, poichè i vari '<span style="font-style: italic;">linux history</span>' da me digitati tornavano morte e miracoli sulla storia di linux ma non sul comando history, ho trovato il modo per risolvere il problema.<br /><br />In pratica basta aggiungere nel .bashrc la variabile di ambiente HISTIGNORE con il contenuto da ignorare. Alla fine<br /><br /><br /><span style="font-size:85%;">export HISTIGNORE="svn ci*"</span><br /><br />mi ha risolto la giornata e il mio 'invio' compulsivo.valeriushttp://www.blogger.com/profile/18409632335227000779noreply@blogger.com0