<?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>Il blog di AziendeItalia: webhosting, domini, programmazione web e tutorial</title>
	<atom:link href="http://blog.aziendeitalia.com/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.aziendeitalia.com</link>
	<description></description>
	<lastBuildDate>Thu, 17 May 2012 05:56:44 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>Buone pratiche SEO: il redirect HTTP 301</title>
		<link>http://blog.aziendeitalia.com/buone-pratiche-seo-il-redirect-http-301</link>
		<comments>http://blog.aziendeitalia.com/buone-pratiche-seo-il-redirect-http-301#comments</comments>
		<pubDate>Thu, 17 May 2012 05:56:44 +0000</pubDate>
		<dc:creator>Stefano Adriani</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[Webhosting]]></category>
		<category><![CDATA[.htaccess]]></category>
		<category><![CDATA[amp]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[DNS]]></category>
		<category><![CDATA[dominio]]></category>
		<category><![CDATA[hosts]]></category>
		<category><![CDATA[HTTP 301]]></category>
		<category><![CDATA[Page Rank]]></category>
		<category><![CDATA[redirect]]></category>
		<category><![CDATA[seo]]></category>
		<category><![CDATA[sottodomini]]></category>
		<category><![CDATA[www]]></category>

		<guid isPermaLink="false">http://blog.aziendeitalia.com/?p=1466</guid>
		<description><![CDATA[Nelle scorse puntate abbiamo chiarito il ruolo del sottodominio www e discusso come la coesistenza di nomi diversi per lo stesso sito possa diminuire l&#8217;efficacia del SEO, dividendo i riferimenti alle pagine in due parti: i link preceduti da www e quelli senza www. E&#8217; importante chiarire che non stiamo parlando del re-indirizzamento DNS del ...]]></description>
			<content:encoded><![CDATA[<p>Nelle scorse puntate abbiamo chiarito il ruolo del <a title="Il sottodominio www" href="http://blog.aziendeitalia.com/il-sottodominio-www">sottodominio <em>www</em></a> e discusso come la coesistenza di nomi diversi per lo stesso sito possa diminuire l&#8217;efficacia del <strong>SEO</strong>, dividendo i riferimenti alle pagine in due parti: i link preceduti da <em>www</em> e quelli senza <em>www</em>.</p>
<p>E&#8217; importante chiarire che non stiamo parlando del re-indirizzamento <strong>DNS</strong> del dominio o del subdominio: se raggiungiamo una pagina in entrambi i modi (sia col prefisso <em>www</em> che senza) significa che il servizio DNS è configurato correttamente. I server DNS provvedono a risolvere il nome verso lo stesso server, perciò “tutto va bene” dal punto di vista dell&#8217;ipotetico visitatore. Le cose cambiano dal punto di vista dei motori di ricerca. Una prova molto semplice potrebbe essere quella di confrontare due modi di scrivere l&#8217;URL di AziendeItalia</p>
<p style="padding-left: 30px"><code>http://aziendeitalia.com</code></p>
<p style="padding-left: 30px"><code>http://www.aziendeitalia.com</code></p>
<p>dopo aver verificato di raggiungere la stessa pagina in ambo i casi, è interessante osservare cosa succede nella barra dell&#8217;indirizzo del browser. I casi sono due</p>
<ol>
<li>Dopo aver caricato la pagina entrambi gli indirizzi restano <strong>invariati</strong></li>
<li>Dopo aver caricato la pagina uno degli indirizzi si <strong>allinea</strong> automaticamente all&#8217;altro</li>
</ol>
<p>le due situazioni sono indifferenti dal punto di vista dell&#8217;utente, ma impattano il <em>Page Rank</em> della pagina: se gli indirizzi restano invariati, un ipotetico motore di ricerca che sta seguendo un link alla pagina, o analizzando il sito, tratterà i due indirizzi come <strong>casi distinti</strong>. Ad esempio, se 10 link puntano alla pagina senza <em>www</em>, e 10 link puntano alla pagina con <em>www</em>, lo scenario 1 significa che il motore di ricerca conterà 10 link (e non 20) per ciascuno dei due indirizzi. Nello scenario 2, invece, grazie alla correzione automatica dell&#8217;indirizzo, il motore di ricerca conterà 20 link totali.</p>
<p>L&#8217;esempio dovrebbe spiegare perché, nonostante il DNS risolva correttamente entrambi gli indirizzi, il fatto di avere due URL equivalenti (ma distinti) riduca l&#8217;efficacia del SEO. Se ci troviamo nello scenario 1, possiamo usare un <a title="Conteggio dei riferimenti ad un sito" href="http://www.opensiteexplorer.org/">tool</a> per capire come vengono divisi i “punteggi” del motore di ricerca.</p>
<p>Un problema di questo genere si risolve scegliendo uno dei due indirizzi, probabilmente quello più “gettonato” dei due, e decidere che tale indirizzo diventerà il riferimento <strong>canonico</strong> al nostro server. Si potrebbe poi pensare di “educare” tutte le persone che referenziano il sito, chiedendo loro di usare solo l&#8217;indirizzo canonico. Da un punto di vista tecnico la cosa funzionerebbe, ma non è questa la soluzione: un domani nuovi e numerosi link (ci auspichiamo) potrebbero puntare al nostro sito, e non possiamo certo prenderci la briga di comunicare a tutti, o pretendere da tutti, di aggiornare il link che abbiamo scelto come indirizzo canonico.</p>
<p>Un&#8217;ottima soluzione, molto più semplice ed indolore, ci viene offerta dallo stesso protocollo <a title="Il protocollo HTTP" href="http://blog.aziendeitalia.com/il-protocollo-http">HTTP</a>, che offre la possibilità del <strong>redirect HTTP 301</strong>.</p>
<p>Per capire il funzionamento del <em>redirect HTTP 301</em> possiamo controllare l&#8217;header HTTP delle risposta tramite i comuni strumenti di sviluppo web, come ad esempio <strong>Firebug</strong>. Considerando come esempio il dominio <code>aziendeitalia.com</code>, proviamo a raggiungere il sito usando i due indirizzi (con <em>www</em> e senza <em>www</em>) e confrontare i risultati. Nel caso dell&#8217;indirizzo <strong>con</strong> il prefisso <em>www</em> abbiamo</p>
<div id="attachment_1471" class="wp-caption alignnone" style="width: 310px"><a href="http://blog.aziendeitalia.com/wp-content/uploads/2012/05/redirect_301_01.png"><img class="size-medium wp-image-1471" src="http://blog.aziendeitalia.com/wp-content/uploads/2012/05/redirect_301_01-300x94.png" alt="Esempio di HTTP 200" width="300" height="94" /></a><p class="wp-caption-text">Esempio di HTTP 200</p></div>
<p>mentre <strong>senza</strong> il prefisso <em>www</em> risulta</p>
<p><a href="http://blog.aziendeitalia.com/wp-content/uploads/2012/05/redirect_301_02.png"><img class="size-medium wp-image-1472" src="http://blog.aziendeitalia.com/wp-content/uploads/2012/05/redirect_301_02-300x97.png" alt="Esempio di redirect 301" width="300" height="97" /></a></p>
<div class="mceTemp">
<dl>
<dd>Esempio di redirect 301</dd>
</dl>
</div>
<p>dal confronto emerge che il dominio canonico (o <em>authoritative domain</em>) per il sito di AziendeItalia è quello <strong>con</strong> il prefisso <em>www</em>: se digitiamo l&#8217;indirizzo senza tale prefisso riceviamo la risposta “HTTP 301 Moved Permanently”, che serve proprio a risolvere il problema in oggetto: la risposta <strong>HTTP 301</strong> significa che l&#8217;indirizzo richiesto è stato spostato altrove, specificando dove ridirigere le richiesta. Subito dopo questa risposta, infatti, abbiamo (vedi figura qui sopra) una nuova richiesta HTTP GET verso il dominio canonico (<code>www.aziendeitalia.com</code>), con esito <strong>HTTP 200</strong>, che significa “tutto ok”.</p>
<p>Il caso appena visto è un buon esempio di utilizzo del redirect HTTP 301: grazie al re-indirizzamento, qualsiasi sia l&#8217;indirizzo, ogni volta che raggiungiamo il sito di AziendeItalia siamo indirizzati (alla fine delle transazione HTTP) verso il dominio corretto. Ciò accade, tra l&#8217;altro, anche quando il sito viene analizzato dai motori di ricerca, che grazie a questo stratagemma indicizzano solamente il dominio canonico.</p>
<p>Per realizzare il redirect basta aggiungere alcune righe al file <code>.htaccess</code> presente nella root del sito. Se non abbiamo mai usato un file <code>.htaccess</code>, possiamo crearne uno nuovo, che conterrà solamente le righe qui sotto. Se non sappiamo cos&#8217;è un file <code>.htaccess</code>, e vogliamo saperne di più, possiamo leggere l&#8217;<a title="Configurazione di Apache" href="http://blog.aziendeitalia.com/configurazione-di-apache">articolo</a> introduttivo all&#8217;argomento.</p>
<p>Per realizzare il redirect di un ipotetico indirizzo <code>www.prova.org</code>, verso l&#8217;indirizzo <code>prova.org</code>, le righe da inserire nel file <code>.htaccess</code> sono</p>
<p style="padding-left: 30px"><code>RewriteEngine On<br />
RewriteBase /<br />
RewriteCond %{HTTP_HOST} ^www.prova.org [NC]<br />
RewriteRule ^(.*)$ http://prova.org/$1 [L,R=301]</code></p>
<p>Ovviamente, per ottenere lo stesso risultato su un altro sito, occorre sostituire le stringhe <code>www.prova.org e</code> <code>prova.org</code> con quelle del dominio in questione.</p>
<p>Esistono in realtà modi diversi di realizzare il redirect, usando sempre il modulo rewrite di Apache: questa libertà è dovuto alla flessibilità delle regole di rewrite, che possono essere scritte in maniera differente pur realizzando lo stesso risultato. Poiché il funzionamento di un file <code>.htaccess</code> dipende dalla politica del provider, il fatto di poter scrivere le regole del redirect in modi diversi dovrebbe aiutarci a trovare la “giusta sintassi” per il “giusto provider”. Se l&#8217;esempio qui sopra non dovesse funzionare, non scoraggiamoci e cerchiamo altri esempi di “redirect HTTP 301”: l&#8217;argomento è abbastanza popolare e la ricerca sul web offre numerosi esempi di sintassi alternativa.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.aziendeitalia.com/buone-pratiche-seo-il-redirect-http-301/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Aggiornamento di PrestaShop</title>
		<link>http://blog.aziendeitalia.com/aggiornamento-di-prestashop</link>
		<comments>http://blog.aziendeitalia.com/aggiornamento-di-prestashop#comments</comments>
		<pubDate>Wed, 16 May 2012 08:42:56 +0000</pubDate>
		<dc:creator>Stefano Adriani</dc:creator>
				<category><![CDATA[CMS - Content Management System]]></category>
		<category><![CDATA[Guide tecniche]]></category>
		<category><![CDATA[aggiornamento]]></category>
		<category><![CDATA[cms]]></category>
		<category><![CDATA[e-commere]]></category>
		<category><![CDATA[Presta Shop 1.4]]></category>
		<category><![CDATA[PrestaShop]]></category>
		<category><![CDATA[procedura]]></category>

		<guid isPermaLink="false">http://blog.aziendeitalia.com/?p=1449</guid>
		<description><![CDATA[PrestaShop è una soluzione e-commerce gratuita e open-source, semplice da installare e configurare. La procedura di aggiornamento dalle versioni precedenti la 1.4 può presentare qualche difficoltà: oggi vedremo quali sono i passaggi più critici, cercando di fornire gli strumenti utili per risolvere gli eventuali problemi. Innanzitutto, prima di procedere è fortemente suggerito eseguire un backup ...]]></description>
			<content:encoded><![CDATA[<p>PrestaShop è una soluzione e-commerce gratuita e open-source, semplice da <a title="Installazione di PrestaShop" href="http://blog.aziendeitalia.com/e-commerce-con-prestashop">installare</a> e configurare. La procedura di aggiornamento dalle versioni precedenti la 1.4 può presentare qualche difficoltà: oggi vedremo quali sono i passaggi più critici, cercando di fornire gli strumenti utili per risolvere gli eventuali problemi. Innanzitutto, prima di procedere è fortemente suggerito eseguire un <strong>backup</strong> del sito e del database, seguendo la stessa procedura vista per la <a title="Migrazione di PrestaShop" href="http://blog.aziendeitalia.com/come-migrare-prestashop">migrazione</a> di PrestaShop.</p>
<p>Se abbiamo modificato qualche <strong>traduzione</strong>, dal menù principale clicchiamo sul <em>Utilità</em> – <em>Traduzioni</em>. Nella sezione <em>Esporta una lingua</em> selezioniamo la lingua e il tema corrente, poi clicchiamo su <em>Esporta</em>.</p>
<p>Come ultima precauzione, <strong>disabilitiamo</strong> momentaneamente il negozio: dal menù <em>Preferenze</em> – <em>Abilita negozio</em> spuntiamo la voce “no”. Subito sotto, nel campo Indirizzo <em>IP di manutenzione</em>, inseriamo il nostro IP corrente (<a title="What's my IP" href="http://www.whatsmyip.org/">trova IP</a>), allo scopo di poter accedere al negozio per le verifiche necessarie. Se lavoriamo in locale inseriamo l&#8217;indirizzo 127.0.0.1.</p>
<p><a title="PrestaShop download" href="http://www.prestashop.com/it/download">Scarichiamo</a> la nuova versione (in formato compresso), estraiamo i files e <strong>rinominiamo</strong> la cartella</p>
<p style="padding-left: 30px"><code> /prestashop/admin </code></p>
<p>con il nome della nostra cartella di amministrazione (quella che usiamo per entrare nel backend). D&#8217;ora in poi faremo riferimento a questa nuova copia di PrestaShop come la “nuova versione”. Durante la procedura avremo quindi due istanze di PrestaShop: quella vecchia, che non toccheremo mai, e quella nuova (estratta dallo ZIP), che dovremo trasformare in una nuova versione funzionante.</p>
<p>&nbsp;</p>
<p><strong>1° step: procedura manuale</strong></p>
<p>Copiamo la cartelle del nostro backup dentro le cartelle delle nuova installazione. Le cartelle da copiare sono:</p>
<ul>
<li><code>img</code>: immagini di categorie e prodotti, <em>sovrascrivendo</em> il contenuto della cartella <code>img</code> della nuova versione, in modo da mantenere le nostre immagini</li>
<li><code>modules</code>: i moduli aggiunti dopo l&#8217;installazione, <em>sovrascrivendo</em> il contenuto della cartella <code>modeles</code> della nuova versione. Se abbiamo installato PrestaShop con tutti i moduli di default, e non abbiamo mai aggiunto alcun modulo, possiamo saltare questo passaggio. Se non siamo sicuri che i moduli siano compatibili con la nuova versione, conviene disinstallarli (disabilitarli senza disinstallarli potrebbe essere inutile)</li>
<li><code>themes/&lt;nome&gt;</code>: copiamo solamente il tema che stiamo utilizzando. Se usiamo il tema di default (i.e. <em>Prestashop</em>) saltiamo questo passaggio, ovvero non portiamo il vecchio tema nella nuova installazione. Altrimenti è bene verificare che il tema sia compatibile con la nuova versione <em>prima</em> di procedere con l&#8217;aggiornamento, usando l&#8217;apposito <a title="Validazione dei temi di PrestaShop" href="http://validator.prestashop.com/">tool</a> online (con istruzioni in inglese). Se il tema non è compatibile conviene <strong>disabilitarlo</strong> (tornando su quello di default) prima di proseguire, e ripristinarlo al termine dell&#8217;aggiornamento (scaricandone l&#8217;ultima versione)</li>
</ul>
<p>Se abbiamo personalizzato <strong>manualmente</strong> alcune pagine, probabilmente dovremo copiare anche le cartelle <code>mail</code>, <code>download</code> e <code>upload</code>: se invece non abbiamo mai toccato queste cartelle, possiamo evitare di copiarle nella nuova versione.</p>
<p>Dalla cartella <strong>config</strong> copiamo solamente il file <code>settings.inc.php</code>, facendo attenzione ai soliti parametri (gli stessi che dobbiamo tenere d&#8217;occhio in caso di migrazione).</p>
<p style="padding-left: 30px"><code> __PS_BASE_URI__</code> : il percorso rispetto alla root di Apache, ad esempio <code>ilmiosito</code></p>
<p style="padding-left: 30px"><code> _DB_NAME_</code>: il nome del database</p>
<p style="padding-left: 30px"><code> _DB_SERVER_</code>: l&#8217;host del dabase, probabilmente <code>localhost</code></p>
<p> La cartella <strong>classes</strong> merita una trattazione a parte: se abbiamo aggiunto classi nuove, non previste da PrestaShop, ci toccherà editarle a mano e cambiare tutti i nomi, per appendere il suffisso <code>Core</code>. Ad esempio, la classe <code>Pippo</code> andrà rinominata come <code>PippoCore</code>. Quest&#8217;operazione va effettuata solo sui nomi delle classi, non sui nomi dei files PHP che le contengono.</p>
<p>&nbsp;</p>
<p><strong>2° step: wizard di aggiornamento</strong></p>
<p>A questo punto apriamo il browser per raggiugere il wizard di aggiornamento. Se lavoriamo in locale ci colleghiamo ad un indirizzo del tipo</p>
<p style="padding-left: 30px"><code>http://localhost/prestashop/install/</code></p>
<p>Nella prima pagina spuntiamo la casella <em>Voglio aggiornare il mio PrestaShop</em>, nella seconda confermiamo di aver fatto il backup dell&#8217;installazione precedente. Se il wizard ci segnala che i <strong>parametri del server</strong> sono insufficienti (ad esempio <code>max_execution_time</code>), provvediamo a modificare il parametro nel file <code>.htaccess</code> (o il file <code>php.ini</code> se siamo in locale) e rilanciamo il wizard dall&#8217;inizio.</p>
<p>Al termine del processo ci verrà detto se sono avvenuti errori. In caso di errori SQL dobbiamo copiare il rapporto completo (cliccando su <em>visualizza rapporto</em>) e cercare l&#8217;errore. Questo potrebbe essere piuttosto noioso, perché non sapendo cosa cercare, probabilmente dovremo scorre l&#8217;intero file. A titolo d&#8217;esempio, un possibile errore potrebbe essere</p>
<p style="padding-left: 30px"><code> (1048) Column 'id_module' cannot be null</code></p>
<p>Per risolvere gli eventuali problemi SQL dobbiamo identificare la risorsa che genera l&#8217;errore (ad esempio il modulo <em>pagesnotfound</em>) e provare a rimuovere, installare o re-installare la risorsa (in questo caso il modulo <em>Pagina non trovata</em>). Se gli errori non sono bloccanti, possiamo ugualmente concludere l&#8217;installazione: ciò significa cancellare la cartella <code>install</code> e i file <code>readme*.txt</code> e <code>CHANGELOG</code> (nella cartella <code>doc</code>).</p>
<p>&nbsp;</p>
<p><strong>3° step: validazione</strong></p>
<p>Per validare l&#8217;aggiornamento di PrestaShop eseguiamo alcune operazioni nel backend:</p>
<ul>
<li>Dal menù principale clicchiamo sul <em>Utilità</em> – <em>Traduzioni</em>. Nella sezione <em>Importa una lingua manualmente </em> importiamo la traduzioni esportate all&#8217;inizio della procedura</li>
<li>Verifichiamo nel menù <em>Preferenze</em> &#8211; <em>SEO &amp; URLs</em> che i valori <em>PS directory</em> e <em>Nome di dominio del negozio</em> siano corretti</li>
<li>Rigeneriamo il file <code>.htaccess</code> dal menù <em>Utilità</em> – <em>Generatori</em>, <em>cliccando su Crea un file “.htaccess”</em></li>
</ul>
<p>La validazione dell&#8217;aggiornamento dovrebbe includere alcuni test funzionali, che potrebbero essere: navigare le sezioni del sito; creare un account utente; fare un ordine; fare un prova di pagamento; verificare (nel backend) che l&#8217;ordine sia ricevuto; mandare una mail dalla pagina dei contatti; controllare la fatturazione della vendita; controllare i moduli. Se abbiamo poco tempo, e l&#8217;aggiornamento sembra andare a buon fine in locale, probabilmente conviene effettuare i test live, ed intervenire in modo specifico solo dove serve.</p>
<p>Per ulteriori informazioni possiamo consultare la <a title="PrestaShop update" href="http://doc.prestashop.com/display/PS14/Updating+PrestaShop">guida</a> completa all&#8217;aggiornamento.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.aziendeitalia.com/aggiornamento-di-prestashop/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>VirtualHost su Windows con Apache</title>
		<link>http://blog.aziendeitalia.com/virtualhost-su-windows-con-apache</link>
		<comments>http://blog.aziendeitalia.com/virtualhost-su-windows-con-apache#comments</comments>
		<pubDate>Tue, 15 May 2012 08:54:58 +0000</pubDate>
		<dc:creator>Stefano Adriani</dc:creator>
				<category><![CDATA[Senza categoria]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[hosts]]></category>
		<category><![CDATA[httpd-vhosts.conf]]></category>
		<category><![CDATA[virtual hosts]]></category>
		<category><![CDATA[windows]]></category>
		<category><![CDATA[xampp]]></category>

		<guid isPermaLink="false">http://blog.aziendeitalia.com/?p=1434</guid>
		<description><![CDATA[Quando lavoriamo su un progetto web è normale provare l&#8217;applicazione in locale prima di portarla sul server remoto. Il vantaggio di questo approccio è la riduzione dei tempi di sviluppo e collaudo: ogni modifica effettuata in locale può essere verificata immediatamente, senza dover eseguire l&#8217;upload delle risorse via FTP, e senza utilizzare qualche strumento di ...]]></description>
			<content:encoded><![CDATA[<p>Quando lavoriamo su un progetto web è normale provare l&#8217;applicazione in locale prima di portarla sul server remoto. Il vantaggio di questo approccio è la riduzione dei tempi di sviluppo e collaudo: ogni modifica effettuata in locale può essere verificata immediatamente, senza dover eseguire l&#8217;upload delle risorse via FTP, e senza utilizzare qualche strumento di amministrazione dei files remoti (ad esempio un editor di risorse via browser). Lo svantaggio, o meglio il rischio, è di avere delle sorprese al momento del rilascio. L&#8217;ambiente di run-time remoto non è quasi mai uguale a quello locale, ed è piuttosto probabile che una stessa applicazione, che gira perfettamente in locale, si comporti diversamente in remoto.</p>
<p>Un modo di ridurre il problema è quello di creare un ambiente di lavoro locale il più possibile simile a quello remoto. Una delle prime operazioni in questa direzione è la consistenza degli <strong>indirizzi</strong> locali rispetto a quelli remoti. Molto spesso capita di lavorare in locale su un indirizzo come</p>
<p style="padding-left: 30px"><code> http://localhost/prova.com/</code></p>
<p>e di volerlo farlo funzionare in remoto come</p>
<p style="padding-left: 30px"><code> http://prova.com/</code></p>
<p>Una situazione di questo tipo rappresenta un possibile problema: se la nostra applicazione utilizza una riscrittura dinamica degli indirizzi (<em>rewrite</em> di Apache), o semplicemente gestisce le pagine in base alla posizione rispetto alla root del server, una discrepanza come quella qui sopra potrebbe creare dei fastidi al momento del deploy in remoto. Una buona soluzione, per tutti i problemi di questo tipo, è la configurazione di un <strong>Virtual Host</strong> in locale.</p>
<p>Abbiamo già visto come configurare un Virtual Host nel caso di Apache2 (su <a title="Installare Apache su Linux come servizio" href="http://blog.aziendeitalia.com/installare-apache-come-servizio-su-linux">Linux</a>). Oggi vedremo come compiere la stessa operazione su Windows, facendo riferimento all&#8217;installazione di <strong>Apache</strong> tramite il pacchetto <a title="Installare Apache su Windows" href="http://blog.aziendeitalia.com/installare-apache-su-windows"><strong>XAMPP</strong></a>.</p>
<p><span style="color: #000080"><span style="text-decoration: underline"><br />
</span></span></p>
<p><strong>Configurazione dell&#8217;host virtuale</strong></p>
<p>Il primo passo è la creazione del Virtual Host in Apache. Cerchiamo il file <code>httpd-vhosts.conf</code>, che dovrebbe trovarsi all&#8217;interno della cartella</p>
<p style="padding-left: 30px"><code> &lt;Installazione di XAMPP&gt;\apache\conf\extra</code></p>
<p>e facciamone una copia di backup per sicurezza (chiamandola ad esempio <code>httpd-vhosts.original.conf</code>). Dopodiché apriamo il file con un editor qualsiasi (su Windows consigliamo <em>Notepad++</em>) e scommentiamo la riga</p>
<p style="padding-left: 30px"><code> # Use name-based virtual hosting.</code></p>
<p style="padding-left: 30px"><code> NameVirtualHost *:80</code></p>
<p>in questo modo abilitiamo il riconoscimento degli host virtuali in base al nome presente nell&#8217;URL, ovvero in base al <strong>nome</strong> del dominio (in questo caso virtuale). Alla fine del file inseriamo invece le righe</p>
<p style="padding-left: 30px"><code>&lt;VirtualHost *:80&gt;</code></p>
<p style="padding-left: 60px"><code> ServerName localhost</code></p>
<p style="padding-left: 60px"><code> DocumentRoot "C:\Apps\xampp\htdocs"</code></p>
<p style="padding-left: 30px"><code>&lt;/VirtualHost&gt;</code></p>
<p style="padding-left: 30px"><code> </code><code>&lt;VirtualHost *:80&gt;</code></p>
<p style="padding-left: 60px"><code> ServerName prova.com</code></p>
<p style="padding-left: 60px"><code> DocumentRoot "C:\Apps\xampp\htdocs\prova"</code></p>
<p style="padding-left: 60px"><code> &lt;Directory "C:\Apps\xampp\htdocs\prova"&gt;</code></p>
<p style="padding-left: 90px"><code> Order allow,deny</code></p>
<p style="padding-left: 90px"><code> Allow from all</code></p>
<p style="padding-left: 60px"><code> &lt;/Directory&gt;</code></p>
<p style="padding-left: 30px"><code>&lt;/VirtualHost&gt;</code></p>
<p>cambiando ovviamente i riferimenti alla directory <code>prova</code>. La prima sezione dice ad Apache di continuare a lavorare come prima quando scriviamo <code>http://localhost</code> nel browser: se omettiamo questa sezione non vedremo più le pagine deployate nella cartella <code>htdocs</code>. La seconda sezione è quella che ci interessa, e serve ad associare l&#8217;host virtuale <code>prova.com</code> alla cartella locale <code>C:\Apps\xampp\htdocs\prova</code> (o l&#8217;equivalente percorso locale).</p>
<p>&nbsp;</p>
<p><strong>Configurazione del file host</strong></p>
<p>La modifica vista sopra è sufficiente per creare un host virtuale, in questo caso <code>prova.com</code>. Rimane però una cosa da fare: se non abbiamo registrato il dominio <code>prova.com</code>, il browser non sarà capace di raggiungere l&#8217;Apache locale. Viceversa, se abbiamo già registrato <code>prova.com</code>, molto probabilmente digitando <code>http://prova.com</code> finiremo (giustamente) sul server remoto e non sull&#8217;istanza locale.</p>
<p>Il modo più semplice di costringere la nostra macchina (e solo lei) a raggiungere l&#8217;Apache locale usando lo stesso URL di produzione è tramite il file <code>hosts</code>, che su Windows dovrebbe trovarsi qui</p>
<p style="padding-left: 30px"><code> C:\WINDOWS\system32\drivers\etc\hosts </code></p>
<p>apriamo il file con i <strong>permessi di amministratore</strong> e inseriamo la riga</p>
<p style="padding-left: 30px"><code> 127.0.0.1 prova.com</code></p>
<p>L&#8217;istruzione dirà a Windows che qualunque richiesta verso l&#8217;host <code>prova.com</code> va risolta sull&#8217;indirizzo IP 127.0.0.1, ovvero quello della nostra macchina locale.</p>
<p>Questo è tutto. Dopo aver riavviato Apache, ogni volta che scriveremo <code>http://prova.com</code> vedremo le pagine dell&#8217;Apache locale, e potremo navigare con gli stessi indirizzi della versione remota del sito (o applicazione). Ricordiamoci che la modifica nel file <code>hosts</code> ci impedirà di raggiungere il sito remoto (quello “reale”): per vedere di nuovo le pagine del sito remoto basta commentare la riga inserita nel file <code>hosts</code>, senza toccare (né riavviare) Apache. Il file <code>hosts</code> riguarda il comportamento del sistema operativo, non gli applicativi installati sulla macchina (come ad esempio Apache).</p>
<p>Se qualcosa va storto, o non funziona, verifichiamo che nel file <code>httpd.conf</code> non sia commentata l&#8217;istruzione</p>
<p style="padding-left: 30px"><code> Include "conf/extra/httpd-vhosts.conf"</code></p>
<p>altrimenti Apache non degnerà di interesse le modifiche nel file <code>httpd-vhosts.conf</code>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.aziendeitalia.com/virtualhost-su-windows-con-apache/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>I protocolli di posta</title>
		<link>http://blog.aziendeitalia.com/i-protocolli-di-posta</link>
		<comments>http://blog.aziendeitalia.com/i-protocolli-di-posta#comments</comments>
		<pubDate>Mon, 14 May 2012 09:58:12 +0000</pubDate>
		<dc:creator>Stefano Adriani</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[architettura]]></category>
		<category><![CDATA[client di posta]]></category>
		<category><![CDATA[e-mail]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[IMAP]]></category>
		<category><![CDATA[mail client]]></category>
		<category><![CDATA[POP]]></category>
		<category><![CDATA[posta]]></category>
		<category><![CDATA[SMTP]]></category>
		<category><![CDATA[webmail]]></category>

		<guid isPermaLink="false">http://blog.aziendeitalia.com/?p=1415</guid>
		<description><![CDATA[Una delle operazioni più critiche, quando configuriamo un client di posta elettronica, è la specifica dei parametri di collegamento al server di posta. Sia che usiamo Outlook, Thunderbird o Apple&#8217;s Mail, la configurazione del client significa inserire i dati di accesso ai server per i diversi protocolli, quali ad esempio POP, SMTP o IMAP. Si ...]]></description>
			<content:encoded><![CDATA[<p>Una delle operazioni più critiche, quando configuriamo un client di posta elettronica, è la specifica dei parametri di collegamento al server di posta. Sia che usiamo Outlook, Thunderbird o Apple&#8217;s Mail, la configurazione del client significa inserire i dati di accesso ai server per i diversi protocolli, quali ad esempio <strong>POP</strong>, <strong>SMTP</strong> o <strong>IMAP</strong>. Si tratta di un&#8217;operazione tutto sommato semplice, che non richiede competenze tecniche specifiche, ma le possibilità di errore non sono trascurabili. E&#8217; forse per questo motivo che molti utenti scelgono di accedere alla posta via webmail, rinunciando alla possibilità di lavorare offline, evitando così di mettere mani alla configurazione di un programma <em>mail client</em>.</p>
<p>Oggi proveremo a fare un po&#8217; di chiarezza sui diversi protocolli utilizzati per gestire la posta elettronica, allo scopo di fornire le competenze di base che dovrebbero rendere meno ostica la configurazione di un client di posta. Questa conoscenze ci serviranno, tra l&#8217;altro, a capire meglio i meccanismi di accesso alle caselle di posta di una <a title="Caselle di posta sulla VPS con Plesk" href="http://blog.aziendeitalia.com/caselle-di-posta-sulla-vps-con-plesk">VPS</a>, oppure al servizio <a title="Business Class Mail di AziendeItalia" href="http://www.aziendeitalia.com/business-class-mail/">BCMail</a> di AziendeItalia.</p>
<p><span style="color: #000080"><span style="text-decoration: underline"><br />
</span></span></p>
<p><strong>Introduzione</strong></p>
<p>Il servizio di posta elettronica è un esempio di architettura <a title="L'Architettura client-server sul web" href="http://blog.aziendeitalia.com/larchitettura-client-server-sul-web">client-server</a>. Qualsiasi sia il protocollo utilizzato, o il programma usato per leggere la posta, da qualche parte abbiamo un <strong>server di posta</strong> che comunica con il client locale. Quest&#8217;ultimo può essere un client tradizionale, come ad esempio Outlook, oppure un browser (se usiamo la webmail). Vi sono molte differenze tra i vari client, ma questo lascia inalterata l&#8217;architettura di base: in tutti i casi la posta viene gestita dal server e l&#8217;utente vi accede tramite un programma client. A seconda del protocollo, e quindi della modalità di lavoro, cambiano alcune funzionalità, come vedremo caso per caso.</p>
<p><strong>Accesso via POP e SMTP</strong></p>
<p>L&#8217;accesso alla posta elettronica attraverso i protocolli POP e SMTP può essere considerato il modo tradizionale di consultare l&#8217;e-mail. Il client scarica i messaggi dal server mediante il protocollo <strong>POP</strong> (<em>Post Office Protocol</em>), detto anche <em>POPmail</em>. Ogni volta che il client controlla la posta in arrivo viene aperta una connessione POP tra client e server, che resta aperta mentre viene scaricata la posta, e chiusa al termine del processo. Questo non implica che i messaggi vengano cancellati dal server: è possibile configurare l&#8217;accesso POP in modo da mantenere una copia dei messaggi sul server anche dopo averli scaricati. Quando viene spedita la posta, il cliente apre una connessione <strong>SMTP</strong> (<em>Simple Mail Transfer Protocol</em>)verso il server, il quale si occupa di ricevere la posta e occuparsi della consegna.</p>
<div id="attachment_1418" class="wp-caption alignnone" style="width: 310px"><a href="http://blog.aziendeitalia.com/wp-content/uploads/2012/05/mail_01.png"><img class="size-medium wp-image-1418" src="http://blog.aziendeitalia.com/wp-content/uploads/2012/05/mail_01-300x225.png" alt="Protocolli di posta" width="300" height="225" /></a><p class="wp-caption-text">Protocolli di posta</p></div>
<p><em><br />
</em></p>
<p><strong>Accesso via HTTP</strong></p>
<p>E&#8217; la modalità di lavoro via <strong>webmail</strong>. Il ruolo del client viene svolto da un browser, che consulta le pagine di una <em>web application</em> installata sul server remoto. La comunicazione in questo caso è sostanzialmente identica alla normale navigazione su internet: da un punto di vista tecnico non c&#8217;è differenza tra consultare la mail via browser o accedere ad una qualsiasi altro servizio autenticato. Ovviamente, nella maggioranza dei casi, la comunicazione client-server della webmail avviene in modalità sicura, attraverso il protocollo HTTPS anziché HTTP, ma le differenze riguardano le modalità di trasporto (SSL) e non ci interessano in questa sede.</p>
<p>Trattandosi di una normale navigazione su internet, i contenuti visualizzati nel browser sono presenti in locale solamente in qualità di risorse del browser. Possiamo lavorare offline, salvare le pagine della mail o rivedere la posta già consultata al termine del collegamento, ma non possiamo visualizzare il contenuto di una mail qualsiasi, come ad esempio una mail di cui abbiamo letto solo l&#8217;oggetto: ogni “e-mail” viene trattata come una pagina web, pertanto non viene scaricata in un formato gestibile localmente, ma è presente solamente tra i files temporanei del browser.</p>
<p><strong>Accesso via IMAP e SMTP</strong></p>
<p>E&#8217; una delle modalità di lavoro più moderne. La trasmissione della posta avviene sempre via SMTP, come nel caso tradizionale (vedi sopra). La ricezione avviene invece attraverso il protocollo <strong>IMAP</strong> (<em>Internet Message Access Protocol</em>), che in linea di massima assomiglia al precedente POP, ma offre alcune interessanti novità:</p>
<ul>
<li><strong>Connessione persistente</strong>: un client IMAP non si disconnette dal server dopo aver scaricato la posta, ma rimane connesso. Questo permette di realizzare le funzionalità sottoelencate</li>
<li><strong>Sincronizzazione degli attributi</strong>: grazie alla persistenza della connessione client-server, il client può notificare al server qualsiasi cambiamento locale. Quando l&#8217;utente legge una mail, assegna un&#8217;etichetta o sposta la mail in una cartella, queste operazioni vengono comunicate al server. In questo modo sul server sono sempre presenti tutte le informazioni relative alla posta elettronica: differenze tra messaggi letti e da leggere, etichette, commenti, risposte e qualsiasi altro attributo della posta elettronica</li>
<li><strong>Molteplicità di utenti e client</strong>: la sincronizzazione degli attributi tra client e server permette di utilizzare la stessa casella di posta tra utenti diversi, o tra programmi client diversi, anche contemporaneamente. Esempio: posso accedere alla posta via Thunderbird e col browser nello stesso istante, e lavorare su entrambi i client. Quando leggerò un messaggio con Thunderbird vedrò cambiare lo stato della mail anche nel browser, e viceversa. Potrei anche accedere alla stessa casella di posta via <em>smartphone</em>, spostare la mail in una nuova cartella, <em>et voilà</em>: il cambiamento si rifletterà anche su Thunderbird e nel browser.</li>
</ul>
<p>Esistono altre differenze tra i protocolli POP e IMAP, ma quelle elencate qui sopra sono probabilmente le più importanti dal punto di vista dell&#8217;utente. Il supporto del protocollo IMAP, da parte di un server di posta, permette un uso più flessibile e moderno della posta elettronica, trasformando i client di posta in una sorta di <em>thin client</em> e delegando al server il compito di memorizzare le modifiche operate dall&#8217;utente. Nelle prossime puntate vedremo alcuni esempi di configurazione delle interfacce IMAP e SMTP, con particolare attenzione ai servizi di posta offerti da AziendeItalia.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.aziendeitalia.com/i-protocolli-di-posta/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>L&#8217;encoding degli URL</title>
		<link>http://blog.aziendeitalia.com/lencoding-degli-url</link>
		<comments>http://blog.aziendeitalia.com/lencoding-degli-url#comments</comments>
		<pubDate>Fri, 11 May 2012 09:59:34 +0000</pubDate>
		<dc:creator>Stefano Adriani</dc:creator>
				<category><![CDATA[Guide tecniche]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[codifica]]></category>
		<category><![CDATA[decodifica]]></category>
		<category><![CDATA[encoding]]></category>
		<category><![CDATA[escape]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[unescape]]></category>
		<category><![CDATA[uri]]></category>
		<category><![CDATA[url]]></category>
		<category><![CDATA[urn]]></category>

		<guid isPermaLink="false">http://blog.aziendeitalia.com/?p=1396</guid>
		<description><![CDATA[Un generico indirizzo che appare nella barra del browser viene, con abuso di linguaggio, chiamato URL. Ad essere precisi, le specifiche standard distinguono tra URL (Uniform Resource Locator), URI (Uniform Resource Identifier) e URN (Uniform Resource Name). Un esempio dovrebbe chiarire la differenza tra queste sigle http://www.aziendeitalia.com/pagina.html in questo caso, esemplificando, possiamo pensare alla prima ...]]></description>
			<content:encoded><![CDATA[<p>Un generico indirizzo che appare nella barra del browser viene, con abuso di linguaggio, chiamato URL. Ad essere precisi, le specifiche standard distinguono tra <strong>URL</strong> (<em>Uniform Resource Locator</em>), <strong>URI</strong> (<em>Uniform Resource Identifier</em>) e <strong>URN</strong> (<em>Uniform Resource Name</em>). Un esempio dovrebbe chiarire la differenza tra queste sigle</p>
<p style="padding-left: 30px"><code> http://www.aziendeitalia.com/pagina.html</code></p>
<p>in questo caso, esemplificando, possiamo pensare alla prima parte dell&#8217;indirizzo come l&#8217;URL (<code>http://www.aziendeitalia.com</code>), alla seconda parte come l&#8217;URN (<code>pagina.html</code>) e all&#8217;insieme delle due (l&#8217;intero indirizzo) come all&#8217;URI. Abbiamo detto “esemplificando” per evitare di entrare nei dettagli, altrimenti le differenze tra URI e URL diventerebbero piuttosto sfumate, rischiando di fare confusione. Per quello che ci interessa possiamo benissimo pensare all&#8217;URL come all&#8217;indirizzo comune di un gruppo di risorse, per certi versi analogo al concetto di <em>cartella</em> o <em>directory</em>, mentre l&#8217;URN assomiglia al concetto di <em>nome</em> di un file o di un documento. Ecco perché servono entrambi (URL e URN) per definire un URI, che può essere pensato come il percorso completo (cartella più nome del file) di una generica risorsa sul web.</p>
<p>L&#8217;esempio appena visto dovrebbe spiegare perché è diffusa la pratica di considerare sinonimi URI e URL: da un punto di vista pratico un URL è anche un URI, perché di fatto rappresenta il nome completo di una risorsa. Se scrivessimo infatti</p>
<p style="padding-left: 30px"><code> http://www.aziendeitalia.com</code></p>
<p>potremmo pensare di avere scritto solamente un URL, e non un URI, perché manca il nome della pagina (cioè l&#8217;URN). In realtà, siccome l&#8217;indirizzo qui sopra identifica comunque una risorsa, che in questo caso è la pagina di benvenuto di AziendeItalia, è lecito parlare di URI.</p>
<p><strong>Encoding degli indirizzi</strong></p>
<p>Dopo aver chiarito le (sottili) differenze tra URL e URI, possiamo affrontare la questione che ci interessa: l&#8217;<strong>encoding</strong> degli indirizzi. Consideriamo gli indirizzi</p>
<p style="padding-left: 30px"><code> http://prova.com/domanda/pagina?n=5</code></p>
<p style="padding-left: 30px"><code> http://prova.com/?/pagina?n=5</code></p>
<p>il primo caso è semplice: si tratta di una richiesta HTTP GET inviata alla risorsa <code>domanda/pagina</code>, passando il parametro <code>n</code>, con valore <code>5</code>. Nel secondo caso stiamo immaginando che l&#8217;ipotetico sviluppatore del sito <code>prova.com</code> abbia pensato di abbreviare l&#8217;indirizzo, usando il simbolo “<code>?</code>” al posto della stringa <code>domanda</code>.</p>
<p>Si tratta ovviamente di una pessima idea, ed il motivo dovrebbe essere chiaro: come può il server, al momento di ricezione della richiesta, capire che non stiamo passando un parametro di nome <code>/pagina?n </code>con valore <code>5</code>? In altre parole, la seconda richiesta potrebbe essere interpretata come: “voglio invocare l&#8217;indirizzo <code>http://prova.com/</code> passando il parametro<code> /pagina?n</code>, e assegnando il valore <code>5</code> a questo parametro.”</p>
<p>Per evitare ambiguità di questo tipo si è ricorsi all&#8217;<strong>encoding</strong> di alcuni caratteri riservati. Ciò significa che all&#8217;interno di un URL o di un URI non è possibile usare liberamente tutti i caratteri, ma dobbiamo ricordarci che alcuni caratteri hanno un significato speciale. Alcuni di questi caratteri sono</p>
<p style="padding-left: 30px"> <code>! * ' ( ) ; : @ &amp; = + $ , / ? # [ ] </code></p>
<p>procedere con la codifica (<em>encoding</em>) di questi caratteri significa rappresentarli in modo alternativo, in questo caso usando il loro codice ASCII preceduto dal carattere<code> %</code> (percentuale). In questo modo l&#8217;indirizzo ambiguo scritto sopra potrebbe diventare</p>
<p style="padding-left: 30px"> <code>http://prova.com/?%2Fpagina%3Fn=5</code></p>
<p>questo perché, nella codifica convenzionalmente accettata degli URL, il carattere riservato <code>/</code> (<em>slash</em>) diventa <code>%2F</code>, mentre il carattere riservato <code>?</code> (punto di domanda) diventa <code>%3F</code>.</p>
<p>Un&#8217;ottima domanda, a questo punto, potrebbe essere: <em>quando</em> dobbiamo utilizzare l&#8217;encoding di un URL o di un URI? La risposta è: quando vogliamo usare un carattere riservato per uno scopo particolare, attribuendogli un significato <strong>speciale</strong>. Questo è esattamente quello che abbiamo fatto sopra: siccome volevano usare i caratteri <code>/</code> e <code>?</code> come parte del nome della risorsa (<code>/pagina?n</code>), abbiamo dovuto codificare i caratteri per evitare ambiguità.</p>
<p>&nbsp;</p>
<p><strong>Il problema inverso</strong></p>
<p>L&#8217;encoding degli URL risolve i problemi di ambiguità, e ci permette di usare tutti i caratteri liberamente, anche quelli riservati, previa la loro codifica. Esiste però un possibile problema: in alcuni casi un indirizzo viene codificato per altri motivi (ad esempio per essere scritto in un database), e quando viene proposto come link potrebbe avere una forma del genere</p>
<p style="padding-left: 30px"> <code>http://prova.com/pagina.php%3Fn%3D5</code></p>
<p>se copiamo l&#8217;iindirizzo qui sopra nella barra del browser, probabilmente non raggiungeremo alcuna pagina. L&#8217;indirizzo corretto, in questo caso, potrebbe essere quello <strong>decodificato</strong></p>
<p style="padding-left: 30px"> <code>http://prova.com/pagina.php?n=5</code></p>
<p> un modo semplice e veloce di decodificare l&#8217;indirizzo potrebbe essere quello di usare l&#8217;apposita funzione <strong>JavaScript</strong>, ovvero</p>
<p style="padding-left: 30px"> <code>unescape(“http://prova.com/pagina.php%3Fn%3D5”);</code></p>
<p> che fornisce come risultato</p>
<p style="padding-left: 30px"> <code>http://prova.com/pagina.php?n=5</code></p>
<p> Ovviamente JavaScript fornisce anche la funzone <code>escape()</code>, che permette di codificare una generica stringa. Ricordiamoci di queste due funzioni tutte le volte che dobbiamo maneggiare un URL o un URI, perché sono spesso il modo più semplice di gestire qualsiasi esigenza di codifica.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.aziendeitalia.com/lencoding-degli-url/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>La notazione ottale dei permessi di Linux</title>
		<link>http://blog.aziendeitalia.com/la-notazione-ottale-dei-permessi-di-linux</link>
		<comments>http://blog.aziendeitalia.com/la-notazione-ottale-dei-permessi-di-linux#comments</comments>
		<pubDate>Thu, 10 May 2012 09:44:48 +0000</pubDate>
		<dc:creator>Stefano Adriani</dc:creator>
				<category><![CDATA[Guide tecniche]]></category>
		<category><![CDATA[chmod]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[notazione ottale]]></category>
		<category><![CDATA[notazione simbolica]]></category>
		<category><![CDATA[permessi]]></category>

		<guid isPermaLink="false">http://blog.aziendeitalia.com/?p=1366</guid>
		<description><![CDATA[Moltissime guide tecniche o tutorial riguardanti l&#8217;installazione o l&#8217;aggiornamento di un software in hosting remoto spiegano come assegnare i permessi di files e cartelle, ma spesso lo fanno senza dare alcuna spiegazione. Da un punto di vista è un bene, perché una guida tecnica nasce con lo scopo di fornire istruzioni operative e non spiegazioni ...]]></description>
			<content:encoded><![CDATA[<p>Moltissime guide tecniche o tutorial riguardanti l&#8217;installazione o l&#8217;aggiornamento di un software in <a title="Hosting su AziendeItalia" href="http://www.aziendeitalia.com/hosting/entry-linux/">hosting</a> remoto spiegano come assegnare i <strong>permessi</strong> di files e cartelle, ma spesso lo fanno senza dare alcuna spiegazione. Da un punto di vista è un bene, perché una guida tecnica nasce con lo scopo di fornire istruzioni operative e non spiegazioni teoriche. D&#8217;altro canto questo è un rischio, perché se le istruzioni operative non possono essere eseguite alla lettera, o qualcosa va storto, l&#8217;utente potrebbe non avere gli strumenti per risolvere il problema.</p>
<p>Con questo articolo vogliamo fornire al lettere le poche basi teoriche che servono per capire cosa sta dietro frasi come “assegnare i permessi 755” oppure “verificare che le cartelle abbiamo i permessi 644”, le quali utilizzano la <strong>notazione ottale</strong>. Si tratta di una notazione molto semplice, che ci permetterà di prendere due piccioni con una fava: nell&#8217;apprendere la notazione ottale impareremo anche a leggere a colpo d&#8217;occhio i numeri espressi in base binaria.</p>
<p>Gli unici requisti necessari, prima di proseguire la lettura, sono le conoscenze base di Linux relative alla gestione degli utenti, dei gruppi e dei permessi. Chi non conoscesse l&#8217;argomento può trovare alcuni spunti qui:</p>
<ul>
<li><a title="Linux Quick Start" href="http://blog.aziendeitalia.com/linux-quick-start"><strong>Linux Quick Start</strong></a></li>
<li><a title="Il comando chmod" href="http://blog.aziendeitalia.com/il-comando-chmod"><strong>Il comando chmod</strong></a></li>
<li><a title="I gruppi utenti su Linux" href="http://blog.aziendeitalia.com/i-gruppi-utenti-su-linux"><strong>I gruppi utenti</strong></a></li>
<li><a title="Priorità dei permessi su Linux" href="http://blog.aziendeitalia.com/priorita-dei-permessi-su-linux"><strong>Priorità dei permessi</strong></a></li>
</ul>
<p><strong>Cenni teorici</strong></p>
<p>La notazione ottale è semplicemente un modo abbreviato di esprimere una cifra binaria. Se non conosciamo il sistema numerico binario possiamo dare un&#8217;occhiata <a title="Wikipedia" href="http://it.wikipedia.org/wiki/Sistema_numerico_binario">qui</a>, ma i concetti sono talmente semplice che, in virtù della completezza di questo articolo, possiamo riassumerla in poche righe. Per contare in binario basta fare quello che facciamo, senza rendercene conto, quando leggiamo una cifra scritta in base decimale (il sistema numerico che usiamo tutti i giorni). Ad esempio, la cifra 125 può essere scritta come</p>
<p style="padding-left: 30px"><code>125 = 1*100 + 2*10 + 5*1 </code></p>
<p>in altre parole, sappiamo tutti che la cifra 125 è composta da 1 centinaio, 2 decine e 5 unità. Trattandosi di un sistema in base 10, in termini matematici si usa dire che i “pesi” delle varie cifre (le cifre sono i simboli 1, 2 e 5) sono, rispettivamente, 10<sup>2</sup>, 10<sup>1</sup> e 10<sup>0</sup>. Se non conosciamo le potenze, o non ci piace la notazione 10<sup>n</sup>, nessun problema: impariamo (come fanno tutti) a memoria la sequenza 1, 10, 100, 1000 ecc. ed il gioco è fatto. Se ci pensiamo un attimo, lo facciamo tutti i giorni, ogni volta che leggiamo una qualsiasi cifra numerica.</p>
<p>In binario abbiamo la stessa cosa, con un&#8217;unica differenza: la sequenza “da imparare a memoria” non è più 1, 10, 100, 1000 bensì 1, 2, 4, 8, 16 ecc&#8230; Se ci piace giocare con le potenze possiamo ricordare la sequenza come “le potenze di 2”, altrimenti va benissimo ricordarla col metodo che preferiamo.</p>
<p>Questo è tutto. Basta ricordare la sequenza per tradurre qualsiasi cifra binaria. Ad esempio</p>
<p style="padding-left: 30px"><code>101 = 1*4 + 0*2 + 1*1</code></p>
<p>L&#8217;unica “stranezza”, rispetto a prima, è che dobbiamo fare la somma per capire di che numero si tratta (in questo caso 5). In realtà non c&#8217;è nulla di strano, anche prima abbiamo fatto la somma, ma senza rendercene conto, perché lo facciamo tutti i giorni. Una volta capito il meccanismo, ci accorgeremo che il sistema binario fa ormai parte della vita quotidiana. Non è un caso che le memorie RAM siano passate da 256MB a 512MB, poi ad 1024MB (1 GB) ed infine a 4096MB (4 GB): anche questi sono numeri della sequenza 1,2,4,8,16,32&#8230;</p>
<p><strong>Pratica e sintassi</strong></p>
<p>Per utilizzare la notazione ottale basta saper leggere e scrivere i numeri binari di 3 cifre. Consideriamo ad esempio la risorsa</p>
<p style="padding-left: 30px"><code>-rwxrw-r-- 1 pippo adm 249 9 mag 22.13 foo.txt</code></p>
<p>in questo caso i permessi di utente, gruppo e altri (ricordiamo la sigla UGO) sono, rispettivamente: <code>rwx</code> (utente), <code>rw-</code> (gruppo) e <code>r--</code> (altri). La <strong>regola</strong> è semplice: trasformiamo qualsiasi carattere (sia esso <code>r</code>, <code>w</code> o <code>x</code>) nella cifra “1”, mentre il trattino va letto come “0” (zero). Avremo così</p>
<p style="padding-left: 30px"><code> Utente: rwx = 111 = 1*4 + 1*2 + 1*1 = 7</code></p>
<p style="padding-left: 30px"><code> Gruppo: rw- = 110 = 1*4 + 1*2 + 0*1 = 6</code></p>
<p style="padding-left: 30px"><code> Altri : r-- = 100 = 1*4 + 0*2 + 0*1 = 4</code></p>
<p>ed il gioco è fatto. I permessi della risorsa <code>foo.txt</code>, che in notazione simbolica si scrivono come <code>-rwxrw-r--</code>, in notazione ottale diventano 764.</p>
<p>Quali sono i vantaggi della notazione? Immaginiamo di voler cambiare i permessi del file <code>foo.txt</code>, per lasciare all&#8217;utente solo il permesso di lettura, togliere ogni permesso agli altri utenti, e dare tutti i permessi al gruppo proprietario. Quello che vogliamo ottenere è</p>
<p style="padding-left: 30px"><code>r--rwx--- 1 pippo adm 249 9 mag 22.13 foo.txt</code></p>
<p>Tramite il comando <code>chmod</code> ci toccherebbe eseguire l&#8217;operazione in più passaggi, digitando prima <code>chmod u-wx</code>, poi <code>chmod g+x</code> ed infine <code>chmod o-r</code>. Oppure dovremmo ricordarci la sintassi per compiere l&#8217;operazione con un solo comando, cosa che nella pratica non succede quasi mai.</p>
<p>La notazione ottale permette di ottenere lo stesso risultato con un solo comando. Basta osservare che, con la regola vista sopra, la sequenza <code>r--rwx---</code> si traduce nei numeri binari 100,111 e 000, ovvero 4, 7 e 0. Per settare i permessi basterà quindi digitare</p>
<p style="padding-left: 30px"><code> chmod 470 foo.txt</code></p>
<p>Con un po&#8217; di pratica, trattandosi di maneggiare solo numeri di 3 cifre, è naturale imparare a memoria le diverse combinazioni, ad esempio: 777 sta per 111,111,111, ovvero <code>rwxrwxrwx</code> (tre volte <code>rwx</code>) che significa “tutti i permessi a tutti”. Analogamente, il permesso 000 sta per 000,000,000, ovvero <code>---------</code> (9 trattini), che significa “non permettere mai alcuna operazione”.</p>
<p>Dopo aver svelato l&#8217;arcano dovrebbe essere facile, o addirittura divertente, capire al volo i permessi di cui si parla nei vari tutorial. Ad esempio</p>
<p style="padding-left: 30px"><strong>644</strong> significa 110, 100, 100, ovvero <code>rw-r--r--</code></p>
<p style="padding-left: 30px"><strong>755</strong> significa 111, 101, 101, ovvero <code>rwxr-xr-x</code></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.aziendeitalia.com/la-notazione-ottale-dei-permessi-di-linux/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Caselle di posta sulla VPS con Plesk</title>
		<link>http://blog.aziendeitalia.com/caselle-di-posta-sulla-vps-con-plesk</link>
		<comments>http://blog.aziendeitalia.com/caselle-di-posta-sulla-vps-con-plesk#comments</comments>
		<pubDate>Wed, 09 May 2012 06:21:22 +0000</pubDate>
		<dc:creator>Stefano Adriani</dc:creator>
				<category><![CDATA[AziendeItalia]]></category>
		<category><![CDATA[Domini]]></category>
		<category><![CDATA[Webhosting]]></category>
		<category><![CDATA[casele di posta]]></category>
		<category><![CDATA[email]]></category>
		<category><![CDATA[mailbox]]></category>
		<category><![CDATA[plesk]]></category>
		<category><![CDATA[server di posta]]></category>
		<category><![CDATA[vps]]></category>
		<category><![CDATA[vps managed]]></category>
		<category><![CDATA[vps small]]></category>
		<category><![CDATA[vps small linux]]></category>

		<guid isPermaLink="false">http://blog.aziendeitalia.com/?p=1346</guid>
		<description><![CDATA[Abbiamo già visto come svolgere le operazioni relative alla gestione di hosting, domini e web server su una VPS Small Linux di AziendeItalia, usando l&#8217;interfaccia di amministrazione di Plesk. Un riassunto degli articoli sull&#8217;argomento è disponibile qui. Oltre a questi servizi, la VPS ovviamente ospita anche un server di posta, che permette di aprire caselle ...]]></description>
			<content:encoded><![CDATA[<p>Abbiamo già visto come svolgere le operazioni relative alla gestione di hosting, domini e web server su una <strong>VPS Small Linux</strong> di AziendeItalia, usando l&#8217;interfaccia di amministrazione di <strong>Plesk</strong>. Un riassunto degli articoli sull&#8217;argomento è disponibile <a title="Gestire i servizi della VPS con Plesk" href="http://blog.aziendeitalia.com/la-gestione-dei-servizi-della-vps-con-plesk">qui</a>.</p>
<p>Oltre a questi servizi, la VPS ovviamente ospita anche un server di posta, che permette di aprire caselle di posta (<em>mailbox</em>) associabili ai domini presenti sulla VPS. Prima di vedere come utilizzare Plesk è bene chiarire i possibili scenari d&#8217;uso</p>
<ol>
<li>Se stiamo usando la VPS per ospitare dei domini, e per ogni dominio vogliamo offrire anche il servizio di posta, può essere una buona idea creare i diversi account direttamente da Plesk e fornire i dati di configurazione al cliente, affinché possa usare il <strong>client di posta</strong> che più gli piace (ad esempio Outlook oppure Thunderbird)</li>
<li>Se vogliamo usare il servizio di posta come <strong>webmail</strong>, anziché tramite un client di posta, forse conviene cercare un&#8217;altra soluzione (come ad esempio la <a title="Business Class Mail di AziendeItalia" href="http://www.aziendeitalia.com/business-class-mail/">BCMail</a> di AziendeItalia). La configurazione di Plesk sulla VPS (al momento di questo articolo) utilizza <em>Horde</em> come client webmail. Horde è un software funzionante e completo, ma forse un po&#8217; datato rispetto agli standard attuali. E siccome anche l&#8217;occhio vuole la sua parte, in molti casi la webmail offerta da Horde potrebbe non essere la soluzione ottimale.</li>
</ol>
<p>Qualunque sia l&#8217;utilizzo che abbiamo in mente, sia tramite client di posta o webmail, è bene vedere l&#8217;intera procedura di configurazione, per arricchire la nostra cassetta degli attrezzi.</p>
<p>Iniziamo con il verificare che il server di posta sia attivo</p>
<p><a href="http://blog.aziendeitalia.com/wp-content/uploads/2012/05/vps_mail_01.png"><img class="size-medium wp-image-1348" src="http://blog.aziendeitalia.com/wp-content/uploads/2012/05/vps_mail_01-300x122.png" alt="Pannello principale del dominio" width="300" height="122" /></a></p>
<div class="mceTemp">
<dl>
<dd>Pannello principale del dominio</dd>
</dl>
</div>
<p>una configurazione corretta potrebbe essere la seguente</p>
<div id="attachment_1349" class="wp-caption alignnone" style="width: 303px"><a href="http://blog.aziendeitalia.com/wp-content/uploads/2012/05/vps_mail_02.png"><img class="size-medium wp-image-1349" src="http://blog.aziendeitalia.com/wp-content/uploads/2012/05/vps_mail_02-293x300.png" alt="Configurazione server di posta" width="293" height="300" /></a><p class="wp-caption-text">Configurazione server di posta</p></div>
<p>dopodiché spostiamoci nel pannello del dominio, dove abbiamo a disposizione i pulsanti per creare un nuovo account di posta, o controllare quelli già esistenti. Per creare una nuova casella di posta clicchiamo su <strong>Crea l&#8217;account email</strong></p>
<div id="attachment_1350" class="wp-caption alignnone" style="width: 310px"><a href="http://blog.aziendeitalia.com/wp-content/uploads/2012/05/vps_mail_03.png"><img class="size-medium wp-image-1350" src="http://blog.aziendeitalia.com/wp-content/uploads/2012/05/vps_mail_03-300x142.png" alt="Gestione account di posta" width="300" height="142" /></a><p class="wp-caption-text">Gestione account di posta</p></div>
<p>dovrebbe aprirsi il pannello qui sotto, dove inseriamo il nome dell&#8217;account (ad esempio: <em>stefano</em>) e la password (due volte)</p>
<div id="attachment_1351" class="wp-caption alignnone" style="width: 284px"><a href="http://blog.aziendeitalia.com/wp-content/uploads/2012/05/vps_mail_04.png"><img class="size-medium wp-image-1351" src="http://blog.aziendeitalia.com/wp-content/uploads/2012/05/vps_mail_04-274x300.png" alt="Nuovo account" width="274" height="300" /></a><p class="wp-caption-text">Nuovo account</p></div>
<p>Facciamo attenzione alla capitalizzazione, quando inseriamo il nome dell&#8217;account. Nell&#8217;esempio qui sopra abbiamo scritto “Stefano” con la “S” maiuscola: anche se la casella di posta funzionerà in modo <em>case-insensitive</em> (cioè indifferentemente dalla capitalizzazione), molto probabilmente le credenziali dell&#8217;account rispetteranno la capitalizzazione. In altre parole, quando l&#8217;utente dovrà inserire login e password, dovrà digitare correttamente le eventuali lettere maiuscole.</p>
<p>Dopo aver creato la casella di posta, dal pannello del dominio clicchiamo su <strong>Account di posta </strong>per visualizzare l&#8217;elenco della caselle esistenti. Qui clicchiamo su <strong>Impostazione di posta</strong> per attivare la webmail</p>
<div id="attachment_1352" class="wp-caption alignnone" style="width: 310px"><a href="http://blog.aziendeitalia.com/wp-content/uploads/2012/05/vps_mail_05.png"><img class="size-medium wp-image-1352" src="http://blog.aziendeitalia.com/wp-content/uploads/2012/05/vps_mail_05-300x104.png" alt="Elenco caselle di posta" width="300" height="104" /></a><p class="wp-caption-text">Elenco caselle di posta</p></div>
<p>per attivare il servizio di webmail clicchiamo sul campo <em>WebMail</em> per scegliere il software che realizza la webmail (nell&#8217;esempio qui sotto <em>Horde 4.3.6</em>)</p>
<div id="attachment_1353" class="wp-caption alignnone" style="width: 310px"><a href="http://blog.aziendeitalia.com/wp-content/uploads/2012/05/vps_mail_06.png"><img class="size-medium wp-image-1353" src="http://blog.aziendeitalia.com/wp-content/uploads/2012/05/vps_mail_06-300x217.png" alt="Preferenze email" width="300" height="217" /></a><p class="wp-caption-text">Preferenze email</p></div>
<p>Con questo abbiamo finito. Per accedere alla posta via webmail possiamo usare il pulsante <strong>Aprire WebMail</strong> (dal pannello principale del dominio) e cliccare sul nome dell&#8217;account che ci interessa. Si aprirà il pannello di login di Horde, dove inseriamo le credenziali dell&#8217;account</p>
<div id="attachment_1354" class="wp-caption alignnone" style="width: 310px"><a href="http://blog.aziendeitalia.com/wp-content/uploads/2012/05/vps_mail_07.png"><img class="size-medium wp-image-1354" src="http://blog.aziendeitalia.com/wp-content/uploads/2012/05/vps_mail_07-300x203.png" alt="Horde" width="300" height="203" /></a><p class="wp-caption-text">Horde</p></div>
<p>In alternativa, il login dovrebbe essere possibile anche tramite accesso diretto (senza entrare in Plesk), utilizzando un indirizzo del tipo</p>
<p style="padding-left: 30px"><code>http://webmail.hostingtech.it/</code></p>
<p>Come detto sopra, anche se la grafica di Horde non è in linea con le ultime tendenze, vale la pena provare almeno una volta a navigare tra i vari menù: Horde è un client webmail completo, con gestione di rubrica, calendario, ricerca e note, che potrebbe tornarci utile per verificare il corretto funzionamento del server di posta.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.aziendeitalia.com/caselle-di-posta-sulla-vps-con-plesk/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sezioni HTML dinamiche in PHP</title>
		<link>http://blog.aziendeitalia.com/sezioni-html-dinamiche-in-php</link>
		<comments>http://blog.aziendeitalia.com/sezioni-html-dinamiche-in-php#comments</comments>
		<pubDate>Tue, 08 May 2012 08:32:36 +0000</pubDate>
		<dc:creator>Stefano Adriani</dc:creator>
				<category><![CDATA[Guide tecniche]]></category>
		<category><![CDATA[array]]></category>
		<category><![CDATA[echo]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[pagine dinamiche]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[print]]></category>
		<category><![CDATA[rendering]]></category>
		<category><![CDATA[template]]></category>

		<guid isPermaLink="false">http://blog.aziendeitalia.com/?p=1320</guid>
		<description><![CDATA[La creazione di blocchi di HTML dinamici è forse l&#8217;applicazione più semplice e popolare di una pagina web dinamica. Moltissimi tutorial PHP, JSP o ASP iniziano con la creazione di una tabella o una serie di blocchi HTML. Dati i numerosi vantaggi pratici, è bene utilizzare la tecnica anche per siti prevalentemente statici, ovvero pagine ...]]></description>
			<content:encoded><![CDATA[<p>La creazione di blocchi di HTML dinamici è forse l&#8217;applicazione più semplice e popolare di una pagina web <strong>dinamica</strong>. Moltissimi tutorial PHP, JSP o ASP iniziano con la creazione di una tabella o una serie di blocchi HTML. Dati i numerosi vantaggi pratici, è bene utilizzare la tecnica anche per siti prevalentemente statici, ovvero pagine che si presentano uguali a tutti gli utenti. In altre parole: non serve aver bisogno di gestire degli account utenti, tramite registrazione e login, per beneficiare dei vantaggi di un linguaggio web dinamico. Una pagina realizzata dinamicamente è più facile da mantenere, più snella e si presenta in maniera più pulita rispetto ad una pagina creata usando solamente dell&#8217;HTML statico.</p>
<p>Per fissare le idee, vedremo un caso pratico di applicazione della tecnica in <strong>PHP</strong>: i concetti esposti varranno per qualsiasi altro linguaggio di programmazione, salvo ovviamente le opportune modifiche sintattiche. Iniziamo con il parametrizzare tutti i dati che ci interessano</p>
<pre><code>// Definizione di autori e libri</code>
<code> $books = array(</code>
<code> 0 =&gt; array("book_1.php", "Titolo 1" , "Mario Rossi", "2010" ) ,</code>
<code> 1 =&gt; array("book_2.php", "Titolo 2" , "Bruno Verdi", "2012" ) ,</code>
<code> ecc.</code>
<code> ) ;</code></pre>
<p>nell&#8217;esempio qui sopra abbiamo definito i dati di alcuni libri, specificando rispettivamente: la <em>landing page</em> del libro, il titolo dell&#8217;opera, il nome dell&#8217;autore e l&#8217;anno di pubblicazione. Per farlo abbiamo usato un array bidimensionale (array 2D), che in pratica può essere visualizzato come una tabella, dove ogni riga contiene i dati di un&#8217;opera letterale, e ogni colonna contiene una serie di dati omogenei. Chi è pratico con i database può pensare ad un array 2D come una specie di tabella o vista di un database. L&#8217;elemento generico <code>$books[i][j]</code> rappresenterà il dato j-esimo della riga i-esima, ad esempio</p>
<p style="padding-left: 30px"><code>$books[1][2] = “Titolo 2”</code></p>
<p>Ovviamente, a seconda del contesto e degli argomenti trattati, il nostro array sarà diverso. A volte è comodo definire più di un array, per evitare di ritrovarsi un unico array composto da troppe colonne. Continuando l&#8217;esempio qui sopra, un secondo array potrebbe essere:</p>
<pre><code>// Definizione di risorse</code>
<code> $resources = array(</code>
<code> 0 =&gt; array("/img/copertina_1.jpg", "libri/titolo_1.pdf" ) ,</code>
<code> 1 =&gt; array("/img/copertina_2.jpg", "libri/titolo_2.pdf" ) ,</code>
<code> ecc.</code>
<code> ) ;</code></pre>
<p>La scelta di quali e quanti array usare dipende dal contesto, ed è forse la scelta più <strong>importante</strong>. Se definiamo troppi array dobbiamo ricordarci, quando aggiorniamo o aggiungiamo qualcosa, di modificare tutti gli array coinvolti. Di contro, se usiamo un unico grande array con tutti i dati che ci servono, dobbiamo essere lungimiranti ed ordinati nel gestire le colonne, onde evitare di perdere troppo tempo ogni volta che vogliamo modificare qualcosa. La scelta dipende anche dagli strumenti di lavoro: se usiamo un <a title="Editing in colonna" href="http://blog.aziendeitalia.com/editing-in-colonna">editor in colonna</a> probabilmente terremo tutte le colonne ben formattate. Se invece diamo molto peso alla performances, e gestiamo gli array tramite un framework o tool apposito, forse sceglieremo di compattare gli array sacrificandone la formattazione.</p>
<p>&nbsp;</p>
<p><strong>Rendering</strong></p>
<p>Dopo aver deciso come organizzare i contenuti all&#8217;interno di uno o più array, possiamo occuparci di <em>renderizzare</em> i dati, ovvero produrre l&#8217;HTML finale. Ciò si realizza scrivendo una sorta di blocco <em>template</em>, ovvero una sezione di codice HTML e PHP, ad esempio</p>
<pre><code>&lt;?php</code>
<code>for ($n = 0 ; $n &lt; count($books) ; $n++) {</code>
<code>?&gt;</code>

<code>&lt;div class="my_div"&gt;</code>
  <code>&lt;a class="link_1" href="&lt;?php echo $books[$n][0] ?&gt;" title="&lt;?php echo $books[$n][1] ?&gt;"&gt;</code>
  <code>&lt;img class="my_image" src="&lt;?php echo $resources[$n][0] ?&gt;"/&gt;</code>
  <code>&lt;/a&gt;</code>
  <code>&lt;a class="link_2" href="&lt;?php echo $books[$n][0] ?&gt;" title="&lt;?php echo $books[$n][1] ?&gt;"&gt;</code>
  <code>&lt;span class="title"&gt;&lt;?php echo $books[$n][1] ?&gt;&lt;/span&gt;</code>
  <code>&lt;/a&gt;</code>
  <code>&lt;br/&gt;&lt;br/&gt;</code>
  <code>&lt;span class="subtitle"&gt;di &lt;?php echo $books[$n][2] ?&gt; - &lt;?php echo $books[$n][3] ?&gt;&lt;/span&gt;</code>
  <code>&lt;p class="description"&gt;&lt;?php echo $abstracts[$n] ?&gt;</code>
  <code>&lt;br/&gt;&lt;br/&gt;</code>
  <code>&lt;a class="link_3" href="&lt;?php echo $resources[$n][1] ?&gt;" title="&lt;?php echo $books[$n][1] ?&gt;"&gt;Scarica&lt;/a&gt;</code>
  <code>&lt;/p&gt;</code>
<code>&lt;/div&gt;</code>

<code>&lt;?php } ?&gt;</code></pre>
<p>Il codice qui sopra produrrà tutti i blocchi HTML del caso (in questo caso dei <code>div</code> con classe <em>my_div</em>).</p>
<p>Il vantaggio è evidente: se dobbiamo cambiare layout, grafica o aspetto ci basterà mettere le mani nel codice qui sopra, anche se la pagina contenesse decine di libri.</p>
<p>Prima di concludere osserviamo che</p>
<ul>
<li>Nell&#8217;esempio qui sopra abbiamo usato un terzo array, avente nome <code>abstract</code>, che potrebbe contenere una breve descrizione dei libri. Come detto sopra questa è solo una delle scelte possibili: volendo avremmo potuto inserire i dati degli array <code>resources</code> e <code>abstract</code> all&#8217;interno dell&#8217;array <code>books</code></li>
<li>Abbiamo evitato la sintassi abbreviata <code>&lt;?= $books[i][j] ?&gt;</code>, perché potrebbe dare problemi a seconda della configurazione di PHP (per dettagli vedi <a title="Le tag abbreviate nello scripting" href="http://blog.aziendeitalia.com/le-tag-abbreviate-nello-scripting">qui</a>)</li>
<li>Usiamo <code>echo</code> al posto di <code>print</code> perché è leggermente più veloce. Si potrebbe guadagnare ancora qualcosa sulle performances evitando la concatenazione di stringhe tramite l&#8217;operatore <em>dot</em> (il punto), ma la questione non è banale  e merita di essere trattata a parte</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.aziendeitalia.com/sezioni-html-dinamiche-in-php/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Come migrare PrestaShop</title>
		<link>http://blog.aziendeitalia.com/come-migrare-prestashop</link>
		<comments>http://blog.aziendeitalia.com/come-migrare-prestashop#comments</comments>
		<pubDate>Mon, 07 May 2012 07:44:31 +0000</pubDate>
		<dc:creator>Stefano Adriani</dc:creator>
				<category><![CDATA[CMS - Content Management System]]></category>
		<category><![CDATA[Guide tecniche]]></category>
		<category><![CDATA[Webhosting]]></category>
		<category><![CDATA[.htaccess]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[cms]]></category>
		<category><![CDATA[export sql]]></category>
		<category><![CDATA[migrazione]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[PrestaShop]]></category>
		<category><![CDATA[settings.inc.php]]></category>

		<guid isPermaLink="false">http://blog.aziendeitalia.com/?p=1307</guid>
		<description><![CDATA[PrestaShop è un&#8217;ottima soluzione CMS per moltissime tipologie di e-commerce. Abbiamo già visto la procedura di installazione di PrestaShop e come configurare il memory limit di PHP in caso di hosting. Oggi vedremo come affrontare, in modo pratico, l&#8217;eventuale migrazione di un&#8217;istanza di PrestaShop da una macchina ad un&#8217;altra. Si tratta di uno scenario abbastanza ...]]></description>
			<content:encoded><![CDATA[<p>PrestaShop è un&#8217;ottima soluzione CMS per moltissime tipologie di <a title="E-commerce e CMS a confronto" href="http://blog.aziendeitalia.com/e-commerce-e-cms-a-confronto">e-commerce</a>. Abbiamo già visto la procedura di <a title="Installazione di PrestaShop" href="http://blog.aziendeitalia.com/e-commerce-con-prestashop">installazione</a> di PrestaShop e come configurare il <a title="Configurazione del memory limit in PHP" href="http://blog.aziendeitalia.com/prestashop-e-php-limportanza-del-memory-limit"><em>memory limit</em></a> di PHP in caso di hosting.</p>
<p>Oggi vedremo come affrontare, in modo pratico, l&#8217;eventuale migrazione di un&#8217;istanza di PrestaShop da una macchina ad un&#8217;altra. Si tratta di uno scenario abbastanza frequente, che potrebbe presentarsi per motivi diversi</p>
<ol>
<li>Cambiamo host provider (tipicamente perché migriamo il dominio)</li>
<li>Dobbiamo copiare un&#8217;istanza remota in locale, o viceversa</li>
<li>Vogliamo aggiornare PrestaShop in remoto, e vogliamo prima provare in locale la procedura di aggiornamento</li>
</ol>
<p>Tutti questi casi si possono ricondurre al secondo scenario: se siamo in grado di migrare PrestaShop da remoto a locale, e viceversa, siamo potenzialmente capaci di effettuare qualsiasi migrazione. Per questo motivo consideriamo, come esercizio e tutorial,  il caso di migrazione da remoto a locale.</p>
<p><strong>Copia locale</strong></p>
<p>Assumiamo di avere un&#8217;installazione di PrestaShop già attiva in remoto. Per portarle in locale, la prima cosa da fare è effettuare un <strong>export</strong> del database. A parte rare eccezioni, PrestaShop utilizza <strong>MySQL</strong>, per cui <em>phpMyAdmin</em> si presta perfettamente allo scopo. Colleghiamoci al database utilizzando <em>phpMyAdmin</em> tramite l&#8217;indirizzo o lo strumento fornito dal nostro provider (ad esempio Plesk o cPanel). Dall&#8217;interfaccia di <em>phpMyAdmin</em> scegliamo la tab <strong>Esporta</strong>: nel riquadro <em>Esporta</em> selezioniamo il database di PrestaShop, controlliamo di avere selezionato le check-box <em>SQL</em> (formato di esportazione) e <em>Salva con nome</em> (in basso), scegliamo un nome per il file di export e clicchiamo su <em>Esegui</em>.</p>
<p>Volendo, è possibile spuntare una voce di compressione, come ad esempio <em>zip</em> o <em>gzip</em>, a seconda del volume d&#8217;affare della nostra attività. Se l&#8217;attività è modesta, o in piedi da pochi mesi, probabilmente l&#8217;export del database sarà molto leggero e possiamo scaricarlo senza compressione. In caso contrario vale la pena scegliere un formato di compressione.</p>
<p>Il secondo passo è collegarsi al sito con un <strong>client FTP</strong> (quello che usiamo di solito), verificare di avere impostato l&#8217;interfaccia del client per visualizzare i <strong>files nascosti</strong>, e portare in locale l&#8217;intera copia del sito. La durata di questo processo dipende dalla dimensione del nostro catalogo: se abbiamo qualche centinaio di prodotti, con relative immagini, il download del sito potrebbe richiedere parecchie ore. Se temiamo di non poter lasciare acceso il PC, o abbiamo problemi di tempo, è buona norma iniziare a scaricare il sito al mattino, come attività in background.</p>
<p><strong>Configurazione locale</strong></p>
<p>Dopo aver portato in locale il file di export del database e la copia dell&#8217;intero sito (files e directories), dobbiamo riprodurre l&#8217;ambiente locale adeguato. Questo è il passaggio più laborioso e delicato, ma non spaventiamoci: seguire la procedura qui sotto è semplice e non richiede alcuna competenza specifica. L&#8217;unico svantaggio, se non siamo dei sistemisti esperti, è che potremmo non essere in grado di risolvere eventuali problemi o difficoltà. Ma vale la pena provare comunque, per almeno tre motivi: non rischiamo di perdere nulla, sbagliando si impara e la probabilità di successo sono elevate.</p>
<ol>
<li>Creiamo un database vuoto sul nostro MySQL locale, ad esempio tramite phpMyAdmin, usando tutte le ipotesi di default</li>
<li>Importiamo nel database appena creato il file di export scaricato dal sito remoto, sempre con tutte le opzioni di default</li>
<li>Creiamo sul database locale un utente dedicato al nostro database. Per semplicità possiamo creare l&#8217;utente usando lo stesso login e password del database remoto. Subito dopo, inoltre, è una buona idea testare la connessione (con l&#8217;utente appena creato) usando un client SQL</li>
<li>Copiamo (o spostiamo) l&#8217;intero sito (tutti i files e le cartelle) nella <code>htdocs</code> o <code>www</code> dell&#8217;Apache locale. Questo ovviamente dipende da come e dove abbiamo installato Apache. Se possibile evitiamo di copiare nella <em>root</em> di Apache, ma copiamo il sito in una directory dedicata (ad esempio <code>ilmiosito</code>)</li>
<li>Modifichiamo il file <code>settings.inc.php</code> locale per inserire in nuovi dati. I parametri da cambiare dovrebbero essere <code>__PS_BASE_URI__</code> (il percorso rispetto la <em>DocumentRoot</em> di Apache, ad esempio <code>ilmiosito</code>) e <code>_DB_SERVER_</code> (l&#8217;host del dabase, probabilmente <em>localhost</em>): tutti gli altri parametri dovrebbero restare invariati</li>
<li>Facciamo una copia del file <code>.htaccess</code> originale, chiamandolo ad esempio <code>htaccess.original</code>: questo è necessario se lavoriamo su Windows, perché Windows non permette di creare file senza nome (come <code>.htaccess</code>), per cui siamo costretti a modificare quello originale</li>
<li>Apriamo il file <code>.htaccess</code> con un editor qualsiasi (Notepad, Notepad++, VIM o quello che ci piace) e cancelliamo il suo contenuto, dopodiché salviamo. Come accennato al punto precedente, questo è uno modi più semplici di creare un file <code>.htaccess</code> vuoto su Windows: ecco perché al punto 6 abbiamo fatto una copia di backup dell&#8217;originale</li>
<li>Avviamo il web server locale (Apache) e il database locale (MySQL): se usiamo un pacchetto AMP probabilmente possiamo compiere quest&#8217;operazione con un click</li>
<li>Colleghiamoci al backend, usando lo stesso indirizzo remoto, modificato ad hoc in locale. Ad esempio, se in remoto usiamo</li>
</ol>
<p style="padding-left: 60px"><code> http://www.ilmiosito.com/my_admin/</code></p>
<p style="padding-left: 30px">in locale probabilmente useremo</p>
<p style="padding-left: 60px"><code> http://localhost/ilmiosito/my_admin/</code></p>
<ol start="10">
<li>Nell&#8217;interfaccia del backend andiamo in <em>Utilità</em> – <em>Generatori</em> e clicchiamo sul pulsante (o scritta) <em>Genera file .htaccess</em></li>
</ol>
<p>&nbsp;</p>
<p>In conclusione, i files modificati in locale, rispetto l&#8217;installazione remota, dovrebbero essere solamente il file <code>.htaccess</code> e <code>settings.inc.php</code>: ricordiamocelo al momento di riportare il sito in remoto, o altrove, per evitare di perdere o sovrascrivere i due files dell&#8217;installazione originale.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.aziendeitalia.com/come-migrare-prestashop/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Il sottodominio www</title>
		<link>http://blog.aziendeitalia.com/il-sottodominio-www</link>
		<comments>http://blog.aziendeitalia.com/il-sottodominio-www#comments</comments>
		<pubDate>Fri, 04 May 2012 09:17:39 +0000</pubDate>
		<dc:creator>Stefano Adriani</dc:creator>
				<category><![CDATA[Domini]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Webhosting]]></category>
		<category><![CDATA[domini]]></category>
		<category><![CDATA[ftp]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[Page Rank]]></category>
		<category><![CDATA[seo]]></category>
		<category><![CDATA[sottodomini]]></category>
		<category><![CDATA[tcp/ip]]></category>
		<category><![CDATA[TLD]]></category>
		<category><![CDATA[www]]></category>

		<guid isPermaLink="false">http://blog.aziendeitalia.com/?p=1296</guid>
		<description><![CDATA[La questione del sottodominio www rimane a volte un punto interrogativo anche nella mente dei più esperti: non è raro che persino gli addetti ai lavori, ovvero programmatori, tecnici e sistemisti, a volte non conoscano vantaggi, svantaggi e ragioni dell&#8217;esistenza del sottodominio www. Con questo articolo cercheremo di introdurre gli aspetti più importanti della questione, ...]]></description>
			<content:encoded><![CDATA[<p>La questione del sottodominio <em>www</em> rimane a volte un punto interrogativo anche nella mente dei più esperti: non è raro che persino gli addetti ai lavori, ovvero programmatori, tecnici e sistemisti, a volte non conoscano vantaggi, svantaggi e ragioni dell&#8217;esistenza del sottodominio <em>www</em>. Con questo articolo cercheremo di introdurre gli aspetti più importanti della questione, sperando di mettere il lettore in grado di, se necessario, approfondire in modo autonomo l&#8217;argomento.</p>
<p>Iniziamo con il considerare il dominio <code>aziendeitalia.com</code>, cioè il <strong>dominio</strong> registrato da AziendeItalia. Ogni host viene registrato presso un dominio di <strong>primo livello </strong>(ovvero <strong>TLD</strong>, <em>Top Level Domain</em>), che in questo caso è <code>.com</code>. Ricordiamoci che non sempre il dominio di primo livello è quello dopo l&#8217;ultimo punto. In alcuni casi (vedi ad esempio <code>.uk</code>) il ruolo del dominio di primo livello viene svolto da “particolari sottodomini”, come ad esempio <code>co.uk</code> oppure <code>org.uk</code>. Da un punto di vista tecnico, anche in questi casi, il vero dominio di primo livello è quello dopo l&#8217;ultimo punto (cioè <code>.uk</code>), e le etichette come <code>co</code> e <code>org</code> sono domini di secondo livello registrati presso <code>.uk</code>. Ma, da un punto di vista pratico, siccome i domini sotto <code>.uk</code> vanno registrati come <code>prova.co.uk</code> oppure <code>prova.org.uk</code>, possiamo pensare alle sigle <code>co.uk</code> e <code>org.uk</code> come se fossero davvero domini di primo livello.</p>
<p>Subito prima del dominio di primo livello (ad esempio .<code>com</code>) abbiamo il dominio di <strong>secondo livello</strong> (ad esempio <code>aziendeitalia</code>): è questo quello che va registrato presso l&#8217;authority competente. Poiché il dominio di secondo livello è l&#8217;unico a necessitare una registrazione, quando si dice “registrare un dominio” si da per sottinteso che stiamo parlando di un dominio di secondo livello. I domini registrati sono, proprio in virtù della procedura di registrazione, unici all&#8217;interno di un dominio di primo livello. Per questo motivo non possiamo usarli liberamente, o cambiarli quando ci pare e piace, ma dobbiamo sempre sottostare alla procedura di registrazione.</p>
<p>Eccoci così giunti al nocciolo della questione: <em>prima</em> del nome del dominio registrato abbiamo gli eventuali sottodomini di <strong>terzo livello</strong>. Qui abbiamo libertà completa: se abbiamo spazio, e se il nostro hosting provider lo permette, possiamo inventarci tutti i sottodomini che ci piacciono, senza alcuna necessità di registrarli. Il motivo è semplice: se pensiamo al dominio di primo livello come l&#8217;indirizzo postale della nostra città (esempio: Milano – Italia), e al dominio di secondo livello come l&#8217;indirizzo stradale (esempio: Via Roma, 1), allora i sottodomini di terzo livello sono quella parte dell&#8217;indirizzo che ci compete: il nome scritto sulla cassetta delle lettere, o sul citofono.</p>
<p>Siccome il dominio di secondo livello è l&#8217;unico a dover essere registrato, esso viene detto semplicemente “dominio”. Questo spiega perché i domini di terzo livello, in quanto contenuti in quello che viene detto “dominio”, sono detti per brevità“sottodomini”.</p>
<p>Una volta chiarita la terminologia, e giustificato l&#8217;uso dei vari sinonimi, possiamo finalmente chiarire la questione del sottodominio <em>www</em>. Consideriamo ad esempio</p>
<p style="padding-left: 30px"><code>www.aziendeitalia.com</code></p>
<p style="padding-left: 30px"><code>prova.aziendeitalia.com</code></p>
<p>Per quanto appena detto, in questo caso abbiamo un dominio registrato (cioè di secondo livello), avente nome <code>aziendeitalia</code>, che contiene due sottodomini: <code>www</code> e <code>prova</code>. Se siamo abituati a pensare (erroneamente) alla sigla <em>www</em> come sinonimo di Internet, il fatto che <em>www</em> sia in realtà un sottodominio potrebbe confonderci. Per convincerci, basta fare un salto nel passato e ricordare che la nascita di Internet coincide con l&#8217;adozione del protocollo <a title="Il protocollo TCP/IP" href="http://blog.aziendeitalia.com/il-web-e-il-protocollo-tcpip">TCP/IP </a>su scala mondiale. Il World Wild Web coincide invece con la diffusione, in un secondo tempo, del protocollo <a title="Il protocollo HTTP" href="http://blog.aziendeitalia.com/il-protocollo-http">HTTP</a> sopra la rete TCP/IP. Per questo motivo, all&#8217;inizio (primi anni &#8217;90) il protocollo HTTP era uno dei tanti possibili modi di usare Internet. Riprendendo l&#8217;analogia tra la struttura di un URL e un indirizzo postale, dove il sottodominio rappresenta ciò che scriviamo sul citofono o sulla cassetta delle lettere, avremmo</p>
<p style="padding-left: 30px"> <code>smtp.aziendeitalia.com</code> (cassetta delle lettere)</p>
<p style="padding-left: 30px"><code> ftp.aziendeitalia.com</code> (box dedicato ai pacchi)</p>
<p style="padding-left: 30px"><code> www.aziendeitalia.com</code> (nome sul citofono)</p>
<p> L&#8217;analogia è azzeccata, perché la funzione iniziale dei sottodomini era esattamente questa: differenziare i diversi protocolli di comunicazione su indirizzi diversi. Solamente in un secondo tempo, quando il protocollo HTTP si è imposto sugli altri, si è iniziato a pensare al sottodominio <em>www</em> come quello “normale” o di “default”, perché era quello da “usare dentro il browser”.</p>
<p>&nbsp;</p>
<p><strong>Vantaggi e svantaggi</strong></p>
<p>Dato che l&#8217;utilizzo del sottodomino <em>www</em> è un retaggio storico, è chiaro che se ne potrebbe fare a meno. E&#8217; per questo che, sia scrivendo <code>www.aziendeitalia.com</code> o <code>aziendeitalia.com</code>, apparentemente non cambia nulla. Esistono però delle differenze che si riflettono in vantaggi o svantaggi effettivi. Alcune questioni associate alla scelta di usare o non usare il prefisso <em>www</em> sono</p>
<ul>
<li>Valutazione del <strong>Page Rank</strong> da parte dei motori di ricerca: se il nostro sito viene indicizzato a volte come <em>www</em>, a volte senza <em>www</em>, di fatto il numero di link verso il nostro sito viene diviso in due parti. Per ottimizzare l&#8217;indicizzazione, soprattutto relativamente al SEO, è bene scegliere uno solo dei due indirizzi. Vanno bene entrambi, scegliamo quello che più ci piace, però usiamone solo uno.</li>
<li><strong>Scalabilità e balancing</strong>: il vantaggio dei sottodomini, rispetto all&#8217;uso delle directories (esempio: <code>aziendeitalia.com/prova</code>) è che possiamo impostare i record <a title="Domains Name System" href="http://blog.aziendeitalia.com/domain-name-system">DNS</a> di un sottodominio per puntare ad IP diversi. Questo permette di migrare, in modo trasparente all&#8217;utente, i sottodomini su macchine diverse. Un altro vantaggio è di poter reindirizzare le richieste dai sottodomini su server in <em>load balacing</em>, migliorando le performances.</li>
<li><strong>Gestione dei cookies</strong>: il fatto di avere dei sottodomini impatta lo <em>scope</em> dei cookies, e in alcuni casi può ridurre la banda effettiva a disposizione del sito. Si tratta di un argomento che merita di essere trattato a parte, come vedremo nelle prossime puntate.</li>
</ul>
<p>Se non siamo dei tecnici specializzati, ma usiamo il web per fare impresa, l&#8217;aspetto più importante dovrebbe essere il primo: ricordarsi di utilizzare sempre un solo tipo di riferimento al nostro sito. Per ottimizzare l&#8217;indicizzazione delle nostre pagine, conviene decidere se vogliamo farci conoscere con il prefisso <em>www</em> o senza di esso. Se abbiamo già avviato il sito, già indicizzato molte pagine e utilizzato una volta un indirizzo, una volta l&#8217;altro, non è troppo tardi per rimediare. Prossimamente vedremo come sfruttare il <em>redirect</em> HTTP (o addirittura DNS) per risolvere il problema.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.aziendeitalia.com/il-sottodominio-www/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Priorità dei permessi su Linux</title>
		<link>http://blog.aziendeitalia.com/priorita-dei-permessi-su-linux</link>
		<comments>http://blog.aziendeitalia.com/priorita-dei-permessi-su-linux#comments</comments>
		<pubDate>Thu, 03 May 2012 05:50:45 +0000</pubDate>
		<dc:creator>Stefano Adriani</dc:creator>
				<category><![CDATA[Guide tecniche]]></category>
		<category><![CDATA[chmod]]></category>
		<category><![CDATA[chown]]></category>
		<category><![CDATA[gruppi]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[permessi]]></category>
		<category><![CDATA[sicurezza]]></category>
		<category><![CDATA[useradd]]></category>
		<category><![CDATA[utenti]]></category>

		<guid isPermaLink="false">http://blog.aziendeitalia.com/?p=1255</guid>
		<description><![CDATA[La gestione dei permessi di files e risorse su Linux richiede almeno tre diversi tipi di competenze. Innanzitutto occorre sapere cos’è un utente, cos’è un gruppo di utenti e in che modo utenti e gruppi sono in relazione tra loro (vedi ad esempio il concetto di gruppo primario). Poi dobbiamo conoscere i comandi principali che ...]]></description>
			<content:encoded><![CDATA[<p>La gestione dei permessi di files e risorse su Linux richiede almeno tre diversi tipi di competenze. Innanzitutto occorre sapere cos’è un utente, cos’è un <a title="Guida ai gruppi utenti su Linux" href="http://blog.aziendeitalia.com/i-gruppi-utenti-su-linux">gruppo</a> di utenti e in che modo utenti e gruppi sono in relazione tra loro (vedi ad esempio il concetto di <em>gruppo primario</em>). Poi dobbiamo conoscere i comandi principali che permettono di assegnare e/o modificare i permessi, come ad esempio <a title="Il comando chmod" href="http://blog.aziendeitalia.com/il-comando-chmod"><em>chmod</em></a> e <em>chown</em>. Con questi due strumenti si potrebbe pensare di avere le basi per gestire qualsiasi situazione, ma abbiamo detto “tre competenze”, non due. Cosa manca? Il terzo requisito è ricordarsi che i permessi degli utenti hanno la priorità sui permessi dei gruppi.</p>
<p>Per capirlo vediamo un esempio: consideriamo due gruppi: <em>adm</em> (con id=4) e  <em>dialout</em> (con id=20). Assumendo di avere i permessi di <strong>amministratore</strong>, creiamo due utenti e assegniamoli a questi gruppi</p>
<p><code>useradd -g 20 -c "Prova permessi" pippo<br />
useradd -g 4 -c "Prova permessi" pluto</code></p>
<p>Siccome vogliamo loggarci con questi utenti, assegniamo loro una password (trattandosi di una prova, va benissimo usare una password uguale al nome)</p>
<p><code>passwd pippo<br />
passwd pluto</code></p>
<p>Sempre come amministratore, creiamo infine una directory dove mettere alcuni files di prova, ad esempio</p>
<p><code>-rw-rw----  1 pippo   adm        5 2012-05-02 16:57 due.sh<br />
-rw-rw----  1 pluto   adm       14 2012-05-02 16:13 uno.sh<br />
</code><br />
Per creare una situazione come questa, dopo aver creato i due files (<em>uno.txt</em> e <em>due.sh</em>) assegniamo proprietari e permessi tramite i comandi</p>
<p><code>chmod o-r uno.sh<br />
chmod o-r due.sh<br />
chown pluto:adm uno.sh<br />
chown pippo:adm due.sh<br />
</code><br />
Siamo finalmente pronti per fare qualche prova: entriamo come utente <em>pippo</em>, usando ad esempio “su pippo”, e proviamo a maneggiare il file <em>uno.sh</em>.  Com’è giusto che sia, non potremo né leggere, né modificare, né eseguire il file <em>uno.sh</em>. Ovviamente non potremo né cambiare i suoi permessi (comando <em>chmod</em>) né assegnarlo ad altro utente o gruppo (comando <em>chown</em>). Le cose cambiano se ci logghiamo con l’utente <em>pluto</em> (usando “su pluto”) e proviamo a maneggiare il file <em>due.sh</em>. In questo caso potremo leggere e modificare il file (permessi del gruppo), ma non potremo eseguirlo. Anche qui ovviamente non potremo cambiare né permessi né utente o gruppo proprietario.<br />
Proviamo ora a cambiare i permessi, aggiungendo i permessi di esecuzione a livello di gruppo</p>
<p><code>-rw-rwx--- 1 pippo adm 3 2012-05-02 17:24 due.sh<br />
-rw-rwx--- 1 pluto adm 3 2012-05-02 17:27 uno.sh</code></p>
<p>Se ci logghiamo come utente <em>pippo</em>, giustamente non potremo eseguire nessuno dei due files. Come invece <em>pluto</em> potremo eseguire il file <em>due.sh</em>, ma <strong>non</strong> potremo eseguire <em>uno.sh</em>!<br />
Cos’è successo? Nel caso del file <em>due.sh</em>, le operazioni permesse all’utente <em>pluto</em> sono regolamentate dal suo gruppo (ovvero <em>adm</em>), e siccome questo gruppo ha i permessi di esecuzione, anche l’utente <em>pluto</em> potrà eseguire questo file. Le cose sono diverse quando proviamo ad eseguire il file <em>uno.sh</em>. Siccome come utente non ha i permessi di esecuzione, l’utente <em>pluto</em> non potrà eseguire il file <em>uno.sh</em>, anche se potrebbe farlo in quanto membro del gruppo <em>adm</em>!</p>
<p>Se ci pensiamo un attimo, questo è il comportamento giusto: lo scopo dei gruppi è quello di fornire regole generiche, valide per molti utenti e molti tipi di risorse, senza preoccuparci del singolo caso o eccezione. I permessi dei gruppi potrebbero essere sufficienti a regolamentare tutte le risorse del file system, per cui non abbiamo, in teoria, necessità di assegnare anche un utente proprietario ad ogni risorsa. Il vantaggio di decidere che una certa risorsa ha due “padroni” (un utente e un gruppo) è quello di poter gestire delle regole particolari, che potrebbero non andar bene a livello di gruppo. E’ quindi giusto che, là dove ci sia contraddizione tra i permessi come utente proprietario e come gruppo proprietario, i permessi dell’utente siano prioritari: solamente in questo modo saremo in grado di assegnare regole specifiche e puntuali sui singoli utenti.<br />
Per verificare quanto detto basta invertire la situazione, assegnando i permessi di esecuzione (per il file <em>uno.sh</em>) all’utente proprietario anziché il gruppo</p>
<p><code>-rw-rwx---  1 pippo   adm        3 2012-05-02 17:24 due.sh<br />
-rwxrw----  1 pluto   adm        3 2012-05-02 17:27 uno.sh<br />
</code><br />
se riproviamo adesso, l’utente <em>pluto</em> potrà eseguire <em>uno.sh</em> perché ha il permesso di farlo in quanto utente, ma non potrebbe farlo in qualità di membro del gruppo <em>adm</em>. La situazione appena vista è un ottimo esempio di buon uso dei permessi in combinazione con la distinzione tra gruppi e utenti: in molti casi è bene assegnare dei permessi piuttosto “contenuti” ai gruppi, ed aumentare eventualmente “i poteri” solamente agli utenti giusti.</p>
<p>Come ultima cosa osserviamo che quanto detto vale per qualsiasi gruppo, sia esso primario o secondario. Anche qui, il modo migliore di imparare è fare qualche prova nella shell (usando, se necessario, il comando <em>usermod</em>  per assegnare gli utenti già creati ad altri gruppi).</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.aziendeitalia.com/priorita-dei-permessi-su-linux/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>La direttiva Directory di Apache</title>
		<link>http://blog.aziendeitalia.com/la-direttiva-directory-di-apache</link>
		<comments>http://blog.aziendeitalia.com/la-direttiva-directory-di-apache#comments</comments>
		<pubDate>Wed, 02 May 2012 05:58:04 +0000</pubDate>
		<dc:creator>Stefano Adriani</dc:creator>
				<category><![CDATA[Guide tecniche]]></category>
		<category><![CDATA[Server]]></category>
		<category><![CDATA[Webhosting]]></category>
		<category><![CDATA[.htaccess]]></category>
		<category><![CDATA[Allow]]></category>
		<category><![CDATA[AllowOverride]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[apache.conf]]></category>
		<category><![CDATA[apache2]]></category>
		<category><![CDATA[apache2.conf]]></category>
		<category><![CDATA[configurazione]]></category>
		<category><![CDATA[Deny]]></category>
		<category><![CDATA[Directory]]></category>
		<category><![CDATA[direttive di apache]]></category>
		<category><![CDATA[httpd.conf]]></category>
		<category><![CDATA[Options]]></category>
		<category><![CDATA[Order]]></category>

		<guid isPermaLink="false">http://blog.aziendeitalia.com/?p=1238</guid>
		<description><![CDATA[Se lavoriamo col web server Apache, o abbiamo portato online qualche sito o applicazione web, ci è capitato quasi sicuramente di dover creare, modificare o deployare il file .htaccess di Apache. All&#8217;interno di questo file possiamo specificare molte delle direttive di Apache, le stesse che si trovano nel file apache.conf o httpd.conf. Nelle scorse puntate ...]]></description>
			<content:encoded><![CDATA[<p>Se lavoriamo col web server Apache, o abbiamo portato online qualche sito o applicazione web, ci è capitato quasi sicuramente di dover creare, modificare o deployare il file <code>.htaccess</code> di Apache. All&#8217;interno di questo file possiamo specificare molte delle direttive di Apache, le stesse che si trovano nel file <code>apache.conf</code> o <code>httpd.conf</code>. Nelle scorse puntate (vedi <a title="Il file httpd.conf di apache" href="http://blog.aziendeitalia.com/il-file-httpd-conf-di-apache">qui</a>) abbiamo visto quali solo le direttive più usate per configurare Apache. Oggi vogliamo dedicarci a quella che forse è la direttiva più importante, sia quando configuriamo Apache, sia quando modifichiamo un file <code>.htaccess</code>: la direttiva <strong>Directory</strong>.</p>
<p>All&#8217;interno del file di configurazione di Apache dovrebbe sempre trovarsi una direttiva del tipo</p>
<p style="padding-left: 30px"><code> &lt;Directory /&gt;</code></p>
<p style="padding-left: 30px"><code> ...</code></p>
<p style="padding-left: 30px"><code> &lt;/Directory&gt;</code></p>
<p>la direttiva riguarda la root del server perché il percorso “<code>/</code>” è specificato subito dopo la keyword <code>Directory</code>: ciò significa che la direttiva si applica alla root del server, ovvero a tutte le risorse presenti sotto il percorso definito nella <code>DocumentRoot</code>, incluse le eventuali sotto directories.</p>
<p>Se vogliamo applicare una direttiva <code>Directory</code> ad un particolare percorso, basterà scrivere (su Windows è bene delimitare il percorso tra “doppi apici”) qualcosa come</p>
<p style="padding-left: 30px"><code> &lt;Directory /usr/local/httpd/mysite&gt;</code></p>
<p style="padding-left: 30px">…</p>
<p style="padding-left: 30px"><code> &lt;/Directory&gt;</code></p>
<p>Questo dovrebbe farci capire perché la direttiva <code>Directory</code> è così importante: si tratta di una “meta direttiva”, che non riguarda una regola particolare di Apache, ma permette invece di specificare <strong>quando</strong> applicare un gruppo di direttive. Se pensiamo alle direttive come ad un mazzo di carte da gioco, la direttiva <code>Directory</code> dice a quale “giocatore” (leggi: sito o percorso nel <em>file system</em>) va assegnato un&#8217;intera mano di carte (leggi: gruppo di direttive). All&#8217;interno della direttiva <code>Directory</code> possiamo inserire molte direttive diverse, e caratterizzare così il comportamento del singolo sito o applicazione. Tanta libertà potrebbe disorientare: andiamo perciò a vedere quali sono le direttive usate più spesso all&#8217;interno dell&#8217;elemento <code>Directory</code>.</p>
<p>&nbsp;</p>
<p><strong>Options</strong></p>
<p>Permette di specificare molti comportamenti diversi, che riguardano quali script possono essere eseguiti lato server (<code>ExecCGI</code>), come gestire i link simbolici (<code>FollowSymLinks</code> e <code>SymLinksIfOwnerMatch</code>), i tipi di <em>include</em> permessi lato lato server (<code>Includes</code> e <code>IncludesNOEXEC</code>), le modalità di negoziazione dei contenuti (<code>MultiViews</code>) e come vanno visualizzati le directory sprovviste di una <code>index.html</code> (<code>Indexes</code>). Se lavoriamo in locale, possiamo tranquillamente scegliere il valore <code>Options All</code> che attiva tutte le modalità che abbiamo elencato. Se invece dobbiamo amministrare un server remoto, non possiamo esimerci dallo <a title="Documentazione di Apache" href="http://httpd.apache.org/docs/2.0/mod/core.html#options">studiare</a> bene questa direttiva.</p>
<p>&nbsp;</p>
<p><strong>AllowOverride</strong></p>
<p>Direttiva molto importate per le applicazioni in hosting remoto. Se questa direttiva è settata su <code>None</code>, tutti i files <code>.htaccess</code> sotto la directory in questione saranno ignorati. Esistono diversi modi di configurare dove e quando è permesso l&#8217;<em>override</em> tramite un file <code>.htaccess</code>, non possiamo discuterli tutti in queste sede. Ci basta invece ricordare che, se un file <code>.htaccess</code> tenta di eseguire un <em>override</em> non consentito, nella maggior parte dei casi avremo un <em>internal server error</em>.</p>
<p>&nbsp;</p>
<p><strong>Order, Deny e Allow</strong></p>
<p>Sono tre direttive diverse, ma vale la pena vederle assieme. La direttiva <code>Order</code> decide con quale priorità considerare le altre due, e può assumere solo due valori: <code>Deny,Allow</code> (le richieste “dubbie” vengono accettate) oppure <code>Allow,Deny</code> (le richieste “dubbie” vengono respinte). Per richieste “dubbie” si intendono tutte quelle non regolamentate da qualche regola di tipo <code>Allow</code> o <code>Deny</code> (o da entrambe). Alcuni esempi dovrebbero chiarire l&#8217;uso combinato delle tre direttive</p>
<p style="padding-left: 30px"><code> Order Deny,Allow<br />
Deny from all<br />
Allow from aziendeitalia.com </code></p>
<p>significa che le uniche richieste accettate sono quelle provenienti dal dominio <code>aziendeitalia.com</code>. Notiamo che in questo caso non esistono richieste dubbie e ambigue, perché la direttiva <code>Deny from all</code> è chiara quanto imperativa: tutto ciò che non è regolamentato va rifiutato.</p>
<p>Lo stesso risultato si potrebbe ottenere scrivendo</p>
<p style="padding-left: 30px"><code> Order Allow,Deny<br />
Allow from aziendeitalia.com<br />
Deny from ilmiosito.com</code></p>
<p>infatti in tal caso tutte le richieste “dubbie” (ovvero quelle che non provengono né da AziendeItalia, né dal “mio sito”) saranno scartate perché abbiamo scelto l&#8217;impostazione meno permissiva (cioè <code>Order Allow,Deny</code>), che respinge tutto ciò che non soddisfa una qualsiasi regola.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Dovrebbe essere chiaro che non è possibile riassumere in poche pagine tutte le potenzialità offerte dalla direttiva <code>Directory</code>. Nelle prossime puntate vedremo alcuni esempi specifici, sperando di coprire almeno i casi più frequenti per chi lavora sul web. Vale però la pena, prima di concludere, accennare a cosa succede se un percorso del <em>file system</em> viene descritto da più direttive <code>Directory</code>. Consideriamo ad esempio</p>
<p style="padding-left: 30px"><code> &lt;Directory /&gt; ecc... ecc...&lt;/Directory&gt;</code></p>
<p style="padding-left: 30px"><code> &lt;Directory /mysite&gt; ecc... ecc...&lt;/Directory&gt;</code></p>
<p>in questo caso al percorso <code>/mysite</code> si applicano entrambe le direttive, perché la directory <code>mysite</code> si trova sotto l&#8217;albero della <em>root</em> (regolata dalla direttiva <code>&lt;Directory /&gt;</code>). Per risolvere ambiguità come questa Apache assegna la priorità al percorso <strong>più breve</strong>: siccome la stringa “<code>/</code>” è più breve delle stringa “<code>/mysite</code>”, le istruzioni della prima riga verranno applicate prima di quelle della seconda riga. Il discorso cambia se specifichiamo il percorso a cui fa riferimento la direttiva usando un&#8217;<strong>espressione regolare</strong>: direttive di questo tipo sono valutate dopo le direttive normali, e dopo gli eventuali file <code>.htaccess</code>. Per questo motivo, almeno all&#8217;inizio, sconsigliamo di lavorare con le espressioni regolari, ma di identificare i percorsi delle directory in maniera esplicita.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.aziendeitalia.com/la-direttiva-directory-di-apache/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

