<?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>Anticlimax</title>
	<atom:link href="http://acinapura.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://acinapura.com</link>
	<description>Blog su Sviluppo Web, Tecnologie e altre amenità.</description>
	<lastBuildDate>Sun, 26 Apr 2009 21:50:46 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.3</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Slide del mio intervento al Facebook Developer Garage</title>
		<link>http://acinapura.com/2009/04/slide-del-mio-intervento-al-facebook-developer-garage/</link>
		<comments>http://acinapura.com/2009/04/slide-del-mio-intervento-al-facebook-developer-garage/#comments</comments>
		<pubDate>Sun, 26 Apr 2009 21:50:46 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Varie]]></category>

		<guid isPermaLink="false">http://acinapura.com/?p=104</guid>
		<description><![CDATA[Pubblico le slide del mio intervento al recente Facebook Developer Garage di Milano.
Ho parlato di come sono fatte le applicazioni Facebook, dei punti di integrazione, delle tecnologie che è necessario conoscere per sviluppare sulla piattaforma.
Colgo l&#8217;occasione per ringraziare ancora una volta tutti i presenti all&#8217;evento.
Creare applicazioni Facebook
View more presentations from liquid1982.

]]></description>
			<content:encoded><![CDATA[<p>Pubblico le slide del mio intervento al recente Facebook Developer Garage di Milano.</p>
<p>Ho parlato di come sono fatte le applicazioni Facebook, dei punti di integrazione, delle tecnologie che è necessario conoscere per sviluppare sulla piattaforma.</p>
<p>Colgo l&#8217;occasione per ringraziare ancora una volta tutti i presenti all&#8217;evento.</p>
<div style="width:425px;text-align:left" id="__ss_1344825"><a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" href="http://www.slideshare.net/liquid1982/creare-applicazioni-facebook?type=presentation" title="Creare applicazioni Facebook">Creare applicazioni Facebook</a><object style="margin:0px" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=presentazionevincenzo-090426164914-phpapp01&#038;stripped_title=creare-applicazioni-facebook" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=presentazionevincenzo-090426164914-phpapp01&#038;stripped_title=creare-applicazioni-facebook" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object>
<div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;">View more <a style="text-decoration:underline;" href="http://www.slideshare.net/">presentations</a> from <a style="text-decoration:underline;" href="http://www.slideshare.net/liquid1982">liquid1982</a>.</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://acinapura.com/2009/04/slide-del-mio-intervento-al-facebook-developer-garage/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Capistrano, deploy sexy come mai prima</title>
		<link>http://acinapura.com/2009/02/capistrano-deploy-sexy-come-mai-prima/</link>
		<comments>http://acinapura.com/2009/02/capistrano-deploy-sexy-come-mai-prima/#comments</comments>
		<pubDate>Sun, 22 Feb 2009 09:23:40 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Capistrano]]></category>
		<category><![CDATA[deployment]]></category>

		<guid isPermaLink="false">http://acinapura.com/?p=18</guid>
		<description><![CDATA[Gestire la fase di deploy di un sito o applicazione web complessa può diventare un compito delicato e prono all&#8217;errore. Dimenticare, ad esempio, di settare i permessi giusti su file o cartelle dopo un aggiornamento potrebbe introdurre malfunzionamenti, o peggio problemi di sicurezza, e gli script di shell in alcuni casi risultano strumenti rigidi e [...]]]></description>
			<content:encoded><![CDATA[<p>Gestire la fase di deploy di un sito o applicazione web complessa può diventare un compito delicato e prono all&#8217;errore. Dimenticare, ad esempio, di settare i permessi giusti su file o cartelle dopo un aggiornamento potrebbe introdurre malfunzionamenti, o peggio problemi di sicurezza, e gli script di shell in alcuni casi risultano strumenti rigidi e poco adattabili a scenari complessi, che potrebbero coinvolgere diverse macchine con ruoli distinti.<br />
<span id="more-18"></span><br />
<a href="http://capify.org">Capistrano</a> (prima SwitchTower) nasce per automatizzare e semplificare la fase di messa in produzione e aggiornamento delle applicazioni <a href="http://www.rubyonrails.com">Rails</a>, consentendo una grande flessibilità d&#8217;uso. Nulla vieta, come vedremo, di utilizzare questo strumento per servire qualsiasi tipo di file o applicazione, su qualsiasi architettura che rispetti i pochi prerequisiti richiesti.</p>
<p>È opera di <a href="http://weblog.jamisbuck.org/">Jamis Buck</a>, si basa su <a href="http://rake.rubyforge.org/">Rake</a> e permette di definire una serie di operazioni (tasks) legate alla fase di deploy del progetto: installazione di software, checkout dei file da repository, rollback istantanei, migrazioni di database e avvio di application server sono solo alcuni dei compiti che è possibile automatizzare e ripartire su macchine differenti, il tutto mediante l&#8217;uso di un DSL facilissimo da comprendere e padroneggiare. L&#8217;approccio transazionale di Capistrano e la sua flessibilità lo rendono idoneo all&#8217;uso in scenari anche decisamente complessi, in cui ad esempio esistono ambienti di produzione, sviluppo e collaudo con diverse architetture e diverse configurazioni.</p>
<h3>Installazione e Setup</h3>
<p>È necessario installare Capistrano soltanto sulle macchine da cui si lanciano i comandi di deploy, e l&#8217;unico prerequisito richiesto sulle macchine remote è la presenza di SSH ed una shell compatibile POSIX. Installare Capistrano mediante <a href="http://www.rubygems.org/">rubygems</a> è semplice:</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;">host:~ user$ sudo gem install capistrano</pre></div></div>

<p>La gemma installa due binari in <code>/usr/bin</code>, che sono <code>cap</code> e <code>capify</code>. Per servire la propria applicazione mediante Capistrano è necessario creare un file che contiene le istruzioni necessarie al deploy. Un modo automatico per creare questo file (chiamato <code>Capfile</code>) è recarsi nella cartella del progetto e digitare il comando</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;">host:Sites/myapp user$ capify .</pre></div></div>

<p>Se lanciato sulla root di una applciazione Rails, <code>capify</code> produce due file: il <code>Capfile</code> e <code>deploy.rb</code>, nella cartella <code>config</code>. Purtroppo <code>capify</code> è praticamente inutile se ciò che stiamo servendo non è una applicazione Rails, vedremo in seguito come partire con un <code>Capfile</code> pulito.</p>
<p>Vediamo il contenuto del <code>Capfile</code>:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#CC0066; font-weight:bold;">load</span> <span style="color:#996600;">'deploy'</span> <span style="color:#9966CC; font-weight:bold;">if</span> respond_to?<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:namespace</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#008000; font-style:italic;"># cap2 differentiator</span>
<span style="color:#CC00FF; font-weight:bold;">Dir</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'vendor/plugins/*/recipes/*.rb'</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">each</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#006600; font-weight:bold;">|</span>plugin<span style="color:#006600; font-weight:bold;">|</span> <span style="color:#CC0066; font-weight:bold;">load</span><span style="color:#006600; font-weight:bold;">&#40;</span>plugin<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
<span style="color:#CC0066; font-weight:bold;">load</span> <span style="color:#996600;">'config/deploy'</span></pre></div></div>

<p>e di <code>deploy.rb</code>:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">set <span style="color:#ff3333; font-weight:bold;">:application</span>, <span style="color:#996600;">&quot;set your application name here&quot;</span>
set <span style="color:#ff3333; font-weight:bold;">:repository</span>,  <span style="color:#996600;">&quot;set your repository location here&quot;</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># If you aren't deploying to /u/apps/#{application} on the target</span>
<span style="color:#008000; font-style:italic;"># servers (which is the default), you can specify the actual location</span>
<span style="color:#008000; font-style:italic;"># via the :deploy_to variable:</span>
<span style="color:#008000; font-style:italic;"># set :deploy_to, &quot;/var/www/#{application}&quot;</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># If you aren't using Subversion to manage your source code, specify</span>
<span style="color:#008000; font-style:italic;"># your SCM below:</span>
<span style="color:#008000; font-style:italic;"># set :scm, :subversion</span>
&nbsp;
role <span style="color:#ff3333; font-weight:bold;">:app</span>, <span style="color:#996600;">&quot;your app-server here&quot;</span>
role <span style="color:#ff3333; font-weight:bold;">:web</span>, <span style="color:#996600;">&quot;your web-server here&quot;</span>
role <span style="color:#ff3333; font-weight:bold;">:db</span>,  <span style="color:#996600;">&quot;your db-server here&quot;</span>, <span style="color:#ff3333; font-weight:bold;">:primary</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">true</span></pre></div></div>

<p>Naturalmente è possibile tenere tutte le istruzioni di deploy nel solo <code>Capfile</code>, ed è quello che faremo in questo articolo.</p>
<h3>Concetti base di Capistrano</h3>
<p>Vediamo adesso alcuni dei concetti base per capire il funzionamento di Capistrano:</p>
<ul>
<li> I <strong>task</strong> sono le unità funzionali che contengono i comandi di shell da eseguire sulle  macchine contemplate dal nostro scenario di deploy. Possono essere chiamati direttamente dall&#8217;utente oppure da altri task, e come per Rake è possibile raggrupparli logicamente in namespaces;</li>
<li> Le <strong>ricette</strong> (recipes) sono gruppi di task che si riferiscono a determinati compiti. Possono avere a che fare direttamente con il deploy dell&#8217;applicazione, ma possono anche essere rivolte a compiti di altra natura, come ad esempio setup di componenti software e monitoraggio di applicazioni in background.</li>
<li> I <strong>ruoli</strong> (roles) sono ambiti in base ai quali è possibile raggruppare le macchine destinatarie dei task. Capistrano ci suggerisce tre ruoli di default, che sono <code>:app</code>, <code>:db</code> e <code>:web</code>.</li>
</ul>
<p>Capistrano, come anticipato, assume che sia possibile raggiungere le macchine remote mediante SSH, e la connessione avviene mediante la classe <code>NET::SSH</code> di Ruby.</p>
<p>Con il comando</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;">host:Sites/myapp user$ cap -Tv</pre></div></div>

<p>viene visualizzata la lista di tutti task che è possibile eseguire sulla propria applicazione, ad ognuno dei quali è associata una breve descrizione. Se abbiamo in precedenza eseguito <code>capify</code> sulla  root della nostra applicazione notiamo che molti di questi task appartengono al namespace deploy. Questo perché nel <code>Capfile</code> viene caricato, nella prima riga, il file <code>deploy.rb</code>, che possiamo trovare (in Mac OS X) sotto <code>/Library/Ruby/Gems/1.8/gems/capistrano-2.x.x/lib/capistrano/recipes/deploy.rb</code>. In questo file è contenuta la gran parte dei task di default di Capistrano, quindi ne consiglio la lettura.</p>
<p>Vediamo ora come istruire un <code>Capfile</code> d&#8217;esempio per il nostro primo deploy.</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#CC0066; font-weight:bold;">load</span> <span style="color:#996600;">'deploy'</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># Il nome che sarà assegnato alla cartella che conterrà l'applicazione</span>
set <span style="color:#ff3333; font-weight:bold;">:application</span>, <span style="color:#996600;">&quot;myapp&quot;</span> 
&nbsp;
<span style="color:#008000; font-style:italic;"># Il repository che contiene il codice da servire</span>
set <span style="color:#ff3333; font-weight:bold;">:repository</span>, <span style="color:#996600;">&quot;svn://repository.com/myapp/trunk&quot;</span> 
&nbsp;
<span style="color:#008000; font-style:italic;"># Il server che Capistrano raggiungerà tramite SSH</span>
set <span style="color:#ff3333; font-weight:bold;">:domain</span>, <span style="color:#996600;">&quot;host.com&quot;</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># Usiamo solo una macchina per il deploy.</span>
server domain, <span style="color:#ff3333; font-weight:bold;">:app</span>, <span style="color:#ff3333; font-weight:bold;">:web</span>, <span style="color:#ff3333; font-weight:bold;">:db</span>, <span style="color:#ff3333; font-weight:bold;">:primary</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">true</span></pre></div></div>

<p>Questa configurazione minimale è possibile perché Capistrano fa le seguenti ipotesi sullo scenario di deploy:</p>
<ul>
<li>Stiamo servendo una applicazione Rails;</li>
<li>L&#8217;utente che lancia il comando di deploy è presente anche sulla/e macchina/e remota/e (Capistrano cerca quindi di accedere con le stesse credenziali dell&#8217;utente che ha lanciato il deploy);</li>
<li>Vogliamo servire una copia versionata della nostra applicazione;</li>
<li>Stiamo usando Subversion come SCM;</li>
<li>Il repository ha le stesse credenziali d&#8217;accesso della macchina remota, qualora non consenta checkout anonimo;</li>
<li>L&#8217;applicazione viene servita dalla cartella <code>/u/apps/myapp</code>;</li>
</ul>
<p>Possiamo adeguare ciascuno dei defaults alle nostre necessità. Adesso vediamo l&#8217;esempio di un <code>Capfile</code> più completo:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#CC0066; font-weight:bold;">load</span> <span style="color:#996600;">'deploy'</span>
&nbsp;
 <span style="color:#008000; font-style:italic;"># Il nome che sarà assegnato alla cartella che conterrà l'applicazione</span>
set <span style="color:#ff3333; font-weight:bold;">:application</span>, <span style="color:#996600;">&quot;myapp&quot;</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># Il repository che contiene il codice da servire</span>
set <span style="color:#ff3333; font-weight:bold;">:repository</span>, <span style="color:#996600;">&quot;svn://repository.com/myapp/trunk&quot;</span>
&nbsp;
set <span style="color:#ff3333; font-weight:bold;">:domain</span>, <span style="color:#996600;">&quot;host.com&quot;</span> 
&nbsp;
<span style="color:#008000; font-style:italic;"># Usiamo macchine diverse per ciascun ruolo.</span>
role <span style="color:#ff3333; font-weight:bold;">:app</span>, <span style="color:#996600;">&quot;app.#{domain}&quot;</span>
role <span style="color:#ff3333; font-weight:bold;">:web</span>, <span style="color:#996600;">&quot;www.#{domain}&quot;</span>
role <span style="color:#ff3333; font-weight:bold;">:db</span>,  <span style="color:#996600;">&quot;db.#{domain}&quot;</span>, <span style="color:#ff3333; font-weight:bold;">:primary</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">true</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># Non cerca di eseguire i task come root</span>
set <span style="color:#ff3333; font-weight:bold;">:use_sudo</span>, <span style="color:#0000FF; font-weight:bold;">false</span> 
&nbsp;
<span style="color:#008000; font-style:italic;"># Le release da tenere sulla macchina remota</span>
set <span style="color:#ff3333; font-weight:bold;">:keep_releases</span>, <span style="color:#006666;">3</span> 
&nbsp;
<span style="color:#008000; font-style:italic;"># Credenziali  d'accesso alla macchina remota,</span>
<span style="color:#008000; font-style:italic;"># se diverse da quelle dell'utente che lancia il deploy</span>
set <span style="color:#ff3333; font-weight:bold;">:user</span>, <span style="color:#996600;">&quot;deployuser&quot;</span>
<span style="color:#008000; font-style:italic;"># set :password, &quot;deploypassword&quot;</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># Possiamo anche evitare di tenere la password nel Capfile</span>
set<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:password</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#6666ff; font-weight:bold;">Capistrano::CLI</span>.<span style="color:#9900CC;">ui</span>.<span style="color:#9900CC;">ask</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Password: &quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># Posizione dell'applicazione sulla macchina remota</span>
set <span style="color:#ff3333; font-weight:bold;">:deploy_to</span>, <span style="color:#996600;">&quot;/var/www/#{application}&quot;</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># Strategia di deploy, in questo caso svn export</span>
set <span style="color:#ff3333; font-weight:bold;">:deploy_via</span>, <span style="color:#ff3333; font-weight:bold;">:export</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># Specifica alcune dipendenze</span>
depend <span style="color:#ff3333; font-weight:bold;">:remote</span>, <span style="color:#ff3333; font-weight:bold;">:gem</span>, <span style="color:#996600;">&quot;parseexcel&quot;</span>
depend <span style="color:#ff3333; font-weight:bold;">:remote</span>, <span style="color:#ff3333; font-weight:bold;">:directory</span>, <span style="color:#ff3333; font-weight:bold;">:writeable</span>, <span style="color:#996600;">&quot;/var/www/current/config&quot;</span>
depend <span style="color:#ff3333; font-weight:bold;">:local</span>, <span style="color:#ff3333; font-weight:bold;">:command</span>, <span style="color:#996600;">&quot;svn&quot;</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># Esempio di callback: dopo la fine di un task è possibile</span>
<span style="color:#008000; font-style:italic;"># invocarne automaticamente un altro</span>
after <span style="color:#996600;">&quot;deploy:finalize_update&quot;</span>, <span style="color:#996600;">&quot;deploy:cleanup&quot;</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># Altro modo di definire una callback: prependere before_ o after_</span>
<span style="color:#008000; font-style:italic;"># al nome di un task definito.</span>
desc <span style="color:#996600;">&quot;Crea la cartella uploaded_pictures&quot;</span>
task <span style="color:#ff3333; font-weight:bold;">:after_setup</span>
  run <span style="color:#996600;">&quot;mkdir -p #{shared_path}/uploaded_pictures&quot;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Capistrano ci permette di riassumere in un unico file tutte le istruzioni necessarie per servire l&#8217;applicazione, aspetto molto vantaggioso perché rende facile la manutenzione e riduce al minimo i punti di fallimento.</p>
<h3>Il primo deploy</h3>
<p>Vediamo ora come procedere al primo deploy. Una volta istruito il <code>Capfile</code> con le impostazioni che descrivono il nostro scenario, lanciamo dalla root della nostra applicazione il comando</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;">host:Sites/myapp user$ cap deploy:setup</pre></div></div>

<p>In questo modo Capistrano tenta di connettersi alle macchine remote, e su ciascuna di esse crea, nella cartella indicata in <code>:deploy_to</code>, le seguenti cartelle:</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;">releases
current
shared
shared/log
shared/system
shared/pids</pre></div></div>

<p>La cartella <code>releases</code> ospita tutti i rilasci dell&#8217;applicazione, e ciascun rilascio è contenuto a sua volta in una cartella nominata con il timestamp del momento in cui si è lanciato il deploy. <code>current</code> è un link che punta all&#8217;ultima release servita, oppure ad una release precedente se abbiamo lanciato il comando di rollback (vedremo a breve come). <code>shared</code> è destinata a contenere tutti quei file generati dall&#8217;applicazione come i <code>log</code>, i <code>pid</code> ma anche ad esempio immagini caricate dagli utenti ed altri assets generati successivamente. Dopo aver lanciato <code>cap deploy:setup</code>, possiamo servirci di <code>cap deploy:check</code> per verificare che tutte le dipendenze siano soddisfatte e che tutti i permessi siano impostati correttamente. Se qualcosa non dovesse essere al suo posto, questo comando ci aiuterà a risolvere i problemi. A questo punto possiamo lanciare:</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;">host:Sites/myapp user$ cap deploy</pre></div></div>

<p>che effettuerà il checkout della nostra applicazione sulle macchine specificate, avvierà i server ed eseguirà in successione tutti i task che abbiamo specificato. Se in qualsiasi momento volessimo tornare indietro ad una release precedente:</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;">host:Sites/myapp user$ cap deploy:rollback</pre></div></div>

<p>sposterà il link <code>current</code> sulla release precedente.</p>
<h3>Il prossimo appuntamento</h3>
<p>Nel prossimo post vedremo:</p>
<ul>
<li>come sovrascrivere alcuni task di default riferiti a Rails</li>
<li>le strategie di deploy</li>
<li>la creazione di namespaces contenenti task personalizzati</li>
<li>la maniera migliore per servire la nostra applicazione in una pluralità di ambienti (collaudo, produzione, etc)</li>
<li>come è possibile raggiungere mediante Capistrano delle macchine dietro un proxy</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://acinapura.com/2009/02/capistrano-deploy-sexy-come-mai-prima/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
