<?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>Mirko Pagliai</title>
	<atom:link href="http://www.mirkopagliai.it/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.mirkopagliai.it</link>
	<description>La morale della domenica ed altre elucubrazioni</description>
	<lastBuildDate>Fri, 18 May 2012 10:22:56 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Amarok 1.4.10: aggiornamenti</title>
		<link>http://www.mirkopagliai.it/amarok-1-4-10-aggiornamenti/</link>
		<comments>http://www.mirkopagliai.it/amarok-1-4-10-aggiornamenti/#comments</comments>
		<pubDate>Fri, 18 May 2012 10:19:03 +0000</pubDate>
		<dc:creator>Mirko Pagliai</dc:creator>
				<category><![CDATA[Unix]]></category>
		<category><![CDATA[Amarok]]></category>
		<category><![CDATA[Amarok 1.4.10]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[Debian 32bit]]></category>
		<category><![CDATA[Debian 64bit]]></category>
		<category><![CDATA[Debian Lenny]]></category>
		<category><![CDATA[Debian Sid]]></category>
		<category><![CDATA[Debian Squeeze]]></category>
		<category><![CDATA[Debian stable]]></category>
		<category><![CDATA[Debian unstable]]></category>
		<category><![CDATA[dpkg]]></category>
		<category><![CDATA[Synaptic]]></category>
		<category><![CDATA[vecchia versione Amarok]]></category>
		<category><![CDATA[versione di Debian]]></category>

		<guid isPermaLink="false">http://www.mirkopagliai.it/?p=2246</guid>
		<description><![CDATA[Avevo scritto questo articolo su come installare Amarok 1.4.10 su recenti versioni di Debian, per chi preferisce la vecchia versione alla nuova. Visto che sono cambiate un po&#8217; di cose nei pacchetti disponibili, questo articolo è un aggiornamento della precedente guida. Si cominci sempre con installare un po&#8217; di pacchetti necessari e che dovrebbero essere [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft  wp-image-2191" title="Amarok logo" src="http://www.mirkopagliai.it/wp-content/uploads/2012/01/amarok-logo-180x180.jpg" alt="Amarok logo" width="88" height="88" />Avevo scritto questo <a href="http://www.mirkopagliai.it/amarok-1-4-10/">articolo</a> su come installare <strong>Amarok 1.4.10</strong> su recenti versioni di <strong>Debian</strong>, per chi preferisce la <strong>vecchia versione</strong> alla nuova. Visto che sono cambiate un po&#8217; di cose nei pacchetti disponibili, questo articolo è un aggiornamento della <a href="http://www.mirkopagliai.it/amarok-1-4-10/">precedente guida</a>.</p>
<p>Si cominci sempre con installare un po&#8217; di pacchetti necessari e che dovrebbero essere disponibili a prescindere dalla <strong>versione di Debian</strong> in uso:</p>
<pre class="brush: bash; light: true; title: ; notranslate">aptitude install libqt3-mt libifp4 libkarma0 libnjb5 libpq5 liblua50 liblualib50</pre>
<p>Fatto questo, abbiamo bisogno dei seguenti pacchetti:</p>
<pre class="brush: plain; light: true; title: ; notranslate">amarok
amarok-common
amarok-engine-xine
kdelibs4c2a
kdelibs-data
libarts1c2a
libartsc0
libaudiofile0
libavahi-qt3-1
libgpod3-nogtk
libmtp7
libmysqlclient15off
libtunepimp5</pre>
<p>Notare che:</p>
<ol>
<li>i primi tre pacchetti (<em>amarok</em>, <em>amarok-common</em> e <em>amarok-engine-xine</em>) devono essere alla versione 1.4.x;</li>
<li>alcuni di questi pacchetti sono disponibili solo per <strong>Debian Lenny</strong> (<em>oldstable</em>), altri anche se <strong>Debian Squeeze</strong> (attuale <em>stable</em>) e/o su <strong>Debian Sid</strong> (<em>unstable</em>).</li>
</ol>
<p>Se volete, quindi, potete procedere tramite pinning (<a href="http://www.mirkopagliai.it/debian-repository-e-pinning/">guida</a>), almeno per i pacchetti presenti su Squeeze e/o Unstable. Ma per agevolarvi il lavoro, ho creato due comodi archivi <em>.tar.gz</em>, uno per <strong>Debian a 32bit</strong> (<a href="http://docs.mirkopagliai.it/packages/amarok_32bit.tar.gz">qui</a>) e uno per <strong>Debian a 64bit</strong> (<a href="http://docs.mirkopagliai.it/packages/amarok_64bit.tar.gz">qui</a>).</p>
<p>Scaricate quello corrispondente alla vostra architettura. Per 32bit:</p>
<pre class="brush: bash; light: true; title: ; notranslate">http://docs.mirkopagliai.it/packages/amarok_32bit.tar.gz</pre>
<p>Per 64bit:</p>
<pre class="brush: bash; light: true; title: ; notranslate">http://docs.mirkopagliai.it/packages/amarok_64bit.tar.gz</pre>
<p>Decomprimete l&#8217;archivio:</p>
<pre class="brush: bash; light: true; title: ; notranslate">tar -zxvf amarok*.tar.gz</pre>
<p>Quindi portatevi all&#8217;interno della directory estratta e procedete all&#8217;installazione di tutti i file <em>.deb</em> tramite <em>dpkg</em>:</p>
<pre class="brush: bash; light: true; title: ; notranslate">cd amarok*
dpkg -i *.deb</pre>
<p>Ricordatevi, alla fine, di bloccare i pacchetti <em>amarok</em> e <em>amarok-common</em>, altrimenti vi chiederà continuamente di aggiornarli:</p>
<pre class="brush: bash; light: true; title: ; notranslate">aptitude hold amarok amarok-common</pre>
<p>(la stessa cosa va fatta all&#8217;interno di <strong>Synaptic</strong>, selezionando i pacchetti e poi scegliendo dal menù &#8220;Pacchetto&#8221; l&#8217;opzione &#8220;Blocca versione&#8221;)</p>
<p>Enjoy Amarok 1.4.10 ;-)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mirkopagliai.it/amarok-1-4-10-aggiornamenti/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Facebook regala antivirus? Rifiutate il regalo</title>
		<link>http://www.mirkopagliai.it/facebook-regala-antivirus-rifiutate-il-regalo/</link>
		<comments>http://www.mirkopagliai.it/facebook-regala-antivirus-rifiutate-il-regalo/#comments</comments>
		<pubDate>Thu, 26 Apr 2012 13:53:52 +0000</pubDate>
		<dc:creator>Mirko Pagliai</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[acquisti suggeriti]]></category>
		<category><![CDATA[acquisto acritico]]></category>
		<category><![CDATA[Avast]]></category>
		<category><![CDATA[Avg]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[La Repubblica]]></category>
		<category><![CDATA[licenze antivirus]]></category>
		<category><![CDATA[licenze antivirus gratuite]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[marketing]]></category>
		<category><![CDATA[passare a Linux]]></category>
		<category><![CDATA[passate a Linux]]></category>
		<category><![CDATA[proteggere dallo spam]]></category>
		<category><![CDATA[prova gratuita di un prodotto commerciale]]></category>
		<category><![CDATA[software antivirus]]></category>
		<category><![CDATA[spam Facebook]]></category>

		<guid isPermaLink="false">http://www.mirkopagliai.it/?p=2236</guid>
		<description><![CDATA[Oggi è apparso questo articolo su La Repubblica. Da quanto riportato, sembrerebbe che Facebook offrirà ai suoi utenti licenze antivirus gratuite che vanno da sei mesi fino ad un anno. Nell&#8217;articolo si legge che Gli obbiettivi sono almeno due: rendere educare gli utenti alla protezione del computer, e rendere il social network più sicuro e [...]]]></description>
			<content:encoded><![CDATA[<p>Oggi è apparso <a href="http://www.repubblica.it/tecnologia/2012/04/26/news/facebook_sposa_gli_antivirus_sei_mesi_gratuiti_per_gli_utenti-33980772/">questo</a> articolo su <em>La Repubblica</em>. Da quanto riportato, sembrerebbe che <em>Facebook</em> offrirà ai suoi utenti <strong>licenze antivirus gratuite</strong> che vanno da sei mesi fino ad un anno. Nell&#8217;articolo si legge che</p>
<blockquote><p>Gli obbiettivi sono almeno due: rendere educare gli utenti alla protezione del computer, e rendere il social network più sicuro e gli iscritti meno vulnerabili agli attacchi di spam.</p></blockquote>
<p>Primo, un antivirus non protegge e non può <strong>proteggere dallo spam</strong>, tanto meno dalla <strong>spam presente su Facebook</strong>: se un altro utente vuole postare della pubblicità sulla vostra bacheca o se ricevete messaggi privati dagli stessi contenuti, un antivirus nulla può fare. Semmai dovrebbe essere <em>Facebook</em> a prevenire (a livello di codice della propria piattaforma) questi episodi, piuttosto che consigliare &#8220;soluzioni terze&#8221; di scarsa utilità.<br />
Secondo, si parla di &#8220;educazione&#8221;, ma non si capisce perché l&#8217;educazione debba passare tramite la <strong>prova gratuita di un prodotto commerciale</strong> (e semmai non fosse chiaro: vi regalano dai 6 ai 12 mesi di utilizzo gratuito, poi dovrete pagare), cosa che sembra piuttosto marketing &#8211; appunto &#8211; commerciale.</p>
<p>Ed è proprio di <strong>marketing</strong> che si parla: le case produttrici di <strong>software antivirus</strong> pagano <em>Facebook</em>, in cambio <em>Facebook</em> vi offre per inter-tramite i loro prodotti in prova gratuita, consigliando e suggerendo (e non è cosa da poco, perché ormai è fin dentro la nostra vita e molti si fidano); quando la prova gratuita termina, dovete procedere al pagamento della licenza annuale.<br />
Insomma, <em>Facebook</em> e le case produttrici (l&#8217;articolo riporta <em>Symantec</em>, <em>McAfee</em>, <em>Trend Micro</em>, <em>Sophos</em> e <em>Microsoft</em>) guadagno, voi intanto venite &#8220;educati&#8221;. Sì, educati all&#8217;<strong>acquisto acritico</strong> e di massa.</p>
<p>Diffidate di questi articoli, diffidate anche delle rubriche informatiche e tecnologiche dei vari quotidiani italiani, che sono di una superficialità spaventosa e si limitano soltanto a fare da vetrina per prodotti, diffidate soprattutto delle relative rubriche su <em>La Repubblica</em>, che in questo senso detiene un vero e proprio record. Diffidate anche degli &#8220;acquisti suggeriti&#8221; e dagli <strong>acquisti suggeriti</strong> in particolare da Facebook. Ma fin qui spero siate capaci di arrivarci anche da soli.</p>
<p>Se utilizzate Windows, guardate a soluzioni gratuite come <a href="http://www.avast.com/it-it/free-antivirus-download">Avast</a> e <a href="http://free.avg.com/it-it/pagina-iniziale">Avg</a>. È dimostrato, informaticamente parlando, come ad oggi queste soluzioni gratuite siano pari se non superiori a quelle a pagamento, quindi non si capisce perché scegliere diversamente, soprattutto perché dover essere educati diversamente, per giunta tramite metodi subdoli.<br />
Se volete fare cosa ancora migliore, allora<a href="http://www.istitutomajorana.it/passare-linux/index.html"> passate a Linux</a> e dormite sonni tranquilli.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mirkopagliai.it/facebook-regala-antivirus-rifiutate-il-regalo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Localepurge solo in manuale</title>
		<link>http://www.mirkopagliai.it/localepurge-solo-in-manuale/</link>
		<comments>http://www.mirkopagliai.it/localepurge-solo-in-manuale/#comments</comments>
		<pubDate>Sat, 21 Apr 2012 14:10:05 +0000</pubDate>
		<dc:creator>Mirko Pagliai</dc:creator>
				<category><![CDATA[Unix]]></category>
		<category><![CDATA[/etc/apt/apt.conf.d/99-localepurge.]]></category>
		<category><![CDATA[apt-get]]></category>
		<category><![CDATA[aptitude]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[Debian Linux]]></category>
		<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[localepurge]]></category>
		<category><![CDATA[mantenere pulito il sistema]]></category>
		<category><![CDATA[pacchetti di sistema]]></category>
		<category><![CDATA[rimuovere file non necessari]]></category>
		<category><![CDATA[Synaptic]]></category>

		<guid isPermaLink="false">http://www.mirkopagliai.it/?p=2227</guid>
		<description><![CDATA[Sulle mie Debian non manca mai localepurge, un ottimo tool per mantenere pulito il sistema e rimuovere file non necessari. Questo è uno script per recuperare lo spazio su disco sprecato per file locale, localizzazioni di Gnome/KDE e pagine di manuale localizzate non necessari. In base all&#8217;installazione, è possibile recuperare qualcosa come 200, 300 o più mega byte [...]]]></description>
			<content:encoded><![CDATA[<p>Sulle mie <strong>Debian</strong> non manca mai <strong>localepurge</strong>, un ottimo tool per <strong>mantenere pulito il sistema</strong> e <strong>rimuovere file non necessari</strong>.</p>
<blockquote><p>Questo è uno script per recuperare lo spazio su disco sprecato per file locale, localizzazioni di Gnome/KDE e pagine di manuale localizzate non necessari. In base all&#8217;installazione, è possibile recuperare qualcosa come 200, 300 o più mega byte di spazio su disco dedicato alle localizzazioni che molto probabilmente non avrebbero nessun utilizzo. Sarà invocato automagicamente al termine di ogni processo di installazione di apt.</p>
<p>Notare che questo strumento è un trucco che *non* è integrato nel sistema di gestione dei pacchetti di Debian e perciò non è adatto ai deboli di cuore. Questo programma interferisce con la gestione dei pacchetti di Debian e provoca strani, ma di solito innocui, comportamenti nei programmi correlati ad apt/dpkg, come dpkg-repack, reportbug, ecc. La responsabilità e i possibili danni al sistema derivanti dal suo uso ricadono perciò nelle mani dell&#8217;amministratore di sistema (le vostre).</p>
<p>Ci si astenga categoricamente dal riportare uno qualsiasi di questi malfunzionamenti incolpando localepurge se il proprio sistema è stato danneggiato dal suo uso. Se non si sa quello che si sta facendo e non si possono risolvere autonomamente i danni derivanti dall&#8217;uso, allora semplicemente non si usi questo pacchetto.</p></blockquote>
<p>Tuttavia, se lo utilizzate avrete sicuramente notato come venga lanciato ogni qualvolta andiamo compiere una qualsiasi operazione con i <strong>pacchetti di sistema</strong> (con <em>apt-get</em> e <em>aptitude</em>, ma anche con <em>synaptic</em>). Comportamento &#8211; almeno per quanto mi riguarda &#8211; fastidioso e dispendioso, ma che può ovviamente essere disabilitato.</p>
<p>Durante la sua installazione, infatti, localepurge crea il file <em>/etc/apt/apt.conf.d/99-localepurge</em>, che si occupa appunto dell&#8217;autostart ogni volta che viene compiuta un&#8217;operazione inerente apt. Il contenuto del file:</p>
<pre class="brush: bash; title: ; notranslate">// Get rid of unneeded locale files after each package installation

DPkg
{
Post-Invoke {&quot;if [ -x /usr/sbin/localepurge ] &amp;&amp; [ $(ps w -p $PPID | grep -c remove) != 1 ]; then /usr/sbin/localepurge; else exit 0; fi&quot;;};
};</pre>
<p>Ebbene &#8211; incredibile a dirsi :-) &#8211; per disabilitare l&#8217;autostart di localepurge è sufficiente commentare quelle quattro linee di codice (anteporre il carattere <em>#</em> alle linee 3-6). Viceversa, per ripristinarlo, togliere i commenti.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mirkopagliai.it/localepurge-solo-in-manuale/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Php: array/menù a tendina con mesi di pubblicazione</title>
		<link>http://www.mirkopagliai.it/php-arraymenu-a-tendina-con-mesi-di-pubblicazione/</link>
		<comments>http://www.mirkopagliai.it/php-arraymenu-a-tendina-con-mesi-di-pubblicazione/#comments</comments>
		<pubDate>Thu, 19 Apr 2012 12:56:18 +0000</pubDate>
		<dc:creator>Mirko Pagliai</dc:creator>
				<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[menù a tendina]]></category>
		<category><![CDATA[menù a tendina con mesi]]></category>
		<category><![CDATA[menù mesi di pubblicazione]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[scegliere il mese di pubblicazione]]></category>

		<guid isPermaLink="false">http://www.mirkopagliai.it/?p=2218</guid>
		<description><![CDATA[Oggi mi sono trovato di fronte a un&#8217;esigenza un po&#8217; particolare: per un piccolo motore di ricerca di articoli, creare un menù a tendina (select) per scegliere il mese di pubblicazione. La difficoltà sta nel realizzare un array ben curato con i valori da ciclare per poi creare il citato menù a tendina. Il menù [...]]]></description>
			<content:encoded><![CDATA[<p>Oggi mi sono trovato di fronte a un&#8217;esigenza un po&#8217; particolare: per un piccolo motore di ricerca di articoli, creare un <strong>menù a tendina</strong> (<em>select</em>) per <strong>scegliere il mese di pubblicazione</strong>. La difficoltà sta nel realizzare un array ben curato con i valori da ciclare per poi creare il citato menù a tendina.</p>
<p>Il menù a tendina, ovviamente, di default dovrebbe partire dal momento attuale (cioè mese e anno corrente) e arrivare fino al mese di apertura del sito. Ad esempio, posto che l&#8217;eventuale sito abbia aperto a giugno 2010 e visto che ora siamo in aprile 2012, i valori dovrebbero essere questi:</p>
<pre class="brush: plain; light: true; title: ; notranslate">aprile 2012
marzo 2012
febbraio 2012
gennaio 2012
dicembre 2011
...
agosto 2010
luglio 2010
giugno 2010</pre>
<p>Dovrebbe tuttavia permettere anche di indicare valori di partenza e/o di arrivo diversi, oltre a quelli di default. Di seguito, la funzione che ho scritto, ben commentata (non dovrebbe necessitare di ulteriori spiegazioni):</p>
<pre class="brush: php; title: ; notranslate">/**
* Restituisce un array dei mesi (accompagnati dall'anno) in cui possono essere stati pubblicati degli articoli
* (l'array ha chiavi come &quot;2012-02&quot; e valori come &quot;febbraio 2012&quot;)
* @param int $final_month Mese di arrivo. Se non indicato, letto dalla configurazione
* @param int $final_year Anno di arrivo. Se non indica, letto dalla configurazione
* @param int $starting_month Mese di partenza. Se non indicato, impostato all'attuale
* @param int $starting_year Anno di arrivo. Se non indicato, impostato all'attuale
* @return array Array dei mesi
*/
function getPublicationMonths($final_month = null, $final_year = null, $starting_month = null, $starting_year=null) {
	//Se non è stato passato il mese o l'anno di arrivo, imposta dalle constanti di configurazione
	$final_month = !is_null($final_month) ? $final_month : FINAL_MONTH;
	$final_year = !is_null($final_year) ? $final_year : FINAL_YEAR;

	//Se non è stati passato il mese o l'anno di partenza, imposta al momento attuale
	$starting_month = !is_null($starting_month) ? $starting_month : date('n');
	$starting_year = !is_null($starting_year) ? $starting_year : date('Y');

	//Prepara l'array in cui inserire i dati
	$data = array();

	//Cicla i dati. Il ciclo ha fine quando vengono raggiunti mese e anno di arrivo
	while($starting_year != $final_year || $starting_month+1 != $final_month) {
		//Se il mese è valido (&gt;=0), aggiunge i dati all'array
		if($starting_month) {
			$data[$starting_year.'-'.date('m', mktime(0, 0, 0, $starting_month))] = strftime('%B', mktime(0, 0, 0, $starting_month)).' '.$starting_year;
			$starting_month -= 1;
		}
		//Se il mese non è valido, imposta il mese a dodice e decrementa l'anno
		else {
			$starting_month = 12;
			$starting_year -= 1;
		}
	}

	return($data);
}</pre>
<p>Giusto un aspetto che potrebbe non essere chiaro: se non viene indicato il mese e/o l&#8217;anno finali, utilizza le constanti <em>FINAL_MONTH</em> e/o <em>FINAL_YEAR</em> (che si suppone siano state già state impostate altrove e che riportano appunto mese e anno di apertura del sito. Comunque, nulla di impedisce di fare una query per selezionare l&#8217;articolo più vecchio e estrarre i dati da lì); se non viene indicato il mese e/o l&#8217;anno di partenza, utilizza mese e anno attuali.</p>
<p>Quindi, lanciandola così:</p>
<pre class="brush: php; light: true; title: ; notranslate">getPublicationMonths('6', '2010');</pre>
<p>(equivale a dire: da oggi (aprile 2012) a giugno 2010)</p>
<p>E utilizzando un altro ciclo per creare l&#8217;html del menù a tendina (perché la funzione restituisce solo un array), il risultato è questo:</p>
<pre class="brush: xml; title: ; notranslate">&lt;select&gt;
	&lt;option value=&quot;&quot;&gt;-- data --&lt;/option&gt;
	&lt;option value=&quot;2012-04&quot;&gt;aprile 2012&lt;/option&gt;
	&lt;option value=&quot;2012-03&quot;&gt;marzo 2012&lt;/option&gt;
	&lt;option value=&quot;2012-02&quot;&gt;febbraio 2012&lt;/option&gt;
	&lt;option value=&quot;2012-01&quot;&gt;gennaio 2012&lt;/option&gt;
	&lt;option value=&quot;2011-12&quot;&gt;dicembre 2011&lt;/option&gt;
	&lt;option value=&quot;2011-11&quot;&gt;novembre 2011&lt;/option&gt;
	&lt;option value=&quot;2011-10&quot;&gt;ottobre 2011&lt;/option&gt;
	&lt;option value=&quot;2011-09&quot;&gt;settembre 2011&lt;/option&gt;
	&lt;option value=&quot;2011-08&quot;&gt;agosto 2011&lt;/option&gt;
	&lt;option value=&quot;2011-07&quot;&gt;luglio 2011&lt;/option&gt;
	&lt;option value=&quot;2011-06&quot;&gt;giugno 2011&lt;/option&gt;
	&lt;option value=&quot;2011-05&quot;&gt;maggio 2011&lt;/option&gt;
	&lt;option value=&quot;2011-04&quot;&gt;aprile 2011&lt;/option&gt;
	&lt;option value=&quot;2011-03&quot;&gt;marzo 2011&lt;/option&gt;
	&lt;option value=&quot;2011-02&quot;&gt;febbraio 2011&lt;/option&gt;
	&lt;option value=&quot;2011-01&quot;&gt;gennaio 2011&lt;/option&gt;
	&lt;option value=&quot;2010-12&quot;&gt;dicembre 2010&lt;/option&gt;
	&lt;option value=&quot;2010-11&quot;&gt;novembre 2010&lt;/option&gt;
	&lt;option value=&quot;2010-10&quot;&gt;ottobre 2010&lt;/option&gt;
	&lt;option value=&quot;2010-09&quot;&gt;settembre 2010&lt;/option&gt;
	&lt;option value=&quot;2010-08&quot;&gt;agosto 2010&lt;/option&gt;
	&lt;option value=&quot;2010-07&quot;&gt;luglio 2010&lt;/option&gt;
	&lt;option value=&quot;2010-06&quot;&gt;giugno 2010&lt;/option&gt;
&lt;/select&gt;</pre>
<p>Che, graficamente, si traduce in questo:</p>
<p><img class="aligncenter size-full wp-image-2220" title="Menù a tendina con mesi" src="http://www.mirkopagliai.it/wp-content/uploads/2012/04/menu_a_tendina_con_mesi.jpg" alt="Menù a tendina con mesi" width="167" height="400" /></p>
<p>Come potete vedere dall&#8217;output html di cui sopra, il valore selezionato sarà nel formato (formato di <a href="http://it2.php.net/manual/en/function.date.php" target="_blank">date()</a>):</p>
<pre class="brush: plain; light: true; title: ; notranslate">Y-m</pre>
<p>Mentre i valori dell&#8217;array sono in questo formato (chiave =&gt; valore):</p>
<pre class="brush: plain; light: true; title: ; notranslate">Y-m =&gt; F Y</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.mirkopagliai.it/php-arraymenu-a-tendina-con-mesi-di-pubblicazione/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tutorial Jquery: menù a tendina verso l&#8217;alto</title>
		<link>http://www.mirkopagliai.it/tutorial-jquery-menu-a-tendina-verso-lalto/</link>
		<comments>http://www.mirkopagliai.it/tutorial-jquery-menu-a-tendina-verso-lalto/#comments</comments>
		<pubDate>Wed, 28 Mar 2012 16:34:44 +0000</pubDate>
		<dc:creator>Mirko Pagliai</dc:creator>
				<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[codice html]]></category>
		<category><![CDATA[codice Jquery]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[elementi html]]></category>
		<category><![CDATA[fogli di stile]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[menù a tendina]]></category>
		<category><![CDATA[menù a tendina verso l'alto]]></category>
		<category><![CDATA[Tutorial Jquery]]></category>

		<guid isPermaLink="false">http://www.mirkopagliai.it/?p=2208</guid>
		<description><![CDATA[In un precedente articolo Tutorial Jquery: menù a tendina ho ricevuto il seguente commento: Ciao Mirko, ho seguito alla lettera il tuo tutorial… nel mio caso mi servirebbe un menu con una tendina che si aprisse verso l’alto e non verso il basso… sapresti darmi qualche suggerimento su come fare? ti ringrazio! Si può fare? Sì, [...]]]></description>
			<content:encoded><![CDATA[<p>In un precedente articolo <a href="http://www.mirkopagliai.it/tutorial-jquery-menu-a-tendina">Tutorial Jquery: menù a tendina</a> ho ricevuto il seguente commento:</p>
<blockquote><p>Ciao Mirko, ho seguito alla lettera il tuo tutorial… nel mio caso mi servirebbe un menu con una tendina che si aprisse verso l’alto e non verso il basso… sapresti darmi qualche suggerimento su come fare? ti ringrazio!</p></blockquote>
<p>Si può fare? Sì, vediamo subito di aiutare Paolo.</p>
<p>Il problema che si riscontra è generalmente questo: normalmente, gli <strong>elementi html</strong> vengono disposti dall&#8217;alto verso il basso (oltre che da sinistra verso destra). Noi dobbiamo invertire questo caso, ed è possibile solo utilizzando il posizionamento assoluto.</p>
<p>Partiamo dal <a href="http://www.mirkopagliai.it/tutorial-jquery-menu-a-tendina">precedente esempio</a>. Il <strong>codice html</strong> era questo:</p>
<pre class="brush: xml; title: ; notranslate">&lt;ul id=&quot;navbar&quot;&gt;
	&lt;li&gt;&lt;a href=&quot;pagina1.html&quot;&gt;Pagina 1&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;
            &lt;a href=&quot;#&quot;&gt;Pagina 2&lt;/a&gt;
            &lt;ul&gt;
               &lt;li&gt;&lt;a href=&quot;paginaA.html&quot;&gt;Pagina A&lt;/a&gt;&lt;/li&gt;
               &lt;li&gt;&lt;a href=&quot;paginaB.html&quot;&gt;Pagina B&lt;/a&gt;&lt;/li&gt;
               &lt;li&gt;&lt;a href=&quot;paginaC.html&quot;&gt;Pagina C&lt;/a&gt;&lt;/li&gt;
            &lt;/ul&gt;
        &lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;pagina3.html&quot;&gt;Pagina 3&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</pre>
<p>Mentre il foglio di stile è disponibile <a href="http://docs.mirkopagliai.it/html/menu-tendina/style1.css">qui</a>.</p>
<p>Bene, la prima cosa da fare, come detto, è dare una posizione assoluta (<em>position: absolute</em>) ai sotto-menù. È però prima necessario indicare qual è l&#8217;elemento di riferimento (<em>position: relative</em>): nel nostro caso sarà <em>#navbar</em>, cioè il menù principale.<br />
Quindi la posizione: dal basso, dalla parte inferiore del menù principale (&#8220;bottom&#8221;) è sufficiente spostare il sotto-menù dello stesso numero di pixel dell&#8217;altezza del menù principale (che nel precedente esempio è di 25 pixel). Ovvero (riporto solo le regole che incidono su questo caso, per il resto &#8211; come già detto &#8211; guardate l&#8217;esempio precedente):</p>
<pre class="brush: css; title: ; notranslate">#navbar {
	height: 25px;
	position: relative;  /* Necessario perché fa da riferimento alla posizione dei sotto-menù (successiva regola) */
}
#navbar ul {
	bottom: 25px; /* Deve essere uguale all'altezza di #navbar (precedente regola) */
	position: absolute;
}</pre>
<p>Graficamente il nuovo menù apparirà così:<br />
<img class="aligncenter size-full wp-image-2209" title="jquery_submenu" src="http://www.mirkopagliai.it/wp-content/uploads/2012/03/jquery_submenu.jpg" alt="jquery_submenu" width="357" height="121" /></p>
<p>Anche qui, aggiungiamo ai sotto-menù la regola <em>display: none</em>, così che di default, al caricamento della pagina, non vengano mostrati.</p>
<p>Infine, proprio come nel precedente esempio, possiamo aggiungere lo stesso<strong> codice Jquery</strong>:</p>
<pre class="brush: jscript; title: ; notranslate">&lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
	$(document).ready(function(){
		$(&quot;#navbar li&quot;).hover(function (){
			$(this).children(&quot;ul&quot;).slideToggle();
		});
	});
&lt;/script&gt;</pre>
<p>Ed ecco il risultato finale:<br />
<a href="http://docs.mirkopagliai.it/html/menu-tendina/esempio6_versoalto.html">http://docs.mirkopagliai.it/html/menu-tendina/esempio6_versoalto.html</a></p>
<p>Notare che:</p>
<ol>
<li>per praticità, il codice css è nella stessa pagina html, non ho usato un foglio di stile esterno;</li>
<li>al menù principale (<em>#navbar</em>) ho aggiunto un margine superiore semplicemente per distanziarlo e rendere visibile l&#8217;effetto.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.mirkopagliai.it/tutorial-jquery-menu-a-tendina-verso-lalto/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Debian: i mirror più veloci</title>
		<link>http://www.mirkopagliai.it/debian-i-mirror-piu-veloci/</link>
		<comments>http://www.mirkopagliai.it/debian-i-mirror-piu-veloci/#comments</comments>
		<pubDate>Sat, 11 Feb 2012 16:19:06 +0000</pubDate>
		<dc:creator>Mirko Pagliai</dc:creator>
				<category><![CDATA[Unix]]></category>
		<category><![CDATA[/etc/apt/sources.list]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[individuare il mirror italiano più veloce]]></category>
		<category><![CDATA[lista dei mirror da testare]]></category>
		<category><![CDATA[lista mirror]]></category>
		<category><![CDATA[mirror debian]]></category>
		<category><![CDATA[mirror italiano]]></category>
		<category><![CDATA[mirror più veloce]]></category>
		<category><![CDATA[mirror veloce]]></category>
		<category><![CDATA[netselect]]></category>
		<category><![CDATA[testare mirror]]></category>

		<guid isPermaLink="false">http://www.mirkopagliai.it/?p=2202</guid>
		<description><![CDATA[Riporto qui sul blog l&#8217;ottimo suggerimento¹ di xtow sul forum debianizzati.org su come individuare il mirror italiano più veloce. Innanzitutto è necessario installare netselect e quindi: Va quindi lanciato col l&#8217;opzione -vv (&#8220;very verbose mode&#8221;), seguito dalla lista dei mirror da testare. Ad esempio: Nel mio caso: Modificate il vostro /etc/apt/sources.list di conseguenza. Per qualsiasi [...]]]></description>
			<content:encoded><![CDATA[<p>Riporto qui sul blog l&#8217;ottimo suggerimento¹ di xtow sul forum <a href="http://forum.debianizzati.org/viewtopic.php?p=146572#p146572" target="_blank">debianizzati.org</a> su come <strong>individuare il mirror italiano più veloce</strong>.</p>
<p>Innanzitutto è necessario installare <em>netselect</em> e quindi:</p>
<pre class="brush: bash; light: true; title: ; notranslate">apt-get install netselect</pre>
<p>Va quindi lanciato col l&#8217;opzione <em>-vv</em> (&#8220;very verbose mode&#8221;), seguito dalla <strong>lista dei mirror da testare</strong>. Ad esempio:</p>
<pre class="brush: bash; light: true; title: ; notranslate">netselect -vv debian.bononia.it debian.fastweb.it ftp.it.debian.org debian.dynamica.it debian.fastbull.org freedom.dicea.unifi.it giano.com.dist.unige.it mi.mirror.garr.it mirror.units.it</pre>
<p>Nel mio caso:</p>
<pre class="brush: bash; light: true; title: ; notranslate">root@mirko-laptop:/home/mirko# netselect -vv debian.bononia.it debian.fastweb.it ftp.it.debian.org debian.dynamica.it debian.fastbull.org freedom.dicea.unifi.it giano.com.dist.unige.it mi.mirror.garr.it mirror.units.it
Running netselect to choose 1 out of 9 addresses.
...............................................................................
freedom.dicea.unifi.it                  82 ms  22 hops   90% ok ( 9/10) [  291]
debian.fastbull.org                     39 ms  16 hops  100% ok (10/10) [  101]
giano.com.dist.unige.it               9999 ms  30 hops    0% ok
debian.fastweb.it                       28 ms  12 hops   90% ok ( 9/10) [   68]
ftp.it.debian.org                       40 ms  17 hops   90% ok ( 9/10) [  121]
mi.mirror.garr.it                       29 ms  16 hops   75% ok ( 6/ 8) [  101]
debian.dynamica.it                      33 ms  14 hops   90% ok ( 9/10) [   88]
debian.bononia.it                     9999 ms  30 hops    0% ok
mirror.units.it                         40 ms  19 hops   90% ok ( 9/10) [  127]
   68 debian.fastweb.it</pre>
<p>Modificate il vostro <em>/etc/apt/sources.list</em> di conseguenza.</p>
<p>Per qualsiasi altra cosa, fate sempre riferimento al manuale:</p>
<pre class="brush: bash; light: true; title: ; notranslate">man netselect</pre>
<p><em>netselect</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.mirkopagliai.it/debian-i-mirror-piu-veloci/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Silverlight su qualsiasi versione di Firefox/Iceweasel</title>
		<link>http://www.mirkopagliai.it/silverlight-su-qualsiasi-versione-di-firefoxiceweasel/</link>
		<comments>http://www.mirkopagliai.it/silverlight-su-qualsiasi-versione-di-firefoxiceweasel/#comments</comments>
		<pubDate>Sat, 28 Jan 2012 19:45:31 +0000</pubDate>
		<dc:creator>Mirko Pagliai</dc:creator>
				<category><![CDATA[Unix]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[Firefox 9]]></category>
		<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Iceweasel]]></category>
		<category><![CDATA[Iceweasel 9]]></category>
		<category><![CDATA[Moonlight]]></category>
		<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[siti Rai]]></category>

		<guid isPermaLink="false">http://www.mirkopagliai.it/?p=2197</guid>
		<description><![CDATA[Come probabilmente già saprete (soprattutto se giungete a questo post da una ricerca) le ultime versioni di Firefox/Iceweasel non supportano l&#8217;ultima versione dell&#8217;estensione Silverlight (la 3.99.0.3 del 12 aprile 2011); estensione ahimè necessaria (anche se in rete si possono trovare varie alternative, più o meno funzionanti) per fruire di diversi contenuti multimediali, come quelli sui [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-2198" title="Firefox" src="http://www.mirkopagliai.it/wp-content/uploads/2012/01/firefox.png" alt="Firefox" width="71" height="74" />Come probabilmente già saprete (soprattutto se giungete a questo post da una ricerca) le ultime versioni di <strong>Firefox</strong>/<strong>Iceweasel</strong> non supportano l&#8217;ultima versione dell&#8217;estensione <strong>Silverlight</strong> (la 3.99.0.3 del 12 aprile 2011); estensione ahimè necessaria (anche se in rete si possono trovare varie alternative, più o meno funzionanti) per fruire di diversi contenuti multimediali, come quelli sui <strong>siti Rai</strong>.</p>
<p>Taccio a proposito di:</p>
<ol>
<li>motivi che portano alla scelta di adottare software proprietario o che si appoggia a software proprietario, software non libero, software non-multipiattaforma o con problemi/scarse prestazioni su alcune piattaforme, software non flessibile e via dicendo. Soprattutto quando (vedi caso della Rai) sono tenuto anche a pagare. Ma è già assodato come ci siano in giro troppi ingegneri, esperti di informatica o sviluppatori che, anche se con laurea alla mano, dovrebbe andare a fare un altro lavoro causa pochezza mentale;</li>
<li>motivi che portano a sviluppare un software, farlo adottare da tanti e in contesti così cruciali da fare in modo che diventi un software essenziale e poi non aggiornarlo regolarmente (l&#8217;ultima release stabile risale &#8211; lo ripeto &#8211; ad aprile 2011).</li>
</ol>
<p>Vengo a spiegarvi come ho risolto sulla <strong>Debian</strong>, procedura che dovrebbe essere valida anche su altre distribuzioni <strong>GNU/Linux</strong>.  Anzitutto dovete sapere che l&#8217;estensione funziona benissimo (almeno io la sto usando su <strong>Firefox 9</strong>), è solo che per ogni estensione viene indicata una versione massima e una minima dei vari browser e presumibilmente la prima sarà l&#8217;ultima versione disponibile al momento della versione dell&#8217;estensione.</p>
<p>Dunque:</p>
<ol>
<li>scaricate (non installandola, ma scaricandola effettivamente sul vostro hard disk) l&#8217;estensione da <a href="http://www.go-mono.com/moonlight/download.aspx" target="_blank">qui</a>. Con lo stesso Firefox/Iceweasel dovrebbe essere sufficiente fare click destro sul link e quindi scegliere l&#8217;opzione &#8220;Salva destinazione con nome&#8230;&#8221;. Altrimenti, c&#8217;è sempre il divino <em>wget</em>:
<pre class="brush: bash; light: true; title: ; notranslate">wget http://www.go-mono.com/moonlight/downloads/3.99.0.3/novell-moonlight-3.99.0.3-x86_64.xpi</pre>
</li>
<li>il file scaricato è un archivio, quindi decomprimetelo (assumo sappiate già come fare). In caso di problemi, rinominatelo come un <em>.zip</em>;</li>
<li>entrate nella directory estratta e aprite il file <em>install.rdf</em>, con un qualsiasi editor di testo. Quindi cercate le seguenti righe:
<pre class="brush: plain; light: true; title: ; notranslate">&lt;em:targetApplication&gt; &lt;!-- Firefox --&gt;
   &lt;Description&gt;
   &lt;em:id&gt;{ec8030f7-c20a-464f-9b0e-13a3a9e97384}&lt;/em:id&gt;
   &lt;em:minVersion&gt;1.5&lt;/em:minVersion&gt;
   &lt;em:maxVersion&gt;4.0.*&lt;/em:maxVersion&gt;
   &lt;/Description&gt;
&lt;/em:targetApplication&gt;</pre>
<p>Modificate la versione massima, ad esempio così:</p>
<pre class="brush: plain; light: true; title: ; notranslate">&lt;em:maxVersion&gt;10.*&lt;/em:maxVersion&gt;</pre>
<p>Non dovete rimuoverla, deve essere presente, volutamente potete indicare qualsiasi numero (anche 100).<br />
Quindi salvate il file;</li>
<li>cancellate la directory META-INF;</li>
<li>ricreate l&#8217;archivio come file <em>.zip</em>. <span style="text-decoration: underline;">Fate attenzione a creare un archivio non della directory estratta</span> (altrimenti, al momento dell&#8217;installazione, vi dirà che l&#8217;estensione risulta danneggiata), ma dei file contenuti nella directory. Il file risultante dovrebbe chiamarsi <em>novell-moonlight-3.99.0.3-x86_64.xpi_FILES.zip</em>, modificatelo affinché abbia il nome come quello originale;</li>
<li>in Firefox andate su &#8220;Strumenti&#8221;, &#8220;Componenti aggiuntivi&#8221;, fate click sul pulsante alla sinistra della barra di ricerca e scegliete l&#8217;opzione &#8220;Installa componente aggiuntivo da file&#8230;&#8221;. Selezionate il file, attendete il termine dell&#8217;installazione e riavviate il browser.</li>
</ol>
<p>Fatto.</p>
<p>Fonte: <a href="http://bit.ly/tM4rS2" target="_blank">http://bit.ly/tM4rS2</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.mirkopagliai.it/silverlight-su-qualsiasi-versione-di-firefoxiceweasel/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Amarok 1.4.10</title>
		<link>http://www.mirkopagliai.it/amarok-1-4-10/</link>
		<comments>http://www.mirkopagliai.it/amarok-1-4-10/#comments</comments>
		<pubDate>Tue, 10 Jan 2012 11:44:16 +0000</pubDate>
		<dc:creator>Mirko Pagliai</dc:creator>
				<category><![CDATA[Unix]]></category>
		<category><![CDATA[Amarok]]></category>
		<category><![CDATA[Amarok 1.4]]></category>
		<category><![CDATA[Amarok 1.4.10]]></category>
		<category><![CDATA[amarok-common]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[Debian Lenny]]></category>
		<category><![CDATA[dpkg. installare Amarok]]></category>
		<category><![CDATA[repository Debian Lenny]]></category>
		<category><![CDATA[sources.list]]></category>
		<category><![CDATA[Synaptic]]></category>
		<category><![CDATA[vecchia versione di Amarok]]></category>

		<guid isPermaLink="false">http://www.mirkopagliai.it/?p=2189</guid>
		<description><![CDATA[18/05/2012: guida obsoleta. Guardare qui. Mettiamo che, come il sottoscritto, reputate la vecchia versione di Amarok (Amarok 1.4) come la migliore. Mettiamo che, come il sottoscritto, volete ancora utilizzarla sulla vostra Debian (qualsiasi versione). Bene, Amarok 1.4 è ancora presente &#8211; al momento in cui scrivo &#8211; su Debian Lenny, l&#8217;attuale old-stable: vediamo come reperirlo, [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-thumbnail wp-image-2191" title="Amarok logo" src="http://www.mirkopagliai.it/wp-content/uploads/2012/01/amarok-logo-180x180.jpg" alt="Amarok logo" width="120" height="120" /></p>
<p><strong><span style="color: #ff0000;">18/05/2012: guida obsoleta. Guardare <span style="text-decoration: underline;"><a href="http://www.mirkopagliai.it/amarok-1-4-10-aggiornamenti/"><span style="color: #ff0000; text-decoration: underline;">qui</span></a></span>.</span></strong></p>
<p>Mettiamo che, come il sottoscritto, reputate la <strong>vecchia versione di Amarok</strong> (<strong>Amarok 1.4</strong>) come la migliore. Mettiamo che, come il sottoscritto, volete ancora utilizzarla sulla vostra <strong>Debian</strong> (qualsiasi versione).</p>
<p>Bene, Amarok 1.4 è ancora presente &#8211; al momento in cui scrivo &#8211; su <strong>Debian Lenny</strong>, l&#8217;attuale old-stable: vediamo come reperirlo, come conservarlo (prima o poi i <strong>repository di Debian Lenny</strong> andranno off, anche se con un po&#8217; di impegno si può accedere ancora a repository molto più vecchi, che qualcuno conserva qua e là) e come installarlo.</p>
<p>Innanzitutto, se i repository di Debian Lenny sono ancora disponibili, configuriamo il pinning (se non lo abbiamo ancora fatto) come spiegato <a href="http://www.mirkopagliai.it/debian-repository-e-pinning/" target="_blank">qui</a> e poi aggiungiamo al nostro<em> sources.list</em> il repository:</p>
<pre class="brush: plain; light: true; title: ; notranslate">deb http://ftp.it.debian.org/debian/ lenny main contrib non-free</pre>
<p>Fatto questo, aggiorniamo e poi scarichiamo i pacchetti che ci servono (li scarichiamo proprio per conservarli per il futuro):</p>
<pre class="brush: bash; light: true; title: ; notranslate">aptitude update
aptitude -t lenny download amarok amarok-common amarok-engine-xine libgpod3-nogtk libmtp7 libmysqlclient15off</pre>
<p>I pacchetti verranno scaricati nell&#8217;attuale directory e dovrebbero essere (può cambiare l&#8217;architettura):</p>
<pre class="brush: bash; light: true; title: ; notranslate">amarok_1.4.10-2lenny1_i386.deb
amarok-common_1.4.10-2lenny1_all.deb
amarok-engine-xine_1.4.10-2lenny1_i386.deb
libgpod3-nogtk_0.6.0-6_i386.deb
libmtp7_0.2.6.1-3_i386.deb
libmysqlclient15off_5.0.51a-24+lenny5_i386.deb</pre>
<p>Semmai i repository di Lenny non dovessero essere più presenti, ho preparato un archivio con questi pacchetti per <a href="http://docs.mirkopagliai.it/packages/amarok_32bit.tar.gz" target="_blank">32bit</a> e <a href="http://docs.mirkopagliai.it/packages/amarok_64bit.tar.gz" target="_blank">64bit</a>. Scaricate e decomprimete.</p>
<p>Fatto questo, è necessario procedere con l&#8217;installazione di alcune dipendenze necessarie:</p>
<pre class="brush: bash; light: true; title: ; notranslate">aptitude install kdelibs4c2a libqt3-mt libifp4 libkarma0 libnjb5 libpq5 libtunepimp5</pre>
<p>Notate che queste dipendenze dovrebbero essere presenti anche nella vostra versione di Debian, quindi in questo caso non si necessita di pinning. Le dipendenze non più presenti (cioè obsolete) le abbiamo già reperite. Bisogna prima installare queste perché il resto verrà installato tramite <em>dpkg</em>, che non si preoccupa di installare eventuali dipendenze mancanti.</p>
<p>Infatti, a questo punto non resta che <strong>installare Amarok</strong> e le dipendenze ormai obsolete. Nella cartella in cui abbiamo precedentemente scaricato:</p>
<pre class="brush: bash; light: true; title: ; notranslate">dpkg -i amarok*.deb libgpod3-nogtk*.deb libmtp*.deb libmysqlclient15off*.deb</pre>
<p>Ed è fatta. Due accorgimenti:</p>
<ol>
<li>il lanciatore nel menù è nascosto di default, quindi (in Gnome 2) click destro del mouse sul menù, &#8220;Modifica menù&#8221;, andate sotto &#8220;Audio e video&#8221; e mettete la spunta alla relativa opzione;</li>
<li>il nostro gestore dei pacchetti, rilevata una versione più recente di Amarok, insisterà nel farci aggiornare. Per risolvere è sufficiente bloccare i pacchetti <em>amarok</em> e <em>amarok-common</em>. In <em>aptitude</em>:
<pre class="brush: bash; light: true; title: ; notranslate">aptitude hold amarok amarok-common</pre>
<p>In <em>synaptic</em> cercate (guardate sotto &#8220;Installato (aggiornabile)&#8221;) i due pacchetti, selezionatene uno alla volta, poi andate sul menù &#8220;Pacchetto&#8221; e mettete la spunta a &#8220;Blocca versione&#8221;.<br />
Notate che dovete seguire entrambe le procedure.</li>
</ol>
<p>Et voilà:</p>
<p><a href="http://www.mirkopagliai.it/wp-content/uploads/2012/01/amarok.jpg"><img class="aligncenter size-full wp-image-2190" title="Amarok" src="http://www.mirkopagliai.it/wp-content/uploads/2012/01/amarok.jpg" alt="Amarok" width="600" height="340" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.mirkopagliai.it/amarok-1-4-10/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Bash scripting: check for and install missing dependencies</title>
		<link>http://www.mirkopagliai.it/bash-scripting-check-for-and-install-missing-dependencies/</link>
		<comments>http://www.mirkopagliai.it/bash-scripting-check-for-and-install-missing-dependencies/#comments</comments>
		<pubDate>Tue, 03 Jan 2012 15:49:10 +0000</pubDate>
		<dc:creator>Mirko Pagliai</dc:creator>
				<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[Unix]]></category>
		<category><![CDATA[apt-get]]></category>
		<category><![CDATA[ArchLinux]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[bash scripting]]></category>
		<category><![CDATA[CentOS]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[dpkg]]></category>
		<category><![CDATA[Fedora]]></category>
		<category><![CDATA[install missing dependencies]]></category>
		<category><![CDATA[list of required dependencies]]></category>
		<category><![CDATA[logiche di mercato]]></category>
		<category><![CDATA[Mandriva]]></category>
		<category><![CDATA[Mint]]></category>
		<category><![CDATA[missing dependencies]]></category>
		<category><![CDATA[need some dependencies]]></category>
		<category><![CDATA[openSUSE]]></category>
		<category><![CDATA[pacman]]></category>
		<category><![CDATA[rpm]]></category>
		<category><![CDATA[rpm-based]]></category>
		<category><![CDATA[run a bash script]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[urpmi]]></category>
		<category><![CDATA[what dependencies are missing]]></category>
		<category><![CDATA[yum]]></category>
		<category><![CDATA[zypper]]></category>

		<guid isPermaLink="false">http://www.mirkopagliai.it/?p=2181</guid>
		<description><![CDATA[Sometimes we need some dependencies are installed on the operating system to run a bash script. So you can create a script that installs the missing dependencies. After making a list of required dependencies, there are two ways to do this: pass the entire list to the package manager. Then the package manager will check [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-thumbnail wp-image-2145" title="Bash script" src="http://www.mirkopagliai.it/wp-content/uploads/2011/10/bash-script-180x180.png" alt="" width="116" height="116" />Sometimes we <strong>need some dependencies</strong> are installed on the operating system to <strong>run a bash script</strong>. So you can create a script that installs the missing dependencies.</p>
<p>After making <strong>a list of required dependencies</strong>, there are two ways to do this:</p>
<ol>
<li>pass the entire list to the package manager. Then the package manager will check which packages are already installed and will proceed with the installation of those that are missing;</li>
<li>check what dependencies are already installed, make a list of dependencies that are missing, then pass to the package manager only missing dependencies list.</li>
</ol>
<p>The second choice is the best choice, besides being more elegant. First, because it has a better chance of success (by hypothesis, some package managers may not work, if we ask it to install a package that&#8217;s already installed); second, &#8217;cause if we were having some problems with the installation (for whatever reason), we can say exactly to the user what are the packages that he has to install manually.</p>
<p>Now let&#8217;s see what we have to do. As I have already said, we should:</p>
<ol>
<li>make a list of required dependencies (it&#8217;ll be the <em>DEPENDENCIES</em> array);</li>
<li>check <strong>what dependencies are missing</strong> and save them in a new list (it&#8217;ll be the <em>PKGSTOINSTALL</em> string);</li>
<li>install missing dependencies (from the <em>PKGSTOINSTALL</em> string).</li>
</ol>
<p>Well, let&#8217;s go to the code. We need to create a list of required dependencies, for example <em>foo</em> and <em>bar</em> packages:</p>
<pre class="brush: bash; light: true; title: ; notranslate">DEPENDENCIES=(foo bar)</pre>
<p>Now we need to check which of those packages are already installed. The missing packages will be added to the <em>PKGSTOINSTALL</em> string, separated by a space:</p>
<pre class="brush: bash; title: ; notranslate"># What dependencies are missing?
PKGSTOINSTALL=&quot;&quot;
for (( i=0; i /dev/null; then
		if [[ ! `dpkg -l | grep -w &quot;ii  ${DEPENDENCIES[$i]} &quot;` ]]; then
			PKGSTOINSTALL=$PKGSTOINSTALL&quot; &quot;${DEPENDENCIES[$i]}
		fi
	# OpenSuse, Mandriva, Fedora, CentOs, ecc. (with rpm)
	elif which rpm &amp;&gt; /dev/null; then
		if [[ ! `rpm -q ${DEPENDENCIES[$i]}` ]]; then
			PKGSTOINSTALL=$PKGSTOINSTALL&quot; &quot;${DEPENDENCIES[$i]}
		fi
	# ArchLinux (with pacman)
	elif which pacman &amp;&gt; /dev/null; then
		if [[ ! `pacman -Qqe | grep &quot;${DEPENDENCIES[$i]}&quot;` ]]; then
			PKGSTOINSTALL=$PKGSTOINSTALL&quot; &quot;${DEPENDENCIES[$i]}
		fi
	# If it's impossible to determine if there are missing dependencies, mark all as missing
	else
		PKGSTOINSTALL=$PKGSTOINSTALL&quot; &quot;${DEPENDENCIES[$i]}
	fi
done</pre>
<p>With a loop we will be checked every necessary dependency. <em>Dpkg</em> will be used for the <strong>deb-based distros</strong> (Debian, Ubuntu and derivatives, as Mint), <em>rpm</em> for the <strong>rpm-based</strong> (OpenSuse, Mandriva, Fedora, CentOs, etc.) and <em>pacman</em> for ArchLinux. If none of these is available on the system (for whatever reason), all the required dependencies will be marked as missing.</p>
<p>At this point, as I said before, the <em>PKGSTOINSTALL</em> string contains the list of required dependencies that are missing. We can proceed to install them:</p>
<pre class="brush: bash; title: ; notranslate"># If some dependencies are missing, asks if user wants to install
if [ &quot;$PKGSTOINSTALL&quot; != &quot;&quot; ]; then
	echo -n &quot;Some dependencies are missing. Want to install them? (Y/n): &quot;
	read SURE
	# If user want to install missing dependencies
	if [[ $SURE = &quot;Y&quot; || $SURE = &quot;y&quot; || $SURE = &quot;&quot; ]]; then
		# Debian, Ubuntu and derivatives (with apt-get)
		if which apt-get &amp;&gt; /dev/null; then
			apt-get install $PKGSTOINSTALL
		# OpenSuse (with zypper)
		elif which zypper &amp;&gt; /dev/null; then
			zypper in $PKGSTOINSTALL
		# Mandriva (with urpmi)
		elif which urpmi &amp;&gt; /dev/null; then
			urpmi $PKGSTOINSTALL
		# Fedora and CentOS (with yum)
		elif which yum &amp;&gt; /dev/null; then
			yum install $PKGSTOINSTALL
		# ArchLinux (with pacman)
		elif which pacman &amp;&gt; /dev/null; then
			pacman -Sy $PKGSTOINSTALL
		# Else, if no package manager has been founded
		else
			# Set $NOPKGMANAGER
			NOPKGMANAGER=TRUE
			echo &quot;ERROR: impossible to found a package manager in your sistem. Please, install manually ${DEPENDENCIES[*]}.&quot;
		fi
		# Check if installation is successful
		if [[ $? -eq 0 &amp;&amp; ! -z $NOPKGMANAGER ]] ; then
			echo &quot;All dependencies are satisfied.&quot;
		# Else, if installation isn't successful
		else
			echo &quot;ERROR: impossible to install some missing dependencies. Please, install manually ${DEPENDENCIES[*]}.&quot;
		fi
	# Else, if user don't want to install missing dependencies
	else
		echo &quot;WARNING: Some dependencies may be missing. So, please, install manually ${DEPENDENCIES[*]}.&quot;
	fi
fi</pre>
<p>Now I&#8217;ll explain this portion of code. First of all, the script asks the user if he wanna proceed with the installation (else, it will tell the user which packages have to install manually). Then it proceeds by using the package manager avaible on the system: <em>apt-get</em> for Debian, Ubuntu and derivateves, <em>zypper</em> for OpenSuse, <em>urpmi</em> for Mandriva, <em>yum</em> for Fedora and CentOS and <em>pacman</em> for Archlinux.</p>
<p>If none is available, the user indicates which packages have to install manually. Finally it verifies if the installation was successful and in case of problems, again, alerts the user.</p>
<p>Good luck.</p>
<p>(in italiano: <a href="http://www.mirkopagliai.it/bash-scripting-verificare-e-installare-dipendenze-mancanti/">Bash scripting: verificare e installare dipendenze mancanti</a>)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mirkopagliai.it/bash-scripting-check-for-and-install-missing-dependencies/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CakePHP: custom flash messages</title>
		<link>http://www.mirkopagliai.it/cakephp-custom-flash-messages/</link>
		<comments>http://www.mirkopagliai.it/cakephp-custom-flash-messages/#comments</comments>
		<pubDate>Tue, 03 Jan 2012 13:02:39 +0000</pubDate>
		<dc:creator>Mirko Pagliai</dc:creator>
				<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[Cake's core]]></category>
		<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[CakePHP documentation]]></category>
		<category><![CDATA[different types of messages]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[flash message]]></category>
		<category><![CDATA[flash method]]></category>
		<category><![CDATA[manage directly the session]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[one-time notification message]]></category>
		<category><![CDATA[override the classes of Cake's core]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[rewrite component]]></category>
		<category><![CDATA[rewrite helper]]></category>
		<category><![CDATA[SessionComponent]]></category>
		<category><![CDATA[SessionHelper]]></category>
		<category><![CDATA[setFlash]]></category>
		<category><![CDATA[setFlash method]]></category>
		<category><![CDATA[show a message inside a view]]></category>
		<category><![CDATA[store more messages in a single action]]></category>
		<category><![CDATA[store multiple messages]]></category>
		<category><![CDATA[style for flash messages]]></category>
		<category><![CDATA[style sheet]]></category>

		<guid isPermaLink="false">http://www.mirkopagliai.it/?p=2166</guid>
		<description><![CDATA[As you know, CakePHP can manage flash messages, information messages for the user that are stored by and in session. They are particularly used to notify some operations (result of authentication operations, operations on the database, etc..). Essentially, flash messages are used whenever you want to say to an user: &#8220;hey man, everything is fine, or [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.mirkopagliai.it/wp-content/uploads/2012/01/cake-logo.png"><img class="alignleft  wp-image-2168" title="CakePHP" src="http://www.mirkopagliai.it/wp-content/uploads/2012/01/cake-logo.png" alt="CakePHP" width="138" height="138" /></a>As you know, <strong>CakePHP</strong> can manage <strong>flash messages</strong>, information messages for the user that are stored by and in session. They are particularly used to notify some operations (result of authentication operations, operations on the database, etc..).</p>
<p>Essentially, flash messages are used whenever you want to say to an user: &#8220;hey man, everything is fine, or something went wrong&#8221;.</p>
<p>As the <a href="http://book.cakephp.org/2.0/en/core-libraries/components/sessions.html?highlight=setflash#creating-notification-messages" target="_blank">CakePHP documentation</a> explains:</p>
<blockquote><p>Often in web applications, you will need to display a one-time notification message to the user after processing a form or acknowledging data. In CakePHP, these are referred to as “flash messages”. You can set flash messages with the SessionComponent and display them with the SessionHelper::flash(). To set a message, use setFlash.</p></blockquote>
<p>To store a message inside a controller, you can use the <em>setFlash()</em> method (<a href="http://book.cakephp.org/2.0/en/core-libraries/components/sessions.html#SessionComponent::setFlash" target="_blank">API</a>) provided by <em>SessionComponent</em>; to <strong>show a message inside a view</strong>, you can instead use the <em>flash()</em> method (<a href="http://book.cakephp.org/2.0/en/core-libraries/helpers/session.html#SessionHelper::flash" target="_blank">API</a>) provided by <em>SessionHelper</em>. </p>
<p>For example, inside a controller like this:</p>
<pre class="brush: php; title: ; notranslate">public function myAction() {
   // do something...
   $this-&gt;Session-&gt;setFlash(&quot;it works!&quot;);
   // do something...
}</pre>
<p>Inside a view:</p>
<pre class="brush: php; light: true; title: ; notranslate">Session-&gt;flash(); ?&gt;</pre>
<p>As my example says, this will work correctly and will produce this html:</p>
<pre class="brush: xml; light: true; title: ; notranslate">&lt;div id=&quot;flashMessage&quot; class=&quot;message&quot;&gt;it works!&lt;/div&gt;</pre>
<p>This is really nice, especially because flash messages are &#8220;one-time messages&#8221; and the developer doesn&#8217;t have to worry about <strong>manage directly the session</strong> (<strong>Cake&#8217;s core</strong> will take care of this, not you). But there are problems when you wanna <strong>store more messages in a single action</strong> of a controller. Indeed this one:</p>
<pre class="brush: php; title: ; notranslate">public function myAction() {
   // do something...
   $this-&gt;Session-&gt;setFlash(&quot;does it work?&quot;);
   $this-&gt;Session-&gt;setFlash(&quot;it works!&quot;);
   // do something...
}</pre>
<p>will remember only the second flash message. And the first one? Another problem is: and if I wanted to differentiate between <strong>different types of messages</strong> (for example: warnings, errors, confirmations, etc..)?<br />
As the documentation explains, &#8220;using the <em>$key</em> parameter you can <strong>store multiple messages</strong>, which can be output separately&#8221; (quoting the documentation example):</p>
<pre class="brush: php; title: ; notranslate">// set a bad message.
$this-&gt;Session-&gt;setFlash('Something bad.', 'default', array(), 'bad');
// set a good message.
$this-&gt;Session-&gt;setFlash('Something good.', 'default', array(), 'good');</pre>
<p>These flash messages will be output as html and styled differently:</p>
<pre class="brush: php; title: ; notranslate">// in a view.
echo $this-&gt;Session-&gt;flash('good');
echo $this-&gt;Session-&gt;flash('bad');</pre>
<p>You can also pass a class in <em>$params</em> array using again <em>$this->Session->setFlash</em>:</p>
<pre class="brush: php; light: true; title: ; notranslate">$this-&gt;Session-&gt;setFlash('Example message text', 'default', array('class' =&gt; 'example_class'));</pre>
<p>Using <em>$this->Session->flash()</em>, the output will be:</p>
<pre class="brush: xml; light: true; title: ; notranslate">&lt;div id=&quot;flashMessage&quot; class=&quot;example_class&quot;&gt;Example message text&lt;/div&gt;</pre>
<p>But all this is very uncomfortable to use and is very difficult to develop using the proposal syntax.<br />
So, how to solve? It&#8217;s simple: <strong>rewrite component and helper</strong>.<br />
First, you need to copy</p>
<pre class="brush: plain; light: true; title: ; notranslate">lib/Cake/Controller/Component/SessionComponent.php</pre>
<p>in</p>
<pre class="brush: plain; light: true; title: ; notranslate">app/Controller/Component/</pre>
<p>and</p>
<pre class="brush: plain; light: true; title: ; notranslate">lib/Cake/View/Helper/SessionHelper.php</pre>
<p>in</p>
<pre class="brush: plain; light: true; title: ; notranslate">app/View/Helper/</pre>
<p>This allows you to <strong>override the classes of Cake&#8217;s core</strong> with yours, that will be used first (<span style="text-decoration: underline;">note</span>: you must not edit directly Cake&#8217;s core, never! Just rewrite components, helpers, views, etc.).</p>
<p>Then, in <em>app/Controller/Component/SessionComponent.php</em> replace the <em>setFlash()</em> function with this one:</p>
<pre class="brush: php; title: ; notranslate">public function setFlash($message, $type=&quot;message&quot;) {
	//If flash messages are already stored in session, fetch array
	if(CakeSession::check('flashMessages'))
		$messages = CakeSession::read('flashMessages');
	//Else, create a new empty array
	else
		$messages = array();
	//If the flash message type is not supported (only &quot;error&quot;, &quot;notice&quot;, &quot;success&quot; and &quot;warning&quot;), set it to &quot;notice&quot;
	if(!in_array($type = strtolower($type), array(&quot;error&quot;, &quot;notice&quot;, &quot;success&quot;, &quot;warning&quot;)))
		$type = &quot;notice&quot;;
	//Add the passed flash message to the array
	$messages[$type][] = $message;
	//Store in sessione
	CakeSession::write('flashMessages', $messages);
}</pre>
<p>With this, now you can store flash messages like this (it will store an error):</p>
<pre class="brush: php; light: true; title: ; notranslate">echo $this-&gt;Session-&gt;flash('something has gone wrong', 'error');</pre>
<p>Again, in <em>app/View/Helper/SessionHelper.php</em> replace the <em>flash()</em> function with this one:</p>
<pre class="brush: php; title: ; notranslate">public function flash() {
	//Check if flash messages are stored in session
	if(CakeSession::check('flashMessages')) {
		//Retrieve saved flash messages and deletes them from the session
		$messages = CakeSession::read('flashMessages');
		CakeSession::delete('flashMessages');
		//Prepare the $out variable that will contain the final output
		$out = &quot;&quot;;
		//Loop every flash message that is stored in session, appending to the variable $out
		foreach ($messages as $type =&gt; $message) {
			foreach ($message as $text)
				$out .= '&lt;div class=&quot;'.$type.'&quot;&gt;'.$text.'&lt;/div&gt;';
		}
		//Return flash messages in html
		return $out;
	}
}</pre>
<p>It will return flash messages as:</p>
<pre class="brush: php; light: true; title: ; notranslate">&lt;div class=&quot;$type&quot;&gt;$text&lt;/div&gt;</pre>
<p>Now a new example. Inside your controller:</p>
<pre class="brush: php; title: ; notranslate">$this-&gt;Session-&gt;setFlash(&quot;This is just a warning&quot;, &quot;warning&quot;);
$this-&gt;Session-&gt;setFlash(&quot;It's ok!&quot;, &quot;success&quot;);
$this-&gt;Session-&gt;setFlash(&quot;Something seems to have gone wrong&quot;, &quot;error&quot;);
$this-&gt;Session-&gt;setFlash(&quot;A simple, innocent news.&quot;, &quot;notice&quot;);</pre>
<p>It will be displayed like this:</p>
<pre class="brush: xml; title: ; notranslate">&lt;div class=&quot;warning&quot;&gt;This is just a warning&lt;/div&gt;
&lt;div class=&quot;success&quot;&gt;It's ok!&lt;/div&gt;
&lt;div class=&quot;error&quot;&gt;Something seems to have gone wrong&lt;/div&gt;
&lt;div class=&quot;notice&quot;&gt;A simple, innocent news.&lt;/div&gt;
</pre>
<p>Wonderful, is not it?</p>
<p>Since we are here, just add a little <strong>style for flash messages</strong>. In the view, you have to display messages like this:</p>
<pre class="brush: php; title: ; notranslate">&lt;div id=&quot;flashMessages&quot;&gt;
	&lt;?php echo $this-&gt;Session-&gt;flash(); ?&gt;
&lt;/div&gt;</pre>
<p>Download <a href="http://docs.mirkopagliai.it/documents/dialogs-pics.tar.gz" target="_blank">these files</a> and move them to <em>app/webroot/img/</em>, then add to your <strong>style sheet</strong>:</p>
<pre class="brush: css; title: ; notranslate">#flashMessages div {
	background: no-repeat 5px 5px;
	border-radius: 5px;
	border-style: solid;
	border-width: 2px;
	box-shadow: 0 5px 5px -5px #555;
	margin-bottom: .5em;
	min-height: 24px;
	padding: 5px 10px 5px 35px;
}

#flashMessages .error {
	background-color: #FFCCCC;
    background-image: url(&quot;/img/error.png&quot;);
    border-color: #8F0000;
    color: #8F0000;
}

#flashMessages .notice {
	background-color: #e6ecf2;
	background-image: url(&quot;/img/notice.png&quot;);
	border-color: #314e6c;
	color: #314e6c;
}

#flashMessages .success {
    background-color: #DEFADE;
    background-image: url(&quot;/img/success.png&quot;);
    border-color: #267726;
    color: #267726;
}

#flashMessages .warning {
    background-color: #FFEEBF;
    background-image: url(&quot;/img/warning.png&quot;);
    border-color: #B87D00;
    color: #B87D00;
}</pre>
<p>This is the result:</p>
<p><a href="http://www.mirkopagliai.it/wp-content/uploads/2012/01/flashMessages.png"><img class="aligncenter size-full wp-image-2167" title="flash messages" src="http://www.mirkopagliai.it/wp-content/uploads/2012/01/flashMessages.png" alt="flash messages" width="611" height="182" /></a></p>
<p>A great work guys! ;-)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mirkopagliai.it/cakephp-custom-flash-messages/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Abortisce con la pillola del giorno dopo</title>
		<link>http://www.mirkopagliai.it/abortisce-con-la-pillola-del-giorno-dopo/</link>
		<comments>http://www.mirkopagliai.it/abortisce-con-la-pillola-del-giorno-dopo/#comments</comments>
		<pubDate>Fri, 09 Dec 2011 13:42:53 +0000</pubDate>
		<dc:creator>Mirko Pagliai</dc:creator>
				<category><![CDATA[Costume e società]]></category>
		<category><![CDATA[abortire]]></category>
		<category><![CDATA[alimentare la disinformazione]]></category>
		<category><![CDATA[Cinzia Sasso]]></category>
		<category><![CDATA[disinformazione]]></category>
		<category><![CDATA[pillola del giorno dopo]]></category>

		<guid isPermaLink="false">http://www.mirkopagliai.it/?p=2159</guid>
		<description><![CDATA[L&#8217;articolo è qui, a firma di Cinzia Sasso. Si legge chiaramente come una ragazza, per abortire, abbia fatto ricorso alla pillola del giorno dopo. Le ipotesi plausibili (o meglio: che mi vengono in mente) sono due: la giornalista è venuta a sapere che la ragazza aveva fatto uso della pillola del giorno dopo e ha [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.mirkopagliai.it/wp-content/uploads/2011/12/Schermata-del-2011-12-09-134059.jpg"><img class="aligncenter size-full wp-image-2160" title="Pillola del giorno dopo" src="http://www.mirkopagliai.it/wp-content/uploads/2011/12/Schermata-del-2011-12-09-134059.jpg" alt="Pillola del giorno dopo" width="693" height="158" /></a>L&#8217;articolo è <a href="http://www.repubblica.it/cronaca/2011/12/09/news/ragazzina_aborto-26317910/" target="_blank">qui</a>, a firma di <strong>Cinzia Sasso</strong>. Si legge chiaramente come una ragazza, per <strong>abortire</strong>, abbia fatto ricorso alla <strong>pillola del giorno dopo</strong>. Le ipotesi plausibili (o meglio: che mi vengono in mente) sono due:</p>
<ol>
<li>la giornalista è venuta a sapere che la ragazza aveva fatto uso della pillola del giorno dopo e ha dedotto (erroneamente) che ha abortito e che quindi fosse rimasta incinta;</li>
<li>viceversa, che la ragazza era rimasta incinta e ha abortito e ha dedotto (sempre erroneamente) che l&#8217;abbia fatto tramite l&#8217;uso della pillola del giorno dopo.</li>
</ol>
<p>In ogni caso &#8211; diciamo per sintesi &#8211; la giornalista ha lavorato di fantasia per arricchire l&#8217;articolo. E il risultato è quello che si vede.</p>
<p>Il problema è che la discussione su aborto da una parte e contraccettivi dall&#8217;altra, ad oggi, nel nostro Paese, è basata quasi esclusivamente sulla <strong>disinformazione</strong>, sia di chi è contrario ai due (soprattutto), sia (anche e non di meno) di chi è favore delle due o di una delle due.<br />
In questo contesto, un giornalista può permettersi, senza troppe responsabilità, di <strong>alimentare la disinformazione</strong>? Non si sente la necessità di aderire a un codice deontologico oppure, quanto meno, di informarsi come requisito per informare (&#8220;informarsi per informare&#8230;&#8221;), assumendo che si sia in buona fede?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mirkopagliai.it/abortisce-con-la-pillola-del-giorno-dopo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tutorial Jquery: menù a tendina</title>
		<link>http://www.mirkopagliai.it/tutorial-jquery-menu-a-tendina/</link>
		<comments>http://www.mirkopagliai.it/tutorial-jquery-menu-a-tendina/#comments</comments>
		<pubDate>Mon, 31 Oct 2011 16:48:47 +0000</pubDate>
		<dc:creator>Mirko Pagliai</dc:creator>
				<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[append]]></category>
		<category><![CDATA[codice html pulito e conforme]]></category>
		<category><![CDATA[costrutto if]]></category>
		<category><![CDATA[each]]></category>
		<category><![CDATA[effetti menù]]></category>
		<category><![CDATA[effetto al passaggio del mouse]]></category>
		<category><![CDATA[fadeToggle]]></category>
		<category><![CDATA[foglio di stile]]></category>
		<category><![CDATA[hover]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[length]]></category>
		<category><![CDATA[menù a tendina]]></category>
		<category><![CDATA[menù a tendina completo]]></category>
		<category><![CDATA[menù Jquery]]></category>
		<category><![CDATA[passaggio del mouse]]></category>
		<category><![CDATA[proprietà css di base]]></category>
		<category><![CDATA[quali menù contengono un sotto-menù]]></category>
		<category><![CDATA[slideToggle]]></category>
		<category><![CDATA[sotto-menù con Jquery]]></category>
		<category><![CDATA[struttura html]]></category>
		<category><![CDATA[toggle]]></category>

		<guid isPermaLink="false">http://www.mirkopagliai.it/?p=2150</guid>
		<description><![CDATA[(aggiornamento riguardante solo i menù a tendina che si espandono verso l&#8217;alto: vedi qui) Avevo già scritto qualcosa sui menù a tendina, arrivando a consigliare di utilizzare SuperFish, che a tutt&#8217;ora considero un ottimo plugin. Vediamo però come realizzare da zero un menù a tendina completo, utilizzando solo e semplicemente Jquery e limitandoci (per questo articolo, [...]]]></description>
			<content:encoded><![CDATA[<p><img class="size-thumbnail wp-image-2054 alignleft" title="Jquery" src="http://www.mirkopagliai.it/wp-content/uploads/2011/07/Jquery-180x44.gif" alt="" width="180" height="44" /></p>
<p><em>(aggiornamento riguardante solo i menù a tendina che si espandono verso l&#8217;alto: vedi <a href="http://www.mirkopagliai.it/tutorial-jquery-menu-a-tendina-verso-lalto/">qui</a>)</em></p>
<p>Avevo già scritto <a href="http://www.mirkopagliai.it/how-to-menu-a-tendina/" target="_blank">qualcosa</a> sui <strong>menù a tendina</strong>, arrivando a consigliare di utilizzare <a href="http://users.tpg.com.au/j_birch/plugins/superfish/" target="_blank">SuperFish</a>, che a tutt&#8217;ora considero un ottimo plugin. Vediamo però come realizzare da zero un <strong>menù a tendina completo</strong>, utilizzando solo e semplicemente <a href="http://jquery.com/" target="_blank">Jquery</a> e limitandoci (per questo articolo, più in là semmai approfondirò) a un solo livello di profondità (in altri termini: i sotto-menù, a loro volta, non si espanderanno).</p>
<p>Due piccole premesse:</p>
<ol>
<li>dovete conoscere bene html e css, in quanto qui ci limiteremo (per questi due) allo stretto indispensabile;</li>
<li>qui utilizzeremo un menù principale orizzontale (quindi le voci del menù affiancate) con sotto-menù in verticale (quindi voci elencate). Nulla toglie che poi, in base alle proprie esigenze e con le giuste modifiche, si possa operare diversamente (esempio: entrambi verticali).</li>
</ol>
<p>Innanzitutto è necessario e doveroso scrivere del <strong>codice html pulito e conforme</strong>. Potete tenere a riferimento le considerazioni già espresse nel <a href="http://www.mirkopagliai.it/how-to-menu-a-tendina/" target="_blank">precedente articolo</a>, e quindi scrivere un codice di questo genere:</p>
<pre class="brush: xml; title: ; notranslate">&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;pagina1.html&quot;&gt;Pagina 1&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;
            &lt;a href=&quot;#&quot;&gt;Pagina 2&lt;/a&gt;
            &lt;ul&gt;
               &lt;li&gt;&lt;a href=&quot;paginaA.html&quot;&gt;Pagina A&lt;/a&gt;&lt;/li&gt;
               &lt;li&gt;&lt;a href=&quot;paginaB.html&quot;&gt;Pagina B&lt;/a&gt;&lt;/li&gt;
               &lt;li&gt;&lt;a href=&quot;paginaC.html&quot;&gt;Pagina C&lt;/a&gt;&lt;/li&gt;
            &lt;/ul&gt;
        &lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;pagina3.html&quot;&gt;Pagina 3&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</pre>
<p>È fondamentale notare come sia corretto organizzare il sotto-menù: il tag <em>&lt;ul&gt;</em> del sotto-menù (riga 5) è all&#8217;interno del tag <em>&lt;li&gt;</em> (riga 3) da cui si estende, che include anche il tag <em>&lt;a&gt;</em> (riga 4) che funge da finto-collegamento (in questo caso, perché deve essere funzionale solo all&#8217;estensione del sotto-menù) e da testo di riferimento per il sotto-menù. Potete vedere un primo esempio (solo html) <a href="http://docs.mirkopagliai.it/html/menu-tendina/esempio1.html" target="_blank">qui</a>.</p>
<p><a href="http://www.mirkopagliai.it/wp-content/uploads/2011/10/submenu1.jpg"><img class="aligncenter size-full wp-image-2152" title="submenu1" src="http://www.mirkopagliai.it/wp-content/uploads/2011/10/submenu1.jpg" alt="" width="168" height="133" /></a>Passiamo al <strong>foglio di stile</strong>. Innanzitutto aggiungiamo un id al menù principale (nell&#8217;esempio sarà <em>navbar</em> e quindi <em>&lt;ul id=&#8221;navbar&#8221;&gt;</em>), così da facilitarne la selezione (sia nel foglio di stile, sia con Jquery; e ricordo che in entrambi bisogna anteporre il cancelletto (#) davanti al nome), poi aggiungiamo delle <strong>proprietà css di base</strong> affinché il menù diventi <a href="http://docs.mirkopagliai.it/html/menu-tendina/esempio2.html" target="_blank">così</a>. Non le riporto per intero in questo articolo, potete trovare il foglio di stile <a href="http://docs.mirkopagliai.it/html/menu-tendina/style1.css" target="_blank">qui</a>.</p>
<p><a href="http://www.mirkopagliai.it/wp-content/uploads/2011/10/submenu22.jpg"><img class="aligncenter size-full wp-image-2153" title="submenu2" src="http://www.mirkopagliai.it/wp-content/uploads/2011/10/submenu22.jpg" alt="" width="259" height="107" /></a>Alcuni commenti:</p>
<ol>
<li>si seleziona il menù principale con <em>#navbar</em> (avendo l&#8217;<em>&lt;ul&gt;</em> principale id <em>navbar</em>, come già detto), i sotto-menù con <em>#navbar ul</em> (non solo quelli di primo livello, semmai ce ne fossero di inferiori!), entrambi (menù principale e sotto-menù) unendo le due con una virgola (quindi: <em>#navbar, #navbar ul</em> su un&#8217;unica riga);</li>
<li>il menù principale si estende orizzontalmente, i sotto-menù (anche qui, non solo quelli di primo livello, ma tutti) verticalmente. Ciò significa che che una regola generale potrebbe (e spesso ha bisogno di) essere riscritta o perfezionata per essere applicata a uno stesso elemento contenuto in un sotto-menù di livello inferiore (il punto 4 di questo elenco ne è un esempio);</li>
<li>dare una posizione assoluta ai sotto-menù (riga 13) è utile affinché siano indipendenti per quanto riguarda le misure (che saranno automatiche e calcolate in base al contenuto). Per eventuali altri sotto-livelli, ho notato dei problemi (sempre con le misure) credo imputabili ai limiti di Css 2. In questi casi, è bene specificare delle larghezze minime assolute per i sotto-menù, che potrebbe comunque essere &#8211; a prescindere &#8211; una buona pratica, anche per motivi estetici;</li>
<li>i <em>&lt;li&gt;</em> del menù principale devono essere &#8220;flottanti&#8221; a sinistra per essere mostrati uno affianco all&#8217;altro (riga 23), visto che di default un elenco (<em>&lt;ul&gt;</em>) si estende in verticale. Questa regola viene annullata per i <em>&lt;li&gt;</em> dei sotto-menù (riga 30), visto che l&#8217;ordinamento di default va bene (anche i sotto-menù si estendono in verticale);</li>
<li>bisogna annullare lo stile dei menù (riga 24);</li>
<li>le <em>&lt;a&gt;</em> hanno bisogno della proprietà <em>display</em> impostata a <em>block</em> (riga 36), altrimenti non avranno le stesse dimensioni dei <em>&lt;li&gt;</em> che le contengono;</li>
<li>le modifiche di stile al passaggio del mouse (righe 45-47) vengono &#8220;attivate&#8221; al passaggio del mouse su un <em>&lt;li&gt;</em> (infatti troviamo <em>li:hover</em>), ma vengono applicate alla <em>&lt;a&gt;</em> contenuta in quel <em>&lt;li&gt;</em>, visto che è alla <em>&lt;a&gt;</em> che viene definito un stile (righe 34-40). Le modifiche vengono applicate solo alla <em>&lt;a&gt;</em> &#8220;primo figlio&#8221; (meglio in inglese: <em>first child</em>) tramite il <em>&gt;</em> (riga 45), per evitare comportamenti non voluti (se togliete il &gt; e passate sul <em>&lt;li&gt;</em> che contiene un sotto-menù, noterete che le modifiche vengono applicate anche a tutte le <em>&lt;a&gt;</em> del sotto-menù e non solo a quella che apre il sotto-menù &#8211; è normale, visto che anche quelle sono &#8220;figlie&#8221; del <em>&lt;li&gt;</em> principale, proprio per la <strong>struttura html</strong> che abbiamo (correttamente) definito).</li>
</ol>
<p>In questo esempio &#8211; come sicuramente avrete già notato &#8211; il sotto-menù è mostrato sempre, diremmo &#8220;fisso&#8221;: ho scelto così per permettere di visualizzare nel complesso l&#8217;applicazione del foglio di stile. Normalmente, però, non dovrebbe essere così, quindi dobbiamo nasconderlo. Per farlo utilizzeremo la proprietà <em>display</em> settata su <em>none</em>, da applicare a tutti i sotto-menù. Quindi, a questo punto, dobbiamo aggiungere <span style="text-decoration: underline;">sotto</span> la riga 12 quanto segue:</p>
<pre class="brush: css; light: true; title: ; notranslate">display: none;</pre>
<p>Notare che si potrebbe usare anche la <a href="http://www.w3schools.com/cssref/pr_class_visibility.asp" target="_blank">regola visibility</a> (settata su <em>hidden</em>), che porta allo stesso risultato ed è anche migliore da un punto di vista strettamente semantico; ma dobbiamo necessariamente ricorrere a <em>display</em>, perché Jquery lavora su questa proprietà per modificare la visibilità di un elemento.<br />
Fatto questo, l&#8217;esempio aggiornato è <a href="http://docs.mirkopagliai.it/html/menu-tendina/esempio3.html" target="_blank">questo</a> e il relativo foglio di stile <a href="http://docs.mirkopagliai.it/html/menu-tendina/style2.css" target="_blank">questo qui</a>.</p>
<p>Non resta che aggiungere Jquery. L&#8217;operazione da eseguire è: al <strong>passaggio del mouse</strong> su un <em>&lt;li&gt;</em>, mostra l&#8217;<em>&lt;ul&gt;</em> <em>first child</em> (anche qui, altrimenti se usiamo più livelli di sotto-menù, li estenderebbe subito tutti). Va da sé che se un <em>&lt;li&gt;</em> non ha nessun <em>&lt;ul&gt;</em> figlio, non accade nulla. Quindi innanzitutto includiamo Jquery (all&#8217;interno dei tag <em>&lt;head&gt;</em>):</p>
<pre class="brush: xml; title: ; notranslate">&lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js&quot;&gt;&lt;/script&gt;
&lt;script&gt;
	$(document).ready(function(){
	 	//Il nostro codice andrà qui...
	});
&lt;/script&gt;</pre>
<p>Per attivare un <strong>effetto al passaggio del mouse</strong> su un <em>&lt;li&gt;</em>, possiamo usare l&#8217;evento <em>hover()</em> (<a href="http://api.jquery.com/hover/" target="_blank">documentazione</a>). Il nostro codice diventa quindi (ometto l&#8217;inclusione del <em>.js</em> di Jquery e i vari tag <em>&lt;script&gt;</em>):</p>
<pre class="brush: jscript; title: ; notranslate">$(document).ready(function(){
	$(&quot;#navbar li&quot;).hover(function (){
		//L'effetto da applicare va qui...
	});
});</pre>
<p>Che semplicemente corrisponde a: al passaggio del mouse (evento<em> hover()</em>) su un (qualsiasi) <em>&lt;li&gt;</em> contenuto nell&#8217;<em>&lt;ul&gt;</em> <em>#navbar</em> (quindi <em>#navbar li</em>), applica la funzione alla riga 3 (che qui dobbiamo implementare).</p>
<p>Di effetti disponibili ce ne sono parecchi (<a href="http://api.jquery.com/category/effects/" target="_blank">lista completa</a>): noi utilizzeremo <em>slideToggle()</em> (<a href="http://api.jquery.com/slideToggle/" target="_blank">documentazione</a>), ma si valutino anche il classico <em>toggle()</em> (<a href="http://api.jquery.com/toggle/" target="_blank">documentazione</a>) e <em>fadeToggle()</em> (<a href="http://api.jquery.com/fadeToggle/" target="_blank">documentazione</a>), che differiscono per lo più per il tipo di animazione (si fa prima a provare che a descrivere in questo articolo). Il codice diventa quindi:</p>
<pre class="brush: jscript; title: ; notranslate">$(document).ready(function(){
	$(&quot;#navbar li&quot;).hover(function (){
		$(this).children(&quot;ul&quot;).slideToggle();
	});
});</pre>
<p>Che sta a significare: applica l&#8217;effetto <em>slideToggle()</em> al figlio <em>&lt;ul&gt;</em> (grazie a <em>children()</em> (<a href="http://api.jquery.com/children/" target="_blank">documentazione</a>)) dell&#8217;attuale <em>&lt;li&gt;</em> (<em>this</em>) su cui si è passato il mouse. Ecco quindi il <a href="http://docs.mirkopagliai.it/html/menu-tendina/esempio4.html" target="_blank">nuovo esempio</a> (il foglio di stile è sempre lo stesso, non lo abbiamo toccato), che soddisfa le necessità iniziali.</p>
<p>Manca giusto una (ultima) cosa, per lo più un &#8220;orpello&#8221;: come fare a capire (ad occhio, per il visitatore) <strong>quali menù contengono un sotto-menù</strong>. È diffusa l&#8217;abitudine di aggiungere il carattere &#8220;»&#8221; (ascii &amp;#187;) ai menù che contengono un sotto-menù, pratica chiara e immediata. Potremmo occuparci di questa &#8220;aggiunta&#8221; manualmente, ma perché farlo (e faticare e rischiare di commettere errori o di non aggiornare in là col tempo), quando Jquery può occuparsi anche di questo e al posto nostro?<br />
D&#8217;altronde la cosa è semplice: ciclare tutti i <em>&lt;li&gt;</em> del menù (<em>&lt;li&gt;</em> a qualsiasi profondità, ovviamente), verificare se hanno un <em>&lt;ul&gt;</em> figlio (con un <strong>costrutto if</strong>) e in caso positivo aggiungere il carattere (preceduto da uno spazio!) alla fine del link.</p>
<p>Bene, passiamo al codice. Per ciclare possiamo utilizzare <em>each()</em> (<a href="http://api.jquery.com/each/" target="_blank">documentazione</a>):</p>
<pre class="brush: jscript; title: ; notranslate">$(&quot;#navbar li&quot;).each(function() {
	//Fa qualcosa ad ogni &lt;li&gt; all'interno di #navbar...
});</pre>
<p>che, in questo caso, eseguire la funzione qui dichiarata su ogni elemento <em>&lt;li&gt;</em> all&#8217;interno di <em>#navbar</em>. Quindi la verifica, per la quale possiamo affidarci a <em>length</em> (<a href="http://api.jquery.com/length/" target="_blank">documentazione</a>):</p>
<pre class="brush: jscript; title: ; notranslate">$(&quot;#navbar li&quot;).each(function() {
	if ($(this).children(&quot;ul&quot;).length) //Fa qualcosa ad ogni &lt;li&gt; all'interno di #navbar che contiene un &lt;ul&gt;...
});</pre>
<p>In sostanza, in questo esempio <em>lenght</em> è pari al numero degli <em>&lt;ul&gt;</em> figli del <em>&lt;li&gt;</em> per il quale stiamo eseguendo il ciclo (sempre il famoso selettore this), e quindi l&#8217;if avrà esito negativo se non ci sono <em>&lt;ul&gt;</em> figli, viceversa positivi se c&#8217;è almeno un <em>&lt;ul&gt;</em> figlio &#8211; nota: questo if può essere generalmente utilizzato per verificare se un tag ne contiene un altro ed eventualmente in quale quantità.<br />
Quindi l&#8217;aggiunta:</p>
<pre class="brush: jscript; title: ; notranslate">$(&quot;#navbar li&quot;).each(function() {
	//Se un &lt;li&gt; contiene un sotto-menù, aggiunge al collegamento &quot; »&quot;
	if ($(this).children(&quot;ul&quot;).length) $(this).children(&quot;a&quot;).append(&quot; &amp;#187;&quot;);
});</pre>
<p>Utilizziamo il manipolatore <em>append()</em> (<a href="http://api.jquery.com/append/" target="_blank">documentazione</a>) per aggiungere uno spazio e un carattere alla<em> &lt;a&gt;</em> figlia di ogni <em>&lt;li&gt;</em> che ha come figlio un <em>&lt;ul&gt;</em> &#8211; sembra un ragionamento contorto, sì, lo so; ma riflettete un po&#8217; sul codice e ci arriverete: l&#8217;aggiunta va fatta alla <em>&lt;a&gt;</em> contenuta nel <em>&lt;li&gt;</em> e non al <em>&lt;li&gt;</em> sul quale abbiamo eseguito il controllo.</p>
<p>Ecco quindi il codice Jquery finale e completo:</p>
<pre class="brush: jscript; title: ; notranslate">$(document).ready(function(){
	$(&quot;#navbar li&quot;).hover(function (){
		$(this).children(&quot;ul&quot;).slideToggle();
	});
	$(&quot;#navbar li&quot;).each(function() {
		//Se un &lt;li&gt; contiene un sotto-menù, aggiunge al collegamento &quot; »&quot;
		if ($(this).children(&quot;ul&quot;).length) $(this).children(&quot;a&quot;).append(&quot; &amp;#187;&quot;);
	});
});</pre>
<p>Nonché, l&#8217;<a href="http://docs.mirkopagliai.it/html/menu-tendina/esempio5.html" target="_blank">ultimo esempio</a>.</p>
<p><a href="http://www.mirkopagliai.it/wp-content/uploads/2011/10/submenu3.jpg"><img class="aligncenter size-full wp-image-2154" title="submenu3" src="http://www.mirkopagliai.it/wp-content/uploads/2011/10/submenu3.jpg" alt="" width="248" height="104" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.mirkopagliai.it/tutorial-jquery-menu-a-tendina/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Bash scripting: verificare e installare dipendenze mancanti</title>
		<link>http://www.mirkopagliai.it/bash-scripting-verificare-e-installare-dipendenze-mancanti/</link>
		<comments>http://www.mirkopagliai.it/bash-scripting-verificare-e-installare-dipendenze-mancanti/#comments</comments>
		<pubDate>Mon, 24 Oct 2011 13:58:15 +0000</pubDate>
		<dc:creator>Mirko Pagliai</dc:creator>
				<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[Unix]]></category>
		<category><![CDATA[apt-get]]></category>
		<category><![CDATA[ArchLinux]]></category>
		<category><![CDATA[CentOS]]></category>
		<category><![CDATA[costrutto if]]></category>
		<category><![CDATA[costrutto if-elif-else]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[dipendenze da verificare]]></category>
		<category><![CDATA[dpkg]]></category>
		<category><![CDATA[esito dell'installazione]]></category>
		<category><![CDATA[Fedora]]></category>
		<category><![CDATA[install.sh]]></category>
		<category><![CDATA[installate determinate dipendenze]]></category>
		<category><![CDATA[installazione dello script]]></category>
		<category><![CDATA[Mandriva]]></category>
		<category><![CDATA[Mint]]></category>
		<category><![CDATA[openSUSE]]></category>
		<category><![CDATA[pacman]]></category>
		<category><![CDATA[pacmangestore di pacchetti]]></category>
		<category><![CDATA[provvedere a installare manualmente]]></category>
		<category><![CDATA[rpm]]></category>
		<category><![CDATA[script bash]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[urpmi]]></category>
		<category><![CDATA[verificare quali dipendenze sono mancanti]]></category>
		<category><![CDATA[yum]]></category>
		<category><![CDATA[zypper]]></category>

		<guid isPermaLink="false">http://www.mirkopagliai.it/?p=2141</guid>
		<description><![CDATA[Mettiamo che &#8211; come nel mio caso &#8211; state scrivendo uno script (magari proprio in bash, ma &#8211; perché no&#8230; &#8211; anche in altri linguaggi) che ha bisogno che sul sistema siano correttamente installate determinate dipendenze, utili alla sua esecuzione . Mettiamo che &#8211; come nel mio caso &#8211; avete previsto uno script bash che [...]]]></description>
			<content:encoded><![CDATA[<p><img class="size-thumbnail wp-image-2145 alignleft" title="Bash script" src="http://www.mirkopagliai.it/wp-content/uploads/2011/10/bash-script-180x180.png" alt="" width="78" height="78" />Mettiamo che &#8211; come nel mio caso &#8211; state scrivendo uno script (magari proprio in bash, ma &#8211; perché no&#8230; &#8211; anche in altri linguaggi) che ha bisogno che sul sistema siano correttamente <strong>installate determinate dipendenze</strong>, utili alla sua esecuzione .<br />
Mettiamo che &#8211; come nel mio caso &#8211; avete previsto uno <strong>script bash</strong> che si occupi dell&#8217;<strong>installazione dello script</strong> (qualcosa del tipo <em>install.sh</em>, che crea, sposta, modifica alcuni file) e che vogliate che questo si occupi anche dell&#8217;installazione delle suddette dipendenze.</p>
<p>Si può fare? Sì, si può fare. Vi spiego come.<br />
Analizziamo innanzitutto i passaggi che si dovrebbero svolgere, ordinandoli:</p>
<ol>
<li>vengono elencate (ad esempio, tramite un array) le dipendenze necessarie;</li>
<li>ricerca di un <strong>gestore di pacchetti</strong> valido;</li>
<li>verifica delle dipendenze mancanti nel sistema in uso, elencando anche queste (un nuovo array);</li>
<li>ricerca di un gestore di pacchetti valido;</li>
<li>installazione delle dipendenze segnate come mancanti.</li>
</ol>
<p>Prima osservazione, più che lecita: i punti 2) e 4) non fanno la stessa cosa? A che serve ripetere due volte la stessa operazione?<br />
Risposta: serve ripetere la stessa operazione perché sì, nonostante facciano la stessa cosa (ricerca un gestore di pacchetti valido), la ricerca, nei due casi, può e anzi dovrebbe portare a risultati diversi; questo perché bisogna tenere in conto che il gestore selezionato al punto 2) deve svolgere l&#8217;operazione indicata come 3), mentre il gestore selezionato al punto 4) svolgerà il compito 5).<br />
E non è detto che per entrambe le operazioni sia opportuno utilizzare lo stesso gestore (anche se è cosa possibile), anzi&#8230;</p>
<p>Un esempio concreto chiarificherà questa spiegazione: visto che il gestore selezionato al punto 4) dovrà procedere all&#8217;installazione di alcuni pacchetti &#8211; come indicato al punto 5) &#8211; se la distribuzione è openSuse si utilizzerà <em>zypper</em>, se è Mandriva si utilizzerà <em>urpmi</em>, se è Fedora si utilizzerà <em>yum</em>. Mentre invece il punto 3), in tutti questi tre casi (openSuse, Mandriva e Fedora) può essere sempre svolto da <em>rpm</em>. Che per giunta svolge il compito 3) meglio degli altri già elencati; al contrario, non sarebbe invece molto indicato per svolgere il punto 5), per motivi che tutti conosciamo.<br />
Lo stesso dicasi per altre distribuzioni. Ad esempio, per Debian, Ubuntu e derivate varie, il punto 3) verrà svolto da <em>dpkg</em>, il punto 5) da <em>apt-get</em>.</p>
<p>Seconda osservazione: è proprio necessario <strong>verificare quali dipendenze sono mancanti</strong>? Non si fa prima a proporre l&#8217;installazione di tutte le dipendenze, così che sia poi il gestore a occuparsi di installare solo quelle mancanti e eventualmente a segnalare quelle già presenti? Sì, certo, si può fare e sicuramente è più comodo e veloce. Ma qui si valuterà il processo &#8220;più complesso&#8221;, negli altri casi non dovrebbe essere difficile (per voi, per chi legge, per chi è interessato) snellire la procedura, a seconda delle proprie esigenze.<br />
Si tenga anche in conto che lo script potrebbe fallire, per tanti motivi (perché non è stato trovato un gestore di pacchetti adatto, cosa possibile perché non si possono considerare tutte le distribuzioni Linux esistenti, con i loro relativi gestori): in questo caso, potremo indicare all&#8217;utente quali dipendenze sono appunto mancanti, e invitarlo a installarle manualmente. Cosa che è molto più elegante, in questo caso, dell&#8217;indicare tutte le dipendenze necessarie, installate o meno, mettendo così l&#8217;utente nella condizione di dover controllare quali deve provvedere a installare manualmente.</p>
<p>Terza osservazione: l&#8217;installazione, ovvero il passaggio 5), avviene del tutto automaticamente, cioè senza nessun interazione con l&#8217;utente? No, volutamente no. Lo script che propongo lancia il gestore con il corretto comando d&#8217;installazione: è facile e molto probabile che poi &#8211; qualsiasi sia la distribuzione, qualsiasi sia il gestore selezionato &#8211; verrà chiesto all&#8217;utente di confermare.<br />
È una scelta voluta, perché esperienza mi ha insegnato che non è corretto installare software senza renderne consapevole e partecipe l&#8217;utente e che non è corretto installare senza aver prima visionato quali cambiamenti verranno apportati al sistema (in alcuni casi, l&#8217;installazione di alcuni pacchetti, per via di errati calcoli o problemi con le dipendenze che si portano dietro, possono rendere un sistema instabile&#8230;).</p>
<p>Finite le osservazioni, passiamo al codice. È innanzitutto necessario stabilire quali sono le dipendenze necessarie. Vorrei subito chiarire, a scanso di equivoci, che:</p>
<ol>
<li>quando parlo di &#8220;dipendenze&#8221; o di &#8220;dipendenze necessarie&#8221; mi riferisco alle dipendenze richieste dal nostro script (affinché funzioni correttamente);</li>
<li>quando parlo di &#8220;dipendenze mancanti&#8221; mi riferisco alle dipendenze del nostro script <span style="text-decoration: underline;">e</span> che mancano sul sistema in uso (è quindi questo un sotto-insieme o una selezione del precedente).</li>
</ol>
<p>Avevamo previsto un array, che mi sembra la scelta più opportuna:</p>
<pre class="brush: bash; light: true; title: ; notranslate">DEPENDENCIES=(adduser curlftpfs dialog inotify-tools libnotify-bin nfs-common)</pre>
<p>Questo soddisfa il punto 1) nella lista dei passaggi da compiere. Passiamo ai punti 2) e 3), ovvero alla selezione di un opportuno gestore di pacchetti e alla verifica di quali dipendenze sono mancanti:</p>
<pre class="brush: bash; title: ; notranslate"># What dependencies are missing?
PKGSTOINSTALL=&quot;&quot;
for (( i=0; i&lt;${tLen=${#DEPENDENCIES[@]}}; i++ )); do
	# Debian, Ubuntu and derivatives (with dpkg)
	if which dpkg &amp;&gt; /dev/null; then
		if [[ ! `dpkg -l | grep -w &quot;ii  ${DEPENDENCIES[$i]} &quot;` ]]; then
			PKGSTOINSTALL=$PKGSTOINSTALL&quot; &quot;${DEPENDENCIES[$i]}
		fi
	# OpenSuse, Mandriva, Fedora, CentOs, ecc. (with rpm)
	elif which rpm &amp;&gt; /dev/null; then
		if [[ ! `rpm -q ${DEPENDENCIES[$i]}` ]]; then
			PKGSTOINSTALL=$PKGSTOINSTALL&quot; &quot;${DEPENDENCIES[$i]}
		fi
	# ArchLinux (with pacman)
	elif which pacman &amp;&gt; /dev/null; then
		if [[ ! `pacman -Qqe | grep &quot;${DEPENDENCIES[$i]}&quot;` ]]; then
			PKGSTOINSTALL=$PKGSTOINSTALL&quot; &quot;${DEPENDENCIES[$i]}
		fi
	# If it's impossible to determine if there are missing dependencies, mark all as missing
	else
		PKGSTOINSTALL=$PKGSTOINSTALL&quot; &quot;${DEPENDENCIES[$i]}
	fi
done</pre>
<p>Nonostante reputi questo codice abbastanza comprensibile, vado a commentare:</p>
<ol>
<li>innanzitutto vado a creare la variabile (vuota) <em>PKGSTOINSTALL</em>, che conterrà l&#8217;elenco (non è un array, ma una stringa, con gli spazi a mò di divisore) delle dipendenze mancanti;</li>
<li>viene quindi eseguito un ciclo (riga 3) per ognuna delle <strong>dipendenze da verificare</strong>;</li>
<li>all&#8217;interno del ciclo, tramite un (complesso) <strong>costrutto if-elif-else</strong>, vado a verificare se è disponibile un gestore di pacchetti, avvalendomi di <em>which</em> (che stampa la localizzazione di un eseguibile, quando è presente, altrimenti nulla) e, se disponibile, quale (righe 5, 10 e 15).<br />
Qui, in particolare, ricerchiamo tra <em>dpkg</em> (per Debian, Ubuntu e derivate, come Mint), <em>rpm</em> (per OpenSuse, Mandriva, Fedora, CentOs e altre) e <em>pacman</em> (per ArchLinux), che dovrebbero coprire la stragrande maggioranza delle distribuzioni, sicuramente tutte quelle più diffuse;</li>
<li>viene quindi verificata se la singola dipendenza (che stiamo ciclando) è già installata o meno, eseguendo un comando specifico per il gestore che abbiamo selezionato (righe 6, 11 e 16);</li>
<li>se la dipendenza non risulta installata, viene accodata alla stringa <em>PKGSTOINSTALL</em> (righe 7, 12 e 17), preceduta da uno spazio. Se invece è già installata, passa alla successiva dipendenza da controllare;</li>
<li>se non viene trovato un gestore utile (alternativo quindi a quanto descritto al punto 3) di questo elenco), allora segna automaticamente la dipendenza come mancante (riga 21), segnando di fatto tutte le dipendenze come mancanti (perché, ovviamente, anche la successiva iterazione del ciclo porterà allo stesso risultato&#8230;).</li>
</ol>
<p>Alla fine di questo blocco di codice &#8211; come per altro già accennato &#8211; la variabile <em>PKGSTOINSTALL </em>conterrà quindi l&#8217;elenco delle dipendenze mancanti (e quindi da installare!), separate l&#8217;un l&#8217;altra da uno spazio (come tutti i gestori si aspettano siano passato l&#8217;elenco).</p>
<p>Si noti che questo codice non è &#8220;perfetto&#8221;: ad ogni ciclo, di fatti, si va a rieseguire il controllo del gestore. Non dovrebbe portare a chissà quali performance negative e/o penalizzanti, ma non escludo assolutamente che si possano scrivere numerosi varianti migliori di questa e che portino allo stesso risultato. Anzi, se ne avete voglia, prendetelo come un esercizio, visto che sicuramente si può fare (e si dovrebbe fare&#8230;) di meglio.</p>
<p>Passiamo al codice che si occupa dell&#8217;installazione effettiva:</p>
<pre class="brush: bash; title: ; notranslate"># If some dependencies are missing, asks if user wants to install
if [ &quot;$PKGSTOINSTALL&quot; != &quot;&quot; ]; then
	echo -n &quot;Some dependencies are missing. Want to install them? (Y/n): &quot;
	read SURE
	# If user want to install missing dependencies
	if [[ $SURE = &quot;Y&quot; || $SURE = &quot;y&quot; || $SURE = &quot;&quot; ]]; then
		# Debian, Ubuntu and derivatives (with apt-get)
		if which apt-get &amp;&gt; /dev/null; then
			apt-get install $PKGSTOINSTALL
		# OpenSuse (with zypper)
		elif which zypper &amp;&gt; /dev/null; then
			zypper in $PKGSTOINSTALL
		# Mandriva (with urpmi)
		elif which urpmi &amp;&gt; /dev/null; then
			urpmi $PKGSTOINSTALL
		# Fedora and CentOS (with yum)
		elif which yum &amp;&gt; /dev/null; then
			yum install $PKGSTOINSTALL
		# ArchLinux (with pacman)
		elif which pacman &amp;&gt; /dev/null; then
			pacman -Sy $PKGSTOINSTALL
		# Else, if no package manager has been founded
		else
			# Set $NOPKGMANAGER
			NOPKGMANAGER=TRUE
			echo &quot;ERROR: impossible to found a package manager in your sistem. Please, install manually ${DEPENDENCIES[*]}.&quot;
		fi
		# Check if installation is successful
		if [[ $? -eq 0 &amp;&amp; ! -z $NOPKGMANAGER ]] ; then
			echo &quot;All dependencies are satisfied.&quot;
		# Else, if installation isn't successful
		else
			echo &quot;ERROR: impossible to install some missing dependencies. Please, install manually ${DEPENDENCIES[*]}.&quot;
		fi
	# Else, if user don't want to install missing dependencies
	else
		echo &quot;WARNING: Some dependencies may be missing. So, please, install manually ${DEPENDENCIES[*]}.&quot;
	fi
fi</pre>
<p>Vado anche qui a commentare:</p>
<ol>
<li>innanzitutto, un semplice <strong>costrutto if</strong> verifica che la variabile <em>PKGSTOINSTALL</em> non sia vuota (riga 2) e quindi &#8211; in altri termini &#8211; verifica che ci sia qualcosa da installare. Ricordo &#8211; visto che l&#8217;avevo già precisato &#8211; che se precedentemente non è stato possibile determinare quali dipendenze siano mancanti e quali presenti, qui risulteranno tutte come mancanti;</li>
<li>a questo punto, viene chiesto all&#8217;utente se vuole procedere con l&#8217;installazione (la riga 3 stampa la richiesta, la riga 4 salva l&#8217;input in <em>READ</em>);</li>
<li>se la risposta è affermativa (riga 6), allora viene ricercato un gestore di pacchetti (righe 8, 11, 14, 17, 20) tra <em>apt-get</em>, <em>zypper</em>, <em>urpmi</em>, <em>yum</em> e <em>pacman</em>, sempre tramite un costrutto if-elif-else;</li>
<li>se è stato trovato un gestore dei pacchetti, allora procede con l&#8217;installazione, avvalendosi dell&#8217;opportuna istruzione (righe 9, 12, 15, 18, 21). Altrimenti (riga 23), imposta la variabile <em>NOPKGMANAGER</em> a <em>TRUE</em> (riga 25, ci servirà successivamente per controllo) e stampa a schermo un errore (riga 26);</li>
<li>quindi viene verificato l&#8217;<strong>esito dell&#8217;installazione</strong> (riga 29). Se l&#8217;istruzione di installazione non ha restituito nessun errore (per qualsiasi motivo che abbia portato il gestore di turno ad un fallimento) <span style="text-decoration: underline;">e</span> se non è presente la variabile <em>NOPKGMANAGER</em> (impostata quando non viene correttamente rilevato un gestore di pacchetti), allora l&#8217;installazione ha avuto successo e quindi stampa un messaggio di conferma (riga 30). Se invece le due ipotesi non sono entrambe e contemporaneamente vere (riga 32), allora l&#8217;installazione non è andata a buon fine e quindi stampa un messaggio di errore e la lista delle dipendenze segnate come mancanti, che l&#8217;utente dovrà (a questo punto) <strong>provvedere a installare manualmente</strong> (riga  33);</li>
<li>se invece l&#8217;utente ha inizialmente risposto negativamente alla richiesta di procedere con l&#8217;installazione (riga 36), allora stampa un messaggio di avviso e &#8211; anche qui &#8211; la lista delle dipendenze da installare manualmente.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.mirkopagliai.it/bash-scripting-verificare-e-installare-dipendenze-mancanti/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linux day 2011</title>
		<link>http://www.mirkopagliai.it/linux-day-2011/</link>
		<comments>http://www.mirkopagliai.it/linux-day-2011/#comments</comments>
		<pubDate>Wed, 19 Oct 2011 21:44:52 +0000</pubDate>
		<dc:creator>Mirko Pagliai</dc:creator>
				<category><![CDATA[Unix]]></category>
		<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Italian Linux Society]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Linux day]]></category>
		<category><![CDATA[LUG italiani]]></category>
		<category><![CDATA[promuovere GNU/Linux]]></category>
		<category><![CDATA[software libero]]></category>

		<guid isPermaLink="false">http://www.mirkopagliai.it/?p=2132</guid>
		<description><![CDATA[Il 22 ottobre in tutta Italia è il Linux day. Il Linux Day è una manifestazione nazionale articolata in eventi locali che ha lo scopo di promuovere GNU/Linux e il software libero. Il Linux Day è promosso da ILS (Italian Linux Society) e organizzato localmente dai LUG italiani e dagli altri gruppi che condividono le [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone size-full wp-image-2138" style="background-color:black" title="Linux Day 2011" src="http://www.mirkopagliai.it/wp-content/uploads/2011/10/logo.png" alt="Linux Day 2011" width="261" height="54" /></p>
<p>Il 22 ottobre in tutta Italia è il <strong>Linux day</strong>.</p>
<blockquote><p>Il Linux Day è una manifestazione nazionale articolata in eventi locali che ha lo scopo di promuovere GNU/Linux e il software libero. Il Linux Day è promosso da ILS (Italian Linux Society) e organizzato localmente dai LUG italiani e dagli altri gruppi che condividono le finalità della manifestazione.<br />
La responsabilità dei singoli eventi locali è lasciata ai rispettivi gruppi organizzatori, che hanno libertà di scelta per quanto riguarda i dettagli delle iniziative locali, nel rispetto delle <a href="http://www.linuxday.it/node/7">linee guida</a> generali della manifestazione. La prima edizione del Linux Day si è tenuta il 1 dicembre 2001 in circa quaranta città sparse su tutto il territorio nazionale. Il numero è notevolmente cresciuto negli anni divenendo ormai un appuntamento immancabile nel panorama del software libero italiano.</p></blockquote>
<p>Date un&#8217;<a href="http://www.linuxday.it/">occhiata</a> al sito ufficiale, dove trovate la mappa delle 109 città italiane, dell&#8217;utile <a href="http://www.linuxday.it/materiale">materiale informativo</a> e le <a href="http://www.linuxday.it/news">ultime news</a> sull&#8217;iniziativa.</p>
<p>Se tutto andrà bene, io sarò presente a <a href="http://www.pescaralug.org/2011/09/19/linux-day-2011-alle-porte/">quello di Pescara</a>, organizzato dal <a href="http://www.pescaralug.org">Pescara Lug</a>. Il programma (se ci fossero altri della zona interessati):</p>
<blockquote><p>Mattina Inizio ore 9.30<br />
Ore 10.00 Introduzione e saluti<br />
Ore 10.15 Panoramica del mondo Linux<br />
Ore 10.45 Utilizzo di Linux tutti i giorni<br />
Ore 12.30 Pausa Pranzo</p>
<p>Pomeriggio Inizio ore 15.30<br />
Ore 15.30 Impaginazione e Scribus<br />
Ore 16.00 Crittografia dei dati e Tomb<br />
Ore 17.00 Sicurezza reti Wifi<br />
Ore 17.30 Android</p></blockquote>
<p>p.s. non ne sono stati organizzati in provincia di Chieti. Ce ne sono invece due a L&#8217;Aquila (<a href="http://haqlab.wordpress.com/">quello dell&#8217;hAQ-lab</a> e <a href="https://asilo.noblogs.org/linuxday-aq-2210/">quello Linux Crew CaseMatte</a>), <a href="http://avezzanolug.org/">uno ad Avezzano</a> e <a href="http://www.telug.it/">uno a Teramo</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mirkopagliai.it/linux-day-2011/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Checkgmail: errore 401</title>
		<link>http://www.mirkopagliai.it/checkgmail-errore-401/</link>
		<comments>http://www.mirkopagliai.it/checkgmail-errore-401/#comments</comments>
		<pubDate>Wed, 21 Sep 2011 08:23:16 +0000</pubDate>
		<dc:creator>Mirko Pagliai</dc:creator>
				<category><![CDATA[Unix]]></category>
		<category><![CDATA[checkgmail]]></category>
		<category><![CDATA[checkgmail.path]]></category>
		<category><![CDATA[errore 401]]></category>
		<category><![CDATA[patch per checkgmail]]></category>

		<guid isPermaLink="false">http://www.mirkopagliai.it/?p=2116</guid>
		<description><![CDATA[Googlando qua e là, ho scoperto che il problema che mi perseguita ormai da un mesetto, affligge molti utenti: checkgmail non riesce ad accedere al server di posta e notifica un errore 401, &#8220;unauthorized&#8221;. Conseguenza diretta è che, imperterrito, checkgmail chiede continuamente le credenziali di accesso alla casella di posta: Lanciando l&#8217;update da terminale (`checkmail [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-2123" title="Checkgmail" src="http://www.mirkopagliai.it/wp-content/uploads/2011/09/images.jpeg" alt="Checkgmail" width="61" height="61" />Googlando qua e là, ho scoperto che il problema che mi perseguita ormai da un mesetto, affligge molti utenti: <em>checkgmail</em> non riesce ad accedere al server di posta e notifica un <strong>errore 401</strong>, &#8220;unauthorized&#8221;.</p>
<p>Conseguenza diretta è che, imperterrito, <em>checkgmail</em> chiede continuamente le credenziali di accesso alla casella di posta:</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-2119" title="Checkgmail Errore 401" src="http://www.mirkopagliai.it/wp-content/uploads/2011/09/Checkgmail-Errore-401.jpg" alt="Checkgmail Errore 401" width="245" height="62" /></p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-2120" title="Checkgmail Errore 401" src="http://www.mirkopagliai.it/wp-content/uploads/2011/09/Checkgmail-Errore-401b.jpg" alt="Checkgmail Errore 401" width="325" height="165" /></p>
<p>Lanciando l&#8217;update da terminale (`<em>checkmail -update</em>`), qualcosa viene aggiornato, ma la situazione non cambia, tant&#8217;è che lo stesso terminale dà in output un tristissimo:</p>
<pre class="brush: bash; light: true; title: ; notranslate">Unable to find gmail_ik ... full message text won't work :(</pre>
<p>Per nostra fortuna, qualche buon samaritano si è preso la briga di realizzare una piccola <strong>patch per checkgmail</strong> che potete scaricare da <a href="https://launchpadlibrarian.net/80056943/checkgmail.patch" target="_blank">qui</a>. Terminato il download, la potete applicare come segue (sono necessari i privilegi di root):</p>
<pre class="brush: bash; light: true; title: ; notranslate"># patch /usr/bin/checkgmail checkgmail.patch</pre>
<p>Ovviamente dovete indicare la path corretta di <em>checkgmail.path</em>. A questo punto sarà sufficiente riavviare <em>checkgmail</em> (click destro sull&#8217;icona, quindi &#8220;Restart&#8230;&#8221;) e tutto dovrebbe tornare alla normalità.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mirkopagliai.it/checkgmail-errore-401/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Popstar</title>
		<link>http://www.mirkopagliai.it/popstar/</link>
		<comments>http://www.mirkopagliai.it/popstar/#comments</comments>
		<pubDate>Mon, 05 Sep 2011 22:57:40 +0000</pubDate>
		<dc:creator>Mirko Pagliai</dc:creator>
				<category><![CDATA[Senza categoria]]></category>
		<category><![CDATA[Annamaria Talone]]></category>
		<category><![CDATA[Coinvolgimento dei giovani nella valorizzazione delle specificità territoriali]]></category>
		<category><![CDATA[Popstar]]></category>
		<category><![CDATA[provincia di Chieti]]></category>

		<guid isPermaLink="false">http://www.mirkopagliai.it/?p=2111</guid>
		<description><![CDATA[Sfrutto lo spazio del mio blog per pubblicizzare il progetto di un&#8217;amica, perché mi sembra meritevole ed interessante. Di seguito trovate la presentazione dello stesso. Se qualcuno fosse interessato &#8211; e mi rivolgo principalmente ai giovani della provincia di Chieti &#8211; si faccia riferimento all&#8217;apposito gruppo su Facebook. &#8220;Pop&#8221; da popolare, come la cultura viva [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-thumbnail wp-image-2112" title="Popstar" src="http://www.mirkopagliai.it/wp-content/uploads/2011/09/276705_157576127643990_8313737_n-180x148.jpg" alt="Popstar" width="180" height="148" />Sfrutto lo spazio del mio blog per pubblicizzare il progetto di <a href="http://www.facebook.com/profile.php?id=1462747610" target="_blank">un&#8217;amica</a>, perché mi sembra meritevole ed interessante. Di seguito trovate la presentazione dello stesso. Se qualcuno fosse interessato &#8211; e mi rivolgo principalmente ai giovani della provincia di Chieti &#8211; si faccia riferimento all&#8217;<a href="http://www.facebook.com/groups/157576127643990/doc/167443526657250/" target="_blank">apposito gruppo su Facebook</a>.</p>
<blockquote><p>&#8220;Pop&#8221; da popolare, come la cultura viva che crea la nostra identità di individui e di collettività. “Stars” da stelle, non quelle del divismo spettacolare ma quelle naturali che ci portano indietro ad un tempo dove gli uomini erano in equilibrio con la natura, e questo dava loro un benessere individuale e collettivo.</p>
<p>Il Comune di Palombaro in qualità di comune capofila e la provincia di Chieti, annunciano l’avvio di &#8220;Popstars&#8221;, unico progetto abruzzese, selezionato nel bando “Piccoli Comuni per il Coinvolgimento dei giovani nella valorizzazione delle specificità territoriali – Giovani Energie in comune” promosso dall’Anci e dal Dipartimento della Gioventù della Presidenza del Consiglio dei Ministri.</p>
<p>Il progetto abruzzese coinvolge una rete di comuni dislocati in diverse zone dell’entroterra della Provincia di Chieti: Altino, Carunchio, Castelfrentano, Fraine, Miglianico, Pennapiedimonte, Pretoro, Rapino, Roccamontepiano, Roccaspinalveti, Sant’Eusanio del Sangro. I partners istituzionali oltre la Provincia di Chieti sono: CUSPD Centro Universitario di Sociologia della Prevenzione Disagio &#8211; Facoltà di Scienze Sociali Università G. D’Annunzio, Comunità Montana Alto Vastese, Comunità Montana della Maielletta, C.M.A – Centro Montano di Assistenza, Pro loco Carunchio, Pro loco Roccaspinalveti, Pro loco Fraine. Il consorzio Civica è responsabile del project Management.</p>
<p>La finalità principale di Pop Stars è quella di guidare i giovani in un percorso di recupero della memoria e dell’identità culturale del territorio attingendo al bagaglio di conoscenze e saperi di cui sono custodi gli anziani. Gli elementi della tradizione popolare saranno ri-letti e ri-utilizzati dai giovani attraverso i linguaggi della comunicazione e dell’arte contemporanea. Il progetto prevede per i mesi estivi lo svolgimento di un’attività di ricerca nei territori che coinvolge gli anziani. A partire da settembre e per tutto l’autunno, si svolgeranno i percorsi formativi in ambito socio – culturale rivolti ai giovani: laboratori di teatro, musica e canto, performance, video, fotografia e gestione siti web.</p>
<p>Le attività formative ideate e coordinate dalla regista Annamaria Talone dell’Associazione Maglab saranno realizzate da artisti ed operatori culturali esperti appartenenti alle associazioni abruzzesi Euritmi e Rogoteatro, e da una formatrice d’eccellenza Helen Chadwick  &#8211; musicista inglese, vocal trainer della Royal Shakespeare Company e del National Theatre. Le attività di ricerca e monitoraggio saranno guidate dal CUSPD diretto dal prof. Benvenuti &#8211; Facoltà di Scienze Sociali Università G. D’Annunzio.</p>
<p>Per poter partecipare i giovani devono avere un’età compresa tra i 18 e i 30 anni e la residenza in uno dei comuni coinvolti. Nel caso in cui non si raggiunge il numero minimo di adesioni per singolo laboratorio, sarà data la possibilità di fare domanda di partecipazione anche ai giovani residenti in tutti i comuni della Provincia di Chieti. Per informazioni sulle modalità di partecipazione ci si può rivolgere al proprio comune di residenza oppure visitare il sito <a href="http://www.facebook.com/groups/157576127643990/doc/167443526657250/www.giovanipopstars.it">www.giovanipopstars.it</a>. La domanda va presentata entro il 30.07.2011</p>
<p>Il progetto si conclude con delle feste finali promosse dai giovani insieme agli anziani e a tutta la popolazione dei paesi. Il valore sociale del progetto non tocca solo le giovani generazioni ma ha una ricaduta positiva sulle comunità dei paesi coinvolti, rafforzando il senso di appartenenza, l’identità territoriale e la comunicazione tra diverse generazioni.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.mirkopagliai.it/popstar/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sviluppo web in locale</title>
		<link>http://www.mirkopagliai.it/sviluppo-web-in-locale/</link>
		<comments>http://www.mirkopagliai.it/sviluppo-web-in-locale/#comments</comments>
		<pubDate>Mon, 29 Aug 2011 17:57:49 +0000</pubDate>
		<dc:creator>Mirko Pagliai</dc:creator>
				<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[Unix]]></category>
		<category><![CDATA[/etc/apache2/ports.conf]]></category>
		<category><![CDATA[/etc/phpmyadmin/config.inc.php]]></category>
		<category><![CDATA[Apache in ascolto solo in locale]]></category>
		<category><![CDATA[applicazioni web in locale]]></category>
		<category><![CDATA[database mysql]]></category>
		<category><![CDATA[host locale]]></category>
		<category><![CDATA[PhpMyAdmin senza password]]></category>
		<category><![CDATA[server Apache]]></category>
		<category><![CDATA[Sviluppo web in locale]]></category>

		<guid isPermaLink="false">http://www.mirkopagliai.it/?p=2101</guid>
		<description><![CDATA[Due veloci tips and tricks per chi &#8211; come il sottoscritto &#8211; sviluppa applicazioni web in locale. Apache in ascolto solo in locale Questo impedisce che il nostro server Apache sia raggiungibile dall&#8217;esterno, lan inclusa. In altri termini, sarà raggiungibile solo dall&#8217;host locale, ovvero dalla stessa macchina su cui è in funzione il web server. [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-thumbnail wp-image-2102" title="Apache" src="http://www.mirkopagliai.it/wp-content/uploads/2011/08/apache-http-server-logo1-180x135.jpg" alt="Apache" width="142" height="106" />Due veloci tips and tricks per chi &#8211; come il sottoscritto &#8211; sviluppa <strong>applicazioni web in locale</strong>.</p>
<h2>Apache in ascolto solo in locale</h2>
<p>Questo impedisce che il nostro <strong>server Apache</strong> sia raggiungibile dall&#8217;esterno, lan inclusa. In altri termini, sarà raggiungibile solo dall&#8217;<strong>host locale</strong>, ovvero dalla stessa macchina su cui è in funzione il web server.<br />
Modificare il file <em>/etc/apache2/ports.conf</em> da:</p>
<pre class="brush: plain; light: true; title: ; notranslate">Listen 80</pre>
<p>a:</p>
<pre class="brush: plain; light: true; title: ; notranslate">Listen 127.0.0.1:80</pre>
<p>È possibile indicare un indirizzo per riga. Quindi, volendo abilitare anche la lan (e supponendo che l&#8217;ip della macchina, al suo interno, sia 192.168.0.100), modificare in:</p>
<pre class="brush: plain; light: true; title: ; notranslate">Listen 127.0.0.1:80
Listen 192.168.0.100:80</pre>
<p>E quindi riavviare il servizio:</p>
<pre class="brush: bash; light: true; title: ; notranslate"># /etc/init.d/apache2 restart</pre>
<h2>PhpMyAdmin senza password</h2>
<p>Questo ci permette di loggarci automaticamente all&#8217;interno di PhpMyAdmin senza doverci autenticare ogni volta. Di default, è richiesta l&#8217;autenticazione, che viene mantenuta tramite l&#8217;utilizzo di cookie.<br />
Modificare il file <em>/etc/phpmyadmin/config.inc.php</em> da:</p>
<pre class="brush: plain; title: ; notranslate">/* Authentication type */
$cfg['Servers'][$i]['auth_type'] = 'cookie';</pre>
<p>a:</p>
<pre class="brush: plain; title: ; notranslate">/* Authentication type */
$cfg['Servers'][$i]['auth_type'] = 'config';
$cfg['Servers'][$i]['user'] = 'root';
$cfg['Servers'][$i]['password'] = 'mypwd';</pre>
<p><span class="small">(dove <em>mypwd</em> è la password dell&#8217;utente root)</span></p>
<p>Assicurarsi, in questo caso, che PhpMyAdmin non sia accessibile dall&#8217;esterno (modificando come prima illustrato), onde evitare di esporsi a gravi pericoli (ovvero avere i propri <strong>database mysql</strong> accessibili a tutti).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mirkopagliai.it/sviluppo-web-in-locale/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ati &amp; Debian: installazione dei driver fglrx</title>
		<link>http://www.mirkopagliai.it/ati-debian-installazione-dei-driver-fglrx/</link>
		<comments>http://www.mirkopagliai.it/ati-debian-installazione-dei-driver-fglrx/#comments</comments>
		<pubDate>Sun, 28 Aug 2011 13:59:48 +0000</pubDate>
		<dc:creator>Mirko Pagliai</dc:creator>
				<category><![CDATA[Unix]]></category>
		<category><![CDATA[/etc/apt/sources.list]]></category>
		<category><![CDATA[/etc/X11/xorg.conf]]></category>
		<category><![CDATA[accelerazione 2D e 3D]]></category>
		<category><![CDATA[chipset di schede grafiche AMD/ATI]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[descrizione degli fglrx]]></category>
		<category><![CDATA[display manager]]></category>
		<category><![CDATA[driver Ati]]></category>
		<category><![CDATA[driver Ati debian]]></category>
		<category><![CDATA[driver Debian]]></category>
		<category><![CDATA[driver fglrx]]></category>
		<category><![CDATA[driver open per Ati]]></category>
		<category><![CDATA[fglrx Debian]]></category>
		<category><![CDATA[fglrx-control]]></category>
		<category><![CDATA[fle]]></category>
		<category><![CDATA[gdm3]]></category>
		<category><![CDATA[installazione dei driver fglrx su Debian]]></category>
		<category><![CDATA[installazione fglrx]]></category>
		<category><![CDATA[kdm]]></category>
		<category><![CDATA[sistema X Window]]></category>
		<category><![CDATA[sources.list]]></category>
		<category><![CDATA[xorg.conf]]></category>

		<guid isPermaLink="false">http://www.mirkopagliai.it/?p=2093</guid>
		<description><![CDATA[In rete sono disponibili più guide e procedimenti (vedere le fonti alla fine di questo articolo) per l&#8217;installazione dei driver fglrx su Debian, che purtroppo o non sono sufficientemente aggiornate oppure sono troppo dispersive o confusionarie. Provo quindi a scrivere una guida semplice e chiara. Anzitutto, la descrizione degli fglrx, reperita direttamente dal Wiki di [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-thumbnail wp-image-2097" title="Logo Ati" src="http://www.mirkopagliai.it/wp-content/uploads/2011/08/ati-logo-20100118-152818-180x166.jpg" alt="Logo Ati" width="92" height="84" />In rete sono disponibili più guide e procedimenti (vedere le fonti alla fine di questo articolo) per l&#8217;<strong>installazione dei driver fglrx su Debian</strong>, che purtroppo o non sono sufficientemente aggiornate oppure sono troppo dispersive o confusionarie. Provo quindi a scrivere una guida semplice e chiara.</p>
<p>Anzitutto, la <strong>descrizione degli fglrx</strong>, reperita direttamente dal <a href="http://wiki.debian.org/ATIProprietary" target="_blank">Wiki di Debian</a>:</p>
<blockquote><p>fglrx sta per FireGL and Radeon for X, ed è il driver proprietario (non libero) per display reso disponibile da ATI Technologies (ora AMD). Questo driver fornisce accelerazione 2D e 3D per chipset di schede grafiche AMD/ATI.</p></blockquote>
<p>Veniamo velocemente al dunque:<br />
1) aggiungere la componente &#8220;non-free&#8221; al proprio repository principale indicato nel file <em>sources.list</em> (<em>/etc/apt/sources.list</em>). Ad esempio, modificando così (per <em>Debian testing</em>, nel mio caso):</p>
<pre class="brush: bash; light: true; title: ; notranslate">deb http://ftp.it.debian.org/debian/ testing main contrib non-free</pre>
<p>2) aggiornare l&#8217;elenco dei pacchetti e installare i pacchetti necessari tramite:</p>
<p><span style="color: #ff0000;"><strong>NOTA dell&#8217;1/4/2012:</strong></span> per quanto riguarda l&#8217;installazione degli headers, il comando che segue era valido solo per i kernel 2.6.x e non è quindi più funzionante per i kernel 3.x. Utilizzare il comando <em>aptitude install linux-headers-`uname -r`</em>, che funziona con qualsiasi kernel.</p>
<pre class="brush: bash; light: true; title: ; notranslate"># aptitude update
# aptitude install linux-headers-2.6-$(uname -r|sed 's,[^-]*-[^-]*-,,') fglrx-driver fglrx-modules-dkms fglrx-glx fglrx-atieventsd</pre>
<p>Il comando installare tutte le dipendenze necessarie. L&#8217;output dovrebbe essere questo:</p>
<pre class="brush: bash; light: true; title: ; notranslate"># aptitude install linux-headers-2.6-$(uname -r|sed 's,[^-]*-[^-]*-,,') fglrx-driver fglrx-modules-dkms fglrx-glx fglrx-atieventsd
I seguenti pacchetti NUOVI (NEW) saranno installati:
fglrx-atieventsd fglrx-driver fglrx-glx fglrx-modules-dkms
glx-alternative-fglrx{a} glx-alternative-mesa{a} glx-diversions{a}
linux-headers-2.6-amd64 linux-headers-amd64{a}
nvidia-installer-cleanup{a}
I seguenti pacchetti sono RACCOMANDATI ma NON verranno installati:
fglrx-glx-ia32
0 pacchetti aggiornati, 10 installati, 0 da rimuovere e 2 non aggiornati.
È necessario prelevare 22,7 MB di archivi. Dopo l'estrazione, verranno occupati 74,0 MB.</pre>
<p>Il pacchetto <em>fglrx-control</em> è (diversamente da come indicato altrove) assolutamente facoltativo ed offre un pannello di controllo utile all&#8217;impostazione di alcune opzioni per il video. Come riporta la stessa descrizione:</p>
<blockquote><p>The control panel shows detailed information on your display adapter and allows you to set dual screen options, adjust gamma correction and set TV out options.</p></blockquote>
<p>3) fermare il <strong>sistema X Window</strong>. È possibile passando a una console virtuale, ovvero premendo contemporaneamente CTRL+ALT+F1. Alternativamente, si può riavviare il sistema in modalità ripristino (ma non è necessario). Fermare quindi il <strong>display manager</strong> in uso dopo essersi autenticati come root. Nel caso di <em>gdm3</em> (per ambiente Gnome):</p>
<pre class="brush: bash; light: true; title: ; notranslate"># /etc/init.d/gdm3 stop</pre>
<p>Nel caso di <em>kdm</em> (per  ambiente Kde):</p>
<pre class="brush: bash; light: true; title: ; notranslate"># /etc/init.d/kdm stop</pre>
<p>4) generare un file <em>xorg.conf</em> (<em>/etc/X11/xorg.conf</em>) ad hoc per la propria scheda Ati:</p>
<pre class="brush: bash; light: true; title: ; notranslate"># aticonfig --initial</pre>
<p>Verificare che nel file in questione, sotto la sezione &#8220;Device&#8221;, alla voce &#8220;Driver&#8221; sia correttamente indicato &#8220;fglrx&#8221;.</p>
<p>5) Riavviare <em>X Window</em> o meglio riavviare il display manager. Nel caso di <em>gdm3</em> (per ambiente Gnome):</p>
<pre class="brush: bash; light: true; title: ; notranslate"># /etc/init.d/gdm3 start</pre>
<p>Nel caso di <em>kdm</em> (per  ambiente Kde):</p>
<pre class="brush: bash; light: true; title: ; notranslate"># /etc/init.d/kdm start</pre>
<p>6) Verificare il corretto funzionamento dei driver e dell&#8217;accelerazione 3D con:</p>
<pre class="brush: bash; light: true; title: ; notranslate">$ fglrxinfo</pre>
<p>e (è necessaria l&#8217;installazione del pacchetto mesa-utils):</p>
<pre class="brush: bash; light: true; title: ; notranslate">$ glxinfo | grep rendering</pre>
<p>L&#8217;output dovrebbe essere:</p>
<pre class="brush: bash; light: true; title: ; notranslate">$ fglrxinfo
display: :0.0  screen: 0
OpenGL vendor string: ATI Technologies Inc.
OpenGL renderer string: ATI Mobility Radeon HD 4650
OpenGL version string: 3.3.11005 Compatibility Profile Context</pre>
<pre class="brush: bash; light: true; title: ; notranslate">$ glxinfo | grep rendering
direct rendering: Yes</pre>
<p>Fonti:<br />
<a href="http://wiki.debian.org/ATIProprietary" target="_blank">http://wiki.debian.org/ATIProprietary</a><br />
<a href="http://guide.debianizzati.org/index.php/Installazione_driver_proprietari_Ati" target="_blank">http://guide.debianizzati.org/index.php/Installazione_driver_proprietari_Ati</a></p>
<p>Per gli interessati ai <strong>driver open per Ati</strong>, fare riferimento a <a href="http://wiki.debian.org/it/AtiHowTo" target="_blank">questa guida</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mirkopagliai.it/ati-debian-installazione-dei-driver-fglrx/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sudo senza password</title>
		<link>http://www.mirkopagliai.it/sudo-senza-password/</link>
		<comments>http://www.mirkopagliai.it/sudo-senza-password/#comments</comments>
		<pubDate>Mon, 22 Aug 2011 15:20:18 +0000</pubDate>
		<dc:creator>Mirko Pagliai</dc:creator>
				<category><![CDATA[Unix]]></category>
		<category><![CDATA[account di root]]></category>
		<category><![CDATA[configurazione di sudo]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[distribuzione GNU/Linux]]></category>
		<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[password di root]]></category>
		<category><![CDATA[password di sudo]]></category>
		<category><![CDATA[password in chiaro]]></category>
		<category><![CDATA[privilegi di root]]></category>
		<category><![CDATA[script bash]]></category>
		<category><![CDATA[sicurezza]]></category>
		<category><![CDATA[sicurezza informatica]]></category>
		<category><![CDATA[Sudo]]></category>
		<category><![CDATA[sudo senza password]]></category>
		<category><![CDATA[utilizzo di sudo]]></category>

		<guid isPermaLink="false">http://mirkopagliai.it/?p=796</guid>
		<description><![CDATA[Sudo (superuser do) è una manna dal cielo. In estrema sintesi permette a un normale utente di svolgere operazioni assumendo temporaneamente i privilegi di root, pur non autenticandosi effettivamente come tale. I vantaggi di sudo sono indiscutibili. Tra i più importanti: non è necessario condividere la password di root con chi necessiti dei privilegi di [...]]]></description>
			<content:encoded><![CDATA[<p><strong><img class="alignleft size-medium wp-image-803" title="Sudo" src="http://mirkopagliai.it/wp-content/uploads/2010/11/sudo1-300x249.jpg" alt="Sudo" width="220" height="182" />Sudo</strong> (<em>su</em>peruser <em>do</em>) è una manna dal cielo. In estrema sintesi permette a un normale utente di svolgere operazioni assumendo temporaneamente i <strong>privilegi di root</strong>, pur non autenticandosi effettivamente come tale.</p>
<p>I vantaggi di sudo sono indiscutibili. Tra i più importanti: non è necessario condividere la <strong>password di root</strong> con chi necessiti dei privilegi di root; l&#8217;utente deve porre maggiore attenzione per ogni singolo comando che lancia con sudo e (quindi) una maggiore attenzione porta a una sensibile diminuzione di errori dovuti alla disattenzione; l&#8217;<strong>utilizzo di sudo</strong> può essere limitato e limitato sotto molti aspetti, mentre invece l&#8217;<strong>account di root</strong> non ha nessun limite &#8211; ne consegue che se la necessità è quella di utilizzare i privilegi di root in alcuni contesti ben definiti, sudo è conveniente rispetto a un accesso totale come root.</p>
<p>Può succedere che qualcuno abbia la necessità di utilizzare <strong>sudo senza password</strong>, soprattutto scrivendo <strong>script bash</strong> che per svolgere determinati passaggi necessitano appunto dei privilegi di root. Cercando su Google &#8220;sudo senza password&#8221; (senza virgolette) vengono fuori numerosi articoli che consigliano sistematicamente di aggirare il problema così:</p>
<pre class="brush: bash; light: true; title: ; notranslate">echo password | sudo -S comando</pre>
<p><span style="font-size: 10px;">(dove <em>password</em> è la password dell&#8217;utente e <em>comando</em> è il comando da eseguire. La password, scritta in chiaro, viene stampata e semplicemente passata a sudo)</span></p>
<p>Questa è la conseguenza di un fenomeno ormai pericolosamente diffuso e imperante sul web: ridistribuire notizie, informazioni, istruzioni senza sapere esattamente cosa si stia facendo e di cosa si stia parlando. Qualcuno scrive una cazzata (cosa comprensibile) e altri diecimila copia-incollano alla &#8220;zozza maniera&#8221; senza porsi il minimo dubbio su quello che stanno facendo.</p>
<p>Faccio subito due puntualizzazioni fondamentali:</p>
<ol>
<li>aggirare il controllo della <strong>password di sudo</strong> può essere solo una pessima idea. Ognuno di noi è libero di farlo (d&#8217;altronde io stesso lo faccio, la comodità della cosa è innegabile), ma bisognerebbe avere consapevolezza di quello che si sta facendo, delle conseguenze che può portare e soprattutto essere nella situazione di assumersi poi le responsabilità di quella che &#8211; lo ripeto &#8211; può essere solo una pessima idea;</li>
<li>generalmente e in qualsiasi contesto, non bisogna mai salvare la propria <strong>password in chiaro</strong>, per nessun motivo, nemmeno per questioni di comodità come questa. Si mette in grave rischio la <strong>sicurezza informatica</strong> del sistema dove si esegue questa scelta scellerata (il vostro sistema <strong>GNU/Linux</strong>, in questo caso specifico). Se non esistono alternative a questa scelta, allora è meglio lasciar perdere e rassegnarsi al dover inserire (manualmente) la password ogni volta che ci viene richiesta.</li>
</ol>
<p>Si può aggirare il controllo della password di sudo semplicemente modificando il file di <strong>configurazione di sudo</strong> con il comando (come root):</p>
<pre class="brush: bash; light: true; title: ; notranslate">visudo</pre>
<p>In fondo alla configurazione è sufficiente aggiungere qualcosa come:</p>
<pre class="brush: bash; light: true; title: ; notranslate">utente   ALL=NOPASSWD: ALL</pre>
<p><span style="font-size: 10px;">(dove <em>utente</em> è il nome dell&#8217;utente)</span></p>
<p>In questo modo l&#8217;utente specificato è autorizzato a utilizzare sudo senza che gli venga richiesta la password. Nell&#8217;esempio specifico, inoltre, questa autorizzazione è valida per qualsivoglia comando voglia eseguire l&#8217;utente. Sarebbe quindi meglio limitare questa possibilità.</p>
<p>A questo scopo (ma anche per approfondire sufficiente l&#8217;argomento) vi rimando alle pagine del manuale:</p>
<pre class="brush: bash; light: true; title: ; notranslate">man sudo</pre>
<p>E ad un&#8217;ottima guida per Ubuntu (comunque valida per qualsiasi <strong>distribuzione GNU/Linux</strong>, tanto il file di configurazione è sempre quello) che potete trovare <a href="http://wiki.ubuntu-it.org/AmministrazioneSistema/Sudo">qui</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mirkopagliai.it/sudo-senza-password/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Skype a 64bit: aggiornamenti</title>
		<link>http://www.mirkopagliai.it/skype-a-64bit-aggiornamenti/</link>
		<comments>http://www.mirkopagliai.it/skype-a-64bit-aggiornamenti/#comments</comments>
		<pubDate>Fri, 19 Aug 2011 11:37:41 +0000</pubDate>
		<dc:creator>Mirko Pagliai</dc:creator>
				<category><![CDATA[Unix]]></category>
		<category><![CDATA[/usr/bin/skype64]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[Debian 64bit]]></category>
		<category><![CDATA[Debian testing a 64bit]]></category>
		<category><![CDATA[forzare l'architettura]]></category>
		<category><![CDATA[installazione di Skype]]></category>
		<category><![CDATA[pacchetto a 64bit]]></category>
		<category><![CDATA[Skype]]></category>
		<category><![CDATA[Skype 2.2.0.35]]></category>
		<category><![CDATA[Skype 64bit]]></category>
		<category><![CDATA[skype64]]></category>
		<category><![CDATA[versione a 64bit]]></category>

		<guid isPermaLink="false">http://www.mirkopagliai.it/?p=2081</guid>
		<description><![CDATA[Ieri ho avuto la necessità di fare un&#8217;installazione pulita di una Debian testing a 64bit su un nuovo computer desktop, così oggi sono passato all&#8217;installazione di Skype a 64bit. Ho potuto quindi constatare di persona i miglioramenti raggiunti grazie alla disponibilità di un pacchetto a 64bit (di cui avevo già parlato qui). Con l&#8217;ultima versione [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-thumbnail wp-image-483" title="Skype" src="http://www.mirkopagliai.it/wp-content/uploads/2010/10/skype-150x150.jpg" alt="Skype" width="150" height="150" />Ieri ho avuto la necessità di fare un&#8217;installazione pulita di una <strong>Debian testing a 64bit</strong> su un nuovo computer desktop, così oggi sono passato all&#8217;installazione di <strong>Skype a 64bit</strong>. Ho potuto quindi constatare di persona i miglioramenti raggiunti grazie alla disponibilità di un <strong>pacchetto a 64bit</strong> (di cui avevo già parlato <a href="http://www.mirkopagliai.it/skype-2-2/" target="_blank">qui</a>).</p>
<p>Con l&#8217;ultima versione disponibile (in questo momento la <em>2.2.0.35</em>) non è più necessario seguire la complessa <a href="http://www.mirkopagliai.it/skype-a-64bit/" target="_blank">procedura</a> che avevo illustrato lo scorso ottobre. In particolare, adesso:</p>
<ul>
<li>non è più necessario <strong>forzare l&#8217;architettura</strong>, essendo disponibile appunto un pacchetto a 64bit;</li>
<li>non è più necessario installare manualmente le dipendenze mancante, in quanto ora sono vengono tutte installate correttamente;</li>
<li>non è più presente il bug legato alle Qt che impediva la corretta visualizzazione degli avatar dei contatti.</li>
</ul>
<p>La <strong>versione a 64bit</strong> è scaricabile da <a href="http://www.skype.com/go/getskype-linux-deb-64" target="_blank">qui</a>. È sufficiente aprire il <em>.deb</em> con <em>Gdebi</em> e avviare l&#8217;installazione: tutto andrà a buon fine. Non è quindi più necessario &#8211; ripeto &#8211; installare dipendenze mancanti e poi procedere con l&#8217;<strong>installazione di Skype</strong> tramite <em>dpkg</em> per forzare l&#8217;architettura.</p>
<p>Persiste tuttavia un piccolo problema. Lanciando Skype dal terminale, possiamo verificare l&#8217;esistenza di due warning (tutto comunque funzionerà normalmente). Ovvero questo:</p>
<pre class="brush: bash; light: true; title: ; notranslate">Gtk-Message: Failed to load module &quot;canberra-gtk-module&quot;: /usr/lib/gtk-2.0/modules/libcanberra-gtk-module.so: classe ELF errata: ELFCLASS64</pre>
<p>E questo:</p>
<pre class="brush: bash; light: true; title: ; notranslate">(&lt;unknown&gt;:3043): Gtk-WARNING **: /usr/lib/gtk-2.0/2.10.0/engines/libclearlooks.so: classe ELF errata: ELFCLASS64</pre>
<p>Possono essere entrambi risolti con un workaround <a href="http://www.mirkopagliai.it/skype-a-64bit/" target="_blank">già descritto</a>. Create, con i privilegi di root, il file <em>/usr/bin/skype64</em>:</p>
<pre class="brush: bash; light: true; title: ; notranslate">touch /usr/bin/skype64</pre>
<p>Quindi copia-incollate al suo interno quanto segue:</p>
<pre class="brush: bash; title: ; notranslate">#!/bin/bash
export GTK_PATH=/usr/lib32/gtk-2.0
skype</pre>
<p>E infine assegnategli i permessi di esecuzione:</p>
<pre class="brush: bash; light: true; title: ; notranslate">chmod +x /usr/bin/skype64</pre>
<p>A questo punto sarà sufficiente lanciare Skype con il nuovo comando <em>skype64</em>, affinché tutto funzioni correttamente.</p>
<p>Mi raccomando a modificare opportunamente i vari lanciatori, primo fra tutti quello del menù:</p>
<p><a href="http://www.mirkopagliai.it/wp-content/uploads/2011/08/Skype-64bit.jpg"><img class="aligncenter size-large wp-image-2082" title="Skype a 64bit" src="http://www.mirkopagliai.it/wp-content/uploads/2011/08/Skype-64bit-680x553.jpg" alt="Skype a 64bit" width="680" height="553" /></a></p>
<p>E quello delle &#8220;Applicazioni d&#8217;avvio&#8221;, se ne avete impostato l&#8217;avvio automatico:<br />
<a href="http://www.mirkopagliai.it/wp-content/uploads/2011/08/Skype-a-64bitb.jpg"><img class="aligncenter size-full wp-image-2083" title="Skype a 64bit" src="http://www.mirkopagliai.it/wp-content/uploads/2011/08/Skype-a-64bitb.jpg" alt="Skype a 64bit" width="629" height="386" /></a>Buone videochiamate a tutti :-)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mirkopagliai.it/skype-a-64bit-aggiornamenti/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

