Come usare rsync, esempi pratici

Spesso abbiamo bisogno di sincronizzare il contenuto di due directory o copiare il contenuto di una nell’altra. Anziché usare un semplice metodo di copia (come cp), è possibile spostare solo i file differenti fra le due, risparmiando tempo e banda. Rsync (Remote sync) è il migliore strumento in Linux/Unix per effettuare backup incrementali spostando solo i file nuovi o modificati, o tenere sempre sincronizzate due cartelle, locali o remote che siano. In questo articolo capiremo prima il comando in generale, le opzioni e forniremo alcuni esempi pratici.

Prima di tutto, occorre sapere che rsync ha numerosi vantaggi:

  • Copia o sincronizza file da e verso sistemi remoti in modo efficiente
  • Supporta la copia dei permessi, timestamp e symolic links
  • È più veloce di scp (Secure Copy) perché lavora in accordo con il server che invia/riceve soltanto i file che sono cambiati
  • Permette di risparmiare banda perché utilizza un sistema di compressione

Il comando rsync

ad esempio:

Trasferiamo tutti i file contenuti nella directory sorgente ~/Desktop/devdev alla directory di destinazione /Volumes/DiscoEsterno/Backup. Alla prima esecuzione, rsync copierà l’intero contenuto, dato che la directory destinazione è vuota. Nei casi successivi, ogni file che avrà subito modifiche nella cartella sorgente verrà sovrascritto in quella di destinazione. In questo caso abbiamo usato le opzioni -vrah, vediamo cosa significano.

Opzioni comuni

-v significa verbose, avremo più informazioni a schermo

-r significa recursive, con questa opzione rsync leggerà nelle cartelle

-h trasforma in byte in un formato più leggibile (es. Mb, Gb)

-a significa archive. Questa modalità corrisponde a scrivere -rlptgoD e riporta tutte le condizioni originali del file dalla destinazione alla sorgente come timestamp, link simbolici, permessi, proprietario e gruppo

-z dice a rsync di comprimere i dati trasmessi

--delete dice a rsync di cancellare sulla destinazione i file non presenti nella sorgente

--exclude dice a rsync quali file o directory ignorare

--progress mostra a schermo il trasferimento dei file

-u imposta che i file presenti in destinazione più nuovi di quelli contenuti in sorgente vengano ignorati

Sincronizzazione tra due directory locali

In questo esempio sincronizziamo la directory ~/Desktop/Grafica con /Volume/DiscoEsterno/backup, con le opzioni verbose, recursive e archive.

La cartella di destinazione non esisteva, rsync l’ha creata automaticamente.

Visualizzare l’avanzamento del trasferimento

Se vogliamo visualizzare l’avanzamento durante il trasferimento, è sufficiente usare l’opzione --progress

Esclusione di file o directory

Con l’opzione --exclude, possiamo specificare quali file, tipi di file o directory escludere dalla sincronizzazione. In quest’esempio abbiamo scelto di ignorare i file “.DS_Store” creati dal sistema macOS usando l’opzione --exclude=.DS_Store.

L’opzione –delete

Se un file o directory non esiste nella sorgente, ma esiste già nella destinazione, con l’opzione --delete possiamo cancellarlo da quest’ultima.

Effettuare una simulazione (dry run)

Se è la prima volta che usiamo rsync, oppure vogliamo avere un’anteprima di cosa succederà una volta eseguito, è possibile simulare un comando rsync per assicurarci di non esguire operazioni errate. Aggiungiamo l’opzione --dry-run

Sincronizzare una directory remota via SSH

Con rsync, possiamo usare SSH (secure shell) come modalità di trasferimento: usare il protocollo SSH ci garantisce che i nostri dati viaggino su un canale sicuro e criptato, in modo che nessuno possa leggere i dati mentre vengono trasmessi. Per specificare che si tratta di una connessione SSH, dobbiamo includere l’opzione -e ssh ed indicare destinazione o sorgente in modo appropriato.

Inoltre il prompt dei comandi ci chiederà la password dell’utente (in esempio root) quando effettuiamo il trasferimento, che avverrà sempre in modo sicuro.

Cancellare il contenuto una volta trasferito

In qualche caso potremmo decidere di cancellare automaticamente il contenuto di sorgente una volta che il trasferimento in destinazione sia avvenuto con successo. Per farlo, specifichiamo --remove-source-files tra le opzioni

Impostare un limite di banda (bandwidth limit)

Quando effettuiamo sincronizzazioni tra directory remote, a volte è necessario impostare un limite di velocità. Pensiamo ad esempio ad un backup remoto in esecuzione mentre stiamo lavorando: limitiamo la banda in upload con l’opzione --bwlimit=KBPS, esempio:

In questo modo limiteremo la banda a 100Kb/s.

Qui la documentazione completa.

 

Scriveteci pure un commento per ulteriori casi o domande.

Come modificare il Post Type in WordPress

Spesso abbiamo la necessità di modificare il tipo di elemento in WordPress. Pensiamo un comune blog: spesso è necessario trasformare Pagine in Articolo oppure il contrario, Articoli in Pagine. È un operazione che WP non permette direttamente, ma che possiamo eseguire attraverso un comodo e collaudato plugin, il Post Type Switcher.

Una volta installato ed attivato, nella colonna Pubblica di WordPress, ci apparirà una tendina dalla quale selezionare il tipo di elemento. Se, ad esempio, avete creato un Post che volete far diventare un Articolo, modificate quest’ultimo e selezionate Post dalla tendina, come nell’immagine seguente:

 

 

 

Conoscere il percorso PATH in Unix e aggiungere una directory

La variabile PATH  (o $PATH) in ambiente Unix consiste in una lista di directory separate da due punti che la nostra shell cerca nel momento in cui eseguiamo un comando. I programmi (eseguibili) sono posizionati in varie cartelle all’interno dei sistemi Unix, per questo motivo avere più directory ci da più possibilità che il sistema trovi il comando, per evitare un “Command not found”. Per conoscere i percorsi, digitiamo nella shell

Avremo un risultato simile a questo

Se, ad esempio, digitiamo il comando ls , la shell cercherà l’esecutivo all’interno di queste cartelle in ordine: prima in /usr/local/bin, poi /usr/bin, successivamente in /bin, poi in /usr/sbin e /sbin e infine nella cartella in cui ci troviamo al momento dell’esecuzione del comando ls.

Aggiungiamo una directory

Se vogliamo aggiungere una directory in cui il sistema deve cercare, possiamo accodare alla variabile $PATH una nuova directory con il comando

sostituendo /dir/nuovadirectory con il percorso reale.

Convertire le immagini in bianco e nero in CSS

Togliere la saturazione ad un’immagine è operazione molto semplice con il giusto filtro CSS. Per applicarlo applichiamo all’immagine una regola come questa:

Applichiamola in questo modo a qualsiasi immagine

Da quali browser è supportata questo effetto? Secondo i dati di caniuse.com, Chrome, Firefox, Safari, Opera, iOS e Android sia desktop che mobile supportano a pieno il filtro, mentre Internet Explorer e Microsoft Edge possono avere qualche problema. Vediamo come aggirare il problema usando un filtro SVG.

Creiamo un file chiamato biancoenero.svg , incolliamo questo testo nel file. Stiamo creando un file grafico SVG contenente un layer traslucido che applicheremo via CSS sulle immagini.

Modifichiamo quindi la classe .biancoenero  creata in precedenza in questo modo

Fatto. La nostra classe è perfettamente cross-browser e vi permetterà di rendere visivamente qualsiasi immagine in bianco e nero. Potrete anche modificare la percentuale di desaturazione intervenendo sulla percentuale, usando ad esempio 50%  anziché 100% .

Usare la compressione gzip in Apache e nginx per aumentare la velocità

La velocità di caricamento sembra essere sempre più il centro focale del web. Come vi abbiamo già raccontato, costruire un sito veloce ha molteplici aspetti positivi e incide radicalmente sulla UX, sul SEO, e sulla fedeltà degli utenti, specialmente se sono Mobile.

Uno dei più importanti processi alla base dell’ottimizzazione della velocità di caricamento è sicuramente la compressione HTTP, ovvero la capacità del server di inviare all’utente le pagine (e in generale i contenuti statici come le immagini e gli script) come contenuto compresso, in modo che il browser stesso li decomprima e li visualizzi. Per farlo ci deve essere un’intesa tra il browser dell’utente, che dice al server quali formati è in grado di leggere, e il server che gli risponde in uno dei formati possibili. Teniamo presente che tutti i browser moderni sono capaci di accettare vari tipi di compressione e tutti sono capaci di adattarsi alle varie richieste.

In questo tutorial ci focalizzeremo sulla compressione gzip, una delle più diffuse ed efficaci e vedremo come abilitarla a livello server e controllare che la compressione sia attiva. In più eseguiremo un test finale per capire quanto è efficace la compressione http. Studieremo come abilitarla sui più diffusi webserver, ovvero Apache ed nginx

Apache usa due moduli principali per la compressione e decompressione:

  1. mod_deflate
  2. mod_gzip

Entrambi usano lo stesso algoritmo di base ed ottengono risultati praticamente identici. Tuttavia, nelle recenti versioni di Apache 2.x.x troviamo già installato mod_deflate e questo è già un vantaggio in termini di velocità di sviluppo. In ogni caso, per verificare che il modulo sia installato, lanciamo uno di questi comandi

oppure

Se nella lista è presente il deflate_module oppure il gzip_module siamo pronti per proseguire.

Abilitiamo gzip in Apache in .htaccess con mod_deflate

Per prima cosa, creiamo un file .htaccess, oppure apriamo il file già esistente. Aggiungiamo queste righe:

Abilitiamo gzip in Apache in .htaccess con mod_gzip

Le versioni più vecchie di Apache hanno installato di default il mod_gzip, con le stesse identiche funzionalità di mod_deflate. Se decidiamo di usare mod_gzip quindi, il procedimento è del tutto simile: creiamo un file .htaccess oppure apriamo il file già esistente. Aggiungiamo queste righe:

Abilitiamo gzip su nginx

Per abilitare gzip su nginx, è necessario intervenire sul suo file di configurazione generale. Se da un late impone una difficoltà maggiore, dall’altra è un setting universale che verrà applicato automaticamente su tutti i siti presenti sullo stesso server. Il file nginx.conf  è solitamente posizionato in /usr/local/nginx/conf/nginx.conf , /etc/nginx/nginx.conf  oppure /usr/local/etc/nginx/nginx.conf . Andiamo a modificarlo, ad esempio con l’editor vim

ed aggiungiamo queste direttive

Salviamo il file e riavviamo nginix con il comando

Come verificare se gzip è abilitato

A questo punto, non ci resta che verificare se i file statici vengono inviati al nostro browser in modalità compressa gzip. Se usate Chrome, accedete alla finestra Ispeziona (tasto destro sulla pagina). In Network, selezioniamo un file CSS o JS servito direttamente dal nostro server, se troviamo la stringa Content-Encoding: gzip  tra le Response Headers abbiamo correttamente abilitato la compressione.

 

Online sono presenti vari tool per verificare se gzip è abilitato, provate ad esempio checkgzipcompression.com

 

Disattivare pingback in WordPress

Cos’è un pingback? Pensiamolo come se fosse un commento automatico ad un articolo. Se l’articolo A contiene un link verso l’articolo B, tra i commenti di quest’ultimo apparirà un commento con il link all’articolo A, che lo ha citato. Non avrà una rilevanza particolare, ma apparirà semplicemente come un normale commento.

In principio questa tecnica veniva dritta-dritta da una specie di codice d’onore dei blog: un pingback arrivava quando qualcuno aveva trovato interessante un nostro articolo e l’aveva linkato nel suo. WordPress effettua anche i pingback interni, cioè tra due articoli dello stesso blog, e ciò può essere fastidioso e sostanzialmente non porta vantaggio. Vediamo come disabilitarli in entrambi i casi.

Posso disattivare i pingback interni?

Assolutamente sì. Il modo più pratico è quello di usare un plugin come No Self Pings. Una volta installato ed attivato non c’è nessuna opzione. I nostri articoli non faranno alcun pingback tra di loro.

Posso disattivare tutti i pingback?

Risposta affermativa. Non abbiamo bisogno di alcun plugin perché possiamo farlo direttamente da WordPress recandoci in Strumenti > Discussione  togliendo la spunta alla voce “Permetti le notifiche dei link da altri blog (pingback e trackback) sui nuovi articoli

Minimizzare CSS e Javascript con lo YUI Compressor

Lo YUI Compressor è uno strumento molto valido per alleggerire i file Javascript e CSS che serviamo agli utenti: è possibile cioè ridurne il peso tra il 20 e il 50% senza intaccarne le funzionalità, così da poterli integrare nei nostri progetti in piena sicurezza.

Esistono varie librerie dedicate alla minimizzazione, ma lo YUI Compressor resta quella con un maggior focus sulla riduzione di peso, che è il fattore che ci interessa maggiormente quando vogliamo ottenere le massime performance in termini di velocità di caricamento dell’intero sito.

Come funziona?

Lo YUI Compressor è scritto in Java, ed è basato sulla libreria open source Rhino, che serve per “far leggere” Javascript a Java stesso. Il sistema di compressione inizia analizzando il file leggendo il codice che abbiamo scritto. Cambia poi i nomi di variabili e funzioni sostituendoli con nomi più brevi dove possibile. Infine, toglie più spazi bianchi possibili e rimuove tutti i commenti. Pare poca cosa, ma in termini di velocità otterremo grandi benefici, ve lo assicuro. Vediamo come usarlo.

Installazione di Java

Per eseguirlo, abbiamo bisogno di avere installato Java JRE (Java Runtime Environment) sul nostro sistema. Se lo avete già fatto, passate al punto successivo.

Installazione di Java su Linux basati su Red Hat, CentOS o Fedora

Per installarlo, ci affidiamo al gestore pacchetti yum

Verifichiamo che l’installazione sia andata a buon fine

Installazione di Java su Linux basati su Ubuntu o Debian

Per installarlo, ci affidiamo al gestore pacchetti APT

Verifichiamo che l’installazione sia andata a buon fine

Installazione di Java su Windows

Procedete al download dal sito ufficiale ed installate il pacchetto. Al termine, riavviate la macchina.

Download di YUI Compressor

A questo punto non ci rimane che scaricare l’ultima versione del compressore, che consiste in un singolo file .jar, dalla pagina download ufficiale. Scarichiamo il pacchetto, manualmente oppure tramite il comando wget

Minimizziamo un file

A questo punto possiamo già utilizzare lo YUI Compressor, testiamolo quindi su un file javascript.

Abbiamo eseguito l’applicativo indicandogli come input il file file.js  e come file output avremo la sua versione minimizzata nel file  file-min.js . Il tipo di compressione (Javascript o CSS) è basato sull’estensione del file che stiamo minimizzando (.js oppure .css). Se i file che intendiamo processare non hanno una di queste estensioni, possiamo forzare il compressore ad un interpretare il tipo, usando l’opzione –type js oppure –type css

In questo caso un file javascript ha estensione .txt: diciamo al compressore di trattarlo come fosse un javascript (.js) e di mettere l’output minimizzato nel file file-min.js.

Opzioni disponibili

È possibile modificare il comportamento del compressore usando una o più opzioni. Per consultare la lista delle opzioni disponibili, digitiamo

Una delle più interessanti è sicuramente la modalità verbose che ci permette di ottenere dei piccoli suggerimenti su come ottimizzare il codice. Ad esempio, quando dichiariamo una variabile che non utilizziamo successivamente. Per abilitare la modalità verbose, aggiungiamo l’opzione –verbose

Fatto. Se volete soltanto provare lo YUI Compressor o utilizzarlo saltuariamente, sono disponibili diversi tool che vi permettono di utilizzarlo online, come questo.

Come installare una nuova versione PHP in Plesk (tutte le versioni)

Usare una versione di PHP aggiornata è fondamentale per due aspetti: il primo è la sicurezza. È straconsigliato evitare di continuare ad usare in produzione versioni non più ufficialmente supportate oppure obsolete che non ricevono più aggiornamenti di sicurezza. Il secondo, riguarda le opportunità che PHP offre a noi sviluppatori, come le nuove funzionalità che possiamo sfruttare per i nostri programmi.

PHP non si aggiorna automaticamente. Ogni versione è supportata per 2 anni dalla data della sua release stable. In questo periodo, bug e vulnerabilità vengono riportati continuamente e fixati con update regolari. Alla scadenza, la versione viene supportata per ulteriori 2 anni, rendendola sicura con i soli aggiornamenti critici. Dopo, la versione viene etichettata come End of life. Ecco la lista sempre aggiornata delle supported versions.

Se utilizziamo il Pannello Plesk, possiamo sfruttare le sue potenzialità per installare diverse versioni PHP contemporaneamente, e selezionare una specifica per ciascun sito ospitato sul server. A seconda della versione di Plesk attualmente installata sul server, le procedura cambia. Nel caso di Plesk 11.5 o precedenti, l’installazione comporterà un procedimento manuale da effettuare via shell SSH. Nel caso di Plesk 12, 12,5 oppure Onyx la procedura è automatizzata. Vediamo come fare in entrambi i casi.

Abilitare una nuova versione PHP in Plesk 11.5 Linux

Per prima cosa, colleghiamoci come root  via SSH al nostro server. Secondo, eseguiamo i seguenti comandi. In questa guida, installeremo PHP 5.6.30.

Procediamo poi a compilare ed installare

ed a preparare una versione standard del file php.ini

A questo punto, è consigliabile modificare il file php.ini a nostro piacimento: conterrà i setting di default che poi potranno essere sovrascritti dai singoli domini.

Ultimo passo è comunicare a Plesk che abbiamo a disposizione questa nuova versione, pronta per essere utilizzata:

Fatto. Da questo momento, sarà possibile selezionare nelle Impostazioni di ciascun dominio quale versione utilizzare.

Abilitare una nuova versione PHP in Plesk 12, 12.5 oppure Onyx

Finalmente, a partire dalla versione 12, Plesk ha uno strumento integrato per installare e gestire versioni PHP multiple direttamente dal pannello. Andiamo in Strumenti e impostazioni > Aggiornamenti e poi su Aggiungi/Rimuovi Componenti

Selezioniamo Web hosting > PHP interpreter versions, selezioniamo Installa accanto alla versione PHP desiderata. Clicchiamo su Continua per finalizzare l’installazione.

Fatto. Da questo momento, sarà possibile selezionare nelle impostazioni di ciascun dominio quale versione utilizzare.

Come evitare la cache dei CSS e Javascript

Spesso è indispensabile evitare che il browser degli utenti che visitano il nostro sito usi una versione vecchia dei fogli di stile CSS o dei file Javascript. Capita, quindi, che le modifiche apportate non vengano poi effettivamente visualizzate o eseguite dai nostri utenti. La cache, però, resta un fattore fondamentale per l’ottimizzazione delle prestazioni di un sito.

Come possiamo evitare la cache del browser?

Spesso lato server la cache viene gestita in modo molto conservativo, con la conseguenza che si tende a forzare troppo la scadenza troppo lunga dei contenuti, e da qui il problema di servire al browser file vecchi.

Supponiamo che la cache del CSS principale del sito abbia una durata di 7 giorni, ma abbiamo appena rilasciato un piccolo aggiornamento. Non potendo dire al browser dei visitatori “Svuota la cache!”, il trucco più semplice è fargli credere che il CSS sia diverso, modificando il nome dei file e quindi l’URL della risorsa chiamata.

https://miosito.it/css/screen.css  diventa https://miosito.it/css/screen.css?v2

Cambiando il nome del file, quindi, il browser, scaricherà una nuova copia di screen.css  e la metterà in cache, secondo le regole di durata preimpostate dal server. Quindi, se abbiamo intenzione di avere versioni future (ad esempio v3, v4, etc.) dovremmo ripetere l’operazione, cambiando nuovamente il nome del file.

Questo discorso vale per tutti i file statici, come javascript, HTML, file di testo, etc.

Evitare automaticamente il caching

Abbiamo capito, quindi, che basta cambiare il nome del file aggiungendo dei parametri fittizi del tipo screen.css?v2  per forzare il browser a scaricare una nuova versione di screen.css . Come possiamo automatizzare questo processo? Cambiando sistematicamente il nome del file ad ogni aggiornamento.

In questo esempio, screen.css  viene parametrato automaticamente con una stringa basata sulla data di modifica del file stesso. La funzione PHP filemtime restituisce l’ultima data di modifica del file in formato Unix timestamp. Ogni volta che pubblicheremo un nuovo screen.css , l’URL sarà diverso, evitando la cache.

La risorsa effettivamente chiamata sarà di conseguenza simile a questa:

screen.css?1489427332

Lo stesso principio, come detto, vale per tutti i tipi di file statici, come ad esempio script javascript

 

Novità di Chrome 57: il CSS Grid Layout e le Media Session API

Google ha appena rilasciato Chrome 57 per Windows, Mac e Linux. Tra le novità interessanti ci sono l’introduzione del sistema CSS Grid layout, nuove API e altre nuove funzioni per gli sviluppatori. Come al solito, potete scaricare l’ultima versione da google.com/chrome oppure lasciare che il browser stesso si auto-aggiorni. Con oltre 1 miliardo di utenti, Chrome è da considerarsi più una piattaforma che un browser. Per questo motivo è bene tenere d’occhio le novità per essere sempre pronti a sfruttarne i vantaggi in fase di sviluppo.

Una nuova throttling policy limita i timer attivi nelle schede in secondo piano, fino ad un massimo di 1 volta al secondo e limiterà il consumo di CPU all’1%. Le schede che riproducono audio, purtroppo, continueranno a funzionare. Questo dovrebbe assicurare un piccolo risparmio di batteria.

Ed eccoci alla novità più interessante di questa release: il CSS Grid Layout, un nuovo sistema a griglia per ottenere delle interfacce responsive. Gli elementi possono essere associati a larghezze predefinite su più colonne e righe e scalare sia in larghezza che in altezza. Se non l’avete già fatto, dato uno sguardo a questo nuovo standard. L’obiettivo è dare più controllo possibile agli sviluppatori sul comportamento alle varie grandezze schermo senza usare addon esterni.

Con le nuove Media Session API invece, potremo customizzare l’aspetto della lock screen (notifiche comprese) della sessione multimediale in corso: potremmo gestire il titolo del brano, il nome dell’artista, la copertina (atrwork) dell’album, etc. In più, ci sono nuove API per poter permettere al sito di rispondere all’azione dell’utente per skipping e seeking.

Curiosità: le taglie sui bug sono sempre presenti: per questa release Google ha sborsato 38.000 dollari!

Al prossimo aggiornamento per Chrome 58.