<?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>AlexBio&#039;s Blog</title>
	<atom:link href="http://alexbio.ath.cx/feed/" rel="self" type="application/rss+xml" />
	<link>http://alexbio.ath.cx</link>
	<description>/dev/random</description>
	<lastBuildDate>Mon, 09 Nov 2009 15:48:40 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Usare una penna USB per autenticarsi su Linux</title>
		<link>http://alexbio.ath.cx/2009/11/09/usare-una-penna-usb-per-autenticarsi-su-linux/</link>
		<comments>http://alexbio.ath.cx/2009/11/09/usare-una-penna-usb-per-autenticarsi-su-linux/#comments</comments>
		<pubDate>Mon, 09 Nov 2009 15:48:40 +0000</pubDate>
		<dc:creator>AlexBio</dc:creator>
				<category><![CDATA[Debian]]></category>
		<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[HowTo]]></category>

		<guid isPermaLink="false">http://alexbio.ath.cx/?p=632</guid>
		<description><![CDATA[Introduzione
Da qualche tempo mi sono chiesto come utilizzare in modo utile una mia chiavetta USB (da circa 1GB) che, una volta sostituita da una più capiente, era del tutto inutilizzata. Navigando su internet mi sono imbattuto in un articolo riguardante le &#8220;nuove&#8221; caratteristiche di Vista. Scorrendolo ho notato ad un certo punto che si faceva [...]]]></description>
			<content:encoded><![CDATA[<h3>Introduzione</h3>
<p>Da qualche tempo mi sono chiesto come utilizzare in modo utile una mia chiavetta USB (da circa 1GB) che, una volta sostituita da una più capiente, era del tutto inutilizzata. Navigando su internet mi sono imbattuto in un articolo riguardante le &#8220;nuove&#8221; caratteristiche di Vista. Scorrendolo ho notato ad un certo punto che si faceva riferimento ad un metodo di autenticazione basato sull&#8217;uso di chiavette USB. Da bravo utente Linux mi sono subito informato se ci fosse una cosa simile anche per il pinguino, trovando piuttosto facilmente, un progetto davvero interessante chiamato pam-usb. Come dice il nome si tratta di un modulo per PAM (Pluggable Authentication Modules), che fornisce un metodo di autenticazione basato su un semplice drive USB in modo facile e veloce (necessita di pochissima configurazione).</p>
<h3>Preparazione</h3>
<p>In questo articolo prenderò in considerazione un sistema Debian, ovvero quello da me utilizzato utilizzo, quindi i passaggi da fare potrebbero essere un pò differenti a seconda della distribuzione usata.<br />
Prima di tutto è necessario installare i pacchetti di base:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># apt-get install libpam-usb pamusb-tools</pre></div></div>

<p>Il primo pacchetto contiene il modulo PAM vero e proprio e dipende, innanzitutto da PAM (pare ovvio), HAL (utilizzato per la rilevazione automatica delle penne USB) e pmount (uno strumento per montare periferiche &#8220;hotpluggabili&#8221; come utente normale). Il secondo pacchetto contiene alcuni strumenti per l&#8217;uso del modulo (configurazione, ecc&#8230;).</p>
<p>In alternativa è possibile scaricare i sorgenti dal <a href="http://pamusb.org">sito</a> (che nel momento in cui scrivo pare essere down) e compilare quelli (rispettando ovviamente tutte le dipendenze).</p>
<h3>Configurazione</h3>
<p>Una volta installato il tutto, è necessario configurarlo. Come già detto questa procedura è molto facile e intuitiva.<br />
Per prima cosa è necessario impostare il modulo pam_usb.so come default per l&#8217;autenticazione. Per fare questo bisogna modificare i file di autenticazione di PAM nella cartella &#8216;/etc/pam.d&#8217;. Il file è &#8216;auth-common&#8217;, ma è anche possibile indicare solo alcuni servizi modificando il file appropriato (es &#8216;gdm&#8217;, &#8217;su&#8217;, ecc&#8230;).</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># nano /etc/pam.d/common-auth</pre></div></div>

<p>Una volta aperto è necessario individuare la linea:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">auth	[success=1 default=ignore]	pam_unix.so nullok_secure</pre></div></div>

<p>(come già detto potrebbe variare un po&#8217; a seconda del sistema, ma non ci dovrebbero essere grosse differenze)<br />
E modificarla in:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">auth    requisite			pam_usb.so
auth	[success=1 default=ignore]	pam_unix.so nullok_secure</pre></div></div>

<p>Oltre a &#8216;requisite&#8217;, che richiede la chiavetta obbligatoriamente e poi chiede anche la password dell&#8217;utente, sono disponibili altri due modi: &#8216;required&#8217; che chiede la password anche nel caso che la chiavetta non sia inserita e &#8217;sufficient&#8217; che non richiede la password ma solo la chiavetta. A seconda delle vostre esigenze/preferenze scegliete quello che più vi aggrada.</p>
<p>(Piccola nota: la linea riguardante il modulo &#8216;pam_usb.so&#8217; deve essere necessariamente posta prima delle altre, altrimenti il controllo sulla chiavetta USB verrebbe fatto soltanto dopo la richiesta della password, e risulterebbe un tantino inutile).</p>
<p>A questo punto pam-usb è impostato come predefinito. Il prossimo passo è quello di configurare una chiavetta per l&#8217;autenticazione utilizzando il tool di configurazione &#8216;pamusb-conf&#8217;.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># pamusb-conf --add-device USBPen
Please select the device you wish to add.
* Using &quot;USB Flash Disk (USB_Flash_Disk_90711C0025D8-0:0)&quot; (only option)
&nbsp;
Which volume would you like to use for storing data ?
* Using &quot;/dev/sdb1 (UUID: 41DF-30BA)&quot; (only option)
&nbsp;
Name		: USBPen
Vendor	: USB
Model		: Flash Disk
Serial		: USB_Flash_Disk_90711C0025D8-0:0
UUID		: 41DF-30BA
&nbsp;
Save to /etc/pamusb.conf ?
[Y/n]</pre></div></div>

<p>Dove &#8216;USBPen&#8217; sta per un nome a vostro piacimento. Se è l&#8217;unica chiavetta inserita (come nell&#8217;esempio) non dovrebbero esserci molti problemi, semplicemente digitate &#8216;y&#8217; in modo che il programma modifichi automaticamente il file di configurazione, altrimenti è necessario indicare quale periferica si vuole utilizzare.</p>
<p>L&#8217;ultimo passo consiste nel definire quali utenti debbano essere autenticati tramite pam-usb sempre utilizzando &#8216;pamusb-conf&#8217;.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># pamusb-conf --add-user user</pre></div></div>

<p>Which device would you like to use for authentication ?<br />
* Using &#8220;USBPen&#8221; (only option)</p>
<p>User		: user<br />
Device	: USBPen</p>
<p>Save to /etc/pamusb.conf ?<br />
[Y/n] </pre>
<p>Dove user sta per l'utente desiderato. Se è stata precedentemente configurata una sola periferica, come nell'esempio, semplicemente digitate 'y', altrimenti, come prima, è necessario scegliere quale chiavetta utilizzare.</p>
<p>Per verificare che tutto sia andato a buon fine è possibile utilizzare il tool 'pamusb-check'.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># pamusb-check user
* Authentication request for user &quot;root&quot; (pamusb-check)
* Device &quot;MyDevice&quot; is connected (good).
* Performing one time pad verification...
* Verification match, updating one time pads...
* Access granted.</pre></div></div>

<p>A questo punto è possibile riavviare il sistema (o più semplicemente terminare la sessione corrente, o anche utilizzare sudo) dopodichè, una volta arrivati alla schermata di login (che sia testuale o grafica tipo tramite gdm) e inserito il nome utente viene verificata la presenza della chiavetta, e poi, a seconda delle configurazioni (viste in precedenza) o viene richiesta la password dell'utente o procede direttamente al tentativo di login: se la chiavetta è presente il login riesce altrimenti no.<br />
Se qualcosa fosse andato storto in fase di configurazione e non fosse possibile loggarsi, è possibile avviare il sistema in 'single user mode' modificando opportunamente la configurazione del proprio bootloader.<br />
La configurazione di base a questo punto è finita.</p>
<h3>Pam-usb Agent</h3>
<p>pamusb-agent è uno degli strumenti del pacchetto pamusb-tools e permette di eseguire automaticamente comandi in caso di eventi particolari, generati in caso di estrazione o inserimento della chiavetta.<br />
Nella guida ufficiale, viene menzionato come esempio l'avvio dello screensaver e il blocco del sistema una volta estratta la chiavetta.<br />
Tutti i comandi devono essere inseriti nel file di configurazione '/etc/pamusb.conf'.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># nano /etc/pamusb.conf</pre></div></div>

<p>Aggiungere un'azione è molto semplice, basta modificare la sezione riguardante l'utente desiderato (già creata automaticamente da pamusb-conf). La struttura base di ogni utente dovrebbe assomigliare a quella qui sotto:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">&lt;user id=&quot;user&quot;&gt;
	&lt;device&gt;USBPen&lt;/device&gt;
&lt;/user&gt;</pre></div></div>

<p>Ogni azione ha la seguente sintassi:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">&lt;agent event=&quot;[evento]&quot;&gt;[comando]&lt;/agent&gt;</pre></div></div>

<p>Dove [evento] può essere 'lock' o 'unlock' e [comando] qualsiasi comando shell.</p>
<p>Per l'esempio dello screensaver citato prima (utilizzando GNOME):</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">&lt;user id=&quot;user&quot;&gt;
	&lt;device&gt;USBPen&lt;/device&gt;
	&lt;agent event=&quot;lock&quot;&gt;gnome-screensaver-command --lock&lt;/agent&gt;
	&lt;agent event=&quot;unlock&quot;&gt;gnome-screensaver-command --deactivate&lt;/agent&gt;
&lt;/user&gt;</pre></div></div>

<p>Dopo aver configurato il necessario è possibile avviare pamusb-agent</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ pamusb-agent</pre></div></div>

<p>oppure, come demone:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ pamusb-agent --daemon</pre></div></div>

<p>Per una lista completa delle sue opzioni vi rimando al suo manuale</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ man pamusb-agent</pre></div></div>

<h3>Disattivazione</h3>
<p>Nel caso si voglia disattivare pamusb, senza dover disinstallare e perdere tutta la configurazione, è sufficiente commentare la linea nel file '/etc/pam.d/common-auth' (o nei file modificati prima) riguardante il pamusb.</p>
<p>Quindi da</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">auth    requisite			pam_usb.so
auth	[success=1 default=ignore]	pam_unix.so nullok_secure</pre></div></div>

<p>A</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">#auth    requisite			pam_usb.so
auth	[success=1 default=ignore]	pam_unix.so nullok_secure</pre></div></div>

<h3>Sicurezza</h3>
<p>Per quanto riguarda la sicurezza di pamusb c'è da dire che supporta pienamente i cosiddetti 'One Time Pad', in pratica, ad ogni autenticazione, viene generato una nuova chiave per l'autenticazione successiva, in modo che risulti più difficile per un attaccante determinare tale chiave. Pamusb in particolare usa un semplice algoritmo per generare una chiave casuale basato su poche righe di codice:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">srand<span style="color: #009900;">&#40;</span>getpid<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> time<span style="color: #009900;">&#40;</span>NULL<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>magic<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #339933;">++</span>i<span style="color: #009900;">&#41;</span>
 magic<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span><span style="color: #009900;">&#41;</span>rand<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Questo metodo, IMHO, risulta essere abbastanza sicuro: anche conoscendo il momento di login e logout dell'utente, sarebbe necessario conoscere l'id del processo (dato dalla funzione getpid()) per duplicare la chiave di autenticazione, cosa che, in base alle mie conoscenze, sarebbe possibile solo conoscendo innanzitutto l'id dell'utente che esegue pamusb (informazione abbastanza accessibile) e da lì risalire al processo stesso (a sistema bloccato non so come questo sia possibile se non avendo già accesso al sistema tramite una altro utente), sempre che il sistema non venga spento ad ogni logout, nel qual caso sarebbe impossibile risalire all'id del processo generatore della chiave di auatenticazione. Comunque per proteggersi da questo tipo di attacco, pamusb esegue un controllo anche sul campo venditore, su quello del modello e del numero seriale della periferica USB, riducendo notevolmente la probabilità di riproduzione 'artificiale' della periferica. Il problema si pone se la chiavetta USB utilizzata non ha un numero seriale, infatti, utilizzando un'altra chiavetta dello stesso venditore e dello stesso modello, e dopo aver generato la chiave di autorizzazione (che comunque risulta abbastanza difficile), un attaccante avrebbe facile accesso al sistema. La vulnerabilità principale però risiede nel modo in cui la chiavetta per l'accesso viene utilizzata: risulta abbastanza ovvio che se prestiamo la chiavetta con la chiave di accesso a qualcun altro, la sicurezza del nostro sistema viene compromessa inesorabilmente. </p>
<h3>Conclusioni</h3>
<p>Come avete potuto vedere è davvero molto facile ottenere il supporto all'autenticazione via USB su Linux. Sul sito ufficiale (se mai dovesse tornare online) è presente la documentazione completa, perciò se necessitate di una funzione particolare non citata in questo articolo potete tranquillamente consultare quella. Dal punto di vista della sicurezza, risulta un programma abbastanza robusto (nonostante tutto e prendendo le dovute precauzioni), anche se non mi sento di consigliarlo per quelle realtà professionali in cui la sicurezza è un requisito importante (le mie considerazioni in questo campo possono non risultare poi così precise ed esatte, pamusb richiederebbe una analisi più approfondita da chi magari ne capisce di più); per sistemi per così dire 'amatoriali' ma anche per piccoli uffici risulta essere comunque una buona soluzione.</p>
]]></content:encoded>
			<wfw:commentRss>http://alexbio.ath.cx/2009/11/09/usare-una-penna-usb-per-autenticarsi-su-linux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Virtualizzare Linux con lguest</title>
		<link>http://alexbio.ath.cx/2009/10/16/virtualizzare-linux-con-lguest/</link>
		<comments>http://alexbio.ath.cx/2009/10/16/virtualizzare-linux-con-lguest/#comments</comments>
		<pubDate>Fri, 16 Oct 2009 17:21:04 +0000</pubDate>
		<dc:creator>AlexBio</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[HowTo]]></category>
		<category><![CDATA[Kernel]]></category>
		<category><![CDATA[Virtualizzazione]]></category>

		<guid isPermaLink="false">http://alexbio.ath.cx/?p=622</guid>
		<description><![CDATA[Introduzione
In questo articolo parlerò nuovamente di una funzione del kernel Linux: se nell&#8217;articolo precedente era kexec, in questo sarà lguest.
lguest non è altro che un hypervisor molto leggero (circa 5000 linee di codice), che permette in modo molto semplice di creare un sistema di paravirtualizzazione (non permette una virtualizzazione completa) con Linux (che è l&#8217;unica [...]]]></description>
			<content:encoded><![CDATA[<h3>Introduzione</h3>
<p>In questo articolo parlerò nuovamente di una funzione del kernel Linux: se nell&#8217;articolo precedente era kexec, in questo sarà lguest.<br />
lguest non è altro che un hypervisor molto leggero (circa 5000 linee di codice), che permette in modo molto semplice di creare un sistema di paravirtualizzazione (non permette una virtualizzazione completa) con Linux (che è l&#8217;unica architettura supportata).<br />
È formato da due parti distinte, una parte kernel, rappresentata da un modulo &#8216;lg&#8217; (è anche possibile compilarlo direttamente nel kernel) che si occupa del lavoro sporco e una parte user-space, l&#8217;hypervisor.</p>
<h3>Funzionamento</h3>
<p>Il funzionamento di lguest è abbastanza semplice da comprendere, in quanto non impiega nessuna tecnica speciale come fanno altri sistemi tipo Xen.<br />
Il cuore di tutto sta nel modulo del kernel che si occupa innanzitutto di allocare una porzione di meoria dinamica del kernel, in cui viene caricato un piccolo hypervisor incaricato di spostarsi dal kernel al sistema guest. Il processo di paravirtualizzazione viene compiuto grazie all&#8217;implementazione di paravirt_ops, che deve essere compilato nel kernel da eseguire come guest. Il modulo del kernel si occupa anche di fornire un&#8217;interfaccia tramite un file speciale posizionato in /dev/lguest. Il client in user-space, per creare un sistema guest, dovrà semplicemente scrivere un comando di inizializzazione in quel file indicando alcuni valori, come ad esempio dove trovare il kernel e la porzione di memoria da utilizzare.</p>
<p>A questo punto il client in user-space si occupa di allocare un tot di memoria virtuale che poi sarà mappata nel sistema guest come memoria fisica. In questa porzione viene caricato il kernel virtualizzato e poi l&#8217;user-space guest (in pratica il filesystem di root del sistema virtualizzato). Un semplice file può essere utilizzato per fornire al sistema guest un&#8217;immagine di un disco gestito dal client che si dovrà preoccuperà di spostare blocchi di dati nella memoria dinamica. Per quanto riguarda la rete, il creatore di lguest consiglia di utilizzare una periferica TAP configurata sul sistema host.<br />
Per far partire il sistema guest, lg modifica opportunamente la page tables del kernel, per fare in modo che il sistema guest appena caricato</p>
<p>Bene o male questo è il funzionamento di lguest. Vediamo ora come mettere queste cose in pratica.</p>
<h3>Root Filesystem</h3>
<p>Iniziamo subito con la creazione di quello che sarà il filesystem di root del sistema guest. Sconsiglio vivamente di utilizzare una partizione esistente in quanto potrebbero sorgere problemi gravi.<br />
Con questo procedimento verrà creato un sistema Debian da zero. È anche possibile trovare in rete immagini di altri sistemi (per quanto ne sappia, il team di Gentoo fornisce immagini di dischi con la distro preinstallata).</p>
<p>Prima di tutto creiamo il file nel quale verrà installato il sistema, come dimensione 1G dovrebbe bastare:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ dd if=/dev/zero of=debian.img bs=1 count=1 seek=1G</pre></div></div>

<p>Creiamo il filesystem:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># mke2fs -j -v debian.img</pre></div></div>

<p>E montiamolo:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># mkdir /mnt/virtual
# mount debian.img /mnt/virtual -o loop</pre></div></div>

<p>(potrebbe essere necessario caricare il modulo per il loopback)</p>
<p>Per installare il sistema base utilizzeremo un tool, debootstrap, che si occupa di scaricare e installare i pacchetti basilari per il nostro sistema. Dopo averlo installato:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># debootstrap --verbose --arch i386 squeeze /mnt/virtual http://debian.fastweb.it/debian</pre></div></div>

<p>Potete ovviamente configurarlo come volete, modificando l&#8217;architettura, la versione di debian e il repository da cui prelevare i pacchetti.</p>
<p>Ora abbiamo un sistema perfettamente funzionante, ma che richiede alcune configurazioni aggiuntive prima di poter essere utilizzato con lguest.<br />
Perciò la prima cosa da fare è entrare nel sistema con chroot:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># chroot /mnt/virtual</pre></div></div>

<p>Da cui:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># apt-get update</pre></div></div>

<p>Per una configurazione terra terra (orario + lingua + password root):</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># dpkg-reconfigure tzdata
# apt-get install locales
# dpkg-reconfigure locales
# passwd root</pre></div></div>

<p>Ora è necessario creare un device a blocchi che verrà utilizzato come console virtuale:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># mknod hvc0 c 229 0</pre></div></div>

<p>e fare in modo che parta all&#8217;avvio modificando il file inittab:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># nano /etc/inittab</pre></div></div>

<p>cambiando le linee che regolano l&#8217;avvio dei terminali:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">1:2345:respawn:/sbin/getty hvc0
#2:2345:respawn:/sbin/getty tty2
#3:2345:respawn:/sbin/getty tty3
#4:2345:respawn:/sbin/getty tty4
#5:2345:respawn:/sbin/getty tty5
#6:2345:respawn:/sbin/getty tty6</pre></div></div>

<p>Per finire creiamo un nuovo utente (chiamatelo pure come vi pare):</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># adduser user</pre></div></div>

<p>E poi usciamo</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># exit</pre></div></div>

<h3>Kernel</h3>
<p>Il modo più semplice per eseguire lguest, come suggerisce il creatore stesso, è utilizzare lo stesso kernel sia come host che come guest.<br />
Abbiamo però bisogno di una configurazione particolare, quindi verificate le seguenti impostazioni nel vostro kernel (se non sono presenti ricompilate):</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">CONFIG_EXPERIMENTAL=y
CONFIG_PARAVIRT=y
CONFIG_LGUEST_GUEST=y
CONFIG_HIGHMEM64G=n
CONFIG_PHYSICAL_ALIGN=0x100000
CONFIG_VIRTIO_BLK=m
CONFIG_VIRTIO_NET=m
CONFIG_TUN=m
CONFIG_LGUEST=m</pre></div></div>

<p>Nella cartella del kernel &#8216;Documentation/lguest&#8217; è presente il client user-space, se non è stato compilato con il kernel, digitate &#8216;make&#8217;.</p>
<p>A questo punto abbiamo tutto il necessario per avviare lguest.</p>
<h3>Let&#8217;s virtualize</h3>
<p>Per prima cosa è necessario caricare il modulo del kernel</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># modprobe lg</pre></div></div>

<p>Dopodichè, sempre dalla cartella di lguest</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># ./lguest [mem] [kernel] --tunnet=[ip] --block=[rootfile] root=/dev/vda</pre></div></div>

<p>Dove:</p>
<ul>
<li>[mem] indica la quantità di memoria da utilizzare in MB</li>
<li>[kernel] il percorso del kernel da usare</li>
<li>[ip] l&#8217;indirizzo di rete da attribuire al sistema guest</li>
<li>[rootfile] il file da usare come root</li>
</ul>
<p>Dopo aver definito root, è possibile indicare altri valori da passare al kernel.</p>
<p>Un esempio di utilizzo:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># ./lguest 64 /boot/vmlinuz-`uname -r` --tunnet=192.168.1.38 --block=debian.img root=/dev/vda ro quiet</pre></div></div>

<p>debian.img starebbe ad indicare il file che abbiamo creato prima, mentre come kernel è stato impostato quello attualmente in uso.</p>
<p>Se tutto è andato per il verso giusto, il nuovo kernel dovrebbe partire.</p>
<h3>Conclusione</h3>
<p>La caratteristica più interessante di lguest è senza dubbio la sua facilità di comprensione e di utilizzo. Essendo scritto in quasi 5000 righe di codice non ha certo funzionalità avanzate da farlo competere con altri grossi progetti di virtualizzazione come Xen o KVM ma è senza dubbio un ottimo punto di partenza per meglio comprendere la virtualizzazione. E comunque non si può certo dire che su Linux manchino soluzioni per la virtualizzazione.</p>
]]></content:encoded>
			<wfw:commentRss>http://alexbio.ath.cx/2009/10/16/virtualizzare-linux-con-lguest/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Twitter &#8211; Mostrare l&#8217;ultimo stato in PHP</title>
		<link>http://alexbio.ath.cx/2009/10/14/twitter-mostrare-lultimo-stato-in-php/</link>
		<comments>http://alexbio.ath.cx/2009/10/14/twitter-mostrare-lultimo-stato-in-php/#comments</comments>
		<pubDate>Wed, 14 Oct 2009 18:05:17 +0000</pubDate>
		<dc:creator>AlexBio</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Source]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://alexbio.ath.cx/?p=565</guid>
		<description><![CDATA[Dopo Last.fm, ora tocca a Twitter. Visto che a fantasia sono messo piuttosto male il codice è praticamente uguale a quello visto in precedenza (a parte la parte delle api ovviamente).
View Source
Semplicemente visualizza l&#8217;ultimo status dell&#8217;utente indicato.
]]></description>
			<content:encoded><![CDATA[<p>Dopo Last.fm, ora tocca a Twitter. Visto che a fantasia sono messo piuttosto male il codice è praticamente uguale a quello <a href="http://alexbio.ath.cx/2009/09/30/last-fm-mostrare-lultima-canzone-ascoltata-in-php/">visto in precedenza</a> (a parte la parte delle api ovviamente).</p>
<p><a href="http://alexbio.ath.cx/code/twitter-last-status/">View Source</a></p>
<p>Semplicemente visualizza l&#8217;ultimo status dell&#8217;utente indicato.</p>
]]></content:encoded>
			<wfw:commentRss>http://alexbio.ath.cx/2009/10/14/twitter-mostrare-lultimo-stato-in-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Riavviare Linux con kexec</title>
		<link>http://alexbio.ath.cx/2009/10/11/riavviare-linux-con-kexec/</link>
		<comments>http://alexbio.ath.cx/2009/10/11/riavviare-linux-con-kexec/#comments</comments>
		<pubDate>Sun, 11 Oct 2009 11:49:01 +0000</pubDate>
		<dc:creator>AlexBio</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[HowTo]]></category>
		<category><![CDATA[Kernel]]></category>

		<guid isPermaLink="false">http://alexbio.ath.cx/?p=587</guid>
		<description><![CDATA[Introduzione
Su sistemi Linux alcuni dei pochi motivi per cui è necessario riavviare il sistema dipendono principalmente da: a) aggiornamento del kernel, b) crash dello stesso.
Personalmente ho sempre odiato il continuo bisogno di riavvio (spesso immotivato) in seguito ad un qualsiasi aggiornamento di software su sistemi Windows, è stata quindi una bella sorpresa per me scoprire [...]]]></description>
			<content:encoded><![CDATA[<h3>Introduzione</h3>
<p>Su sistemi Linux alcuni dei pochi motivi per cui è necessario riavviare il sistema dipendono principalmente da: a) aggiornamento del kernel, b) crash dello stesso.</p>
<p>Personalmente ho sempre odiato il continuo bisogno di riavvio (spesso immotivato) in seguito ad un qualsiasi aggiornamento di software su sistemi Windows, è stata quindi una bella sorpresa per me scoprire che, come già detto, su Linux i riavvii sono molto rari.</p>
<p>Con l&#8217;aumentare della mia esperienza nell&#8217;uso di Linux, uno dei &#8220;lidi&#8221; su cui la mia curiosità si è posata è stato proprio il kernel. Dopo i miei primi e incerti tentativi di ricompilazione, credo di poter dire di aver raggiunto un ragguardevole livello di esperienza (per quanto un normale utente senza, ancora, nessuna istruzione accademica in materia possa raggiungere). Come a molti utenti Linux a me piace sperimentare, mi sono perciò spesso trovato a ricompilare uno stesso kernel diverse volte prima di raggiungere una configurazione che soddisfacesse pienamente le mie aspettative, e ovviamente a queste ricompilazioni seguivano necessariamente altrettanti riavvii del sistema. Questo fino a scoprire una interessante funzione del kernel Linux (entrata nel ramo principale di sviluppo già da diverso tempo): kexec.</p>
<p>Kexec permette, in poche parole, di riavviare un kernel da uno già in esecuzione senza dover necessariamente riavviare il sistema fisico.</p>
<h3>Linux e il suo boot</h3>
<p>Prima di partire però è necessario fare una piccola parentesi sul sistema di booting di Linux, questo per meglio comprendere come kexec funziona.<br />
Il processo di boot ha due fasi principali, la fase del bootloader e quella del kernel, le quali possono essere suddivise a loro volta in diversi stadi.</p>
<p>La prima delle due, la fase bootloader, inizia quando un computer viene acceso fisicamente. Dopo qualche inizializzazioni, il controllo dell&#8217;avvio viene passato al BIOS (o firmware che dir si voglia), che ha il compito di determinare le varie periferiche connesse (memorie, dischi, ecc&#8230;). Il BIOS si occupa anche di avviare il bootloader dal master boot record (MBR), che, in base alla configurazione, farà decidere all&#8217;utente quale kernel avviare (la cosa è un pò più complicata, ma spiegare nei dettaglia il boot di Linux non è lo scopo di questo articolo). Ed è a questo pounto che si passa alla fase del kernel.</p>
<p>Dopo aver preso il controllo del boot, il kernel si occupa di esaminare le periferiche, caricare i driver necessari e inizializzarle. A questo punto vengono avviati i servizi di sistema che si occupano del resto (montare i filesystem, avviare i termiali, ecc&#8230;).</p>
<p>Per la fase di riavvio, prima di ritornare alla fase del bootloader, vengono prima terminati tutti i processi, smontati i filesystem e scaricati i driver (con conseguente spegnimento delle periferiche).</p>
<h3>Cos&#8217;è kexec?</h3>
<p>Kexec non è altro che una funzione del kernel Linux che permette di avviare un kernel da uno già avviato, saltando completamente la fase del bootloader sopra descritta, rendendo quindi la fase di riavvio molto più veloce. Si occupa, in altre parole, di caricare un nuovo kernel in memoria, terminare quello già in esecuzione e sostituirlo con quello caricato in precedenza.</p>
<p>Kexec si divide in due parti, la parte kernel, compilata direttamente con il kernel, che consiste in una serie di system call, e una parte user-space, chiamata kexec-tools (sono ovviamente necessarie entrambe).</p>
<p>Per verificare che il proprio kernel sia compilato con kexec, è sufficiente cercare nel file .config se la chiave CONFIG_KEXEC è impostata a &#8216;y&#8217;:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ zgrep CONFIG_KEXEC /proc/config.gz</pre></div></div>

<p>oppure</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ grep CONFIG_KEXEC /boot/config-`uname -r`</pre></div></div>

<p>Mentre per la parte userspace è sufficiente installare kexec-tools</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># apt-get install kexec-tools</pre></div></div>

<p>oppure usando il proprio package manager preferito.</p>
<h3>Come funziona?</h3>
<p>Prima di procedere con la parte pratica, vediamo più in dettaglio come funziona kexec. Innanzitutto è necessario sapere che il kernel Linux deve essere avviato da una posizione predefinita della memoria, perciò per avviare un nuovo kernel è necessario sovrascrivere quello precedente. Questo è eseguito in 4 passaggi:</p>
<ol>
<li>Caricare il nuovo kernel in memoria</li>
<li>Spostare il kernel nella memoria dinamica del kernel</li>
<li>Sostituire fisicamente il kernel caricato</li>
<li>Avviare il nuovo kernel</li>
</ol>
<p>I primi due passaggi sono effettuati durante il caricamento del kernel. Una volta caricato nella memoria utente, il kernel viene spostato nella memoria dinamica del kernel grazie all&#8217;uso della chiamata di sistema &#8217;sys_kexec&#8217;.<br />
Insieme ad esso viene allocato in memoria del codice assembly chiamato &#8216;reboot_code_buffer&#8217;, che si dovrà occupare di sovrascrivere il kernel in funzione con quello caricato in memoria, e poi farlo partire (terzo e quarto passaggio).</p>
<h3>kexec-tools</h3>
<p>Dopo aver verificato che kexec sia correttamente compilato, e aver installato kexec-tools, vediamo ora come usare nella pratica questi strumenti.<br />
Come già detto il primo passo è caricare il kernel in memoria (i primi due passaggi visti prima).</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># kexec -l [nuovo-kernel] [args]</pre></div></div>

<p>dove [nuovo-kernel] sta per l&#8217;immagine del kernel da caricare. I formati supportati sono: Beoboot-x86, elf-x86, bzImage-x86, multiboot-x86. Mentre [args] sta per gli argomenti specifici per i formati. Un esempio, utilizzando un kernel in formato bzImage, potrebbe essere:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># kexec -l /usr/src/linux/arch/i386/boot/bzImage --append=&quot;root=/dev/hdX&quot;</pre></div></div>

<p>Dove /dev/hdX sta per il filesystem di root. È possibile usare anche initrd:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># kexec -l /usr/src/linux/arch/i386/boot/bzImage --append=&quot;root=/dev/hdX&quot; --initrd=/boot/initrd.img</pre></div></div>

<p>Se siete indecisi su che argomenti passare al kernel potete dare un&#8217;occhiata al file &#8216;/proc/cmdline&#8217; che indica i parametri dell&#8217;attuale kernel.<br />
Per una lista di tutte le opzioni invece basta digitare:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ man kexec</pre></div></div>

<p>Ora non resta altro da fare che avviare il nuovo kernel.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># kexec -e</pre></div></div>

<p>kexec avvia &#8220;alla brutta&#8221; il nuovo kernel senza fare lo shutdown correttamente, perciò consiglio di usare semplicemente il comando</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># reboot</pre></div></div>

<p>Che dovrebbe funzionare ugualmente (ad un certo punto, dovrebbe spuntare un scritta del tipo &#8220;rebooting with kexec&#8221; o qualcosa del genere).</p>
<p>Dopodichè il nuovo kernel dovrebbe partire, come se fosse un normale avvio del sistema.</p>
<h3>Conclusione</h3>
<p>Grazie a kexec, è possibile ridurre notevolmente i tempi di riavvio di un sistema, questo non solo beneficia uno sviluppatore che si trova a dover riavviare numerose volte, ma si applica molto bene anche a tutti quei sistemi in cui il downtime deve essere ridotto al minimo (la maggior parte dei sistemi enterprise quindi). Oltre che ovviamente a tutti quelli che come me vogliono solo imparare qualcosa di nuovo.</p>
]]></content:encoded>
			<wfw:commentRss>http://alexbio.ath.cx/2009/10/11/riavviare-linux-con-kexec/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Last.fm &#8211; Mostrare l&#8217;ultima canzone ascoltata in PHP</title>
		<link>http://alexbio.ath.cx/2009/09/30/last-fm-mostrare-lultima-canzone-ascoltata-in-php/</link>
		<comments>http://alexbio.ath.cx/2009/09/30/last-fm-mostrare-lultima-canzone-ascoltata-in-php/#comments</comments>
		<pubDate>Wed, 30 Sep 2009 20:01:38 +0000</pubDate>
		<dc:creator>AlexBio</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Source]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://alexbio.ath.cx/?p=553</guid>
		<description><![CDATA[Un semplice esercizio nell&#8217;uso della API di Last.fm. In pratica stampa l&#8217;ultima canzone ascoltata e &#8220;scrobblata&#8221; (lol). Volendo con un semplice ciclo è possibile mostrare anche quelle precedenti (fino ad un massimo di 10, per limiti nelle API stesse), e con un pò di codice aggiuntivo è possibile mostrare in modo decente l&#8217;orario di ascolto [...]]]></description>
			<content:encoded><![CDATA[<p>Un semplice esercizio nell&#8217;uso della API di Last.fm. In pratica stampa l&#8217;ultima canzone ascoltata e &#8220;scrobblata&#8221; (lol). Volendo con un semplice ciclo è possibile mostrare anche quelle precedenti (fino ad un massimo di 10, per limiti nelle API stesse), e con un pò di codice aggiuntivo è possibile mostrare in modo decente l&#8217;orario di ascolto (es &#8220;6 minuti fa&#8221;, ecc&#8230;) ma sono piuttosto pigro e si sta facendo piuttosto tardi, quindi non lo faccio.</p>
<p><a href="http://alexbio.ath.cx/code/last-fm-last-song/">View Source</a></p>
<p>Ora devo solo trovare un punto in questo blog in cui piazzare il codice&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://alexbio.ath.cx/2009/09/30/last-fm-mostrare-lultima-canzone-ascoltata-in-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Plugin VST su Linux con DSSI-VST</title>
		<link>http://alexbio.ath.cx/2009/09/23/plugin-vst-su-linux-con-dssi-vst/</link>
		<comments>http://alexbio.ath.cx/2009/09/23/plugin-vst-su-linux-con-dssi-vst/#comments</comments>
		<pubDate>Wed, 23 Sep 2009 16:34:15 +0000</pubDate>
		<dc:creator>AlexBio</dc:creator>
				<category><![CDATA[Audio]]></category>
		<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[HowTo]]></category>

		<guid isPermaLink="false">http://alexbio.ath.cx/2009/09/23/plugin-vst-su-linux-con-dssi-vst/</guid>
		<description><![CDATA[Introduzione
Steinberg&#8217;s Virtual Studio Technology (VST) è una tecnologia proprietaria per integrare effetti e sintetizzatori con programmi di editing audio. Esistono alternative open-source a VST (come LADSPA, architettura molto usata su Linux), ma spesso si vogliono utilizzare plugin VST di cui non esistono le controparti aperte LADSPA (ed è esattamente quello che mi è successo recentemente). [...]]]></description>
			<content:encoded><![CDATA[<h3>Introduzione</h3>
<p>Steinberg&#8217;s Virtual Studio Technology (VST) è una tecnologia proprietaria per integrare effetti e sintetizzatori con programmi di editing audio. Esistono alternative open-source a VST (come LADSPA, architettura molto usata su Linux), ma spesso si vogliono utilizzare plugin VST di cui non esistono le controparti aperte LADSPA (ed è esattamente quello che mi è successo recentemente). La mia intenzione è quella di utilizzare un simulatore di amplificatore per basso (Heliant 1st Bass) su Linux in accopiata con Jackd e, ovviamente il mio basso. Il problema è che quello è un plugin VST, e non è quindi possibile utilizzarlo nativamente.</p>
<p>Ciò che andremo a fare perciò sarà emulare il plugin VST tramite Wine appogiandoci all&#8217;architettura DSSI.</p>
<h3>Preparazione</h3>
<p>Il primo passo è preparare il nostro sistema. Sono necessarie alcuni pacchetti come wine e libwine, e altri di sviluppo per il software che andremo a compilare dopo.</p>
<p>Come già detto, per emulare i plugin VST useremo Wine:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># apt-get install wine libwine-dev</pre></div></div>

<p>Consiglio vivamente di utilizzare il pacchetto della propria distribuzione (in questo caso Debian) in quanto fornisce libwine separatamente.</p>
<p>Un&#8217;altra cosa di cui abbiamo bisogno è DSSI e del supporto a Jackd</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># apt-get install dssi-dev dssi-utils dssi-host-jack</pre></div></div>

<p>E ovviamente dei pacchetti base per la compilazione</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># apt-get install build-essential checkinstall</pre></div></div>

<p>più una serie di altre librerie di sviluppo:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># apt-get install libasound2-dev liblo0-dev</pre></div></div>

<p>Pare ovvio ma lo devo dire&#8230; Jack deve essere installato.</p>
<h3>Compilazione</h3>
<p>A questo punto non ci resta che compilare ciò di cui abbiamo bisogno. Prima di tutto dobbiamo scaricare i sorgenti di dss-vst da <a href="http://sourceforge.net/projects/dssi/files/dssi-vst/">qui</a> (attualmente l&#8217;ultima versione e la 0.8). Poi ci serve l&#8217;SDK VST scaricabile dal <a href="http://www.steinberg.net/en/company/3rd_party_developer.html">sito ufficiale</a> Steinberg (per fare questo è necessario registrarsi, il download è gratuito). Ciò di cui abbiamo bisogno è &#8216;VST Audio Plug-Ins SDK&#8217; versione 2.4 (lo so che c&#8217;è anche la versione 3, ma non sono sicuro della compatibilità con dss-vst.</p>
<p>Estraiamo i sorgenti di dssi-vst e poi al suo interno anche la VST SDK. Bene, a questo punto tutte le dipendenze dovrebbero essere soddisfatte, perciò da terminale:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ make
# checkinstall
&nbsp;
Oppure
&nbsp;
# make install</pre></div></div>

<p>Se l&#8217;nstallazione è riuscita senza intoppi dovremmo aver a disposizione il comando &#8216;vsthost&#8217;. Dopo aver avviato Jack (nel modo che preferite)</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ vsthost [percorso-plugin]</pre></div></div>

<p>Dove [percorso-plugin] è il percorso al plugin desiderato.<br />
Potrebbe essere utile settare la variabile VST_PATH prima di avviare vsthost</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ export &quot;VST_PATH=[percorso-a-volontà]&quot;</pre></div></div>

<h3>Conclusione</h3>
<p>Vi lascio qualche link utile da cui scaricare plugin VST gratuitamente:</p>
<p>VST4Free &#8211; <a href="http://www.vst4free.com/">http://www.vst4free.com/</a><br />
Free Plugin List &#8211; <a href="http://free-plugin-list.com/">http://free-plugin-list.com/</a><br />
Audio Mastermind Database &#8211; <a href="http://www.audiomastermind.com/browse-free_vst_plugins-5886988-1.html">http://www.audiomastermind.com/browse-free_vst_plugins-5886988-1.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://alexbio.ath.cx/2009/09/23/plugin-vst-su-linux-con-dssi-vst/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linux 2.6.31 + RT + nVidia = Fail</title>
		<link>http://alexbio.ath.cx/2009/09/20/linux-2-6-31-rt-nvidia-fail/</link>
		<comments>http://alexbio.ath.cx/2009/09/20/linux-2-6-31-rt-nvidia-fail/#comments</comments>
		<pubDate>Sun, 20 Sep 2009 13:01:02 +0000</pubDate>
		<dc:creator>AlexBio</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[HowTo]]></category>
		<category><![CDATA[Kernel]]></category>

		<guid isPermaLink="false">http://alexbio.ath.cx/?p=529</guid>
		<description><![CDATA[Ieri pomeriggio mi sono messo a ricompilare il kernel Linux (ultima versione stabile ovvero 2.6.31) con la patch real-time di Ingo Molnar. Solitamente aspetto che i sorgenti siano disponibili nei repo di Debian con realativa patch ma questa volta non avevo voglia di attendere.
Compilato alla Debian way senza nessun problema, e felice come una pasqua [...]]]></description>
			<content:encoded><![CDATA[<p>Ieri pomeriggio mi sono messo a ricompilare il kernel Linux (ultima versione stabile ovvero 2.6.31) con la patch real-time di Ingo Molnar. Solitamente aspetto che i sorgenti siano disponibili nei repo di Debian con realativa patch ma questa volta non avevo voglia di attendere.</p>
<p>Compilato alla <a href="http://alexbio.ath.cx/2008/07/08/ricompilare-il-kernel-linux-debian-way/">Debian way</a> senza nessun problema, e felice come una pasqua mi apprestavo ad installare i driver nVidia&#8230; ed è proprio a questo punto che sono iniziati i problemi.</p>
<p>Primo tentativo usando module-assistant e il pacchetto nvidia-kernel-source (185.18)  da Sid&#8230; Fallito.</p>
<p>Secondo tentativo usando l&#8217;installer ufficiale nVidia (sempre 185.18)&#8230; Fallito.</p>
<p>Senza perdermi d&#8217;animo faccio un terzo tentativo usando l&#8217;installer nVidia ancora in beta (versione 192.32) ma anche questo fallisce.</p>
<p>A questo punto, insospettito, vado a guardare il log dell&#8217;installazione. L&#8217;errore riguardava una certa funzione init_MUTEX evidentemente modificata dalla patch RT. Cercando un pò su internet è saltato fuori che nell&#8217;ultima versione del kernel la patch non dichiarava più la suddetta funzione, rispetto alla precedente ovvero quella per la versione 2.6.29.</p>
<p>Continuando a cercare ho trovato anche un&#8217;ottima patch per risolvere il problema&#8230; vediamo ora come installarla.</p>
<p>La patch è la seguente:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">diff -Naur NVIDIA-Linux-x86-190.32-orig/usr/src/nv/nv-linux.h NVIDIA-Linux-x86-190.32/usr/src/nv/nv-linux.h
--- NVIDIA-Linux-x86-190.32-orig/usr/src/nv/nv-linux.h	2009-09-02 11:54:49.000000000 +0100
+++ NVIDIA-Linux-x86-190.32/usr/src/nv/nv-linux.h	2009-09-17 21:05:45.000000000 +0100
@@ -742,20 +742,28 @@
 #define nv_down(lock)                   down(&amp;lock)
 #define nv_up(lock)                     up(&amp;lock)
&nbsp;
+#if defined(CONFIG_PREEMPT_RT) &amp;&amp; !defined(init_MUTEX)
+#  define nv_spin_lock_init(lock)              atomic_spin_lock_init(lock)
+#  define nv_spin_lock_irqsave(lock, irq)      atomic_spin_lock_irqsave(lock, irq)
+#  define nv_spin_unlock_irqrestore(lock, irq) atomic_spin_unlock_irqrestore(lock, irq)
+#else
+#  define nv_spin_lock_init(lock)              spin_lock_init(lock)
+#  define nv_spin_lock_irqsave(lock, irq)      spin_lock_irqsave(lock, irq)
+#  define nv_spin_unlock_irqrestore(lock, irq) spin_unlock_irqrestore(lock, irq)
+#endif
+
 #if defined(CONFIG_PREEMPT_RT)
-#define NV_INIT_MUTEX(mutex) init_MUTEX(mutex)
+#  if defined(init_MUTEX)
+#    define nv_spinlock_t raw_spinlock_t
+#  else
+#    define nv_spinlock_t atomic_spinlock_t
+#  endif
 #else
-#if !defined(__SEMAPHORE_INITIALIZER) &amp;&amp; defined(__COMPAT_SEMAPHORE_INITIALIZER)
-#define __SEMAPHORE_INITIALIZER __COMPAT_SEMAPHORE_INITIALIZER
-#endif
-#define NV_INIT_MUTEX(mutex)                       \
-    {                                              \
-        struct semaphore __mutex =                 \
-            __SEMAPHORE_INITIALIZER(*(mutex), 1);  \
-        *(mutex) = __mutex;                        \
-    }
+#  define nv_spinlock_t   spinlock_t
 #endif
&nbsp;
+#define NV_INIT_MUTEX(mutex) sema_init(mutex, 1)
+
 #if defined (KERNEL_2_4)
 #  define NV_IS_SUSER()                 suser()
 #  define NV_PCI_DEVICE_NAME(dev)       ((dev)-&gt;name)
diff -Naur NVIDIA-Linux-x86-190.32-orig/usr/src/nv/os-interface.c NVIDIA-Linux-x86-190.32/usr/src/nv/os-interface.c
--- NVIDIA-Linux-x86-190.32-orig/usr/src/nv/os-interface.c	2009-09-02 11:54:48.000000000 +0100
+++ NVIDIA-Linux-x86-190.32/usr/src/nv/os-interface.c	2009-09-17 21:05:45.000000000 +0100
@@ -108,11 +108,7 @@
 {
     nv_stack_t        *sp;
     struct completion  completion;
-#if defined(CONFIG_PREEMPT_RT)
-    raw_spinlock_t     lock;
-#else
-    spinlock_t         lock;
-#endif
+    nv_spinlock_t      lock;
     S032               count;
 } os_sema_t;
&nbsp;
@@ -148,7 +144,7 @@
     os_sema = (os_sema_t *)*ppSema;
     os_sema-&gt;sp = sp;
     init_completion(&amp;os_sema-&gt;completion);
-    spin_lock_init(&amp;os_sema-&gt;lock);
+    nv_spin_lock_init(&amp;os_sema-&gt;lock);
     os_sema-&gt;count = 1;
&nbsp;
     if (nv_os_smp_barrier_init())
@@ -199,18 +195,18 @@
     os_sema_t *os_sema = (os_sema_t *)pSema;
     unsigned long old_irq;
&nbsp;
-    spin_lock_irqsave(&amp;os_sema-&gt;lock, old_irq);
+    nv_spin_lock_irqsave(&amp;os_sema-&gt;lock, old_irq);
     if (os_sema-&gt;count &lt;= 0)
     {
         os_sema-&gt;count--;
-        spin_unlock_irqrestore(&amp;os_sema-&gt;lock, old_irq);
+        nv_spin_unlock_irqrestore(&amp;os_sema-&gt;lock, old_irq);
         wait_for_completion(&amp;os_sema-&gt;completion);
     }
     else
     {
         os_sema-&gt;count--;
         rm_disable_interrupts(os_sema-&gt;sp);
-        spin_unlock_irqrestore(&amp;os_sema-&gt;lock, old_irq);
+        nv_spin_unlock_irqrestore(&amp;os_sema-&gt;lock, old_irq);
     }
&nbsp;
     return RM_OK;
@@ -233,17 +229,17 @@
     os_sema_t *os_sema = (os_sema_t *)pSema;
     unsigned long old_irq;
&nbsp;
-    spin_lock_irqsave(&amp;os_sema-&gt;lock, old_irq);
+    nv_spin_lock_irqsave(&amp;os_sema-&gt;lock, old_irq);
     if (os_sema-&gt;count &lt;= 0)
     {
-        spin_unlock_irqrestore(&amp;os_sema-&gt;lock, old_irq);
+        nv_spin_unlock_irqrestore(&amp;os_sema-&gt;lock, old_irq);
         return RM_ERROR;
     }
     else
     {
         os_sema-&gt;count--;
         rm_disable_interrupts(os_sema-&gt;sp);
-        spin_unlock_irqrestore(&amp;os_sema-&gt;lock, old_irq);
+        nv_spin_unlock_irqrestore(&amp;os_sema-&gt;lock, old_irq);
         return RM_OK;
     }
&nbsp;
@@ -267,7 +263,7 @@
     unsigned long old_irq;
     BOOL doWakeup;
&nbsp;
-    spin_lock_irqsave(&amp;os_sema-&gt;lock, old_irq);
+    nv_spin_lock_irqsave(&amp;os_sema-&gt;lock, old_irq);
     if (os_sema-&gt;count &lt; 0)
     {
         doWakeup = TRUE;
@@ -278,7 +274,7 @@
         rm_enable_interrupts(os_sema-&gt;sp);
     }
     os_sema-&gt;count++;
-    spin_unlock_irqrestore(&amp;os_sema-&gt;lock, old_irq);
+    nv_spin_unlock_irqrestore(&amp;os_sema-&gt;lock, old_irq);
&nbsp;
     if (doWakeup)
         complete(&amp;os_sema-&gt;completion);
@@ -1383,7 +1379,7 @@
     unsigned long oldIrql;
&nbsp;
     os_sema = (os_sema_t *) pSema;
-    spin_lock_irqsave(&amp;os_sema-&gt;lock, oldIrql);
+    nv_spin_lock_irqsave(&amp;os_sema-&gt;lock, oldIrql);
&nbsp;
     return oldIrql;
 }
@@ -1394,7 +1390,7 @@
     unsigned long old_irq = (unsigned long) oldIrql;
&nbsp;
     os_sema = (os_sema_t *) pSema;
-    spin_unlock_irqrestore(&amp;os_sema-&gt;lock, old_irq);
+    nv_spin_unlock_irqrestore(&amp;os_sema-&gt;lock, old_irq);
 }
&nbsp;
 RM_STATUS NV_API_CALL os_get_address_space_info(</pre></div></div>

<p>Si riferisce alla versione beta dei driver (192.32) quindi è necessario scaricarli dal <a href="http://www.nvidia.it/object/linux_display_ia32_190.32_it.html">sito ufficiale</a> (ATTENZIONE: come già detto è solo una versione beta&#8230; maneggiare con cura ;) ).</p>
<p>Il secondo passo è quello di estrarre i sorgenti, per fare ciò utilizzare l&#8217;opzione &#8216;-x&#8217;:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ sh NVIDIA-Linux-x86-190.32-pkg1.run -x</pre></div></div>

<p>Che dovrebbe aver creato una cartella omonima (senza il .run). Ora creiamo una copia (non si sa mai):</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ cp -r NVIDIA-Linux-x86-190.32-pkg1 NVIDIA-Linux-x86-190.32-orig</pre></div></div>

<p>Nel mio caso ho salvato la suddetta patch come &#8216;patch-2.6.31-nvidia-192.32-rt.patch&#8217; nella stessa cartella di quella estratta prima (es. se ho estratto la cartella dei driver in &#8216;Downloads/NVIDIA-Linux-x86-190.32-orig&#8217; il percorso della patch dovrà essere &#8216;Downloads/patch-2.6.31-nvidia-192.32-rt.patch&#8217;).</p>
<p>L&#8217;ultimo passo è quello di applicare la patch (alla vecchia maniera):</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ cat patch-2.6.31-nvidia-192.32-rt.patch | patch -p0</pre></div></div>

<p>Il cui output dovrebbe essere qualcosa tipo:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">patching file NVIDIA-Linux-x86-190.32-orig/usr/src/nv/nv-linux.h
patching file NVIDIA-Linux-x86-190.32-orig/usr/src/nv/os-interface.c</pre></div></div>

<p>Se così non fosse, significherebbe che avete sbagliato qualcosa, perciò ripetete il procedimento da capo.</p>
<p>Ed ora possiamo tranquillamente installare i driver (dopo aver terminato Xorg):</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ sudo NVIDIA-Linux-x86-190.32-orig/nvidia-installer</pre></div></div>

<p>Questo è tutto, dopo aver installato i driver è ovviamente necessario configurare Xorg, ma questa è un&#8217;altra storia, su interenet potete trovare pagine e pagine a riguardo.</p>
]]></content:encoded>
			<wfw:commentRss>http://alexbio.ath.cx/2009/09/20/linux-2-6-31-rt-nvidia-fail/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Manipolare file audio con SoX</title>
		<link>http://alexbio.ath.cx/2009/09/12/manipolare-file-audio-con-sox/</link>
		<comments>http://alexbio.ath.cx/2009/09/12/manipolare-file-audio-con-sox/#comments</comments>
		<pubDate>Sat, 12 Sep 2009 20:16:35 +0000</pubDate>
		<dc:creator>AlexBio</dc:creator>
				<category><![CDATA[Audio]]></category>
		<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[HowTo]]></category>
		<category><![CDATA[Tips]]></category>

		<guid isPermaLink="false">http://alexbio.ath.cx/?p=515</guid>
		<description><![CDATA[Introduzione
SoX (Sound eXchange) è uno strumento multipiattaforma di manipolazione di file audio. Con esso è possibile convertire e modificare (cambiare attributi, aggiungere effetti, ecc&#8230;) oltre 20 diversi formati audio.
Per una lista dei formati supportati, completa di informazioni:

$ sox --help-format all

Sintetizzare un file audio
SoX mette a disposizioni alcune semplici funzioni di sintetizzazione (o creazione) di file [...]]]></description>
			<content:encoded><![CDATA[<h3>Introduzione</h3>
<p>SoX (<strong>So</strong>und e<strong>X</strong>change) è uno strumento multipiattaforma di manipolazione di file audio. Con esso è possibile convertire e modificare (cambiare attributi, aggiungere effetti, ecc&#8230;) oltre 20 diversi formati audio.<br />
Per una lista dei formati supportati, completa di informazioni:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ sox --help-format all</pre></div></div>

<h3>Sintetizzare un file audio</h3>
<p>SoX mette a disposizioni alcune semplici funzioni di sintetizzazione (o creazione) di file audio.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ sox -n synth [lunghezza] [tipo] [frequenza]</pre></div></div>

<p>Dove:</p>
<ul>
<li>[lunghezza] sta per la lunghezza dell&#8217;audio da sintetizzare (formato hh:mm:ss.frac).</li>
<li>[tipo] per il tipo di audio da sintetizzare, che può essere: sine, square, triangle, sawtooth, trapezium, exp, noise, pinknoise, brownnoise.</li>
<li>[frequenza] per la frequenza di inizio e di fine del file (es 300/3000).</li>
</ul>
<p>Un esempio può essere:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ sox -r 16000 -n out.wav synth 5 triangle 300-3000</pre></div></div>

<p>(NOTA: -r indica il sample rate e -n il file di output. È possibile utilizzare il formato preferito tra quelli disponibili)</p>
<h3>Convertire un file audio</h3>
<p>SoX è molto utile nella conversione di file audio in diversi formati. Può individuare il formato dei file (sia in input che output) semplicemente dall&#8217;estensione del file stesso.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ sox input.wav output.dat</pre></div></div>

<p>Ma è anche possibile indicare i formati desiderati tramite l&#8217;opzione &#8216;-t&#8217;:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ sox -t wav input -t dat output</pre></div></div>

<h3>Modificare il volume</h3>
<p>Grazie a SoX è anche possibile aumentare o diminuire il volume di un file. Ad esempio, per aumentare:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ sox -v 5.0 file.wav</pre></div></div>

<p>Mentre per diminuire</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ sox -v -0.5 file.wav</pre></div></div>

<h3>Combinare due file audio</h3>
<p>Grazie all&#8217;opzione &#8216;-m&#8217; è possibile combinare (o mixare) due file in uno unico</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ sox -m file1.wav file2.wav output.wav</pre></div></div>

<p>In alternativa è anche disponibile il comando &#8217;soxmix&#8217;</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ soxmix file1.wav file2.wav output.wav</pre></div></div>

<h3>Estrarre una parte di file</h3>
<p>L&#8217;opzione &#8216;trim&#8217; serve a estrarre una data parte di file.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">sox input.wav output.wav trim [inizio] [durata]</pre></div></div>

<p>Dove:</p>
<ul>
<li>[inizio] indica il punto da cui iniziare ad estrarre</li>
<li>[durata] indica la durata in secondi della parte da estrarre.</li>
</ul>
<p>Ad esempio:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">sox input.wav output.wav trim 5 10</pre></div></div>

<p>Estrae 10 secondi da inut.wav partendo dal quinto secondo.</p>
<h3>Aumentare la velocità</h3>
<p>Per aumentrae la velocità di un file audio è sufficiente utilizzare l&#8217;effetto &#8217;speed&#8217;, indicando il fattore di &#8220;accellerazione&#8221;. Aumentando la velocità, automaticamente sarà ridotta la durata.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">sox input.wav output.wav speed [fattore]</pre></div></div>

<p>Ad esempio utilizzando un fattore di 2, la velocità viene raddoppiata, mentre la durata si dimezza.</p>
<h3>Fade</h3>
<p>È possibile aggiungere un effetto di fade-in e fade-out ad un file</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ sox input.wav output.wav fade [tipo] [lunghezza fade-in] [tempo di stop] [lunghezza fade-out]</pre></div></div>

<p>Dove:</p>
<ul>
<li>[tipo] sta per il tipoo di fade (q, h, t, l, p).</li>
<li>[lunghezza fade-in] la lunghezza del fade-in (è anche possibile impostarla a 0).</li>
<li>[tempo di stop] il punto in cui iniziare il fade-out (opzionale).</li>
<li>[lunghezza fade-out] la lunghezza del fade-out (opzionale).</li>
</ul>
<h3>Riprodurre un file audio</h3>
<p>Dopo aver creato/modificato un file è anche possibile eseguirlo:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ sox input.wav -t alsa</pre></div></div>

<p>Oppure:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ play input.wav</pre></div></div>

<h3>Conclusioni</h3>
<p>Questi sono solo alcune (diciamo le principali) delle innumerevoli funzionalità di SoX. Per ottenere un lista (completa di opzioni) di tutti gli effetti disponibili:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ sox --help-effect all</pre></div></div>

<p>Oltre che naturalmente</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ man sox</pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://alexbio.ath.cx/2009/09/12/manipolare-file-audio-con-sox/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>API RESTful</title>
		<link>http://alexbio.ath.cx/2009/08/31/api-restful/</link>
		<comments>http://alexbio.ath.cx/2009/08/31/api-restful/#comments</comments>
		<pubDate>Mon, 31 Aug 2009 19:20:24 +0000</pubDate>
		<dc:creator>AlexBio</dc:creator>
				<category><![CDATA[HowTo]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://alexbio.ath.cx/?p=501</guid>
		<description><![CDATA[Introduzione
Le API sono diventate una caratteristica comune di molte delle applicazioni web più utilizzate (Twitter, Last.fm, YouTube, ecc&#8230;) in particolare le API REST (o RESTful). È in effetti davvero molto facile creare un&#8217;API di questo tipo, e allo stesso modo, e davvero molto facile implementarla in un programma di qualsiasi tipo e in qualsiasi linguaggio.
REST??? [...]]]></description>
			<content:encoded><![CDATA[<h3>Introduzione</h3>
<p>Le API sono diventate una caratteristica comune di molte delle applicazioni web più utilizzate (Twitter, Last.fm, YouTube, ecc&#8230;) in particolare le API REST (o RESTful). È in effetti davvero molto facile creare un&#8217;API di questo tipo, e allo stesso modo, e davvero molto facile implementarla in un programma di qualsiasi tipo e in qualsiasi linguaggio.</p>
<h3>REST??? WTF&#8230;</h3>
<p>Prima di iniziare a buttare giù del codice è meglio forse fare un pò di chiarezza su cosa si intenda con la parola REST.</p>
<p>Innanzitutto è necessario dire che REST non è una prerogativa solamente delle API, si tratta più che altro di un concetto generale che si può applicare a diversi campi. Ma ovviamente, visto il titolo dell&#8217;articolo, ci occuperemo solo del campo delle API.</p>
<h4>Richieste</h4>
<p>Come è facile intuire tutti i tipi di API hanno bisogno di accettare richieste da parte di client esterni. Facciamo finta (o anche no dipende dai casi) che voi abbiate la necessità di fornire un&#8217;API agli utenti del vostro sito, riguardante ad esempio l&#8217;inserimento di articoli sul sito. Normalmente in un&#8217;API RESTful è fornito un URL per accedere a tale API, nel nostro caso potrebbe essere qualcosa tipo /api/articoli o anche /api/articoli/[id] a seconda delle funzionalità che vogliamo fornire. </p>
<p>Innanzitutto è necessario decidere quali funzioni vogliamo implementare, ovvero quali funzioni vogliamo rendere disponibili agli utenti attraverso le API. Parlando di articoli alcune funzioni base potrebbero essere quelle di visualizzazione, creazione, modifica e eliminazione di articoli. Successivamente è necessario creare una sorta di architettura per definire il metodo di accesso dell&#8217;utente alle funzionalità che gli metteremo a disposizione. In questo, REST semplifica di molto la vita allo sviluppatore, in quanto utilizzando i metodi messi a disposizione da HTTP (GET, POST, PUT e DELETE), non è necessario inventarsi nulla di nuovo (ovvero un sacco di lavoro risparmiato). Per rendere più chiara questa idea è possibile associare ad ognuno di questi metodi un&#8217;azione specifica: GET -> mostra, POST -> crea, PUT -> aggiorna e DELETE -> elimina. Mettendo questo, insieme alle cose dette prima riguardo gli URL, possiamo riassumere il tutto così:</p>
<ul>
<li><strong>GET /api/articoli</strong> &#8211; Mostra tutti gli articoli disponibili.</li>
<li><strong>GET /api/articoli/[id]</strong> &#8211; Mostrare un solo articolo definito da [id].</li>
<li><strong>POST /api/articoli</strong> &#8211; Crea un nuovo articolo.</li>
<li><strong>PUT /api/articoli/[id]</strong> &#8211; Modifica un singolo articolo.</li>
<li><strong>DELETE /api/articoli/[id]</strong> &#8211; Elimina un articolo.</li>
</ul>
<p>Come potete constatare, REST ha risolto in modo molto semplice un problema molto grosso.</p>
<h4>Risposte</h4>
<p>Dopo aver visto come accettare richieste dai client, è ora necessario vedere in che modo inviare a questi client i dati che si aspettano di ricevere.</p>
<p>Una risposta tendenzialmente è formata da due parti, un codice di stato e il corpo vero e proprio contenente tutti i dati. Quest&#8217;ultima parte è abbastanza semplice da implementare. Innanzitutto è necessario decidere il formato di risposta in modo che tutti i client possano comprenderla; i più utilizzati sono essenzialmente XML e JSON (ma è possibile utilizzare anche RSS, tutto dipende da che tipo di dato è richiesto). Personalmente preferisco JSON, in quanto è molto facile lavorarci sia con Javascript che con PHP, ma se volete creare un&#8217;API veramente &#8220;robusta&#8221; potete anche implementare entrambi. L&#8217;utente dovrà solo dichiarare il formato voluto impostando il campo &#8216;Accept&#8217; nell&#8217;header HTTP (es. ”Accept: application/xml”) oppure, pratica più utilizzata, impostando un estensione all&#8217;URL dell&#8217;API (es. &#8220;/api/articoli/[id].xml&#8221;). </p>
<p>Ed ora veniamo alla seconda parte, ovvero i codici di stato. Questi codici servono semplicemente ad informare il client riguardo lo stato delle loro richieste. Anche in questo caso REST e HTTP ci tornano molto utili in quanto possiamo semplicemente utilizzare codici di stato già definiti nelle specifiche di HTTP. La cosa bella di questa soluzione è che non è necessario inventarsi nulla di nuovo, il che si traduce in un altro sacco di lavoro risparmiato. Per esempio nel caso che ci sia un errore nella formulazione della richiesta da parte del client possiamo utilizzare il codice 400 (&#8221;Bad Request&#8221;), in caso di successo nella creazione di un articolo il codice 201 (&#8221;Created&#8221;) o ancora in caso di richiesta di un articolo inesistente il codice 404 (&#8221;Not Found&#8221;). Questi sono solo alcuni esempi, esistono <a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes">molti altri codici</a> e molte altre possibilità, a seconda del tipo di API che volete creare.</p>
<p>Credo che a questo punto sia chiaro a tutti quali siano i vantaggi che REST offre agli sviluppatori, in particolare quanto riesca a semplificare la vita a tutti (sia a chi si occupa di creare l&#8217;AP, sia a chi la utilizza) facendo rispiarmiare tempo e fatica.</p>
]]></content:encoded>
			<wfw:commentRss>http://alexbio.ath.cx/2009/08/31/api-restful/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bash Tip #1: foreach file in una cartella</title>
		<link>http://alexbio.ath.cx/2009/08/30/bash-tip-1-foreach-file-in-una-cartella/</link>
		<comments>http://alexbio.ath.cx/2009/08/30/bash-tip-1-foreach-file-in-una-cartella/#comments</comments>
		<pubDate>Sun, 30 Aug 2009 16:29:31 +0000</pubDate>
		<dc:creator>AlexBio</dc:creator>
				<category><![CDATA[Bash]]></category>
		<category><![CDATA[Source]]></category>
		<category><![CDATA[Tips]]></category>

		<guid isPermaLink="false">http://alexbio.ath.cx/?p=497</guid>
		<description><![CDATA[Un semplice esempio per mostrare tutti i file in una data cartella (in questo caso /tmp):

#!/bin/sh
&#160;
for filename in /tmp/*
do
  echo $filename
done;

Poche righe che mi sono spesso tornate molto utili. Ad esempio mi è capitato di dover convertire una serie di file wav (circa 80) in mp3. A mano risulta un lavoro immane, ma semplicemente [...]]]></description>
			<content:encoded><![CDATA[<p>Un semplice esempio per mostrare tutti i file in una data cartella (in questo caso /tmp):</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/sh</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">for</span> filename <span style="color: #000000; font-weight: bold;">in</span> <span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/*</span>
<span style="color: #000000; font-weight: bold;">do</span>
  <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #007800;">$filename</span>
<span style="color: #000000; font-weight: bold;">done</span>;</pre></div></div>

<p>Poche righe che mi sono spesso tornate molto utili. Ad esempio mi è capitato di dover convertire una serie di file wav (circa 80) in mp3. A mano risulta un lavoro immane, ma semplicemente sostituendo &#8216;echo&#8217; con &#8216;lame&#8217; nello script precedente ecco che qualsiasi cosa diventa possibile.</p>
]]></content:encoded>
			<wfw:commentRss>http://alexbio.ath.cx/2009/08/30/bash-tip-1-foreach-file-in-una-cartella/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- www.000webhost.com Analytics Code -->
<script type="text/javascript" src="http://analytics.hosting24.com/count.php"></script>
<noscript><a href="http://www.hosting24.com/"><img src="http://analytics.hosting24.com/count.php" alt="web hosting" /></a></noscript>
<!-- End Of Analytics Code -->
