23. Easy Install è un modulo
python (easy_install)
incluso in setuptools che
vi consente di scaricare ed
installare automaticamente
pacchetti Python.
22
24. Easy Install è un modulo
python (easy_install)
incluso in setuptools che
vi consente di scaricare ed
installare automaticamente
pacchetti Python.
23
46. use JSON qw< from_json >;
use File::Slurp qw< read_file >;
sub get_dotcloud_config {
my $filename = shift || '/home/dotcloud/environment.json';
my $config_text = read_file($filename);
my $config = from_json($config_text);
return $config;
} ## end sub get_dotcloud_config
45
47. sub get_redis {
my $config = get_dotcloud_config();
my ($password, $hostname, $port) = map {
$config->{'DOTCLOUD_NOSQLDB_REDIS_' . $_}
} qw< PASSWORD HOST PORT >;
require Redis;
my $redis = Redis->new(server => "$hostname:$port");
$redis->auth($password);
return $redis;
}
46
48. ROTFL
sub get_redis {
my $config = get_dotcloud_config();
my ($password, $hostname, $port) = map {
$config->{'DOTCLOUD_NOSQLDB_REDIS_' . $_}
} qw< PASSWORD HOST PORT >;
require Redis;
my $redis = Redis->new(server => "$hostname:$port");
$redis->auth($password);
return $redis;
}
47
57. $ dotcloud push whatever
# Found dotcloud.yml: Using /home/poletti/sviluppo/
perl/whatever as a base directory
# upload /home/poletti/sviluppo/perl/whatever ssh://
dotcloud@uploader.dotcloud.com:443/whatever/
branch:master
# git
...
2011-08-27 09:00:16 [api] Deploy whatever scheduled
for revision=latest
2011-08-27 09:00:16 [api] Waiting for the build. (It
may take a few minutes)
2011-08-27 09:00:17 [api] All the services are ready.
Beginning the build.
...
56
67. type: mysql
$ dotcloud info whatever.sqldb
cluster: wolverine
config:
mysql_password: <the-password>
created_at: 1313990083.324873
...
$ dotcloud run whatever.sqldb --
mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ;
or g.
...
mysql> CREATE TABLE weight (...
66
70. $ dotcloud logs whatever.backend
# tail -F /var/log/supervisor/*.log
==> /var/log/supervisor/exporter-stderr---supervisor-2y6P9O.log <==
[2011/08/27 01:35:25 INFO ] serving pending requests if needed...
[2011/08/27 01:35:25 INFO ] waiting for more export requests...
[2011/08/27 01:39:20 INFO ] serving pending requests if needed...
[2011/08/27 01:39:20 INFO ] waiting for more export requests...
[2011/08/27 01:39:42 INFO ] got element to export: {"email":"flavio@polettix.it","username":"silvia"}
[2011/08/27 01:42:18 INFO ] serving pending requests if needed...
[2011/08/27 01:42:18 INFO ] waiting for more export requests...
[2011/08/27 01:42:30 INFO ] got element to export: {"email":"flavio@polettix.it","username":"silvia"}
[2011/08/27 09:00:24 INFO ] serving pending requests if needed...
[2011/08/27 09:00:24 INFO ] waiting for more export requests...
==> /var/log/supervisor/exporter-stdout---supervisor-foI5vi.log <==
==> /var/log/supervisor/saver-stderr---supervisor-pt1_hK.log <==
[2011/08/27 01:35:25 INFO ] waiting for more data...
[2011/08/27 01:36:04 INFO ] got element to save: {"epoch":1313913600,"weight":83200,"username":"flavio"}
[2011/08/27 01:37:25 INFO ] got element to save: {"epoch":1313827200,"weight":62000,"username":"silvia"}
[2011/08/27 01:39:20 INFO ] performing initial transfer if needed...
[2011/08/27 01:39:20 INFO ] waiting for more data...
[2011/08/27 01:42:18 INFO ] performing initial transfer if needed...
[2011/08/27 01:42:18 INFO ] waiting for more data...
[2011/08/27 01:44:04 INFO ] got element to save: {"epoch":1313913600,"weight":78000,"username":"whatever"}
[2011/08/27 09:00:24 INFO ] performing initial transfer if needed...
[2011/08/27 09:00:24 INFO ] waiting for more data...
==> /var/log/supervisor/saver-stdout---supervisor-iQDgpA.log <==
==> /var/log/supervisor/supervisord.log <==
2011-08-27 01:42:18,703 INFO spawned: 'saver' with pid 19587
2011-08-27 01:42:18,713 INFO spawned: 'exporter' with pid 19588
2011-08-27 01:42:19,914 INFO success: saver entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2011-08-27 01:42:19,943 INFO success: exporter entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2011-08-27 09:00:22,067 INFO stopped: saver (terminated by SIGTERM)
2011-08-27 09:00:22,070 INFO stopped: exporter (terminated by SIGTERM)
2011-08-27 09:00:24,079 INFO spawned: 'saver' with pid 19729
2011-08-27 09:00:24,086 INFO spawned: 'exporter' with pid 19730
2011-08-27 09:00:25,426 INFO success: saver entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2011-08-27 09:00:25,426 INFO success: exporter entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
69
&#xC8; utile riferire il contenuto della presentazione ad un esempio di massima... ed in questo caso mi riguarda da vicino!\n
Sicuramente non ve ne sarete accorti, ma sono un tantino sovrappeso. L&#x2019;idea &#xE8; quella di un sistema per la registrazione giornaliera del mio peso... quantomeno per vergognarmi a dovere!\n
Il sistema &#xE8; costituito da quattro blocchi funzionali separati: un front-end per l&#x2019;interazione con gli utenti, un database &#x201C;no SQL&#x201D; per memorizzare i dati dell&#x2019;ultimo mese, un back-end per le operazioni dietro le quinte ed un database SQL per registrare i dati da qui all&#x2019;eternit&#xE0;. Certo, un&#x2019;architettura un po&#x2019; roboante per registrare una sola misurazione al giorno, ma diciamo che vista la stazza il sistema si potrebbe appesantire rapidamente.\n
L&#x2019;interazione dell&#x2019;utente &#xE8; con il Front-End attraverso l&#x2019;utilizzo di un comune browser; il Front-End interagisce a sua volta con il database &#x201C;no SQL&#x201D; (redis in particolare) per sia per visualizzare i dati relativi all&#x2019;ultimo mese che per registrarne di nuovi. In particolare, si pu&#xF2;: visualizzare i dati mensili di ciascun utente, inserire una nuova misura oppure richiedere l&#x2019;export dei dati storici relativi ad un utente (questo export verr&#xE0; spedito via email a cura del Back-End).\n
Redis implementa un meccanismo Sottoscrizione/Pubblicazione molto comodo per gestire delle code; il Back-End &#xE8; impostato per ascoltare le notifiche tanto in relazione all&#x2019;inserimento/aggiornamento dei dati di peso di un giorno (per salvarli nel database completo) quanto per ricevere le richieste di export dei dati. In entrambi i casi viene utilizzata una lista per trasferire i dati secondo una gestione a coda, ed il meccanismo di notifica per evitare che il Back-End faccia richieste continue per vedere se ci sono nuovi dati.\n
Come conseguenza dell&#x2019;inserimento/aggiornamento di uno o pi&#xF9; dati di peso, il Back-End consuma la coda relativa ai &#x201C;new-weights&#x201D; provvedendo all&#x2019;inserimento nel database MySQL. Una volta terminato si rimette in ascolto aspettando la notifica successiva.\n
Analogamente, il Back-End consuma anche la coda di richieste di export dei dati, provvedendo a raccogliere i dati dal database per l&#x2019;utente richiesto, formattarli come file CSV e spedirli via email all&#x2019;indirizzo passato dal Front-End nella richiesta di export.\n
I quattro elementi base dell&#x2019;architettura sono stati implementati con tecnologie differenti: Perl/Dancer per il Front-End e Perl &#x201C;semplice&#x201D; per il Back-End, oltre ovviamente ai due database basati su Redis e MySQL.\n
Il problema ora &#xE8; che questo marchingegno dovrebbe essere messo da qualche parte a cui posso accedere facilmente ovunque mi trovi...\n
... il che poi non &#xE8; l&#x2019;unico problema, perch&#xE9; dovr&#xF2; anche capire come far&#xF2; a mettere tutti questi elementi differenti...\n
... per non parlare del fatto che tutto questo processo mi richieder&#xE0; plausibilmente una bella fetta di tempo.\n
E qui, finalmente, dopo solo 13 slide... arriviamo a dotCloud.\n
La homepage &#xE8; piuttosto invitante: sono disponibili tante combinazioni in &#x201C;stack&#x201D; applicativi differenti in una piattaforma di controllo e gestione unica, il che sembra l&#x2019;ideale per ospitare la nostra applicazione che &#xE8; basata su quattro elementi differenti fra loro. Fortunatamente - altrimenti questa presentazione avrebbe avuto seri problemi - questi quattro elementi che abbiamo scelto sono tutti supportati.\n
Di cloud c&#x2019;&#xE8; molto da parlare, soprattutto perch&#xE9; dopo il calcio sembra un argomento in cui ognuno ha una sua idea. All&#x2019;interno della tassonomia pi&#xF9; classica - l&#x2019;Infrastruttura come Servizio, la Piattaforma come Servizio, il Software come Servizio - dotCloud si colloca decisamente come un un fornitore di Piattaforma, ossia strizza l&#x2019;occhio allo sviluppatore dandogli un ambiente che NON deve gestire a pi&#xF9; basso livello (come sarebbe successo con IaaS, ad esempio Amazon EC2 o Rackspace Servers) ma che gli consente di implementare la propria applicazione, non di utilizzarne una gi&#xE0; costruita (come avviene tipicamente con SaaS).\n
Di cloud c&#x2019;&#xE8; molto da parlare, soprattutto perch&#xE9; dopo il calcio sembra un argomento in cui ognuno ha una sua idea. All&#x2019;interno della tassonomia pi&#xF9; classica - l&#x2019;Infrastruttura come Servizio, la Piattaforma come Servizio, il Software come Servizio - dotCloud si colloca decisamente come un un fornitore di Piattaforma, ossia strizza l&#x2019;occhio allo sviluppatore dandogli un ambiente che NON deve gestire a pi&#xF9; basso livello (come sarebbe successo con IaaS, ad esempio Amazon EC2 o Rackspace Servers) ma che gli consente di implementare la propria applicazione, non di utilizzarne una gi&#xE0; costruita (come avviene tipicamente con SaaS).\n
Non rimane che iscriversi, tanto &#xE8; gratuito...\n
... anche se dovrete riempire un po&#x2019; di scartoffie digitali.\n
Se avete un account, potete entrare e trovare la roboante &#x201C;dashboard&#x201D; di ingresso...\n
... ossia una pagina piuttosto anonima che vi invita ad installare il programma di controllo a linea di comando. Questa pagina dovr&#xE0; cambiare, spero non sia avvenuto prima di questo talk!\n
Lo strumento principale di interazione con dotCloud &#xE8; - secondo il principio della minima sorpresa - un programma che si chiama dotcloud.\n
Installarlo dovrebbe essere piuttosto semplice, visto che il modo consigliato per farlo &#xE8; utilizzare un altro programma chiamato &#x201C;easy_install&#x201D;. Diciamo che quanto a marketing siamo sulla strada giusta... ma il marketing non basta.\n
\n
\n
\n
\n
\n
Non ostante easy_install sia supportato anche da versioni precedenti di Python, per utilizzare dotcloud (il programma) &#xE8; necessario avere Python 2.7 almeno, ma non Python 3.\n
Questo pu&#xF2; essere un problema per parecchi, perch&#xE9; se siete dei nostalgici come me starete utilizzando una distribuzione che probabilmente ancora non include questa versione di Python. A me &#xE8; toccato installarlo a mano. Dunque easy_install &#xE8; un ottimo gestore... il problema &#xE8; tutto quello su cui poggia! Sarebbe stato bello avere pythonbrew... o quantomeno sapere se c&#x2019;erano alternative.\n
Siamo pronti per creare la nostra prima applicazione. Il principio della minima sorpresa continua a spadroneggiare, perch&#xE9; basta lanciare il sottocomando &#x201C;create&#x201D; dando il nome della nostra applicazione.\n
L&#x2019;applicazione, in particolare, &#xE8; stata organizzata in una struttura come quella in figura: il Front-End ha una sua directory &#x201C;www&#x201D;, il Back-End una sua &#x201C;backend&#x201D;. Oltre a queste due cartelle si nota la presenza di un file di configurazione YAML il cui nome lascia sospettare la sua destinazione.\n
Il file &#xE8; in effetti quanto verr&#xE0; utilizzato per costruire il nostro stack applicativo.\n
In particolare possiamo riconoscere, a livello pi&#xF9; elevato, i differenti servizi necessari per realizzare la nostra applicazione. Per ciascun servizio viene specificato il &#x201C;type&#x201D;, ossia &#x201C;perl&#x201D; per applicazioni di Front-End web, &#x201C;perl-worker&#x201D; per applicazioni di Back-End in Perl, redis e mysql per i due tipi di database.\n
Nel file specifichiamo anche che le directory di base per Front-End e Back-End sono separate, in modo che possiamo avere una struttura pulita. DotCloud sapr&#xE0; quindi che nelle macchine dove verr&#xE0; realizzato il Front-End la directory di riferimento sar&#xE0; &#x201C;www&#x201D;, mentre in quelle del Back-End sar&#xE0; &#x201C;backend&#x201D;.\n
Il tipo di servizio &#x201C;perl&#x201D; &#xE8; orientato alla realizzazione di Front-End di tipo web basati, per l&#x2019;appunto, su Perl. Il modello di riferimento in questo caso &#xE8; quello dell&#x2019;interfaccia PSGI, che costituisce un porting piuttosto felice nel mondo Perl di idee nate in ambito Ruby/Python. Non ostante la directory abbia vari elementi, quelli realmente interessanti per dotCloud sono due: app.psgi e Makefile.PL.\n
app.psgi, in particolare, &#xE8; l&#x2019;applicazione web vera e propria. Deve SEMPRE esistere in un servizio dotCloud di tipo &#x201C;perl&#x201D;. Nel caso specifico si &#xE8; utilizzato il framework Dancer, molto comodo e costruito in modo da rispettare l&#x2019;interfaccia PSGI. Come si potr&#xE0; intuire, la vera &#x201C;ciccia&#x201D; dell&#x2019;applicazione si trova all&#x2019;interno del modulo &#x201C;whatever&#x201D;, che - l&#x2019;avrete gi&#xE0; indovinato - &#xE8; nella directory lib. In realt&#xE0; qui per&#xF2; pu&#xF2; esserci qualunque cosa che possa essere considerata aderente alle specifice PSGI.\n
L&#x2019;altro file molto importante - per quanto tecnicamente non obbligatorio - &#xE8; Makefile.PL. Va generato in maniera analoga a quanto si farebbe per una distribuzione su CPAN; come in quel caso, quindi, &#xE8; utile perch&#xE9; contiene una sezione PREREQ_PM dove possiamo andare ad inserire tutti i prerequisiti della nostra applicazione web.\n
La tipologia di servizio &#x201C;perl-worker&#x201D; &#xE8; anch&#x2019;essa basata su Perl, ma &#xE8; orientata all&#x2019;esecuzione di programmi di lunga durata (demoni). Anche in questo caso il file Makefile.PL pu&#xF2;/deve essere utilizzato per specificare i requisiti in termini di moduli da installare, altrimenti il perl che avremo a disposizione non ci permetter&#xE0; di lavorare.\n
Il file pi&#xF9; peculiare in questo caso &#xE8; per&#xF2; supervisord.conf, che non &#xE8; altro che il file di configurazione del progamma supervisord. Tramite questo file possiamo specificare quanti programmi devono essere eseguiti contemporanemente e monitorati per controllare che vengano tenuti in esecuzione. Ovviamente potrete soddisfare ogni vostra curiosit&#xE0; su http://supervisord.org/; nel caso in questione, basta notare che per ciascun demone c&#x2019;&#xE8; un titolo con il nome da dare ed una riga &#x201C;command&#x201D; dove specifichiamo cosa va eseguito.\n
Avrete sicuramente fatto caso che nella specifica dei comandi compaiono dei percorsi piuttosto curiosi. Ebbene s&#xEC;, poich&#xE9; questi programmi verranno eseguiti su delle macchine... queste macchine hanno un filesystem ed i vostri programmi del Back-End li troverete proprio l&#xEC;!\n
In particolare, quando la vostra applicazione viene distribuita, all&#x2019;interno della macchina del Back-End (nel Front-End &#xE8; analogo) viene creata una directory con la directory base che ha un nome non anticipabile. Il sistema di dotCloud, per&#xF2;, vi garantisce che verr&#xE0; anche creato un link simbolico che da /home/dotcloud/current punta verso la directory principale del servizio.\n
In poche parole, /home/dotcloud/current non fa altro che puntare a quella sottodirectory che abbiamo specificato come &#x201C;approot&#x201D; nel file di configurazione dotcloud.yml.\n
Abbiamo capito cosa succede a Front-End e Back-End... ma per i database che succede? In realt&#xE0; vengono create delle macchine virtuali &#x201C;speciali&#x201D; anche in quel caso - la specialit&#xE0; risiede nel fatto che le macchine di tipo &#x201C;redis&#x201D; contengono il server ed il client Redis e quelle di tipo MySQL... lo avrete gi&#xE0; indovinato.\nIl problema per&#xF2; &#xE8;: come ci si connette a questi due database? Dove stanno, soprattutto?\n
Per rispondere a queste domande dobbiamo tornare alla struttura delle directory che ci troviamo nelle macchine del Front-End e del Back-End. Abbiamo gi&#xE0; detto che /home/dotcloud/current punta alla directory specificata come approot per ciascuna applicazione, ma nella directory /home/dotcloud ci sono altri due file interessanti: environment.yml (in formato YAML) ed environment.json (in formato JSON).\n
Molto prosaicamente, questi due file contengono entrambi le informazioni necessarie per raggiungere i servizi dati del nostro stack, includendo cio&#xE8; gli indirizzi di dove si trovano, su quale porta sono in ascolto e quali sono le credenziali di accesso.\n
A questo punto, a seconda che ci piaccia di pi&#xF9; JSON o YAML, &#xE8; facile scrivere una routine che va a leggere il file di configurazione giusto per caricare le differenti variabili che ci servono per la connessione.\n
Per Redis avremo bisogno della password e dei dettagli sulla connessione, ossia il nome della macchina su cui &#xE8; ospitato il nostro servizio e la porta. Nel restituire un oggetto Redis facciamo anche un favore all&#x2019;utente e &#x201C;sblocchiamo&#x201D; la connessione inviando la password.\n
Incidentalmente, &#x201C;get_redis&#x201D; fa ridere. Beh, almeno MI fa ridere.\n
\n
Per la connessione MySQL il discorso &#xE8; analogo: basta andare a prendere le variabili giuste dalla configurazione caricata e creare l&#x2019;oggetto utilizzando il modulo DBI. Il resto &#xE8; roba standard.\n
Questo codice &#xE8; in realt&#xE0; utile tanto al Front-End quanto al Back-End... dove collocarlo? Occorre duplicare?\n
L&#x2019;aspetto interessante &#xE8; che sia l&#x2019;istanza di Front-End che quella di Back-End contengono in realt&#xE0; tutto il codice, ossia anche quello dell&#x2019;altra istanza. Analogamente a quanto succede con /home/dotcloud/current (che punta alla appdir impostata nel file dotcloud.yml), l&#x2019;infrastruttura di dotCloud crea anche un link simbolico che da /home/dotcloud/code punta alla directory principale della distribuzione.\n
Con questi presupposti, dunque, la soluzione pi&#xF9; semplice &#xE8; quella di aggiungere un&#x2019;area comune a cui i vari servizi possono attingere.\n
Nel caso specifico, per&#xF2;, c&#x2019;&#xE8; un modulo su CPAN che serve proprio a questo scopo...\n
... ma non ne parleremo oltre, visto che si tratta di autopromozione!\n
\n
Per andare in produzione &#xE8; sufficiente &#x201C;spingere&#x201D; la nostra applicazione su dotcloud. La prima volta verranno normalmente inizializzati gli ambienti caricando i vari moduli impostati nei prerequisiti, quindi ci metter&#xE0; un po&#x2019; di tempo; successivamente dovrebbe essere pi&#xF9; rapido, a meno di non aggiungere svariati altri prerequisiti.\n
Nel caso dell&#x2019;esempio io utilizzo git, per cui dotcloud &#x201C;sa cosa fare&#x201D; e prende i file da git. Questo &#xE8; un punto su cui occorre fare attenzione, perch&#xE9; per default va a prendere il ramo &#x201C;master&#x201D; e non &#xE8; detto che sia quello su cui state lavorando o che sia quello che volete effettivamente attivare su dotCloud.\n
Se utilizzate mercurial il comportamento &#xE8; analogo.\n
In alternativa potete non utilizzare nessuno dei due, nel qual caso il meccanismo di invio scelto da dotcloud sar&#xE0; rsync.\n
\n
Nel tempo di questa breve digressione il caricamento dell&#x2019;applicazione dovrebbe essere terminato.\n
Il programma dotcloud mette a disposizione vari comandi; in questa fase, &#xE8; utile vedere cosa sia stato effettivamente creato per la nostra applicazione - ossia il nostro &#x201C;stack&#x201D; - e dove sia possibile raggiungerla con il browser.\nIl comando list, nell&#x2019;esempio, riporta una cosa interessante: per ciascun servizio &#xE8; stata attiva un&#x2019;istanza. Queste istanze altro non sono che macchine virtuali attivate nella nuvola di Amazon EC2.\n
Certo, la grafica lascia a desiderare... ma ad occhio e croce il Front-End funziona visto che riporta anche un elenco degli utenti presenti ed un paio di registrazioni.\n
Il comando &#x201C;info&#x201D; &#xE8; molto utile per avere informazioni generali sui vari servizi. Avrete notato che il nome dei servizi &#xE8; composto dal nome dell&#x2019;applicazione, un punto e poi il nome del servizio vero e proprio all&#x2019;interno dell&#x2019;applicazione. In questo modo potete avere dei servizi &#x201C;backend&#x201D; in tutte le applicazioni, senza che questi si disturbino fra loro.\n
\n
Il comando run torna immediatamente utile perch&#xE9; c&#x2019;&#xE8; un&#x2019;ultima cosa che &#xE8; stata lasciata in sospeso nelle basi dati. Con Redis non c&#x2019;&#xE8; bisogno di inizializzazione perch&#xE9; sostanzialmente &#x201C;autovivifica&#x201D;, ma con MySQL occorre definire una tabella, altrimenti &#xE8; difficile scriverci qualcosa.\nUtilizzando il comando info possiamo vedere la password - analogamente potremmo entrare nel Front-End o nel Back-End e leggerla dentro il file environment.*, ma a che pro se esiste un comando apposito?\nCon il comando run possiamo invece lanciare qualsiasi comando remoto; in questo caso, dunque, lanciamo il client di mysql per poter definire la tabella dove il Back-End salva i dati. Certo, certo: alla creazione della tabella potrebbe provvedere il Back-End stesso, ma poi come mostravo il comando run?\n
Ovviamente nessuno di noi pensa che andr&#xE0; liscia al primo tentativo. Nemmeno nei 100 successivi, per la verit&#xE0;.\n
Il primo santo a cui votarsi &#xE8; il comando logs, che ci consente di vedere i log specifici di ciascun servizio.\n
Nel Back-End, ad esempio, d&#xE0; una visione contemporanea di tutti i file nella directory /var/log/supervisor/, ossia dei log dei nostri programmi pi&#xF9; il log del supervisord stesso. Potete decidere di salvare i log da qualche altra parte, ma &#xE8; particolarmente comodo utilizzare STDERR e lasciare che vengano messi in un posto dove possono essere raccolti facilmente con il comando logs.\n
Che fare se i log non bastano? A parte la consueta chiodata, ovviamente?\n
Beh, il comando run pu&#xF2; tornare utile anche in questa occasione.\n
In particolare, tramite run possiamo eseguire comandi nell&#x2019;istanza remota, quindi &#xE8; un po&#x2019; come avere una shell a disposizione. Magari un po&#x2019; lenta, visto che si dove riconnettere ad ogni comando.\n
Che fare quindi se vogliamo andare oltre?!?\n
Beh, non rimane che entrare da terminale sull&#x2019;istanza che ospita il servizio che fa le bizze.\n
No, l&#x2019;accesso come root non &#xE8; contemplato.\n
A seconda dell&#x2019;istanza troveremo ovviamente un ambiente differente con programmi differenti a disposizione. Ad esempio, redis-cli &#xE8; disponibile nell&#x2019;istanza di tipo &#x201C;redis&#x201D; ma non nell&#x2019;istanza del backend - anche se avrebbe fatto comodo.\n
Trovo che Pitfall! fosse un gioco stupendo, ma occorre stare attenti a non cadere!\n
Una delle noie maggiori che ho trovato &#xE8; il fatto che occorre sempre fare &#x201C;git commit&#x201D; prima di effettuare il push, altrimenti dotcloud non prende le modifiche nella directory di lavoro. Stiamo ovviamente parlando del caso in cui venga utilizzato git.\n
\n
Un&#x2019;alternativa molto rapida e molto comoda quando si stanno facendo prove &#xE8; utilizzare &#x201C;--all&#x201D;. In questo modo viene ignorato il meccanismo di base della distribuzione e viene sempre utilizzato rsync.\n
L&#x2019;altro aspetto a cui prestare attenzione &#xE8; che il push normalmente prende il ramo &#x201C;master&#x201D;, per cui se si lavora ad un altro ramo occorre ricordarsi di includere il nome del ramo giusto. Questa la trovo una mancanza, poich&#xE9; &#xE8; semplice sapere quale sia il ramo attivo di una directory di lavoro; probabilmente per&#xF2; per chi ci lavora &#x201C;sul serio&#x201D; &#xE8; un meccanismo di protezione, per cui non borbotter&#xF2; oltre.\n
Dopo averci dato tanta libert&#xE0;... purtroppo dotCloud ha posto anche delle restrizioni.\n
Da poco tempo &#xE8; infatti uscito il prezziario. &#xC8; proprio vero che una volta si stava meglio: se si entrava nella beta, infatti, si poteva giocare molto. Ora sembra che il piano gratuito consenta di avere al massimo due servizi... che fine far&#xE0; il mio carrozzone che ne ha quattro?\n
\n
Certo, si pu&#xF2; sempre barare...\n
... ad esempio creando account multipli ed utilizzando un servizio di directory centralizzato dove vengono salvate le configurazioni di tutte le applicazioni (i file &#x201C;environment.*&#x201D; per intenderci). Un esempio di una directory di questo tipo &#xE8; nel link nella slide e - senza nemmeno dirlo - l&#x2019;applicazione &#xE8; fatta per girare su dotcloud utilizzando due servizi.\n