Come aggiornare il firmware del PC con Ubuntu

Una delle novità più importanti introdotta da Ubuntu 18.04 è la possibilità di aggiornare il firmware dei dispositivi grazie all’introduzione del tool fwupd.

Sono ormai passati i tempi in cui dopo aver installato Ubuntu era necessario perdere ore a trovare il modo per far riconoscere al sistema operativo tutte le periferiche connesse al PC. Chi non ha mai avuto problemi con i driver video o con il riconoscimento delle stampanti?
Con le ultime versioni del sistema operativo invece sempre più dispositivi sono riconosciuti e utilizzabili fin da subito con Linux.
L’ultimo tassello per avere una compatibilità perfetta con Linux era la mancanza di uno strumento che permettesse di aggiornare BIOS e UEFI (e in generale il firmware delle varie periferiche del PC) direttamente da Ubuntu.

Proprio sulla base di questa necessità è nato fwupd. Grazie a questo software open-source sviluppato da Richard Hughes è possibile installare gli aggiornamenti del firmware di sistema per i computer compatibili.
NOTA: per vedere se il tuo PC è compatibile puoi consultare questa lista.

In teoria la presenza degli aggiornamenti del firmware dovrebbe venire notificata insieme a quella degli altri aggiornamenti da GNOME Software.
Tuttavia mi sono reso conto che nel mio Dell XPS 13 9360 questi aggiornamenti non venivano rilevati.

Verificare manualmente la presenza di aggiornamenti

Per verificare manualmente la presenza di aggiornamenti per il proprio sistema basta aprire una finestra del terminale ed eseguire questi comandi:

  • La prima cosa da fare è accertarsi che il demone di fwupd sia in esecuzione:
sudo service fwupd start
  • A questo punto va rinfrescata la lista degli aggiornamenti disponibili:
sudo fwupdmgr refresh
  • Infine, se sono stati rilevati aggiornamenti, è possibile applicarli con questo comando:
sudo fwupdmgr update

Come puoi vedere con questi semplici 3 passaggi è possibile aggiornare il firmware di tutti i dispositivi del computer.
Nell’immagine sottostante puoi vedere come abbia provato in prima persona l’aggiornamento del firmware di sistema del mio computer e, se stai leggendo questo post, significa che il tool è affidabile e che non ci sono stati problemi durante l’upgrade.

Aggiornamento del firmware di sistema sul mio Dell XPS 9360

Se vuoi rimanere sempre aggiornato su ciò che posto in questo blog iscriviti al mio canale Telegram oppure, se hai bisogno di aiuto nel seguire questa guida o non ti è chiaro qualche passaggio puoi lasciarmi un commento qui sotto, scrivermi su Twitter oppure mandarmi direttamente a t.me/lorenzomillucci.

Effettuare il backup di un blog WordPress ospitato su Aruba

Visto il recente rilascio della nuovissima versione 5.0 di WordPress è buona prassi prima di effettuare l’aggiornamento effettuare un backup completo del proprio sito web.
Ho colto quindi l’occasione per riportare di seguito i passi da seguire per effettuare un backup completo (sito + database) di un blog ospitato su Aruba.

Backup dei file del sito

Il primo step che ho seguito per fare il backup completo è stato quello di scaricare tutti i file che costituiscono il sito web. Per farlo ho utilizzato il software open source FileZilla.

Abilitare l’accesso FTP

La prima cosa da fare è effettuare il login nel pannello di amministrazione di Aruba per poter abilitare l’accesso FTP. Infatti Aruba di default blocca gli accessi FTP provenienti dagli indirizzi IP che non sono specificati all’interno di una whitelist.
Per aggiungere il tuo indirizzo IP alla whitelist devi premere sul bottone “Gestione Accessi FTP” del pannello di amministrazione. Nella schermata di gestione ti verrà mostrato il tuo indirizzo IP corrente e ti verrà data la possibilità di aggiungerlo a quelli consentiti.

Aggiungi il tuo indirizzo IP alla whitelist

A questo punto puoi scaricare tutti  i file che costituiscono il tuo sito web utilizzando un programma per l’accesso FTP come ad esempio FileZilla.
NOTA: Per l’accesso dovrai indicare a FileZilla le credenziali che ti ha fornito Aruba al momento della registrazione del servizio di hosting.

Scarica tutti i file dal tuo FTP utilizzando un programma come FileZilla

Backup del Database

Per effettuare il backup del database devi sempre fare l’accesso al pannello di amministrazione di Aruba e selezionare dal menù la voce “Database” e poi premere il bottone “gestisci”. A questo punto, dopo aver fatto il login, ti verrà mostrato il pannello di controllo del database.

Pannello di controllo del database

Per effettuare il backup completo del database ti basta premere il bottone “esporta” dal menù orizzontale in alto e poi confermare l’esportazione.

Conclusione

Una volta terminato il download dei file del sito e il download del dump del database il backup è completo e siamo pronti ad aggiornare il blog a WordPress 5.0.
Nel caso in cui dovessero insorgere problemi durante il processo di update potrai sempre ripristinare la versione precedente grazie al backup che hai appena effettuato.
PS: se stai vedendo questo post vuol dire che l’aggiornamento di questo blog a wordpress 5.0 ha avuto successo 🙂

Installare Enpass su Ubuntu e aggiustare la visualizzazione su schermi HiDPI

Oggi sul blog del disinformatico ho vista riportata questa notizia: la centrale d’annuncio e d’analisi per la sicurezza dell’informazione (MELANI) della Svizzera dice esplicitamente che “Chi utilizza la stessa password più volte agevola i cyber criminali”.

Dopo aver letto l’articolo ho pensato che la soluzione a questo tipo di problemi è l’utilizzo di un password manager con cui generare password uniche, lunghe e non facilmente indovinabili da un potenziale malintenzionato.

Enpass è il password manager che utilizzo quotidianamente da ormai 3-4 anni. Nel corso del tempo ho provato diversi password manager ma alla fine ho deciso di utilizzare Enpass per i seguenti motivi:

  • E’ multipiattaforma: visto che mi trovo spesso a lavorare con Linux, Mac e Windows mi serviva assolutamente qualcosa che funzionasse al 100% con questi sistemi operativi. Inoltre il fatto che sia compatibile anche con android, iOS e windows phone sono delle gradite aggiunte.
  • E’ gratis: utilizzare Enpass su computer non costa nulla, i client per i dispositivi mobile hanno un costo di 9,99€ da pagare una tantum. (di solito intorno a Natale fanno anche qualche sconto, quindi può valere la pena di controllare in questi giorni)
  • E’ integrato con i browser: per inserire le password all’interno delle pagine web non è necessario fare manualmente copia/incolla dal programma ma basta premere la combinazione ctrl+\ (personalizzabile) per fare in modo che Enpass autocompili la pagina con le credenziali d’accesso.
  • E’ cloud: in realtà Enpass non ha un cloud proprio per la sincronizzazione automatica delle password tra i vari dispositivi. Tuttavia dall’applicazione è possibile integrarsi con i più disparati servizi per la sincronizzazione di file  (io ad esempio mi appoggio a dropbox per la sincronizzazione, ma è possibile utilizzare altri provider come: google drive, one drive ecc…)

Installazione su Ubuntu

La prima cosa da fare per installare Enpass su Ubuntu è aggiungere il repository alla lista di quelli controllati tramite il seguente comando:

echo "deb http://repo.sinew.in/ stable main" | sudo tee /etc/apt/sources.list.d/enpass.list

Subito dopo devi aggiungere anche la chiave necessaria alla verifica di autenticità del repository:

wget -O - https://dl.sinew.in/keys/enpass-linux.key | apt-key add -

A questo punto puoi installare effettivamente Enpass all’interno del pc:

sudo apt update
sudo apt install enpass

Sistemare la visualizzazione su schermi HiDPI

NOTA: recentemente è stata rilasciata la versione 6 di Enpass che risolve tutti i problemi con gli schermi HiDPI per cui questo fix qui non è più necessario 😉

Se anche te hai un computer con uno schermo UHD potresti avere problemi con la visualizzazione di Enpass. Infatti di default Enpass viene visualizzato con un carattere piccolissimo che risulta illeggibile sullo schermo.

Visualizzazione microscopica di Enpass

Per risolvere questo fastidioso problema ti basta modificare il file /opt/Enpass/bin/runenpass.sh aggiungendo la seguente linea:

export QT_AUTO_SCREEN_SCALE_FACTOR=1
Modifica al file /opt/Enpass/bin/runenpass.sh
Visualizzazione corretta di Enpass

Conclusioni

Ormai sempre più spesso capita che i siti a cui siamo registrati vengono hackerati e se utilizzi la stessa password su più portali puoi stare certo che la prima cosa che i criminali tenteranno di fare è riutilizzare le stesse credenziali per provare ad accedere ad altri servizi. In quest’ottica utilizzare il password manager per generare password sicure uniche per ogni sito può veramente salvarti la vita (digitale) . 
Se non lo hai mai fatto ti consiglio caldamente di iniziare ad utilizzare un password manager come Enpass.

Installare ZSH e Oh-My-Zsh su Ubuntu 18.04 – il mio terminale su Ubuntu

Chiunque utilizzi una delle mille distribuzioni di Linux e abbia provato ad aprire una console del terminale si è imbattuto in BASH (Bourne-again shell).
Benché esistano molte altre shell per il terminale, BASH è la versione predefinita in tutti i sistemi Linux per motivi storici. Infatti quando si parla di Linux in generale si intende GNU/Linux. Per cui il kernel del sistema è Linux ma tutte le utilities fornite sono quelle di GNU la cui shell ufficiale è proprio BASH.

Come dicevo poco sopra esistono diverse altre versioni di shell e quella che utilizzo quotidianamente nel mio sistema è ZSH (Z-shell).
I motivi principali per cui la ritengo superiore a BASH sono:

  • auto-completamento dei comandi: premendo sulla tastiera il tasto tab mentre sto digitando un comando posso lasciare a ZSH il compito di completarne la scrittura;
  • auto correzione degli errori: spesso digitando velocemente i comandi sulla console mi capita di sbagliare a scrivere qualche lettera e di ricevere un fastidioso messaggio d’errore. Tramite ZSH viene fatto un controllo su eventuali errori di battitura e vengono suggerita un possibile correzione del comando.
  • cronologia condivisa: spesso utilizzo più schermate del terminale in contemporanea e con ZSH posso avere una cronologia unica dei comandi eseguiti tra le varie istanze del terminale
  • plugin: tramite ZSH è possibile utilizzare un ampia gamma di plugin che ne permettono di espandere le funzionalità

Installazione di ZSH e Oh-My-Zsh

Per installare ZSH è sufficiente aprire un terminale e digitare:

 sudo apt install zsh

Per impostare ZSH di come shell default puoi utilizzare il comando:

chsh -s (which zsh) root

Affinchè la modifica abbia effetto devi riavviare il terminale.

Puoi verificare la shell in uso con il comando:

echo $SHELL

Per sfruttare al meglio ZSH ti consiglio anche di installare anche il framework Oh-My-Zsh tramite il seguente comando:

sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"

Tramite Oh-My-Zsh puoi semplificare la gestione di ZSH e sfruttare gli oltre 200 plugin inclusi per personalizzare al meglio la tua esperienza con il terminale di Linux.

Personalizzare ZSH: mostrare il nome delle branch

Per aggiungere la visualizzazione delle branch all’interno del terminale basta  modificare il file ~/.zshrc all’interno della home aggiungendo queste due righe

# Git branch in prompt.

parse_git_branch() {
  git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}

export PS1="\u@\h \W\[\033[32m\]\$(parse_git_branch)\[\033[00m\] $ "

NOTA: puoi ottenere lo stesso effetto anche in BASH. Ti basterà aggiungere le stesse righe al file .bashrc che trovi sempre all’interno della tua home.

Installazione dei plugin

L’installazione di Oh-My-Zsh include già diversi plugin pronti per l’uso. Per abilitare i plugin basta aggiungerli alla lista contenuta all’interno del file ~/.zshrc.

Ad esempio:

plugins=(
  git
  bundler
  dotenv
  osx
  rake
  rbenv
  ruby
)

Plugin consigliati: Zsh-syntax-highlighting

Questo plugin ti permette di evidenziare la sintassi dei comandi all’interno della shell. Sfortunatamente questo plugin non è incluso all’interno di Oh-My-Zsh e va installato a mano recandosi nella cartella ~/.oh-my-zsh/custom/plugins e scaricando l’estensione con questo comando: git clone https://github.com/zsh-users/zsh-syntax-highlighting

A questo punto devi attivare l’estensione aggiungendo alla lista dei plugin la voce zsh-syntax-highlighting

evidenziazione della sintassi

 

Conclusione

Con ZSH puoi veramente velocizzare il tuo flusso di lavoro mentre utilizzi il terminale. La possibilità di personalizzare l’ambiente con i vari temi per la console e di espandere le funzionalità della console con i plugin è veramente impareggiabile.
Personalmente non fatico a credere che ZSH mi abbia permesso di raddoppiare la velocità nell’eseguire il mio solito flusso di lavoro da sviluppatore web.

Te già conoscevi ZSH? In caso negativo ti consiglio di dargli assolutamente una chance, potrebbe veramente migliorarti l’esperienza d’uso del terminale. In caso affermativo invece che plugin usi? Hai qualche estensione interessante da consigliarmi? Se questo post ti è stato utile puoi farmelo sapere con un commento qui sotto  oppure scrivendomi direttamente a t.me/lorenzomillucci. Inoltre ti invito ad iscriverti al mio canale Telegram per non perderti nemmeno un post.

Installare Slack su Ubuntu 18.04

In questi giorni sto migrando il computer di lavoro da un vecchio mac book 2014 ad un nuovo dell XPS 13 su cui ho installato Ubuntu 18.04. Purtroppo devo dire che il passaggio mi sta dando più problemi di quanti pensassi. Uno di questi problemi è proprio l’installazione di Slack.

Ubuntu mette a disposizione all’interno dello store la versione snap di Slack che però nel mio caso ha problemi con l’utilizzo di Wayland (Bug #1754693).
Per cui l’unica soluzione per me è installare Slack tramite il pacchetto di installazione .deb disponibile nel sito ufficiale.

Slack installato su Ubuntu 18.04

Installazione di Slack tramite file .deb

Prima di procedere con l’installazione effettiva di Slack devi assicurarti di avere installato nel sistema libappindicator1. Puoi installarlo tramite il comando:

sudo apt install libappindicator1 desktop-file-utils gconf2 gvfs gvfs-bin gvfs-common gvfs-daemons gvfs-libs libgck-1-0 libgcr-base-3-1 curl

A questo punto puoi scaricare il pacchetto .deb dal sito ufficiale di Slack. Una volta terminato il download puoi installare il pacchetto facendo un doppio click sull’archivio appena scaricato oppure con il seguente comando da terminale:

sudo dpkg -i slack-desktop-3.3.3-amd64.deb

 

Come inviare una fattura elettronica verso l’SdI con PHP

Logo fattura elettronica

Prima di poter interagire con il sistema di interscambio (SdI) bisogna fare l’accreditamento del canale. Una volta fatto ciò ti verrà fornito un “Kit di Test” contenete i seguenti certificati:

  • testservizi.fatturapa.it.cer
  • SistemaInterscambioFatturaPATest.cer
  • servizi.fatturapa.it.cer
  • SistemaInterscambioFatturaPA.cer
  • caentrate.der
  • CAEntratetest.cer

E, sempre dalla pagina di gestione del canale, potrai scaricare due certificati (per client e server) chiamati SDI-<PartitaIVA>.cer

Oltre a tutto ciò avrai a disposizione i file *.key e *.cer che hai utilizzato per l’accreditamento del canale.

Come si usano questi certificati?

Per utilizzare questi certificati all’interno di un client PHP è necessario ottenere delle chiavi derivate che PHP sia in grado di trattare.

In particolare il file SDI-<PartitaIVA>.cer del client (per comodità ora mi riferirò a questo file indicandolo SDI-12345678-client.cer) dovrà essere convertito nel formato .pem tramite il seguente comando:

openssl x509 -inform der -in SDI-12345678-client.cer -out SDI-12345678-client.pem

Inoltre dovrai unire i certificati caentrate.der e CAEntratetest.cer con questo comando:

cat caentrate.der <(echo) CAEntratetest.cer > CA_Agenzia_delle_Entrate_all.pem
E’ fondamentale che inizio e fine dei singoli certificati siano su linee differenti

NOTA: aprendo il file CA_Agenzia_delle_Entrate_all.pem con un editor di testo è fondamentale verificare che END CERTIFICATE e BEGIN CERTIFICATE siano su due linee separate.

A questo punto io ho esteso il SoapClient di PHP per poter utilizzare curl in modo da avere la possibilità di fare il debug di tutto ciò che accade durante la chiamata.

<?php

class DebugSoapClient extends \SoapClient
{
    /**
     * @inheritdoc
     */
    public function __doRequest($request, $location, $action, $version, $one_way = null)
    {
        $soap_request = $request;

        $certspath = __dir__ .  "/certs/";
        //CA file
        $cafile = "CA_Agenzia_delle_Entrate_all.pem";
        //PRIVATE KEY client file
        $keyFile = "private-client.key";
        //Client CERT file
        $clientCertFile = "SDI-12345678-client.pem";

        $header = [
            'Content-type: text/xml;charset="utf-8"',
            'Accept: text/xml',
            'Cache-Control: no-cache',
            'Pragma: no-cache',
            "SOAPAction: {$action}",
            'Content-length: ' . strlen($soap_request),
        ];

        $soap_do = curl_init();

        $url = $location;

        $options = [
            CURLOPT_SSL_VERIFYPEER => true,
            CURLOPT_SSL_VERIFYHOST => 2,
            CURLOPT_SSLKEY => $certspath . $keyFile,
            CURLOPT_SSLCERT => $certspath . $clientCertFile,
            CURLOPT_CAINFO => $certspath . $cafile,

            CURLOPT_SSL_ENABLE_ALPN => false,

            CURLOPT_TIMEOUT => 60,

            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_HEADER         => true,
            CURLOPT_FOLLOWLOCATION => true,

            CURLOPT_USERAGENT      => 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)',
            CURLOPT_VERBOSE        => true,
            CURLOPT_URL            => $url,

            CURLOPT_POST => true,
            CURLOPT_POSTFIELDS => $soap_request,
            CURLOPT_HTTPHEADER => $header,
        ];

        curl_setopt_array($soap_do, $options);

        $output = curl_exec($soap_do);
        var_dump('curl output = ');
        var_dump($output);
        $info = curl_getinfo($soap_do);
        var_dump('curl info = ');
        var_dump($info);
        var_dump('curl http code = ' . $info['http_code']);
        if ($output === false) {
            $err_num = curl_errno($soap_do);
            $err_desc = curl_error($soap_do);
            $httpcode = curl_getinfo($soap_do, CURLINFO_HTTP_CODE);
            var_dump("—CURL FAIL RESPONSE:\ndati={$output}\nerr_num={$err_num}\nerr_desc={$err_desc}\nhttpcode={$httpcode}");
        } else {
            ///Operation completed successfully
            var_dump('success');
        }
        curl_close($soap_do);

        return $output;
    }
}

Il codice che vedi qui sopra lo puoi trovare anche in questo repository su GitHub.

Conclusione

Questo codice è il frutto di diverse ore spese a capire come funziona il SdI. Un particolare ringraziamento va agli utenti del forum Italia. E’ proprio grazie al loro contributo se sono riuscito a creare questo script  👏

Fonti: Accreditamento SDICoop: configurazione SSL su ApacheInstallazione certificati canale SDICOOP

Account email hackerato

Come tutte le  mattine stavo controllando la posta elettronica quando ho notato tra i messaggi in arrivo uno strana email proveniente dal mio stesso indirizzo. Strano. Ero sicuro di non essermi mandato un email la sera prima. Così, incuriosito, ho aperto il messaggio e questo è il contenuto:

  Ciao, caro utente,
Abbiamo installato un trojan di accesso remoto sul tuo dispositivo.
Per il momento il tuo account email è hackerato (vedi , ora ho accesso ai tuoi account).
Ho scaricato tutte le informazioni riservate dal tuo sistema e ho anche altre prove.
La cosa più interessante che ho scoperto sono i video dove tu masturbi.
Avevo incorporato un virus sul sito porno dopo di che tu l’hai installato sul tuo sistema operativo.
Quando hai cliccato su Play di un video porno, in quel momento il tuo dispositivo ha scaricato il mio trojan.
Dopo l’installazione la tua camera frontale ti filma ogni volta che tu masturbi, in più il software è sincronizzato con video che tu scegli.
Per il momento il software ha raccolto tutte le informazioni sui tuoi contatti dalle reti sociali e tutti gli indirizzi email.
Se tu vuoi che io cancelli tutti i dati raccolti, devi trasferirmi $300 in BTC (criptovaluta).
Questo è il mio portafoglio Bitcoin: …
Una volta letta questa comunicazione hai 2 giorni a disposizione.
Appena hai provveduto alla transazione tutti i tuoi dati saranno cancellati.
Altrimenti manderò i video con le tue birichinate a tutti i tuoi colleghi e amici!!!
E da ora in poi stai più attento!
Per favore, visita solo siti sicuri!
Ciao!

Ovviamente questa email è una truffa. Il sedicente hacker sostiene di essere entrato in possesso del mio account email ma in realtà sfrutta semplicemente il fatto che il protocollo utilizzato per lo scambio di mail (SMTP) sia stato ideato agli albori di internet quando ancora la sicurezza informatica non era un problema.
Questo tipo di attacco informatico si chiama Email Spoofing e sfrutta il fatto che SMTP non richiede alcun tipo di autenticazione. Infatti, come per la posta tradizionale, quando viene spedito un messaggio è richiesto che vengano indicati l’indirizzo del mittente (MAIL FROM) e quello del destinatario (RCPT TO) senza alcun tipo di controllo sulla veridicità dei dati inseriti.
In questo modo l’hacker può indicare un qualunque indirizzo all’interno del campo MAIL FROM senza che venga effettuato alcun tipo di controllo.

Quindi se dovesse arrivare anche ate una mail del genere puoi tranquillamente segnalarla come spam.

NOTA: di questo tentativo di truffa se ne è occupata anche Repubblica.it.

Cambiare retention policy su InfluxDB

Cosa è InfluxDB

InfluxDB, in breve, è un DBMS non relazionale ottimizzato per gestire time-series, ovvero gruppi di dati strettamente dipendenti dal tempo (come potrebbero esserlo, ad esempio, lo storico delle misure acquisite da un sensore nel corso di una giornata).

Cosa sono le Retention Policies

Il problema principale delle time-series è che, con il passare del tempo, i dati acquisiti tendono ad accumularsi in volumi enormi. Proprio per contenere questo problema, gli sviluppatori di InfluxDB, hanno implementato diversi meccanismi che permettono di ridurre il numero di dati da mantenere.

Uno dei metodi che InfluxDB implementa per la gestione dei dati è proprio quello delle Retention Policy.

Una Retention Policy è una struttura dati di InfluxDB che definisce per quanto tempo i dati devono essere mantenuti all’interno del database. Di fatto è come se ad ogni dato memorizzato venisse applicata un’etichetta con riportata la data di scadenza.  Internamente InfluxDB si occupa di eliminare i dati la cui data di scadenza è passata senza che lo sviluppatore debba occuparsene in prima persona. L’azione di eliminazione dei dati scaduti dal database è chiamata retention policy enforcement.

Ad ogni retention policy possono essere associati uno o più Shard Groups.
Al fine di ottimizzare le prestazioni, InfluxDB frammenta i dati delle varie time-series in più file chiamati Shard. Gli shard sono a loro volta organizzati all’interno di uno Shard Group.

Nel momento in cui viene definita una retention policy è necessario definire anche la shard group duration. Questo valore (espresso in giorni) indica la quantità di dati che devono essere contenuti all’interno di ogni shard. Ad esempio, la durata di default degli shard è di 7 giorni. Di conseguenza verrà creato un nuovo shard con i dati raccolti in ogni settimana.

InfluxDB crea automaticamente alla creazione del database una retention policy chiamata autogen. Questa policy ha una shard group duration di 7 giorni e non definisce una scadenza per i dati.

Per vedere le policies create all’interno del database puoi utilizzare il seguente comando all’interno della influx-cli:

SHOW RETENTION POLICIES

Il mio problema delle query lente

A cosa è servito tutta questo sproloquio sul funzionamento interno di InfluxDB?
Il problema della retention policy predefinita è che produce circa 52 shards per ogni anno di dati. E, poiché all’aumentare del numero di shards aumenta il numero di file che devono essere analizzati, quando vengono eseguite query su lunghi intervalli temporali il tempo necessario ad eseguire la ricerca aumenta considerevolmente.

Una soluzione a questo problema è creare una nuova retention policy in modo da impostare una shard group duration tale che il numero di shard creati sia minore.
In questo esempio andrò a creare una nuova retention policy con una durata di 2 mesi. Per creare una nuova retention policy chiamata two_months è sufficiente digitare nella CLI:

CREATE RETENTION POLICY two_months ON db DURATION 8w REPLICATION 1

A questo punto è possibile assegnare la policy appena creata ad una nuova measurement tramite il seguente comando:

INSERT INTO two_months sensors,type=temperature value=24

Come fare la migrazione dei dati esistenti

Tramite InfluxDB è possibile creare o modificare una retention policy in ogni momento ma i cambiamenti verranno applicati solo ai dati inseriti successivamente alla modifica.

Nel caso in cui si voglia spostare dei dati già esistenti da una retention policy ad un’altra non è prevista una tecnica ufficiale di migrazione. Tuttavia è possibile aggirare il problema sfruttando un database temporaneo su cui creare la nuova policy per poi copiarci i dati esistenti.

Il primo passo che devi fare è quindi creare il database temporaneo tramite il comando della CLI:

CREATE DATABASE temp_db

All’interno di questo database temporaneo dovrai creare la retention policy che vuoi utilizzare per i dati. Ad esempio tramite il comando:

CREATE RETENTION POLICY two_months ON temp_db DURATION 8w REPLICATION 1

A questo punto devi copiare tutti i dati dalla measurement esistente nel vecchio database (chiamato old_db) al nuovo database, specificando l’utilizzo della nuova policy:

SELECT * INTO "temp_db"."two_months"."sensors" FROM "old_db"."autogen"."sensors" GROUP BY *;

Quando il comando avrà finito di copiare i dati, questi saranno organizzati secondo le regole definite nella nuova retention policy.

A questo punto, se necessario, puoi importare i dati di nuovo all’interno del vecchio database. Per prima cosa devi cancellare la measurement esistente, creare la nuova policy all’interno del database ed infine ti basta effettuare la copia dei dati a partire dal database temporaneo modificando sorgente e destinazione del comando riportato sopra.

Conclusioni

Visto che InfluxDB è un progetto ancora giovane la mancanza di un meccanismo per la migrazione dei dati integrato all’interno del DBMS può essere perdonata.
Se però anche a te è capitato di iniziare a lavorare con il database sfruttando la retention policy predefinita per poi accorgerti delle limitazioni spero che questo breve tutorial ti sia di aiuto. Come hai potuto leggere si tratta di pochi semplici passi che però non sono riportati all’interno della documentazione ufficiale del progetto. Se ritieni che questo tutorial ti sia stato di aiuto o che non sia stato sufficientemente chiaro in qualche punto ti invito a lasciarmi un commento qui sotto.

Montare volumi exfat su ubuntu 16.04 e 18.04

AGGIORNAMENTO: Microsoft integrerà il filesystem exFAT direttamente all’interno del kernel Linux! Ancora non si sa quando verrà rilasciato l’aggiornamento ma da quel momento in poi non sarà necessario più seguire questa guida per utilizzare il filesystem di Microsoft con Ubuntu.


Ti sarà sicuramente capitato di dover copiare dei dati al volo su chiavetta USB formattata con Windows  per poi scoprire che, una volta collegata ad  ubuntu, non era leggibile dal sistema operativo a causa dell’errore unknown filesystem.

Error mounting/dev/sdc1 at /media/lorenzo/14BD-2468: unknown filesystem type ‘exfat’  

Perché succede?

Questo errore si verifica perché il filesystem exFAT è di proprietà di Microsoft e i driver per gestirlo non sono inclusi di default all’interno dell’installazione di Ubuntu.

Come si risolve?

Per aggiungere i driver exFAT ad Ubuntu ti basta aprire una finestra del terminale ad installare i pacchetti necessari tramite il seguente comando:

sudo apt install exfat-fuse exfat-utils

Una volta terminata l’installazione, per accedere ai file, ti basta riprovare ad aprire la chiavetta da nautilus.

NOTA: se ricevi il messaggio di errore E: Impossibile trovare il pacchetto exfat-fuse accertati di aver abilitato il repository universe da “Software e aggiornamenti”

Accertati di aver abilitato il repository universe mettendo la spunta alla voce "Mantenuto dalla comunità, software libero e open source"
Accertati di aver abilitato il repository universe mettendo la spunta alla voce “Mantenuto dalla comunità, software libero e open source”

Conclusioni

Se questo post ti è stato utile puoi farmelo sapere con un commento qui sotto oppure scrivendomi direttamente a t.me/lorenzomillucci.
Inoltre ti invito ad iscriverti al mio canale Telegram o a seguirmi su Twitter per non perderti nemmeno un post del mio blog.

Creare e pubblicare un package Laravel in 5 step

Laravel permette di aggiungere nuove funzioni in modo semplice tramite l’aggiunta di estensioni chiamate package. In questo articolo ti racconto qual’è stata la procedura che ha portato alla creazione del  mio primo package.

Recentemente ho creato (github) e pubblicato (packagist) il mio primo package per Laravel: laravel-civic-sip.
L’idea alla base di questo package è quella di permettere il login attraverso Civic all’interno di applicazioni Laravel senza dover scrivere codice specifico.

NOTA: Civic è una piattaforma per il login sicuro che sfrutta la blockchain, maggiori informazioni qui.

Cos’è un package di laravel?

Il framework Laravel integra al suo interno il codice per implementare le più comuni operazioni che possono essere richieste da una applicazione web in modo agile e veloce. Ovviamente all’interno del core di Laravel non è sempre presente tutto ciò che serve e quindi viene fornito un modo per estenderne le funzionalità importando codice scritto da altri ed evitando quindi di dover reinventare la ruota riscrivendo codice che è già stato prodotto e testato da altri.
Il modo con cui Laravel permette di importare codice scritto da altri per estenderne le funzionalità è costituito dai package.

I package sono dei bundle di codice che racchiudono rotte, controller e views che permettono di estendere le funzionalità base di Laravel con nuove funzioni.

Come si crea un nuovo package?

Benchè la creazione di un nuovo package per Laravel sia abbastanza semplice, ho trovato la documentazione ufficiale un po’ troppo scarna da questo punto di vista. Quindi ho deciso di riportare i passaggi che ho seguito per scrivere il mio primo package per Laravel.

NOTA: in questa guida ti descrivo gli step che ho seguito per creare la mia prima estensione implementando un wrapper per la libreria civic-sip-php. Naturalmente la procedura da seguire è del tutto generale ed è quindi valida per la creazione di un qualunque altro package. Naturalmente il codice che ho scritto sarà specializzato per questa libreria e dovrai modificarlo per adattarlo alle tue necessità. 

Step 1: Installazione di Laravel

La prima cosa che devi fare è creare un nuovo progetto Laravel. Ci sono diversi modi per farlo descritti dalla documentazione ufficiale.

Io ho inizializzato il mio progetto chiamato laravel-civic-sip utilizzando questi due comandi:

composer global require "laravel/installer"
laravel new laravel-civic-sip

Step 2: creazione di una cartella per il package

A questo punto, per tenere ordinato il progetto e non mischiare il codice dell’applicazione a quello del package, devi creare la cartella /package all’interno della root del progetto. All’interno di questa cartella dovrai mettere tutti i file che compongono il package che vuoi a creare.

Una volta fatto ciò devi inizializzare composer all’interno di questa nuova cartella tramite il comando composer init.

NOTA: All’interno della cartella /package io ho strutturato il codice seguendo la seguente gerarchia:

  • config — per tutti i file di configurazione
  • src
    • facades — per il codice relativo alle facades
    • providers — per il codice relativo ai providers
    • tests — per tutto il codice relativo ai test

Step 3: Configurare composer

Prima di procedere con la scrittura del codice vero e proprio del package bisogna fare in modo che composer sia in grado di riconoscere i namespace usati all’interno del codice legandoli ai path dei file utilizzati nel progetto. Per fare ciò devi solo modificare la sezione autoload del file composer.json.

Ad esempio, nel mio package io ho utilizzato il namespace LMillucci\CivicSIP per cui ho modificato la sezione autoload del file composer.json in questo modo:

Inoltre per poter sfruttare l’autodiscovery dei package introdotta con Laravel 5.5 ho registrato i provider e le facades all’interno del composer.json in questo modo:

"autoload": {
"psr-4": {
"LMillucci\\CivicSIP\\": "src/"
}
}

Step 3: Scrivere la logica del package

Per l’implementazione della logica del package, Laravel richiede che vengano create due classi particolari:

  • Un service provider che definisce le informazioni sul pacchetto (quali controller usa, quali rotte ecc…)
  • Una Facade che permette di definire un alias con cui chiamare il service provider.

Naturalmente puoi aggiungere al package file di configurazione, views, routes ecc.. a seconda delle tue necessità.

Per il mio package ho avuto bisogno solo di un file di configurazione che ho aggiunto all’interno della cartella ./config.

Step 3.1: Creazione Service Provider

Per la creazione del service provider basta estendere la classe Illuminate\Support\ServiceProvider.
Per il mio package ho scritto questo ServiceProvider:

Come vedi il codice è molto semplice ma puoi notare:

  • il metodo boot() con cui viene pubblicata la configurazione definita nel file dedicato alla configurazione.
  • il metodo register() con cui viene registrato il servizio come singleton
  • il metodo provides() con cui viene registrato quale servizio viene fornito dal provider

Step 3.2: creazione Facade

Per creare una facade basta estendere la classe Illuminate\Support\Facades\Facade. In questa classe è importante che ti ricordi di fare l’override del metodo getFacadeAccessor() facendogli restituire il nome che vogliamo assegnare al package.

Come puoi vedere il codice che ho scritto è veramente banale:

A questo punto lo sviluppo del package è completo. Nel prossimo punto ti farò vedere come pubblicare il package sul sito packagist in modo da poterlo importare in un progetto sfruttando composer.

Step 4: Pubblicare il package

La prima cosa da fare per pubblicare il package è creare un repository su github e fare il push del codice.

NOTA: ricordati di fare il push solo del contenuto della cartella ./package e di tutto il progetto!

Una volta che il codice è su github devi creare una tag. Questo passaggio è fondamentale in quanto la tag andrà ad indicare la versione del package (es 1.0.0)

Arrivato a questo punto, per rendere il package installabile tramite il comando composer require, è necessario aggiungerlo al sito packagist.com.

Per fare ciò, una volta fatto il login sulla piattaforma, ti basta visitare la pagina di submit e copiare il link del repository github confermando tramite il tasto check.

aggiunta a packagist

Step 5: aggiungere il pacchetto ad un progetto

Complimenti, hai appena pubblicato la tua prima estensione per Laravel! Ora per verificare che tutto abbia funzionato correttamente devi installare il tuo package all’interno di un progetto.

La prima cosa da fare quindi è il require del pacchetto tramite il comando

composer require lmillucci/laravel-civic-sip

Siccome per il funzionamento del mio package è richiesta la creazione di un file di configurazione puoi utilizzare il comando di seguito in modo che Laravel lo crei in modo automatico:

php artisan vendor:publish

Infine, per poter fare il login con Civic devi definire le seguenti variabili d’ambiente all’interno del file .env: 

CIVIC_APPLICATION_ID=app_id
CIVIC_APPLICATION_SECRET=123456abcd
CIVIC_PRIVATE_SIGNING_KEY=abcd123456
CIVIC_ENVIRONMENT=prod

Ora puoi fare il login con Civic semplicemente tramite il comando:

CivicFacade::exchangeToken($token)

 

Congratulazione hai appena sviluppato e pubblicato il tuo primo package laravel! 

Se c’è qualche punto in cui non sono stato sufficientemente chiaro ti prego di lasciarmi un commento qui sotto in modo che possa aiutarti a risolvere i tuoi dubbi.