<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://linuxhub.it/feed.xml" rel="self" type="application/atom+xml" /><link href="https://linuxhub.it/" rel="alternate" type="text/html" /><updated>2024-11-29T16:33:10+00:00</updated><id>https://linuxhub.it/feed.xml</id><title type="html">linux/hub</title><subtitle>Guide curate e dettagliate sul mondo Linux ed Open source. Trattiamo nello specifico argomenti a scopo educativo.</subtitle><author><name>linuxhub.it Team</name></author><entry><title type="html">#howto - KDE Connect: integrazione tra dispositivi</title><link href="https://linuxhub.it/articles/howto-kde-connect-integrazione-tra-dispositivi/" rel="alternate" type="text/html" title="#howto - KDE Connect: integrazione tra dispositivi" /><published>2024-11-23T09:00:00+00:00</published><updated>2024-11-23T09:00:00+00:00</updated><id>https://linuxhub.it/articles/howto-kde-connect-integrazione-tra-dispositivi</id><content type="html" xml:base="https://linuxhub.it/articles/howto-kde-connect-integrazione-tra-dispositivi/"><![CDATA[<p>KDE Connect è un software open-source che consente di comunicare da e verso altri dispositivi connessi alla stessa rete.</p>

<p>Alcune delle sue funzioni sono:</p>

<ul>
  <li><strong>scambiare file</strong>;</li>
  <li>ricevere <strong>notifiche</strong>;</li>
  <li>trasferire la <strong>clipboard</strong> (il testo copiato);</li>
  <li>controllare lo <strong>schermo</strong> da remoto;</li>
  <li>eseguire <strong>comandi</strong> preimpostati;</li>
  <li>inviare e ricevere <strong>SMS</strong>;</li>
  <li>modificare il <strong>volume</strong>;</li>
  <li>navigare il <strong>file system</strong> di un altro dispositivo;</li>
  <li>ed altro ancora …</li>
</ul>

<h2 id="installazione">Installazione</h2>

<p>Sulla <a href="https://kdeconnect.kde.org/download.html">pagina ufficiale</a> dedicata sono disponibili i link per il download su tutte le piattaforme supportate - tra cui Android, iOS, Windows e MacOS.</p>

<p>Di seguito le istruzioni specifiche per l’installazione su distribuzioni Linux (in alcuni ambienti Plasma potrebbe essere già preinstallato).</p>

<h3 id="ubuntu">Ubuntu</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>apt <span class="nb">install </span>kdeconnect
</code></pre></div></div>

<h3 id="fedora">Fedora</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>dnf <span class="nb">install </span>kde-connect
</code></pre></div></div>

<h3 id="arch-linux">Arch Linux</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pacman <span class="nt">-S</span> kdeconnect
</code></pre></div></div>

<h2 id="connessione">Connessione</h2>

<p>Per connettere due dispositivi connessi alla <strong>stessa rete</strong> è possibile sia ricorrere a una coppia di dispositivi <strong>smartphone-computer</strong> (come avviene più frequentemente), sia a una coppia di <strong>due computer</strong>: entrambe le due configurazioni sono valide.</p>

<p>Una volta avviato KDE Connect su entrambi i dispositivi, è sufficiente effettuare una scansione per mostrarli nell’elenco dei dispositivi disponibili.</p>

<p>Per stabilire la connessione, è sufficiente cliccare sul dispositivo a cui ci si vuole connettere e <strong>confermare</strong> la richiesta di accoppiamento (verificando che i PIN comparsi a schermo corrispondano).</p>

<h3 id="connessione-via-openvpn">Connessione via OpenVPN</h3>

<p>La connessione via VPN richiede una configurazione aggiuntiva ed è desiderabile quando si vuole controllare i dispositivi <strong>in ogni situazione</strong>, ossia che siano connessi o meno alla stessa rete.</p>

<p>È necessario che OpenVPN (o software di rete simile) sia installato e configurato correttamente su <strong>entrambi</strong> i dispositivi.</p>

<p>Sul sito di OpenVPN è disponibile una <a href="https://openvpn.net/community-resources/how-to/">guida ufficiale</a>, che richiede tuttavia conoscenze intermedie sul funzionamento di Internet e protocolli di rete.</p>

<h3 id="connessione-via-bluetooth">Connessione via Bluetooth</h3>

<p>In versioni più recenti di KDE Connect è stata aggiunta la possibilità di instaurare il collegamento via funzionalità Bluetooth.</p>

<p>Sull’applicazione Android, in particolare, la scansione via Bluetooth è <strong>disattivata di default</strong> e perciò va abilitata manualmente.</p>

<p>Affinché KDE Connect possa rilevare un dispositivo a cui connettersi, è innanzitutto necessario l’<strong>accoppiamento Bluetooth</strong> (dalle impostazioni di sistema). Dopodiché, i passaggi richiesti rimangono invariati rispetto alla classica connessione via rete locale.</p>

<h2 id="plugin">Plugin</h2>

<p>Non tutti i plugin sono abilitati di default: è sufficiente consultare la sezione specifica dei plugin di entrambi i dispositivi per attivarne di nuovi o disattivare quelli meno usati (dal menu a tendina su mobile, dalle impostazioni di KDE Connect su desktop).</p>

<p>Di seguito alcuni dei plugin che potrebbero richiedere una configurazione aggiuntiva prima di poter essere attivati.</p>

<h3 id="input-mouse">Input mouse</h3>

<p>KDE Connect consente di usare il mouse per controllare sia il cursore di un computer che di uno smartphone.</p>

<p>Plugin di questo tipo richiedono che siano attivati degli speciali <strong>permessi di accessibilità</strong>, che vanno attivati manualmente nelle impostazioni del dispositivo.</p>

<h3 id="browser-file-system">Browser file system</h3>

<p>KDE Connect consente di fare il <code class="language-plaintext highlighter-rouge">mount</code> del file system di un altro dispositivo così da <strong>accedere a file e cartelle</strong> da remoto come se fossero quelli di una periferica esterna fisicamente connessa.</p>

<p>Quest’integrazione richiede:</p>

<ul>
  <li>l’utilizzo del file manager di KDE, <strong>Dolphin</strong>;</li>
  <li>il pacchetto <code class="language-plaintext highlighter-rouge">sshfs</code> (non sempre preinstallato);</li>
  <li>che la comunicazione sulle porte <strong>1714-1764</strong> sia TCP che UDP non sia bloccata dai firewall.</li>
</ul>

<h2 id="ambienti-non-plasma">Ambienti non Plasma</h2>

<p>Nonostante il nome possa suggerire altrimenti, KDE Connect può essere utilizzato anche in ambienti che non sono basati su KDE Plasma (o addirittura che non usano affatto un display server).</p>

<h3 id="gsconnect">GSConnect</h3>

<p><strong>GSConnect</strong>, dedicato ad <strong>ambienti GNOME</strong>, è un’estensione per la shell <a href="https://extensions.gnome.org/extension/1319/gsconnect/">scaricabile</a> dal sito ufficiale di GNOME.</p>

<p>Si tratta di un progetto indipendente, non supportato direttamente da KDE, che implementa lo <strong>stesso protocollo</strong> di KDE Connect (ed è dunque compatibile con le medesime applicazioni di KDE Connect disponibili per altre piattaforme).</p>

<p>Ovviamente, l’utilizzo di GSConnect è esclusivo a quello di KDE Connect: non è possibile usare entrambi, su una singola distribuzione Linux.</p>

<h2 id="conclusione">Conclusione</h2>

<p>KDE Connect consente un’integrazione multipiattaforma, anche tra dispositivi non-Linux, semplice ed efficiente - oltre che gratuita e open-source.</p>

<p>Maggiori informazioni su <a href="https://community.kde.org/KDEConnect">KDE Connect</a> e <a href="https://github.com/GSConnect/gnome-shell-extension-gsconnect/wiki">GSConnect</a> sono disponibili sulle relative pagine Wiki.</p>]]></content><author><name>Midblyte</name></author><category term="ubuntu" /><category term="fedora" /><category term="archlinux" /><category term="android" /><category term="windows" /><category term="macos" /><summary type="html"><![CDATA[KDE Connect è un software open-source che consente di comunicare da e verso altri dispositivi connessi alla stessa rete.]]></summary></entry><entry><title type="html">#howto - Gestire i CSV da terminale</title><link href="https://linuxhub.it/articles/howto-csv-terminale/" rel="alternate" type="text/html" title="#howto - Gestire i CSV da terminale" /><published>2024-11-09T07:00:00+00:00</published><updated>2024-11-09T07:00:00+00:00</updated><id>https://linuxhub.it/articles/howto-csv-terminale</id><content type="html" xml:base="https://linuxhub.it/articles/howto-csv-terminale/"><![CDATA[<p>A lavoro mi capita di gestire sempre una certa quantità di CSV e similari, alle volte anche di una certa dimensione.</p>

<p>Spesso e volentieri, decido di farlo tramite terminale per automatizzare e velocizzare alcune operazioni.</p>

<h2 id="sort">sort</h2>

<p>Il comando sort permette di ordinare da linea di comando in maniera veloce e semplice i file di testo, eventualmente indicando anche dei criteri di ordinamento.</p>

<p>ad esempio il comando:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">echo</span> <span class="s2">"alberto
giovanni
giacomo
aldo  
zurli
davide
zio   
pera"</span> | <span class="nb">sort</span>
</code></pre></div></div>

<p>Restituirà:</p>

<pre><code class="language-plain">alberto
aldo
davide
giacomo
giovanni
pera
zio
zurli
</code></pre>

<p>Tuttavia, per applicare il comando ai file CSV, bisogna applicare alcune opzioni al comando.<br />
Le principali opzioni di sort da conoscere per manipolare i CSV sono:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">-t</code> quest’opzione serve per impostare il separatore, nel caso dei csv se seguono il formato standard, sarà <code class="language-plaintext highlighter-rouge">-t,</code>.</li>
  <li><code class="language-plaintext highlighter-rouge">-k</code> quest’opzione serve a richiedere uno specifico campo quando c’è un separatore. Usato in coppia con l’opzione <code class="language-plaintext highlighter-rouge">-t</code> permette di ordinare rispetto ad una determinata cella separata con il carattere indicato da <code class="language-plaintext highlighter-rouge">t</code>, altrimenti il separatore standard è lo spazio.</li>
  <li><code class="language-plaintext highlighter-rouge">-g</code> Quest’opzione può essere utilizzata per richiedere l’ordinamento numerico e non quello alfanumerico, utile per le celle numeriche.</li>
  <li><code class="language-plaintext highlighter-rouge">-r</code> per ordinare al contrario (ordine decrescente).</li>
  <li><code class="language-plaintext highlighter-rouge">-u</code> elimina le occorrenze doppie, se usato in combo con <code class="language-plaintext highlighter-rouge">-k</code>, lo fa tenendo conto della cella selezionata</li>
</ul>

<p>Supponendo di avere un csv siffatto:</p>

<pre><code class="language-csv">alberto,alberti, 32
giovanni,storti, 67
giacomo,poretti, 68
aldo,baglio, 66
zurli,mago, 150
davide,galati, 33
zio,pera, 21
pera,zio, 21
</code></pre>

<p>Cioè <code class="language-plaintext highlighter-rouge">nome,cognome,età</code>.</p>

<p>Supponendo di dover ordinare per cognome si può scrivere:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sort</span> <span class="nt">-t</span>, <span class="nt">-k2</span> nomicognomieta.csv 
</code></pre></div></div>

<p>Output:</p>

<pre><code class="language-plain">alberto,alberti, 32
aldo,baglio, 66
davide,galati, 33
zurli,mago, 150
zio,pera, 21
giacomo,poretti, 68
giovanni,storti, 67
pera,zio, 21
</code></pre>

<p>O per età, dal più grande al più piccolo:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sort</span> <span class="nt">-t</span>, <span class="nt">-k3</span> <span class="nt">-g</span> <span class="nt">-r</span> nomicognomieta.csv
</code></pre></div></div>

<p>Che come risultato:</p>

<pre><code class="language-plain">zurli,mago, 150
giacomo,poretti, 68
giovanni,storti, 67
aldo,baglio, 66
davide,galati, 33
alberto,alberti, 32
zio,pera, 21
pera,zio, 21
</code></pre>

<p>Provando ad eliminare le righe con la stessa età:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sort</span> <span class="nt">-t</span>, <span class="nt">-k3</span> <span class="nt">-g</span> <span class="nt">-r</span> <span class="nt">-u</span> nomicognomieta.csv
</code></pre></div></div>

<p>Che da come risultato:</p>

<pre><code class="language-plain">zurli,mago, 150
giacomo,poretti, 68
giovanni,storti, 67
aldo,baglio, 66
davide,galati, 33
alberto,alberti, 32
zio,pera, 21
</code></pre>

<h2 id="column">column</h2>

<p>Column serve a mostrare i dati in input in colonne, seguendo una specifica formattazione. Non necessita di troppe opzioni, quelle utili ai CSV sono:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">-s</code> che imposta il delimitatore dei campi. Ad esempio <code class="language-plaintext highlighter-rouge">-s,</code> legge la virgola come delimitatore.</li>
  <li><code class="language-plaintext highlighter-rouge">-t</code> che organizza i dati con tabella e allineamento a sinistra.</li>
</ul>

<p>Supponendo di avere un csv siffatto:</p>

<pre><code class="language-csv">alberto,alberti, 32
giovanni,storti, 67
giacomo,poretti, 68
aldo,baglio, 66
zurli,mago, 150
davide,galati, 33
zio,pera, 21
pera,zio, 21
</code></pre>

<p>Scrivendo:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>column <span class="nt">-s</span>, <span class="nt">-t</span> &lt; nomicognomieta.csv
</code></pre></div></div>

<p>Si avrà:</p>

<pre><code class="language-plain">alberto   alberti   32
aldo      baglio    66
davide    galati    33
zurli     mago      150
zio       pera      21
giacomo   poretti   68
giacomo   poretti   32
giovanni  storti    67
pera      zio       21
</code></pre>

<p>Ma se il file contiene molti file resta comunque molto scomodo leggerlo senza poterlo navigare. Potrebbe essere utile appendere il comando <code class="language-plaintext highlighter-rouge">less</code> con le seguenti opzioni:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">-#</code> che seguito da un numero imposta il numero di spazi tra una cella e un altra. Ad esempio <code class="language-plaintext highlighter-rouge">-#2</code> mette due spazi.</li>
  <li><code class="language-plaintext highlighter-rouge">-N</code> che serve a mostrare il numero di riga per ogni riga del CSV</li>
  <li><code class="language-plaintext highlighter-rouge">-S</code> che fa si che si possa navigare “orizzontalmente” nel csv (questa opzione potrebbe essere di default in molte implementazioni di less)</li>
</ul>

<p>Scrivendo dunque:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>column <span class="nt">-s</span>, <span class="nt">-t</span> &lt; nomicognomieta.csv| less -#2 <span class="nt">-N</span> <span class="nt">-S</span>
</code></pre></div></div>

<p>Si potrà navigare in totale comodità il file csv senza alcun problema</p>

<h2 id="awk">awk</h2>

<p>Considero awk lo strumento “definitivo” per la modifica di una grande mole di dati, riesce a processare riga per riga. È presente sul sito <a href="https://linuxhub.it/articles/howto-usare-awk-pt1/">una guida completa su AWK</a>.</p>

<p>Awk rappresenta anche un ottimo metodo per manipolare i dati su csv. Le cose che si possono fare usandolo sono limitate solo dalla fantasia e non si possono trattare tutte ovviamente, ma vediamo come si può utilizzare per fare un parsing e qualche calcolo.</p>

<p>Innanzitutto per leggere un file csv l’unica opzione da utilizzare è <code class="language-plaintext highlighter-rouge">-F</code> seguita dal delimitatore. Ad esempio con <code class="language-plaintext highlighter-rouge">F ','</code> leggeremo i csv separati per virgola.</p>

<p>Supponendo il seguente csv:</p>

<pre><code class="language-csv">alberto,alberti, 32
giovanni,storti, 67
giacomo,poretti, 68
aldo,baglio, 66
zurli,mago, 150
davide,galati, 33
zio,pera, 21
pera,zio, 21
</code></pre>

<p>Si può ad esempio tirare fuori così l’età media:</p>

<div class="language-awk highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">awk</span> <span class="o">-</span><span class="nx">F</span> <span class="err">'</span><span class="p">,</span><span class="err">'</span> <span class="err">'</span>
<span class="p">{</span>
        <span class="nx">somma</span><span class="o">+=</span><span class="nv">$3</span>
<span class="p">}</span>

<span class="kr">END</span><span class="p">{</span>
        <span class="nx">media</span><span class="o">=</span><span class="nx">somma</span><span class="o">/</span><span class="kc">NR</span>
        <span class="k">print</span><span class="p">(</span><span class="s2">"eta media"</span><span class="p">,</span><span class="nx">media</span><span class="p">)</span>
<span class="p">}</span><span class="err">'</span> <span class="nx">nomicognomieta</span><span class="p">.</span><span class="nx">csv</span>
</code></pre></div></div>

<p>Per trovare il più anzino:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">awk</span> <span class="nt">-F</span> <span class="s1">','</span> <span class="s1">'       
BEGIN {
        max=-1
        maxname=""
}
{
        if(max&lt;$3){
                maxname=$1
                max=$3
        }
}

END{
        print("il più anziano del gruppo si chiama",maxname,"ed ha",max,"anni")
}'</span> nomicognomieta.csv
</code></pre></div></div>

<h2 id="extra-excel-con-gnumeric">Extra: excel con gnumeric</h2>

<p>Purtroppo il formato più utilizzato per tabelle dati è diventato nel tempo quello proprietario di excel. Lo svantaggio di questa tipologia di dati è che oltre ad essere proprietario è anche binario, quindi non facilmente leggibile, questo induce a chiedersi come fare a leggere questi dati al di fuori di piattaforme Microsoft.</p>

<p>Nel tempo son nati molti software (proprietari o meno) in grado di leggere gli excel come Libreoffice, WPS, open office etc… così come molte librerie.</p>

<p>Su linux esiste il software in GTK <code class="language-plaintext highlighter-rouge">gnumeric</code> che si può installare tramite i vari package manager, tramite questo si può convertire poi, anche a linea di comando, un excel in csv e processarlo tramite i metodi sopra elencati:</p>

<h3 id="installazione-gnumeric-ubuntu-e-derivate">Installazione gnumeric Ubuntu e derivate</h3>

<p>Per installare gnumeric su Ubuntu e derivate scrivere</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>apt <span class="nb">install </span>gnumeric
</code></pre></div></div>

<h3 id="installazione-gnumeric-fedora">Installazione gnumeric Fedora</h3>

<p>Per installare gnumeric su Fedora scrivere</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>dnf <span class="nb">install </span>gnumeric
</code></pre></div></div>

<h3 id="installazione-gnumeric-archlinux">Installazione gnumeric ArchLinux</h3>

<p>Per installare gnumeric su ArchLinux scrivere</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pacman <span class="nt">-S</span> gnumeric
</code></pre></div></div>

<h3 id="conversione">Conversione</h3>

<p>Per convertire un excel in csv scrivere:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ssconvert file_excel.xlsx file_excel_convertito.csv
</code></pre></div></div>

<h2 id="extra-excel-con-python-xlsx2csv">Extra: excel con python xlsx2csv</h2>

<p>Un altro tool utilizzabile è <strong>xlsx2csv</strong>, scritto in python ed installabile tramite <code class="language-plaintext highlighter-rouge">pip</code>:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pip <span class="nb">install </span>xlsx2csv
</code></pre></div></div>

<p>Oppure tramite <code class="language-plaintext highlighter-rouge">pipx</code> se si è su ArchLinux:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pipx <span class="nb">install </span>xlsx2csv
</code></pre></div></div>

<p>Utilizzabile poi scrivendo:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>xlsx2csv file_excel.xlsx <span class="o">&gt;</span> file_excel_convertito.csv
</code></pre></div></div>

<h2 id="considerazioni-finali">Considerazioni finali</h2>

<p>I file CSV sono talvolta piuttosto ostici da utilizzare, principalmente perché il formato presenta molte varianti.<br />
Per esempio, normalmente contengono un <em>header</em> con i nomi delle colonne nella prima riga del file, oppure utilizzano i doppi apici - spesso opzionali - per raggruppare i caratteri di stringhe che contengono i delimitatori.
Per esempio:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ID,Nome,Cognome,Indirizzo
1,Paolo,Rossi,"via Paolo, 3"
2,Marco,Bianchi,via Marco Polo
</code></pre></div></div>

<p>Queste casistiche si possono pensare di trattare con non banali combinazioni di comandi come <code class="language-plaintext highlighter-rouge">sort</code>, <code class="language-plaintext highlighter-rouge">head</code>, <code class="language-plaintext highlighter-rouge">tail</code> e <code class="language-plaintext highlighter-rouge">awk</code>, oltre a gestire il tutto con <code class="language-plaintext highlighter-rouge">python</code>.<br />
Per esempio, in casi semplici, il comando</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">head</span> <span class="nt">-n</span> 1 file.csv
</code></pre></div></div>

<p>estrae la prima riga dal file <code class="language-plaintext highlighter-rouge">file.csv</code>, che potrebbe corrispondere all’header.<br />
Il condizionale è dovuto al fatto che l’header non è obbligatorio nei file CSV, e potrebbe non essere presente, come nei molti esempi presentati in questo articolo.</p>

<p>Quando il formato di un file CSV si fa complicato, oppure le operazioni da svolgere sono non banali, come ad esempio l’unione di due file diversi utilizzando criteri opportuni, ci si può affidare - sempre dalla linea di comando - a strumenti specifici per i file CSV.<br />
Alcuni esempi sono i seguenti:</p>

<ul>
  <li><a href="https://github.com/wireservice/csvkit">csvkit</a>, una suite di comandi per convertire e manipolare i file CSV.</li>
  <li><a href="https://bioinf.shenwei.me/csvtk/">csvtk</a>, un singolo programma scritto in linguaggio Go, che mette a disposizione parecchi sotto-comandi per manipolare i file CSV.</li>
  <li><a href="https://github.com/TabViewer/tabview">tabview</a>, un programma in Python che usa la libreria <code class="language-plaintext highlighter-rouge">ncurses</code> per la visualizzazione di file CSV da terminale.</li>
</ul>]]></content><author><name>Davide Galati (in arte PsykeDady)</name></author><category term="CSV" /><category term="bash" /><category term="terminale" /><summary type="html"><![CDATA[A lavoro mi capita di gestire sempre una certa quantità di CSV e similari, alle volte anche di una certa dimensione.]]></summary></entry><entry><title type="html">#howto - Rigenerazione Automatica delle Chiavi SSH per VM Debian/ubuntu Clonate</title><link href="https://linuxhub.it/articles/howto-gestione-chiavi-ssh-virtuali/" rel="alternate" type="text/html" title="#howto - Rigenerazione Automatica delle Chiavi SSH per VM Debian/ubuntu Clonate" /><published>2024-11-02T07:00:00+00:00</published><updated>2024-11-02T07:00:00+00:00</updated><id>https://linuxhub.it/articles/howto-gestione-chiavi-ssh-virtuali</id><content type="html" xml:base="https://linuxhub.it/articles/howto-gestione-chiavi-ssh-virtuali/"><![CDATA[<h1 id="cloud-init-su-linux-rigenerare-le-chiavi-ssh-in-automatico-per-il-tuo-homelab">Cloud-Init su Linux: Rigenerare le Chiavi SSH in Automatico per il Tuo Homelab</h1>

<p><em>Autore: Luigi Smiraglio</em></p>

<h2 id="introduzione">Introduzione</h2>

<p>Nel mondo degli homelab, è comune utilizzare macchine virtuali clonando un template preconfigurato. Questo metodo, sebbene efficiente, può causare problemi di sicurezza, specialmente con le chiavi SSH duplicate. In questa guida, vedremo come utilizzare <strong>cloud-init</strong> su Debian per rigenerare automaticamente le chiavi SSH al primo avvio di una macchina clonata, garantendo un ambiente più sicuro e affidabile.</p>

<h2 id="cosè-cloud-init">Cos’è <code class="language-plaintext highlighter-rouge">cloud-init</code>?</h2>

<p><code class="language-plaintext highlighter-rouge">cloud-init</code> è uno strumento potente per la configurazione automatica delle istanze al primo avvio. Originariamente progettato per ambienti cloud, può essere utilizzato efficacemente anche in ambienti virtualizzati come VMware, Proxmox o nel tuo homelab. Consente di eseguire script e configurazioni iniziali, come la rigenerazione delle chiavi SSH e la personalizzazione della rete.</p>

<h2 id="il-problema-delle-chiavi-ssh-duplicate">Il Problema delle Chiavi SSH Duplicate</h2>

<p>Clonando macchine virtuali da un template, tutte le istanze condividono le stesse chiavi SSH. Questo può causare avvisi di sicurezza quando si tenta di connettersi tramite SSH, poiché il client rileva una chiave host già conosciuta con un’impronta digitale diversa. Ad esempio:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>The authenticity of host '10.290.70.139 (10.290.70.139)' can't be established.
ED25519 key fingerprint is SHA256:bCtJRRv99999999Jshjyintpp/Fl8Z99Vv99Leeimtg.
This host key is known by the following other names/addresses:

~/.ssh/known_hosts:1: [hashed name]
~/.ssh/known_hosts:4: [hashed name]
~/.ssh/known_hosts:5: [hashed name]
~/.ssh/known_hosts:6: [hashed name]
~/.ssh/known_hosts:7: [hashed name]
~/.ssh/known_hosts:8: [hashed name]
~/.ssh/known_hosts:9: [hashed name]
~/.ssh/known_hosts:10: [hashed name]
(1 additional names omitted)
Are you sure you want to continue connecting (yes/no/[fingerprint])?
</code></pre></div></div>

<p>Questo messaggio indica un potenziale rischio di sicurezza, suggerendo un possibile attacco man-in-the-middle. Rigenerare le chiavi SSH per ogni macchina clonata risolve questo problema, migliorando la sicurezza dell’ambiente.</p>

<h2 id="soluzione-utilizzare-cloud-init-nel-tuo-homelab">Soluzione: Utilizzare <code class="language-plaintext highlighter-rouge">cloud-init</code> nel Tuo Homelab</h2>

<p>Anche se associato ai provider cloud, <code class="language-plaintext highlighter-rouge">cloud-init</code> può essere configurato per funzionare efficacemente nel tuo homelab. Ecco come implementarlo su una macchina Debian in un ambiente virtualizzato come VMware o Proxmox.</p>

<h3 id="1-installazione-e-configurazione-di-cloud-init">1. Installazione e Configurazione di <code class="language-plaintext highlighter-rouge">cloud-init</code></h3>

<h4 id="a-installare-cloud-init">a. Installare <code class="language-plaintext highlighter-rouge">cloud-init</code></h4>

<p>Verifica se <code class="language-plaintext highlighter-rouge">cloud-init</code> è già installato. In caso contrario, installalo con:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code> apt update <span class="o">&amp;&amp;</span>  apt upgrade <span class="nt">-y</span>
 apt <span class="nb">install </span>cloud-init <span class="nt">-y</span>
</code></pre></div></div>

<h4 id="b-configurare-cloud-init-per-rigenerare-le-chiavi-ssh">b. Configurare <code class="language-plaintext highlighter-rouge">cloud-init</code> per Rigenerare le Chiavi SSH</h4>

<p>Configura <code class="language-plaintext highlighter-rouge">cloud-init</code> per eliminare e rigenerare le chiavi SSH al primo avvio della macchina clonata.</p>

<ol>
  <li>
    <p><strong>Modifica il File di Configurazione</strong>:</p>

    <p>Apri <code class="language-plaintext highlighter-rouge">/etc/cloud/cloud.cfg</code> con un editor di testo:</p>
  </li>
</ol>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code> nano /etc/cloud/cloud.cfg
</code></pre></div></div>

<ol>
  <li><strong>Aggiungi o Modifica le Seguenti Linee</strong>:</li>
</ol>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">#########################################################</span>
<span class="c1">#cloud-config OFF (datasource_list)</span>
<span class="c1"># cloud-init per rigenerare le chiavi SSH al primo avvio della macchina template </span>
<span class="c1">#########################################################</span>

<span class="c1"># Evita la ricerca di sorgenti dati cloud</span>

<span class="na">datasource_list</span><span class="pi">:</span> <span class="pi">[</span> <span class="nv">None</span> <span class="pi">]</span>

<span class="c1"># Gestione delle chiavi SSH</span>

<span class="na">ssh_deletekeys</span><span class="pi">:</span> <span class="no">true</span>
<span class="na">ssh_genkeytypes</span><span class="pi">:</span> <span class="pi">[</span><span class="s1">'</span><span class="s">ed25519'</span><span class="pi">,</span> <span class="s1">'</span><span class="s">rsa'</span><span class="pi">]</span>

<span class="c1"># Disabilita la gestione della rete da parte di cloud-init</span>
<span class="na">network</span><span class="pi">:</span>
  <span class="na">config</span><span class="pi">:</span> <span class="s">disabled</span>
</code></pre></div></div>

<ul>
  <li><strong><code class="language-plaintext highlighter-rouge">datasource_list: [ None ]</code></strong>: Impedisce a <code class="language-plaintext highlighter-rouge">cloud-init</code> di cercare sorgenti dati cloud, utile per ambienti non cloud.</li>
  <li><strong><code class="language-plaintext highlighter-rouge">ssh_deletekeys: true</code></strong>: Elimina le chiavi SSH esistenti.</li>
  <li><strong><code class="language-plaintext highlighter-rouge">ssh_genkeytypes</code></strong>: Specifica i tipi di chiavi SSH da generare.</li>
  <li><strong><code class="language-plaintext highlighter-rouge">network</code></strong>: Disabilita la gestione della rete da parte di <code class="language-plaintext highlighter-rouge">cloud-init</code> per evitare conflitti.</li>
</ul>

<ol>
  <li><strong>Salva e Chiudi il File</strong>.</li>
</ol>

<h4 id="c-abilitare-cloud-init-allavvio">c. Abilitare <code class="language-plaintext highlighter-rouge">cloud-init</code> all’Avvio</h4>

<p>Assicurati che <code class="language-plaintext highlighter-rouge">cloud-init</code> sia abilitato per eseguire le configurazioni al primo avvio:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code> systemctl <span class="nb">enable </span>cloud-init
</code></pre></div></div>

<blockquote>
  <p><strong>Nota:</strong> Non avviare manualmente <code class="language-plaintext highlighter-rouge">cloud-init</code> con ` systemctl start cloud-init`. Deve essere eseguito automaticamente al primo avvio per funzionare correttamente.</p>
</blockquote>

<h3 id="2-preparazione-del-template">2. Preparazione del Template</h3>

<p>Prima di trasformare la macchina in un template, è necessario pulire i dati di <code class="language-plaintext highlighter-rouge">cloud-init</code> e spegnere la macchina. Sebbene <code class="language-plaintext highlighter-rouge">cloud-init</code> possa rigenerare automaticamente le chiavi SSH in un sistema già configurato, preferisco eliminare manualmente le chiavi host SSH esistenti per garantire che il processo di rigenerazione venga avviato correttamente. Questo perché, al primo accesso SSH, posso indirettamente avere conferma che tale meccanismo stia funzionando.</p>

<p>Esegui il seguente comando sulla macchina template:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">rm</span> /etc/ssh/ssh_host_<span class="k">*</span>
</code></pre></div></div>

<h2 id="rimozione-delle-chiavi-ssh-esistenti">Rimozione delle Chiavi SSH Esistenti</h2>

<p>Esegui il seguente comando sulla macchina template:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">rm</span> /etc/ssh/ssh_host_<span class="k">*</span>
</code></pre></div></div>

<h4 id="a-pulizia-di-cloud-init">a. Pulizia di <code class="language-plaintext highlighter-rouge">cloud-init</code></h4>

<p>Pulisci i dati di <code class="language-plaintext highlighter-rouge">cloud-init</code> per simulare un primo avvio:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code> cloud-init clean
</code></pre></div></div>

<h4 id="b-spegnere-la-macchina">b. Spegnere la Macchina</h4>

<p>Spegni la macchina in modo sicuro:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code> shutdown <span class="nt">-h</span> now
</code></pre></div></div>
<p>La macchina è ora pronta per diventare un template.</p>

<h3 id="3a-creazione-del-template-su-vmware">3.a Creazione del Template su VMware</h3>

<ol>
  <li>
    <p><strong>Seleziona la Macchina Spenta</strong>:</p>

    <p>Apri VMware e individua la macchina Debian preparata.</p>
  </li>
  <li>
    <p><strong>Converti la Macchina in un Template</strong>:</p>

    <p>Segui le procedure specifiche di VMware. Assicurati di:</p>

    <ul>
      <li><strong>Disattivare “Connect At Power On”</strong> per la scheda di rete.</li>
      <li><strong>Impostare il “MAC Address” su Automatico</strong> per evitare conflitti di rete.</li>
    </ul>
  </li>
</ol>

<h3 id="3b-creazione-del-template-su-proxmox">3.b Creazione del Template su Proxmox</h3>

<ol>
  <li>
    <p><strong>Seleziona la Macchina Spenta</strong>:</p>

    <p>Apri Proxmox e individua la macchina Debian preparata.</p>
  </li>
  <li>
    <p><strong>Converti la Macchina in un Template</strong>:</p>

    <p>Segui le procedure specifiche di Proxmox. Assicurati di:</p>

    <ul>
      <li><strong>Disattivare l’Avvio Automatico</strong> per la scheda di rete.</li>
      <li><strong>Impostare il “MAC Address” su Automatico</strong> per evitare conflitti di rete.</li>
      <li><strong>Convertire la VM in un Template</strong>:
        <ul>
          <li>Clicca con il tasto destro sulla macchina virtuale.</li>
          <li>Seleziona <strong>“Convert to Template”</strong>.</li>
          <li>Conferma l’operazione.</li>
        </ul>
      </li>
    </ul>

    <p>Questo processo creerà un template che potrà essere utilizzato per clonare nuove macchine senza conflitti di rete o chiavi SSH duplicate.</p>
  </li>
</ol>

<h3 id="4-clonazione-delle-macchine-dal-template">4. Clonazione delle Macchine dal Template</h3>

<p>Ogni volta che cloni una nuova macchina dal template:</p>

<ol>
  <li>
    <p><strong>Avvia la Macchina Clonata</strong>:</p>

    <p>Al primo avvio, <code class="language-plaintext highlighter-rouge">cloud-init</code> rigenererà automaticamente le chiavi SSH.</p>
  </li>
  <li>
    <p><strong>Verifica le Nuove Chiavi SSH</strong>:</p>

    <p>Controlla le nuove chiavi generate:</p>
  </li>
</ol>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="nb">ls</span> /etc/ssh/ssh_host_<span class="k">*</span>
</code></pre></div></div>

<h2 id="conclusione">Conclusione</h2>

<p>Utilizzando <code class="language-plaintext highlighter-rouge">cloud-init</code> nel tuo homelab, automatizzi la rigenerazione delle chiavi SSH per ogni nuova macchina clonata, migliorando la sicurezza e semplificando la gestione delle macchine virtuali. Questa soluzione è adattabile a vari sistemi operativi e piattaforme di virtualizzazione, rendendola estremamente flessibile.</p>

<hr />

<h2 id="link">Link</h2>

<ul>
  <li><a href="https://cloudinit.readthedocs.io/en/latest/index.html">Documentazione Ufficiale di cloud-init</a></li>
</ul>]]></content><author><name>Luigi Smiraglio</name></author><category term="linux" /><category term="virtualizzazione" /><category term="ssh" /><category term="sicurezza" /><summary type="html"><![CDATA[Cloud-Init su Linux: Rigenerare le Chiavi SSH in Automatico per il Tuo Homelab]]></summary></entry><entry><title type="html">#howtodev - Diagrammi con mermaidjs pt3 - Class Diagrams</title><link href="https://linuxhub.it/articles/howtodev-mermaidjs-pt3/" rel="alternate" type="text/html" title="#howtodev - Diagrammi con mermaidjs pt3 - Class Diagrams" /><published>2024-10-27T07:00:00+00:00</published><updated>2024-10-27T07:00:00+00:00</updated><id>https://linuxhub.it/articles/howtodev-mermaidjs-pt3</id><content type="html" xml:base="https://linuxhub.it/articles/howtodev-mermaidjs-pt3/"><![CDATA[<p><a href="https://linuxhub.it/articles/howtodev-mermaidjs-pt2">Articolo precedente: Sequence Diagrams ←</a></p>

<p>MermaidJS è una libreria Javascript per la creazione di diagrammi tramite linguaggio di formattazione. È integrato in alcuni software ed è facile da utilizzare.</p>

<p>Utilizzo dei Class diagrams</p>

<h2 id="obiettivi">Obiettivi</h2>

<p>L’articolo affronterà i seguenti argomenti:</p>

<ul>
  <li>Class diagrams su MermaidJS</li>
</ul>

<h2 id="prerequisiti">Prerequisiti</h2>

<p>Tutto il necessario è espresso nell’<a href="https://linuxhub.it/articles/howtodev-mermaidjs-pt1">articolo introduttivo a mermaidJS</a></p>

<h2 id="class-diagrams">Class Diagrams</h2>

<p>Il diagramma delle classi è forse il più conosciuto per chiunque si sia mai addentrato nel mondo dei diagrammi UML e nell’ingegneria del software, esprime la correlazione tra gli oggetti (classi) di un progetto ed è ottimo per rappresentare alcune strategie di sviluppo come i design patterns.</p>

<h3 id="panoramica-generale-sul-diagramma-delle-classi">Panoramica generale sul diagramma delle classi</h3>

<p>Nel diagramma delle classi i vari blocchi possono riferirsi ad oggetti, classi implementate, astratte o interfacce. I collegamenti sono in realtà molto vari e possono indicare conoscenza, ereditarietà, inclusione e molto altro.</p>

<p>Ogni riquadro può essere suddiviso in tre sezioni:</p>

<ul>
  <li>La sezione superiore contiene il nome della classe</li>
  <li>quella centrale gli attributi</li>
  <li>quella inferiore i metodi (o operazioni) della classe</li>
</ul>

<p>Mentre è ovviamente <strong>necessario</strong> avere un nome della classe, le altre due sezioni son del tutto opzionali: escluderle ovviamente non implica che quell’oggetto non abbia variabili o metodi, il diagramma UML deve fornire uno schema <em>ad alto livello</em> dell’architettura, quindi un assenza di queste sezioni può anche solo implicare che non sia necessario indicarle per capire la struttura del disegno architetturale.</p>

<p>Si possono specificare gli indicatori di visibilità in variabili o metodi:</p>

<ul>
  <li>Public, indicato con il simbolo <code class="language-plaintext highlighter-rouge">+</code>.</li>
  <li>Private, Indicato con il simbolo <code class="language-plaintext highlighter-rouge">-</code>.</li>
  <li>Protected, Indicato con il simbolo <code class="language-plaintext highlighter-rouge">#</code>.</li>
  <li>Package, Indicato con il simbolo <code class="language-plaintext highlighter-rouge">~</code> o nessun simbolo.</li>
</ul>

<p>Inoltre il nome della classe può essere preceduto (di una riga in su) da uno specificatore atto ad informare che tipo di classe è (astratta, interfaccia etc…). Spesso le interfacce son anche caratterzzate dal nome “in corsivo”.</p>

<p>Come già specificato, il vero fulcro del diagramma delle classi sta nei collegamenti tra una classe e un altra, ce ne sono di veri tipi:</p>

<ul>
  <li>Freccia di Associazione: Una linea semplice che collega due classi, rappresenta una relazione generica. Può includere molteplicità (es. 1..*, 0..1) per indicare il numero di istanze.</li>
  <li>Freccia di Aggregazione: Una linea con un rombo vuoto su un’estremità, indica una relazione “parte-tutto” in cui una classe è composta da altre, senza implicare una dipendenza forte.</li>
  <li>Freccia di Composizione: Simile all’aggregazione, ma con il rombo pieno. Indica una relazione di dipendenza forte, in cui il ciclo di vita della parte è legato al tutto.</li>
  <li>Freccia di Generalizzazione: Una freccia con una punta triangolare, rappresenta l’ereditarietà. La classe sottostante eredita attributi e metodi dalla classe superiore.</li>
  <li>Freccia di Dipendenza: Rappresentata da una freccia tratteggiata, mostra che una classe usa temporaneamente un’altra classe (ad esempio, come parametro di un metodo).</li>
</ul>

<p>Si possono inoltre indicare vari elementi come note, package, sottosistemi e altro…</p>

<h2 id="mermaid-class-diagram">Mermaid Class Diagram</h2>

<p>Su MermaidJS i class Diagram sono introdotti dalla riga:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="s">classDiagram</span>
</code></pre></div></div>

<p>Si può anche inserire un titolo scrivendo:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nn">---</span>
<span class="na">title</span><span class="pi">:</span> <span class="s">Titolo grafico</span>
<span class="nn">---</span>
<span class="s">classDiagram</span>
</code></pre></div></div>

<p>è possibile impostare una “direzione” diversa per il diagramma scrivendo:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>---
title: Titolo grafico
---
classDiagram
    direction RL
</code></pre></div></div>

<p>Dove <code class="language-plaintext highlighter-rouge">RL</code> sta per right to left (è possibile anche usare altre combinazioni come nel diagramma di flusso).</p>

<h3 id="classi">Classi</h3>

<p>Per disegnare un riquadro scrivere <code class="language-plaintext highlighter-rouge">class</code> seguito dal nome della classe:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nn">---</span>
<span class="na">title</span><span class="pi">:</span> <span class="s">Titolo grafico</span>
<span class="nn">---</span>
<span class="s">classDiagram</span>
    <span class="s">class EsempioClasse</span>
</code></pre></div></div>

<p>Apparirà un riquadro in cui, attributi e metodi, sono vuoti (le sezioni sono comunque visibili, ma vuote). Non si può purtroppo creare un riquadro senza le due sezioni di attributi e metodi, si possono solo lasciare vuote.</p>

<p>Si può anche inserire un nome più lungo con spazi e caratteri non supportati normalmente usando le parentesi quadre:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nn">---</span>
<span class="na">title</span><span class="pi">:</span> <span class="s">Titolo grafico</span>
<span class="nn">---</span>
<span class="s">classDiagram</span>
    <span class="s">class IDClasse["Esempio classe"]</span>
</code></pre></div></div>

<p>In questo caso quello che c’è prima delle parentesi graffe sarà usato come ID per la classe (utile per le relazioni ad esempio) mentre quello all’interno sarà l’etichetta (formattabile oltretutto in HTML).</p>

<h3 id="attributi-e-metodi">Attributi e metodi</h3>

<p>Per scrivere attributi e metodi si possono utilizzare due differenti sintassi:</p>

<ul>
  <li>racchiuderle tra parentesi graffe <code class="language-plaintext highlighter-rouge">{}</code>.</li>
  <li>Ogni attributo ed ogni metodo è preceduto dal nome della classe e quindi i due punti (<code class="language-plaintext highlighter-rouge">:</code>).</li>
</ul>

<p>Ad esempio per creare una classe “veicolo” con attributi “numeroRuote”, “numeroPorte” e “targa” e con il metodo “compra” si può scrivere:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nn">---</span>
<span class="na">title</span><span class="pi">:</span> <span class="s">Concessionaria</span>
<span class="nn">---</span>
<span class="s">classDiagram</span>
<span class="err">	</span><span class="s">class Veicolo{</span>
        <span class="s">-numeroRuote</span>
        <span class="s">-numeroTarga</span>
        <span class="s">-numeroPorte</span>
        <span class="s">+compra()</span>
    <span class="s">}</span>
</code></pre></div></div>

<p>Ma anche:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nn">---</span>
<span class="na">title</span><span class="pi">:</span> <span class="s">Concessionaria</span>
<span class="nn">---</span>
<span class="s">classDiagram</span>
<span class="err">	</span><span class="s">class Veicolo</span>
    <span class="s">Veicolo:-numeroRuote</span>
    <span class="s">Veicolo:-numeroTarga</span>
    <span class="s">Veicolo:-numeroPorte</span>
    <span class="s">Veicolo:+compra()</span>
</code></pre></div></div>

<p>Mermaid in modo autonomo capisce se una riga rappresenta una variabile o un metodo, in base alla presenza di parentesi tonde (che rappresentano i parametri del metodo).</p>

<p>Per mettere un tipo alle variabili metterlo dopo due punti alla fine del nome delle variabile. Invece per il tipo di ritorno ad un metodo basta scriverlo dopo le parentesi tonde (i due punti vengono aggiunti da Mermaid in autonomia):</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nn">---</span>
<span class="na">title</span><span class="pi">:</span> <span class="s">Concessionaria</span>
<span class="nn">---</span>
<span class="s">classDiagram</span>
<span class="err">	</span><span class="s">class Veicolo{</span>
        <span class="s">-numeroRuote</span><span class="err">:</span> <span class="s">int</span>
        <span class="s">-numeroTarga</span><span class="err">:</span> <span class="s">string</span>
        <span class="s">-numeroPorte</span><span class="err">:</span> <span class="s">int</span>
        <span class="s">+compra()</span>
        <span class="s">+owner()String</span>
    <span class="s">}</span>
</code></pre></div></div>

<h3 id="interface-e-abstract">Interface e Abstract</h3>

<p>Per inserire le tipologie di classi basta inserire una riga all’interno del metodo con le parentesi angolate. Per l’interfaccia Veicolo:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nn">---</span>
<span class="na">title</span><span class="pi">:</span> <span class="s">Concessionaria</span>
<span class="nn">---</span>
<span class="s">classDiagram</span>
<span class="err">	</span><span class="s">class Veicolo{</span>
        <span class="s">&lt;&lt;Interface&gt;&gt;</span>
        <span class="s">+numeroRuote()</span>
        <span class="s">+compra()</span>
    <span class="s">}</span>
</code></pre></div></div>

<p>Per creare una classe astratta, nativamente non è possibile <em>farlo con il nome in corsivo</em>, quindi bisognerà adattarsi a scriverlo come annotazione:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nn">---</span>
<span class="na">title</span><span class="pi">:</span> <span class="s">Concessionaria</span>
<span class="nn">---</span>
<span class="s">classDiagram</span>
<span class="err">	</span><span class="s">class Veicolo{</span>
        <span class="s">&lt;&lt;Abstract&gt;&gt;</span>
        <span class="s">+numeroRuote()</span>
        <span class="s">+compra()</span>
    <span class="s">}</span>
</code></pre></div></div>

<p>Esiste però un <em>workaround</em> interessante, ovvero quello di sfruttare HTML per questa modifica, staccando identificatore e label della classe:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nn">---</span>
<span class="na">title</span><span class="pi">:</span> <span class="s">Concessionaria</span>
<span class="nn">---</span>

<span class="s">classDiagram</span>
<span class="err">	</span><span class="s">class Veicolo["&lt;em&gt;Veicolo&lt;/em&gt;"] {</span>
        <span class="s">&lt;&lt;Abstract&gt;&gt;</span>
        <span class="s">+numeroRuote()</span>
        <span class="s">+compra()</span>
    <span class="s">}</span>
</code></pre></div></div>

<h3 id="generic-types">Generic Types</h3>

<p>Nella programmazione ad oggetti i “<em>tipi generici</em>” sono uno dei fulcri della programmazione ad alto livello più utilizzati da linguaggi come Java e permettono di creare collezioni di oggetti che hanno un vincolo legato al tipo che viene però risolto nel momento dell’utilizzo e non nella struttura stessa della collezione.</p>

<p>Questo concetto in mermaid si può indicare con il carattere <code class="language-plaintext highlighter-rouge">~</code>:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nn">---</span>
<span class="na">title</span><span class="pi">:</span> <span class="s">Concessionaria</span>
<span class="nn">---</span>
<span class="s">classDiagram</span>
<span class="err">	</span><span class="s">class Veicolo {</span>
        <span class="s">List~Ruota~ ruote;</span>
    <span class="s">}</span>
</code></pre></div></div>

<h2 id="relazioni">Relazioni</h2>

<p>Le relazioni tra classi sono varie e si possono esprimere attraverso delle “frecce” disegnate con i caratteri <code class="language-plaintext highlighter-rouge">-</code> o <code class="language-plaintext highlighter-rouge">.</code>.</p>

<p>In mermaid:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">--&gt;</code> Associazione: la freccia che indica che tra due classi vi è un associazione, un inclusione o comunque una relazione generica</li>
  <li><code class="language-plaintext highlighter-rouge">&lt;|--</code> Estensione o generalizzazione: indica l’ereditarietà o l’implementazione.</li>
  <li><code class="language-plaintext highlighter-rouge">..|&gt;</code> realizzazione: indica anche una tipologia di implementazione</li>
  <li><code class="language-plaintext highlighter-rouge">*--</code> Composizione: la composizione è un relazione “debole” e serve per indicare che una classe può essere composta da una o più istanze di un altra</li>
  <li><code class="language-plaintext highlighter-rouge">o--</code> Aggregazione, ovvero una composizione forte: quando togli un istanza di un aggregazione distruggi la struttura stessa della classe</li>
  <li><code class="language-plaintext highlighter-rouge">..&gt;</code> Dipendenza: ovvero una classe dipende, anche solo temporaneamente, da un altra classe</li>
  <li><code class="language-plaintext highlighter-rouge">..</code> Linea tratteggiata semplice: ottima per collegare note o altro.</li>
  <li><code class="language-plaintext highlighter-rouge">--</code> Linea continua semplice: ottima per collegare note o altro.</li>
</ul>

<h3 id="etichetta">Etichetta</h3>
<p>In alcune frecce può essere utile aggiungere etichette.<br />
Per aggiungerla basta scrivere dopo la relazione e il simbolo <code class="language-plaintext highlighter-rouge">:</code> un etichetta</p>

<p>Ecco un esempio:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nn">---</span>
<span class="na">title</span><span class="pi">:</span> <span class="s">Concessionaria</span>
<span class="nn">---</span>
<span class="s">classDiagram</span>
<span class="err">	</span><span class="s">class Veicolo</span>
    <span class="s">class Macchina</span>
    <span class="s">Macchina --|&gt; Veicolo</span><span class="err">:</span> <span class="s">se ha 4 ruote</span>
</code></pre></div></div>

<h3 id="cardinalità">Cardinalità</h3>

<p>La cardinalità indica da quante istanze una classe dipende da un altra. La dipendenza può essere di vari tipi (composizione, aggregazione, etc…) ma il significato della cardinalità resta invariato. Per implementarla scrivere il numero da una parte ad un altra della freccia tra virgolette doppie <code class="language-plaintext highlighter-rouge">"</code>:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nn">---</span>
<span class="na">title</span><span class="pi">:</span> <span class="s">Concessionaria</span>
<span class="nn">---</span>
<span class="s">classDiagram</span>
<span class="err">	</span><span class="s">class Veicolo</span>
    <span class="s">class Ruote</span>
    <span class="s">Veicolo --*"2..4" Ruote</span>
</code></pre></div></div>

<h3 id="esempio-completo">Esempio completo</h3>

<p>Ecco un esempio completo:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nn">---</span>
<span class="na">title</span><span class="pi">:</span> <span class="s">Concessionaria</span>
<span class="nn">---</span>
<span class="s">classDiagram</span>
<span class="err">	</span><span class="s">class Veicolo{</span>
        <span class="s">&lt;&lt;interface&gt;&gt;</span>
        <span class="s">+nruote()int</span>
    <span class="s">}</span>
    <span class="s">class Ruote</span>
    <span class="s">class Sensori</span>
    <span class="s">class Moto{</span>
        <span class="s">+nruote()int</span>
    <span class="s">}</span>
    <span class="s">class Macchina{</span>
        <span class="s">+nruote()int=4</span>
    <span class="s">}</span>

    <span class="s">Veicolo --*"2..4" Ruote</span>
    <span class="s">Veicolo --o"2..4" Sensori</span>
    <span class="s">Moto --|&gt; Veicolo</span><span class="err">:</span> <span class="s">se ha due o tre ruote</span>
    <span class="s">Macchina --|&gt; Veicolo</span><span class="err">:</span> <span class="s">se ha 4 ruote</span>
</code></pre></div></div>

<h2 id="sistemi">Sistemi</h2>

<p>I sistemi son raggruppamenti che permettono di identificare delle classi che hanno delle caratteristiche in comune o fanno parte di sistemi diversi.</p>

<p>In MermaidJS è possibile creare dei “namespace” per rappresentarli:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nn">---</span>
<span class="na">title</span><span class="pi">:</span> <span class="s">Concessionaria</span>
<span class="nn">---</span>
<span class="s">classDiagram</span>
    <span class="s">namespace  VeicoliABenzina {</span>
        <span class="s">class Moto{</span>
            <span class="s">+nruote()int</span>
        <span class="s">}</span>
        <span class="s">class Macchina{</span>
            <span class="s">+nruote()int=4</span>
        <span class="s">}</span>
    <span class="s">}</span>
    <span class="s">namespace  MezziAnalogici {</span>
        <span class="s">class Bici{</span>
            <span class="s">+nruote()int=2</span>
        <span class="s">}</span>
    <span class="s">}</span>
<span class="err">	</span><span class="s">class Veicolo{</span>
        <span class="s">&lt;&lt;interface&gt;&gt;</span>
        <span class="s">+nruote()int</span>
    <span class="s">}</span>

    <span class="s">Bici --|&gt; Veicolo</span>
    <span class="s">Moto --|&gt; Veicolo</span>
    <span class="s">Macchina --|&gt; Veicolo</span>
    
</code></pre></div></div>

<h2 id="le-note">Le note</h2>

<p>dulcis in fundus, ecco la gestione delle note: basta infatti inserire la parolina <code class="language-plaintext highlighter-rouge">note</code> e scrivere delle note tra virgolette doppie <code class="language-plaintext highlighter-rouge">"</code> per visualizzarle. Inoltre scrivendo dopo <code class="language-plaintext highlighter-rouge">note</code> <code class="language-plaintext highlighter-rouge">for NOMECLASSE</code> verrà collegato ad una specifica classe</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nn">---</span>
<span class="na">title</span><span class="pi">:</span> <span class="s">Concessionaria</span>
<span class="nn">---</span>
<span class="s">classDiagram</span>
<span class="err">	</span><span class="s">class Veicolo{</span>
        <span class="s">&lt;&lt;interface&gt;&gt;</span>
        <span class="s">+nruote()int</span>
    <span class="s">}</span>
    <span class="s">class Moto{</span>
        <span class="s">+nruote()int</span>
    <span class="s">}</span>
    <span class="s">class Macchina{</span>
        <span class="s">+nruote()int=4</span>
    <span class="s">}</span>

    <span class="s">Moto --|&gt; Veicolo</span><span class="err">:</span> <span class="s">se ha due o tre ruote</span>
    <span class="s">Macchina --|&gt; Veicolo</span><span class="err">:</span> <span class="s">se ha 4 ruote</span>

    <span class="s">note "Il seguente grafico mostra la gestione\ndei mezzi per veicoli a benzina"</span>

    <span class="s">note for Moto "Si esistono moto a tre ruote..."</span>
</code></pre></div></div>]]></content><author><name>Davide Galati (in arte PsykeDady)</name></author><category term="javascript" /><category term="mermaidjs" /><category term="uml" /><summary type="html"><![CDATA[Articolo precedente: Sequence Diagrams ←]]></summary></entry><entry><title type="html">#howto - Navi: cheatsheet per il terminale</title><link href="https://linuxhub.it/articles/howto-navi-cheatsheet-per-il-terminale/" rel="alternate" type="text/html" title="#howto - Navi: cheatsheet per il terminale" /><published>2024-10-18T09:00:00+00:00</published><updated>2024-10-18T09:00:00+00:00</updated><id>https://linuxhub.it/articles/howto-navi-cheatsheet-per-il-terminale</id><content type="html" xml:base="https://linuxhub.it/articles/howto-navi-cheatsheet-per-il-terminale/"><![CDATA[<p>Chi lavora molto spesso sul terminale è conscio del fatto che alcuni comandi hanno un’importanza e un’utilità maggiore di altri.</p>

<p>Navi consente di memorizzare (e addirittura <strong>parametrizzare</strong>) questi comandi in file speciali, chiamati <em>cheatsheets</em>, che in un secondo momento possono essere cercati ed eseguiti.</p>

<p>Navi ingloba le principali funzioni di <a href="https://linuxhub.it/articles/howto-tldr-esempi-pratici-per-i-comandi/">tldr</a> e <a href="https://linuxhub.it/articles/howto-guide-rapide-con-cheat-sh/">cheat.sh</a>.</p>

<h2 id="requisiti">Requisiti</h2>

<p>Per utilizzare Navi, è necessario installare uno strumento di “fuzzy finding”, come <a href="https://github.com/junegunn/fzf">fzf</a> o <a href="https://github.com/lotabout/skim">skim</a>.</p>

<p>Sono entrambi tool che consentono di filtrare l’output di altri comandi in modalità “fuzzy”, in modo da trovare tutte le righe corrispondenti ad un determinato pattern, anche omettendo alcuni caratteri nel mezzo.</p>

<p>Nel caso di <code class="language-plaintext highlighter-rouge">fzf</code>, l’installazione per le principali piattaforme è la seguente:</p>

<h3 id="installare-fzf-su-ubuntu">Installare Fzf su Ubuntu</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>apt <span class="nb">install </span>fzf
</code></pre></div></div>

<h3 id="installare-fzf-su-fedora">Installare Fzf su Fedora</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>dnf <span class="nb">install </span>fzf
</code></pre></div></div>

<h3 id="installare-fzf-su-arch-linux">Installare Fzf su Arch Linux</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pacman <span class="nt">-S</span> fzf
</code></pre></div></div>

<h3 id="installare-fzf-su-mac-os">Installare Fzf su Mac OS</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>brew <span class="nb">install </span>fzf
</code></pre></div></div>

<h2 id="installazione-navi">Installazione Navi</h2>

<h3 id="installare-navi-su-ubuntu">Installare navi su Ubuntu</h3>

<p>Nel caso di Ubuntu, non è disponibile alcun pacchetto pronto per l’installazione (tutt’al più esistono i <a href="https://github.com/denisidoro/navi/releases">binari precompilati ufficiali</a> per le piattaforme più utilizzate).</p>

<p>In alternativa, per compilare il codice da sorgente, le istruzioni ufficiali sono le seguenti:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git clone https://github.com/denisidoro/navi ~/.navi
<span class="nb">cd</span> ~/.navi
make <span class="nb">install</span>
</code></pre></div></div>

<p>Al termine dell’installazione (o del download del software precompilato), è possibile spostare manualmente l’eseguibile in una delle cartelle del proprio <code class="language-plaintext highlighter-rouge">$PATH</code> (affinché si possa eseguire <code class="language-plaintext highlighter-rouge">navi</code> globalmente, a prescindere dalla cartella in cui ci si trovi).</p>

<p>In alternativa al semplice <code class="language-plaintext highlighter-rouge">make install</code>, è consigliato specificare anzitempo la cartella di installazione dell’eseguibile impostando la variabile <code class="language-plaintext highlighter-rouge">BIN_DIR</code>:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>make <span class="nv">BIN_DIR</span><span class="o">=</span>/usr/local/bin <span class="nb">install</span>
</code></pre></div></div>

<h3 id="installare-navi-su-fedora">Installare navi su Fedora</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>dnf <span class="nb">install </span>navi
</code></pre></div></div>

<h3 id="installare-navi-su-arch-linux">Installare navi su Arch Linux</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pacman <span class="nt">-S</span> navi
</code></pre></div></div>

<h3 id="installare-navi-su-via-cargo">Installare navi su via Cargo</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>cargo <span class="nb">install</span> <span class="nt">--locked</span> navi
</code></pre></div></div>

<h3 id="installare-navi-su-mac-os">Installare navi su Mac OS</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>brew <span class="nb">install </span>navi
</code></pre></div></div>

<h2 id="cheatsheets">Cheatsheets</h2>

<h3 id="consultare-i-cheatsheet">Consultare i cheatsheet</h3>

<p>Una volta installato <code class="language-plaintext highlighter-rouge">navi</code>, è possibile consultare cheatsheet semplicemente avviando l’eseguibile (senza alcun altro parametro) e digitando del testo.</p>

<p>Si aprirà un’interfaccia testuale (fornita da uno tra <code class="language-plaintext highlighter-rouge">fzf</code> o <code class="language-plaintext highlighter-rouge">skim</code>), in cui si può navigare usando le frecce direzionali e si può filtrare l’elenco a schermo digitando dei caratteri.</p>

<blockquote>
  <p>La ricerca segue le <a href="https://github.com/junegunn/fzf#search-syntax">regole del fuzzy finding</a>, identica sia nel caso di <code class="language-plaintext highlighter-rouge">fzf</code> che di <code class="language-plaintext highlighter-rouge">skim</code>.</p>
</blockquote>

<p>Premendo <code class="language-plaintext highlighter-rouge">Enter</code>, viene confermata la selezione attuale.</p>

<p>Tuttavia, all’inizio non c’è un’ampia gamma di suggerimenti da consultare: è necessario scaricarne di nuovi.</p>

<blockquote>
  <p>Avviare <code class="language-plaintext highlighter-rouge">navi</code> usando l’argomento –print consente una consultazione in modalità di “sola lettura”, prevenendo eventuali esecuzioni accidentali.</p>
</blockquote>

<h3 id="scaricare-cheatsheet-già-pronti">Scaricare cheatsheet già pronti</h3>

<p>Per scaricare una prima selezione di cheatsheet, quella principale, basterà usare lo stesso <code class="language-plaintext highlighter-rouge">navi</code> (o <code class="language-plaintext highlighter-rouge">navi fn welcome</code>) e scegliere la voce corrispondente al comando <code class="language-plaintext highlighter-rouge">navi repo add denisidoro/cheats</code>.</p>

<p>Ci sono molti altri repository di cheatsheet installabili interattivamente da <code class="language-plaintext highlighter-rouge">navi</code>, selezionando la voce relativa al comando <code class="language-plaintext highlighter-rouge">navi repo browse</code>.</p>

<p>Per installare nuovi cheatsheet, che non sono in elenco ma che sono caricati su una repository git, è sufficiente usare <code class="language-plaintext highlighter-rouge">navi repo add &lt;URL&gt;</code>, dove URL può anche essere nel formato <strong>utente/repository</strong> nel caso specifico di una repository GitHub.</p>

<blockquote>
  <p>Nota bene:</p>

  <p>i cheatsheet non vengono aggiornati automaticamente da Navi.</p>
</blockquote>

<h3 id="creare-un-proprio-cheatsheet">Creare un proprio cheatsheet</h3>

<p>Anziché salvare nuovi comandi, nuove funzioni e nuovi alias nel proprio .bashrc, .zshrc e simili, è possibile memorizzarli in file di configurazione per Navi (da posizionare in <code class="language-plaintext highlighter-rouge">~/.local/share/navi/cheats</code> sotto l’estensione <em>.cheat</em>).</p>

<p>Si consideri, ad esempio, la pipeline mostrata all’inizio:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ps aux | <span class="nb">awk</span> <span class="s1">'{print $3, $11}'</span> | <span class="nb">sort</span> <span class="nt">-nr</span> <span class="nt">-k</span> 2 | <span class="nb">tail</span> <span class="nt">-n</span> +2 | <span class="nb">head</span> <span class="nt">-5</span>  <span class="c"># I 5 processi che stanno usando più CPU.</span>
</code></pre></div></div>

<p>Questo comando può essere trasportato in Navi (ad esempio in <code class="language-plaintext highlighter-rouge">~/.local/share/navi/cheats/processi.cheat</code>), parametrizzandolo così che il numero di processi selezionati non sia 5, ma liberamente selezionabile (uno dei vantaggi di Navi rispetto a strumenti simili):</p>

<pre><code class="language-plain">; Le righe che iniziano per punto e virgola (;) sono ignorate da Navi e corrispondono a dei commenti.

; Le righe che iniziano per percentuale (%) indicano le categorie (separate da virgola) del cheatsheet (Navi le mostra sulla sinistra).
% ps, cpu

; Le righe che cominciano per cancelletto (#) sono la descrizione del comando che segue.
# Elenca gli N processi che stanno usando più CPU.
; I parametri racchiusi tra i segni di minore e maggiore (&lt; &gt;) sono variabili, che se non specificate (vedi righe successive) sono chieste in input all'utente.
ps aux | awk '{print $3, $11}' | sort -nr -k 2 | tail -n +2 | head -&lt;N&gt;

; Le righe che iniziano con il segno di dollaro ($) indicano la definizione di variabili (inclusa una selezione di valori multipli da selezionare).
$ N: tr ' ' '\n' &lt;&lt;&lt; '3 5 10'
; La riga precedente è completamente opzionale in questo caso: quando rimossa, l'utente è libero di inserire un qualsiasi valore in input.
</code></pre>

<p>Su GitHub è disponibile la <a href="https://github.com/denisidoro/navi/blob/master/docs/cheatsheet_syntax.md">pagina di riferimento</a> per conoscere la sintassi completa, comprese le funzionalità più avanzate come i comandi multilinea e l’aliasing.</p>

<h2 id="come-widget-della-shell">Come widget della shell</h2>

<p>Anziché digitare ogni volta <code class="language-plaintext highlighter-rouge">navi</code>, potrebbe essere più utile assegnare l’esecuzione del comando a una scorciatoia da tastiera.</p>

<p>Navi fornisce nativamente l’integrazione per tutte le principali shell.</p>

<h3 id="bash">Bash</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">eval</span> <span class="s2">"</span><span class="si">$(</span>navi widget bash<span class="si">)</span><span class="s2">"</span>
</code></pre></div></div>

<h3 id="zsh">Zsh</h3>

<div class="language-zsh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">eval</span> <span class="s2">"</span><span class="si">$(</span>navi widget zsh<span class="si">)</span><span class="s2">"</span>
</code></pre></div></div>

<h3 id="fish">Fish</h3>

<pre><code class="language-fish">navi widget fish | source
</code></pre>

<p>I comandi sopra elencati possono essere sia <strong>invocati manualmente</strong> dopo aver aperto il terminale (con lo svantaggio che i cambiamenti non restano alla chiusura), sia possono essere salvati nei <strong>file di configurazione della propria shell</strong> (come .bashrc, .zshrc e simili).</p>

<p>La scorciatoia assegnata di default è <code class="language-plaintext highlighter-rouge">CTRL+G</code> e non può essere cambiata (se non modificando manualmente lo script che va poi invocato da <code class="language-plaintext highlighter-rouge">eval</code>).</p>

<h2 id="come-alternativa-a-tldr-e-cheatsh">Come alternativa a TLDR e Cheat.sh</h2>

<p>Come precedentemente accennato, Navi può essere utilizzato anche come frontend per <a href="https://linuxhub.it/articles/howto-tldr-esempi-pratici-per-i-comandi/">tldr</a> e <a href="https://linuxhub.it/articles/howto-guide-rapide-con-cheat-sh/">cheat.sh</a>, a cui abbiamo dedicato degli articoli in passato.</p>

<p>Sia <code class="language-plaintext highlighter-rouge">tldr</code> che <code class="language-plaintext highlighter-rouge">cheat.sh</code> sono valide alternative e si completano a vincenda, con delle piccole ma importanti differenze:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">tldr</code>, che va installato, fa affidamento a un database locale che bisogna aggiornare periodicamente.</li>
  <li><code class="language-plaintext highlighter-rouge">cheat.sh</code> è consultabile online su <a href="cheat.sh">cheat.sh</a>, con lo svantaggio di non poter essere consultato senza internet.</li>
</ul>

<p>Per usare <code class="language-plaintext highlighter-rouge">tldr</code> su <code class="language-plaintext highlighter-rouge">git</code> in Navi:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>navi <span class="nt">--tldr</span> git
</code></pre></div></div>

<blockquote>
  <p>Attenzione:</p>

  <p>non tutti i client di <code class="language-plaintext highlighter-rouge">tldr</code> supportano il parametro –markdown (che in alcuni casi è stato sostituito da –raw).
Per questo motivo, Navi potrebbe non funzionare anche nel caso in cui <code class="language-plaintext highlighter-rouge">tldr</code> sia installato correttamente.</p>
</blockquote>

<p>Per usare <code class="language-plaintext highlighter-rouge">cheat.sh</code> su <code class="language-plaintext highlighter-rouge">git</code> in Navi:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>navi <span class="nt">--cheatsh</span> git
</code></pre></div></div>

<h2 id="ulteriori-informazioni">Ulteriori informazioni</h2>

<p>Il codice sorgente di Navi è disponibile sulla <a href="https://github.com/denisidoro/navi">pagina GitHub</a> ufficiale.</p>]]></content><author><name>Midblyte</name></author><category term="ubuntu" /><category term="fedora" /><category term="archlinux" /><category term="macos" /><summary type="html"><![CDATA[Chi lavora molto spesso sul terminale è conscio del fatto che alcuni comandi hanno un’importanza e un’utilità maggiore di altri.]]></summary></entry><entry><title type="html">#howtodev - Diagrammi con mermaidjs pt2 - Sequence Diagram</title><link href="https://linuxhub.it/articles/howtodev-mermaidjs-pt2/" rel="alternate" type="text/html" title="#howtodev - Diagrammi con mermaidjs pt2 - Sequence Diagram" /><published>2024-10-13T07:00:00+00:00</published><updated>2024-10-13T07:00:00+00:00</updated><id>https://linuxhub.it/articles/howtodev-mermaidjs-pt2</id><content type="html" xml:base="https://linuxhub.it/articles/howtodev-mermaidjs-pt2/"><![CDATA[<p><a href="https://linuxhub.it/articles/howtodev-mermaidjs-pt1">Articolo precedente: Introduzione e Flowcharts ←</a><br />
<a href="https://linuxhub.it/articles/howtodev-mermaidjs-pt3">Articolo successivo: Class Diagrams →</a></p>

<p>MermaidJS è una libreria Javascript per la creazione di diagrammi tramite linguaggio di formattazione. È integrato in alcuni software ed è facile da utilizzare.</p>

<p>Utilizzo dei Sequence diagrams.</p>

<h2 id="obiettivi">Obiettivi</h2>

<p>L’articolo affronterà i seguenti argomenti:</p>

<ul>
  <li>Sequence diagrams su mermaid JS</li>
</ul>

<h2 id="prerequisiti">Prerequisiti</h2>

<p>Tutto il necessario è espresso nell’<a href="https://linuxhub.it/articles/howtodev-mermaidjs-pt1">articolo introduttivo a mermaidJS</a></p>

<h2 id="sequence-diagrams">Sequence diagrams</h2>

<p>I Sequence Diagrams son diagrammi UML che hanno lo scopo di modellare l’interazione tra diversi oggetti di un flusso di programmazione.</p>

<p>Le varie interazioni comprendono chiamate a oggetti, metodi, invio di messaggi e attività che vengono posizionate nel tempo.</p>

<p>Ogni attore viene rappresentato da una timeline verticale, i messaggi da frecce (continue o a tratti) che vanno da un attore ad un altro dall’alto verso il basso.</p>

<p>Ci son diverse tipologie di messaggio che si possono indicare:</p>

<ul>
  <li>messaggi sincroni, indicati da una linea continua con freccia piena</li>
  <li>messaggi asincroni, indicati da una linea continua con una freccia vuota</li>
  <li>messaggio di risposta, indicata da una linea tratteggiata con freccia vuota</li>
  <li>messaggio eliminato, rappresentato ad un collegamento tratteggiato con una X sopra</li>
</ul>

<h2 id="sequence-diagrams-in-mermaidjs">Sequence diagrams in mermaidjs</h2>

<p>MermaidJS supporta questo genere di diagrammi ovviamente. Sono introdotti dalla riga:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="s">sequenceDiagram</span>
</code></pre></div></div>

<p>Ogni riga successiva rappresenta un evento, un partecipante o un attore. Per introdurre un partecipante esplicitamente si scrive <code class="language-plaintext highlighter-rouge">participant</code>:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="s">sequenceDiagram</span>
    <span class="s">participant NomeAttore</span>
</code></pre></div></div>

<p>Per uno scambio di messaggi sincroni basta utilizzare una freccia con due punte <code class="language-plaintext highlighter-rouge">-&gt;&gt;</code>:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="s">sequenceDiagram</span>
    <span class="s">participant NomeAttore</span>
    <span class="s">participant NomeAttore2</span>
    <span class="s">NomeAttore -&gt;&gt; NomeAttore2</span><span class="err">:</span> <span class="s">messaggio</span>
</code></pre></div></div>

<p>A seguito di uno scambio, va esplicitato un messaggio (che si posizionerà sopra la linea), il messaggio può essere anche vuoto, ma vanno comunque indicati i due punti <code class="language-plaintext highlighter-rouge">:</code> e uno spazio</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="s">sequenceDiagram</span>
    <span class="s">participant NomeAttore</span>
    <span class="s">participant NomeAttore2</span>
    <span class="s">NomeAttore -&gt;&gt; NomeAttore2</span><span class="err">:</span> 
</code></pre></div></div>

<p>Da notare che, se un partecipante non è esplicitamente dichiarato, viene comunque creato dopo aver creato uno scambio di messaggi asincroni. La sintassi:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="s">sequenceDiagram</span>
    <span class="s">NomeAttore -&gt;&gt; NomeAttore2</span>
</code></pre></div></div>

<p>Produce quindi lo stesso risultato di cui sopra.</p>

<h3 id="actor">Actor</h3>

<p>Per avere un attore anziché un oggetto, basta dichiararlo come <code class="language-plaintext highlighter-rouge">actor</code>:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="s">sequenceDiagram</span>
    <span class="s">actor NomeAttore</span>
</code></pre></div></div>

<p>In questo caso va dichiarato esplicitamente, il valore di default ricade sempre sul partecipante e non attore.</p>

<h3 id="vari-tipi-di-messaggi">Vari tipi di messaggi</h3>

<p>Mermaid supporta vari tipi di messaggi ovviamente:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">-&gt;</code> Chiamata sincrona</li>
  <li><code class="language-plaintext highlighter-rouge">--&gt;</code> Chiamata asincrona</li>
  <li><code class="language-plaintext highlighter-rouge">-&gt;&gt;</code> messaggio sincrono</li>
  <li><code class="language-plaintext highlighter-rouge">--&gt;&gt;</code> messaggio sincrono</li>
  <li><code class="language-plaintext highlighter-rouge">&lt;&lt;-&gt;&gt;</code> comunicazione bidirezionale sincrona</li>
  <li><code class="language-plaintext highlighter-rouge">&lt;&lt;--&gt;&gt;</code> comunicazione bidirezionale asincrona</li>
  <li><code class="language-plaintext highlighter-rouge">-x</code> Terminazione sincrona di un attore</li>
  <li><code class="language-plaintext highlighter-rouge">--x</code>	Terminazione asincrona di un attore.</li>
  <li><code class="language-plaintext highlighter-rouge">-)</code> Messaggio asincrono con freccia vuota</li>
  <li><code class="language-plaintext highlighter-rouge">--)</code>	Messaggio asincrono con freccia vuota e linea tratteggiata</li>
</ul>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="s">sequenceDiagram</span>
    <span class="s">Dady -&gt; Bob</span><span class="err">:</span> <span class="s">linea continua</span>
    <span class="s">Dady --&gt; Bob</span><span class="err">:</span> <span class="s">linea tratteggiata</span>
    <span class="s">Dady -&gt;&gt; Bob</span><span class="err">:</span> <span class="s">linea continua e freccia piena</span>
    <span class="s">Dady --&gt;&gt; Bob</span><span class="err">:</span> <span class="s">linea tratteggiata e freccia piena</span>
    <span class="s">Dady &lt;&lt;-&gt;&gt; Bob</span><span class="err">:</span> <span class="s">linea continua con due freccie piene</span>
    <span class="s">Dady &lt;&lt;--&gt;&gt; Bob</span><span class="err">:</span> <span class="s">linea tratteggiata con due freccie piene</span>
    <span class="s">Dady -x Bob</span><span class="err">:</span> <span class="s">linea continua con x</span>
    <span class="s">Dady --x Bob</span><span class="err">:</span> <span class="s">linea tratteggiata con x</span>
    <span class="s">Dady -) Bob</span><span class="err">:</span> <span class="s">linea continua e freccia vuota</span>
    <span class="s">Dady --) Bob</span><span class="err">:</span> <span class="s">linea tratteggiata e freccia vuota</span>
</code></pre></div></div>

<h3 id="createdestroy">Create/Destroy</h3>

<p>La creazione di un partecipante o di un attore può avvenire in momenti diversi. Usando la parolina “<code class="language-plaintext highlighter-rouge">create</code>” si può anche far si che venga creato in un punto particolare della timeline e non in alto:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="s">sequenceDiagram</span>
    <span class="s">Dady-&gt;&gt;Bob</span><span class="err">:</span> <span class="s">a</span>
    <span class="s">Bob -&gt;&gt; Dady</span><span class="err">:</span> <span class="s">b</span>
    <span class="s">create participant Gio</span>
    <span class="s">Bob -&gt;&gt; Gio</span><span class="err">:</span> <span class="s">c</span>
</code></pre></div></div>

<p>In questo caso, Gio viene creato solo dopo il messaggio “b”. Tramite la parola <code class="language-plaintext highlighter-rouge">destroy</code> può poi essere distrutto in un momento specifico. La distruzione di un attore o un partecipante deve essere però seguita da un messaggio di “delete”:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="s">sequenceDiagram</span>
    <span class="s">Dady-&gt;&gt;Bob</span><span class="err">:</span> <span class="s">Ciao Bob</span>
    <span class="s">Bob -&gt;&gt; Dady</span><span class="err">:</span> <span class="s">Ciao Dady</span>
    <span class="s">create participant Gio</span>
    <span class="s">Bob -&gt;&gt; Gio</span><span class="err">:</span> <span class="s">Oh guarda Gio Ciao</span>
    <span class="s">Gio -&gt;&gt; Dady</span><span class="err">:</span> <span class="s">Son di passaggio ciao!</span>
    <span class="s">Dady -&gt;&gt; Gio</span><span class="err">:</span> <span class="s">Ciao!</span>
    <span class="s">destroy Gio</span>
    <span class="s">Bob-xGio</span><span class="err">:</span> <span class="s">Ciao!</span>
    <span class="s">Dady -&gt;&gt; Bob</span><span class="err">:</span> <span class="s">come stai Bob?</span>
    <span class="s">Bob -&gt;&gt; Dady</span><span class="err">:</span> <span class="s">bene tu dady?</span>
</code></pre></div></div>

<h3 id="alias">Alias</h3>

<p>Se il nome di un partecipante è complesso o si vuole creare un id più semplice e corto senza dover ripetere ogni messaggio il nome per intero si può creare un alias, ovvero il partecipante viene creato con un certo id ma il nome mostrato poi è diverso:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="s">sequenceDiagram</span>
    <span class="s">participant D as Dady</span>
    <span class="s">D -&gt;&gt; Bob</span><span class="err">:</span> <span class="s">Ciao Bob</span>
</code></pre></div></div>

<h3 id="le-note">Le note</h3>

<p>Si possono creare delle note, ovvero riquadri che spiegano in maniera approfondita delle zone di diagramma.<br />
Le note possono essere a lato del diagramma:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="s">sequenceDiagram</span>
    <span class="s">participant Dady</span>
    <span class="s">Note right of Dady</span><span class="err">:</span> <span class="s">Nota a destra</span>
<span class="na">	Note left of Dady</span><span class="pi">:</span> <span class="s">Nota a destra</span>
</code></pre></div></div>

<p>O nel diagramma in una conversazione</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="s">sequenceDiagram</span>
<span class="err">	</span><span class="s">participant Dady</span>
<span class="err">	</span><span class="s">participant Bob</span>
<span class="err">	</span><span class="s">Note over Dady,Bob</span><span class="err">:</span> <span class="s">Nota nella conversazione</span>
</code></pre></div></div>

<h3 id="loop">Loop</h3>

<p>I loop indicano un frammento di timeline che si ripete, e si possono indicare in una struttura molto simile al loop di programmazione:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="s">sequenceDiagram</span>
    <span class="s">loop ogni ora</span>
        <span class="s">Dady-&gt;Bob</span><span class="err">:</span> <span class="s">Che ore sono?</span>
        <span class="s">Bob--&gt;Dady</span><span class="err">:</span> <span class="s">ecco qua l'ora</span>
    <span class="s">end</span>
</code></pre></div></div>

<h3 id="raggruppamento">Raggruppamento</h3>

<p>Si possono raggruppare in box i vari partecipanti, e colorare i box in maniere differenti:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="s">sequenceDiagram</span>
    <span class="s">box rgba(255,255,0,0.5) Box Giallo</span>
        <span class="s">participant Dady</span>
        <span class="s">actor Bob</span>
    <span class="s">end</span>
</code></pre></div></div>

<p>Si può specificare il colore in rgba, il nome e i partecipanti all’interno.</p>

<h3 id="altre-informazioni">Altre informazioni</h3>

<p>Altre informazioni <a href="https://mermaid.js.org/syntax/sequenceDiagram.html">sulla documentazione ufficiale</a>.</p>]]></content><author><name>Davide Galati (in arte PsykeDady)</name></author><category term="javascript" /><category term="mermaidjs" /><category term="uml" /><summary type="html"><![CDATA[Articolo precedente: Introduzione e Flowcharts ← Articolo successivo: Class Diagrams →]]></summary></entry><entry><title type="html">#howtodev - Diagrammi con mermaidjs - Introduzione e Flowcharts</title><link href="https://linuxhub.it/articles/howtodev-mermaidjs-pt1/" rel="alternate" type="text/html" title="#howtodev - Diagrammi con mermaidjs - Introduzione e Flowcharts" /><published>2024-09-29T07:00:00+00:00</published><updated>2024-09-29T07:00:00+00:00</updated><id>https://linuxhub.it/articles/howtodev-mermaidjs-pt1</id><content type="html" xml:base="https://linuxhub.it/articles/howtodev-mermaidjs-pt1/"><![CDATA[<p><a href="https://linuxhub.it/articles/howtodev-mermaidjs-pt2">Articolo successivo: Sequence Diagrams →</a></p>

<p>MermaidJS è una libreria Javascript per la creazione di diagrammi tramite linguaggio di formattazione. È integrato in alcuni software ed è facile da utilizzare.</p>

<p>Ecco una guida sull’utilizzo base.</p>

<h2 id="definizione">Definizione</h2>

<p>MermaidJS consente di creare, tramite un linguaggio di markup, grafici di diverso tipo: UML, di MANAGMENT, flowchart etc…</p>

<p>Essendo un approccio di tipo <code class="language-plaintext highlighter-rouge">WYSIWYM</code> (Ovvero <em>What you see is what you mean</em>) consente facilmente di ottenere risultati ottimali senza quella frustazione tipica dei software GUI in cui si passa il tempo a spostare archi e riquadri fino ad ottenere soluzioni soddisfacenti.</p>

<h2 id="obiettivi">Obiettivi</h2>

<p>L’articolo affronterà i seguenti argomenti:</p>

<ul>
  <li>Installazione di mermaidJS</li>
  <li>Uso base</li>
  <li>Tipologia di diagrammi</li>
  <li>Flow Chart</li>
</ul>

<h2 id="prerequisiti">Prerequisiti</h2>

<p>All’interno dell’articolo si troveranno riferimenti a <code class="language-plaintext highlighter-rouge">NPM</code>, sarebbe quindi meglio conoscere lo strumento prima di continuare l’articolo.</p>

<h2 id="installazione">Installazione</h2>

<p>Esistono vari modi di utilizzare mermaidJS. Il più comune è sicuramente quello di utilizzarlo tramite la comoda <a href="https://mermaid.live">interfaccia web ufficiale</a> che consente anche di vedere le modifiche in tempo reale.</p>

<p>Esistono anche alcuni editor GUI come <a href="https://linuxhub.it/articles/howto-installare-personalizzare-ed-usare-typora/">Typora</a> che lo includono come funzionalità aggiuntiva.</p>

<p>Ma essendo una libreria Javascript può essere utilizzato anche attraverso codice o con un client dedicato.</p>

<h3 id="installare-mermaid-cli">Installare mermaid-cli</h3>

<p>Il modo migliore per interagire in locale con mermaid è proprio quello di usare il client. Per installarlo utilizzare npm:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>npm <span class="nb">install</span> <span class="nt">--global</span> mermaid.cli
</code></pre></div></div>

<h3 id="utilizzo-mermaidcli">Utilizzo mermaid.cli</h3>

<p>Va poi utilizzato tramite la linea di comando. Per generare un diagramma basta scrivere:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mmdc <span class="nt">-i</span> nomefileinput <span class="nt">-o</span> nomefileoutput.png 
</code></pre></div></div>

<p>Dove <code class="language-plaintext highlighter-rouge">nomefileinput</code> è il codice sorgente scritto con il markup di mermaidjs, <code class="language-plaintext highlighter-rouge">nomefileoutput</code> è il nome dell’immagine dove finirà il grafico.</p>

<p>Ci sono anche diverse opzioni molto utili, ad esempio i temi :</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">-t</span> &lt;theme&gt;
</code></pre></div></div>

<p>I temi sono <em>default</em>, <em>forest</em>, <em>dark</em> e <em>neutral</em></p>

<p>O semplicemente il colore del background</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">-b</span> &lt;colore&gt;
</code></pre></div></div>

<p>il colore potete scriverlo in esadecimale con # prima oppure in inglese come se fosse un foglio di stile.</p>

<p>Si possono impostare impostare larghezza ed altezza dell’output così:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">-w</span> &lt;width&gt;
<span class="nt">-H</span> &lt;height&gt;
</code></pre></div></div>

<p>Facendo un esempio completo, per creare un grafico con background nero, tema dark, dimensione 400x400 il comando sarà:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mmdc <span class="nt">-b</span> <span class="s1">'#000000'</span> <span class="nt">-t</span> dark <span class="nt">-w</span> 400 <span class="nt">-H</span> 400 <span class="nt">-i</span> nomefileinput <span class="nt">-o</span> nomefileoutput.png
</code></pre></div></div>

<h2 id="tipologie-di-diagrammi">Tipologie di diagrammi</h2>

<p>Mermaid supporta tantissimi tipi di diagrammi, ed essendo ancora pienamente supportato e aggiornato, aumentano ogni anno.</p>

<p>Quelli supportati dal framework al momento sono:</p>

<ul>
  <li>Flowchart</li>
  <li>Sequence Diagram</li>
  <li>Class Diagram</li>
  <li>State Diagram</li>
  <li>Entity Relationship Diagram</li>
  <li>User Journey</li>
  <li>Gantt</li>
  <li>Pie Chart</li>
  <li>Quadrant Chart</li>
  <li>Requirement Diagram</li>
  <li>Gitgraph (Git) Diagram</li>
  <li>C4 Diagram</li>
  <li>Mindmaps</li>
  <li>Timeline</li>
  <li>ZenUM</li>
  <li>Sankey</li>
  <li>XY Chart</li>
  <li>Block Diagram</li>
  <li>Packet</li>
  <li>Architecture</li>
</ul>

<p>Maggiori dettagli <a href="https://mermaid.js.org/intro/">nella documentazione ufficiale</a>.</p>

<p>Non tutti i grafici son supportati dai client che utilizzano il framework, consultare quindi le documentazioni dei vari progetti per avere dettagli della versione supportata.</p>

<h3 id="sintassi-base">Sintassi base</h3>

<p>Generalmente tutti i diagrammi son introdotti dal nome sulla prima riga, a seguire ogni altra riga, con un livello di indentazione in più.</p>

<h2 id="flow-chart">Flow Chart</h2>

<p>Uno dei tipi più comuni e semplici di diagrammi: può rappresentare un flusso di istruzioni, di idee, la descrizione di algoritmo etc…</p>

<p>Un flowchart è introdotto su mermaid da:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="s">flowchart LR</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">LR</code> rappresenta la direzione del grafico (ovvero <strong>left to right</strong> in questo caso), può essere sostituito da <code class="language-plaintext highlighter-rouge">TB</code>.
Ogni combinazione di lettere (<code class="language-plaintext highlighter-rouge">BT</code> e <code class="language-plaintext highlighter-rouge">RL</code>). A seguire si possono effettuare i vari collegamenti tra i box.</p>

<p>Per creare un box basta scriverne il nome:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="s">flowchart LR</span>
<span class="err">	</span><span class="s">A</span>
</code></pre></div></div>

<p>Per assegnare un nome diverso dall’etichetta basta scriverne il nome tra parentesi quadre:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="s">flowchart LR</span>
    <span class="s">A[Un box qualunque]</span>
</code></pre></div></div>

<p>Per creare un collegamento tra due box, collegarli con una freccia: <code class="language-plaintext highlighter-rouge">--&gt;</code></p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="s">flowchart LR</span>
    <span class="s">A[Un box qualunque] --&gt; B</span>
</code></pre></div></div>

<p>Continuando si possono creare vere e proprie catene:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="s">flowchart LR</span>
    <span class="s">A[Un box qualunque] --&gt; B</span>
<span class="err">	</span><span class="s">B--&gt;C</span>
<span class="err">	</span><span class="s">C--&gt;D</span>
<span class="err">	</span><span class="s">C--&gt;A</span>
<span class="err">	</span><span class="s">F--&gt;B</span>
</code></pre></div></div>

<p>Il risultato sarà</p>

<p><a href="https://mermaid.live/edit#pako:eNo1kD1vgzAQhv-KdTNBYINteaiUD2VKl1ZdWne4YNMggZ1QW02K-O81qXLTc6fn3uGdoPHGgoK29z_NCcdADi_akTTrjzdHjv5KLhH76C7RfpLV6olstNNhk2i7wDbB7gHrBfYJkgMZDHYcsDMpfVoiNYSTHawGldDYFmMfNGg3JxVj8K8314AKY7QZxLPBYHcdfo04gGqx_07XM7p374eHlFZQE1xBMclzIUpRVpLKWvIMbqBKVudMFrSqSi4ErymfM_i9_xc5LyRnjHMuGK1qWmZgTRf8-Pxfx72V-Q9oUFaD"><img src="https://mermaid.ink/img/pako:eNo1kD1vgzAQhv-KdTNBYINteaiUD2VKl1ZdWne4YNMggZ1QW02K-O81qXLTc6fn3uGdoPHGgoK29z_NCcdADi_akTTrjzdHjv5KLhH76C7RfpLV6olstNNhk2i7wDbB7gHrBfYJkgMZDHYcsDMpfVoiNYSTHawGldDYFmMfNGg3JxVj8K8314AKY7QZxLPBYHcdfo04gGqx_07XM7p374eHlFZQE1xBMclzIUpRVpLKWvIMbqBKVudMFrSqSi4ErymfM_i9_xc5LyRnjHMuGK1qWmZgTRf8-Pxfx72V-Q9oUFaD?type=png" alt="" /></a></p>

<p>Se manca lo spazio verticale (nel caso di diagrammi LR e RL) automaticamente i box vengono disposti su seconda riga.</p>

<h3 id="altre-forme">Altre forme</h3>

<p>Un diagramma di flusso può essere fatto da diversi blocchi con diverse forme. Ognuna delle quali ha differenti significati (blocco condizionale, blocco sorgente dati, input/output etc…).</p>

<p>Per disegnare tramite mermaid altre forme basta scrivere, dopo l’identificativo, il simbolo che lo rappresenta.</p>

<h3 id="attività-semplice">Attività semplice</h3>

<p>Per un blocco <em>attività semplice</em> (<em>rettangolare</em>), come si è già visto si utilizzano le parentesi quadre <code class="language-plaintext highlighter-rouge">[]</code>, ma anche semplicemente scrivendo il nome, se non contiene caratteri particolari o spazi, per impostazioni predefinita diventa un blocco rettangolare:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="s">flowchart TB</span>
    <span class="s">A["blocco attività"]</span>
<span class="err">	</span><span class="s">SecondoBlocco</span>
</code></pre></div></div>

<h4 id="blocco-di-partenzafine">Blocco di partenza/fine</h4>

<p>I blocchi <em>rettangolari con gli angoli arrotondati</em> utilizzati in genere all’inizio e alla fine del flusso, in mermaid si utilizzano le parentesi tonde <code class="language-plaintext highlighter-rouge">()</code> per identificarlo</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="s">flowchart TB</span>
    <span class="s">A("blocco fine/inizio")</span>
</code></pre></div></div>

<h4 id="blocco-delle-decisioni">Blocco delle decisioni</h4>

<p>Per diramare una decisione si può utilizzare un blocco a forma di <em>rombo</em>, tramite le parentesi graffe <code class="language-plaintext highlighter-rouge">{}</code>:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="s">flowchart TB</span>
    <span class="s">A{"blocco decisionale"}</span>
</code></pre></div></div>

<h4 id="blocco-inputoutput">Blocco input/output</h4>

<p>I blocchi che identificano l’ingresso di una variabile o l’uscita possono essere identificati da <em>parallelogramma</em>, che nel framework son identificati da parentesi quadre e caratteri slash inversi, al cui interno va poi messo il testo del blocco <code class="language-plaintext highlighter-rouge">[\ \]</code>:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="s">flowchart TB</span>
    <span class="s">A[\variabile input o output\]</span>
</code></pre></div></div>

<p>Si può anche invertire la direzione del parallelepipedo utilizzando il carattere slash normale <code class="language-plaintext highlighter-rouge">[/ /]</code></p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="s">flowchart TB</span>
    <span class="s">A[/variabile input o output/]</span>
</code></pre></div></div>

<h4 id="database">Database</h4>

<p>Per indicare una sorgente dati si usa un icona cilindrica, che rappresenta appunto il database.<br />
Allo scopo, scrivere il testo tra parentesi quadre e poi tonde <code class="language-plaintext highlighter-rouge">[()]</code></p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="s">flowchart LR</span>
    <span class="s">id1[(Database)]</span>
</code></pre></div></div>

<h4 id="altre-forme-1">Altre forme</h4>

<p>Mermaid supporta moltre altre forme, come il cerchio, trapezzoidi e altro: maggiori informazioni sulla <a href="https://mermaid.js.org/syntax/flowchart.html">documentazione ufficiale</a></p>

<h3 id="testo-nel-collegamento">Testo nel collegamento</h3>

<p>Si può inserire un testo nella freccia che collega un box ad un altro, per farlo scrivere del testo tra due segni <code class="language-plaintext highlighter-rouge">-</code> e altri due:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="s">flowchart TB</span>
    <span class="s">A --"testo collegamento"--&gt;B</span>
</code></pre></div></div>

<h3 id="sotto-grafico">Sotto-grafico</h3>

<p>Si può racchiudere una porzione di diagramma a parte, un vero e proprio sotto-diagramma, che può avere una direzione diversa ad esempio, un nome a se stante ed essere collegato ad altri.</p>

<p>Per crearlo scrivere <code class="language-plaintext highlighter-rouge">subgraph NOME</code> e su nuova linea scrivere i collegamenti, terminare con <code class="language-plaintext highlighter-rouge">end</code>:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="s">flowchart LR</span>
<span class="err">	</span><span class="s">subgraph sottoD1</span>
<span class="err">		</span><span class="s">A--&gt;B</span>
<span class="err">	</span><span class="s">end</span>
<span class="err">	</span><span class="s">C--&gt;sottoD1</span>
<span class="err">	</span><span class="s">D--&gt;A</span>
</code></pre></div></div>

<p>Per cambiare direzione nel sottografico la prima istruzione deve essere <code class="language-plaintext highlighter-rouge">direction</code> seguita dalla direzione:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="s">flowchart LR</span>
<span class="err">	</span><span class="s">subgraph sottoD1</span>
        <span class="s">direction TB</span>
<span class="err">		</span><span class="s">A</span>
        <span class="s">B</span>
        <span class="s">A--&gt;B</span>
<span class="err">	</span><span class="s">end</span>
<span class="err">	</span><span class="s">C--&gt;sottoD1</span>
</code></pre></div></div>

<blockquote>
  <p>NOTA BENE:</p>

  <p>Ricordarsi che comunque mermaid aggiusta la direzione e la posizione dei blocchi per ottimizzarli, quindi il sottografo potrebbe anche seguire una direzione diversa</p>
</blockquote>

<h3 id="cambio-di-stile">Cambio di stile</h3>

<p>Si può sistemare lo stile e aggiungere classi utilizzando la parola chiave <code class="language-plaintext highlighter-rouge">style</code> seguito dallo stile: purtroppo non è uno stile nella sintassi standard di css:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">fill</code> rappresenta il colore di sfondo.</li>
  <li><code class="language-plaintext highlighter-rouge">stroke</code> rappresenta il colore della freccia.</li>
  <li><code class="language-plaintext highlighter-rouge">color</code> rappresenta il colore nel testo.</li>
  <li><code class="language-plaintext highlighter-rouge">stroke-dasharray</code> serve a creare un bordo frastagliato, prende in ingresso due o più numeri, il primo indica la lunghezza del segmento il secondo la distanza tra un segmento ed un altro, se si continua con altri numeri si possono indicare lunghezze diverse.</li>
  <li><code class="language-plaintext highlighter-rouge">stroke-width</code> indica quanto ogni segmento è spesso.</li>
</ul>

<p>Ecco un esempio:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="s">flowchart LR</span>
<span class="err">	</span><span class="s">A--&gt;B</span>
    <span class="s">C--&gt;B</span>
    <span class="s">D--&gt;A</span>
    <span class="s">style A fill:#000,color:#FFF</span>
    <span class="s">style C fill:#FFF,stroke:#F00</span>
    <span class="s">style B stroke-dasharray</span><span class="err">:</span> <span class="s">3 </span><span class="m">5</span>
</code></pre></div></div>

<p><a href="https://mermaid.live/edit#pako:eNpNkMFOhDAQhl-lmb0WUii0TQ8m7G446UVvppcGikssdFNKFAnvbl007py-mfn-ZDIrNK41IKGz7qO5aB_Q47MaVaiS5OGoRhTr9I_niNWOU1isQRXqemvlgRCCG2edl4e6ru-N068Rx3gK3r2byITcK0e0L5JWT_EErxeJKCoBw2D8oPs23rf-BBSEixmMAhmxNZ2ebVCgxi2qeg7uZRkbkMHPBsN8bXUw516_eT2A7LSd4vSqx1fnhj8ptiBX-ARJBUs5z3hWiFyUgmFYQGa0TKkgeVFkjHNW5mzD8HXLk5QRwShllBd5jFCOwbR9cP5pf-jtr9s3aJxo4g"><img src="https://mermaid.ink/img/pako:eNpNkMFOhDAQhl-lmb0WUii0TQ8m7G446UVvppcGikssdFNKFAnvbl007py-mfn-ZDIrNK41IKGz7qO5aB_Q47MaVaiS5OGoRhTr9I_niNWOU1isQRXqemvlgRCCG2edl4e6ru-N068Rx3gK3r2byITcK0e0L5JWT_EErxeJKCoBw2D8oPs23rf-BBSEixmMAhmxNZ2ebVCgxi2qeg7uZRkbkMHPBsN8bXUw516_eT2A7LSd4vSqx1fnhj8ptiBX-ARJBUs5z3hWiFyUgmFYQGa0TKkgeVFkjHNW5mzD8HXLk5QRwShllBd5jFCOwbR9cP5pf-jtr9s3aJxo4g?type=png" alt="" /></a></p>

<p>Si può inserire anche una classe. Dopo un identificativo di blocco inserire tre volte i due punti <code class="language-plaintext highlighter-rouge">:::</code> e quindi il nome della classe, si può quindi definire dopo la classe scrivendo <code class="language-plaintext highlighter-rouge">classDef nomeclasse style</code></p>

<p>Ecco un esempio:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="s">flowchart LR</span>
<span class="err">	</span><span class="s">A:::verde--&gt;B</span>
    <span class="s">C--&gt;B</span>
    <span class="s">D--&gt;A</span>
    <span class="s">classDef verde fill:#0F0, color:#666, stroke</span><span class="err">:</span> <span class="c1">#666</span>
</code></pre></div></div>]]></content><author><name>Davide Galati (in arte PsykeDady)</name></author><category term="javascript" /><category term="mermaidjs" /><category term="uml" /><summary type="html"><![CDATA[Articolo successivo: Sequence Diagrams →]]></summary></entry><entry><title type="html">#howto - Powerline e Powerlevel10k: prompt piacevoli e veloci</title><link href="https://linuxhub.it/articles/howto-powerline-e-powerlevel10k-prompt-piacevoli-e-veloci/" rel="alternate" type="text/html" title="#howto - Powerline e Powerlevel10k: prompt piacevoli e veloci" /><published>2024-09-20T09:00:00+00:00</published><updated>2024-09-20T09:00:00+00:00</updated><id>https://linuxhub.it/articles/howto-powerline-e-powerlevel10k-prompt-piacevoli-e-veloci</id><content type="html" xml:base="https://linuxhub.it/articles/howto-powerline-e-powerlevel10k-prompt-piacevoli-e-veloci/"><![CDATA[<p>Le interfacce da terminale non sono note per essere eleganti alla vista: il fatto che sia supportato solo il testo è una caratteristica intrinseca dei terminali, che ha profonde ragioni storiche.</p>

<p>Talvolta è un punto di forza (per minimalismo, densità di informazioni, minori distrazioni a schermo, etc…).</p>

<p>Tuttavia, altre volte è una limitazione, a cui negli anni si è cercato di far fronte con soluzioni sempre diverse: è il caso di Powerline e simili (come Powerlevel10k, specifico per Zsh).</p>

<h2 id="per-iniziare">Per iniziare</h2>

<p>Powerline è Noto plugin per Vim, anche se negli anni si è evoluto per supportare più piattaforme, Powerline fornisce <strong>statusline</strong> e <strong>prompt</strong> a vari software per terminale: sono supportati bash, zsh, fish, tmux, IPython, Awesome, i3 e Qtile.</p>

<h3 id="cosè-powerlevel10k">Cos’è Powerlevel10k?</h3>

<p>Powerlevel10k, fork di Powerlevel9k, è un tema (ispirato a Powerline) specifico per i prompt Zsh.</p>

<p>I suoi punti di forza sono le alte prestazioni e l’estrema personalizzazione.</p>

<h3 id="che-cosè-un-prompt">Che cos’è un prompt?</h3>

<p>Si tratta dell’interfaccia, mostrata all’interno di un terminale, dove compare il testo attualmente immesso in input annesso a alcune informazioni utili (ad esempio cartella corrente, utente e gruppo).</p>

<p>Powerline e Powerlevel10k possono modificare quest’ultima parte, aggiungendo nuove informazioni al prompt, cambiarne lo stile e molto altro.</p>

<p>Solitamente un prompt occupa un’unica riga di terminale, ma esistono anche prompt multilinea.</p>

<h2 id="requisiti-powerlevel">Requisiti Powerlevel</h2>

<p>Per beneficiare appieno di Powerline e software simili, è necessario l’utilizzo di alcuni font opportunamente modificati.</p>

<h3 id="font">Font</h3>

<p>Per installare nuovi font da terminale, è necessario muovere i font scaricati (o la cartella che li comprende) in <code class="language-plaintext highlighter-rouge">~/.local/share/fonts</code> (per l’utente corrente) o <code class="language-plaintext highlighter-rouge">/usr/local/share/fonts</code> (per tutto il sistema).</p>

<p>Una volta installato un nuovo font, è necessario segnalare al sistema operativo la loro presenza con:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>fc-cache <span class="nt">-vf</span> ~/.local/share/fonts
<span class="c"># oppure</span>
fc-cache <span class="nt">-vf</span> /usr/local/share/fonts
</code></pre></div></div>

<h4 id="powerline-fonts">Powerline fonts</h4>

<p>I <strong>powerline fonts</strong> sono varianti dei font più conosciuti, appositamente modificati, che aggiungono il supporto a caratteri non ufficialmente approvati dal consorzio Unicode: grazie ad essi, è possibile mostrare sul terminale alcune icone come se fossero caratteri.</p>

<p>Consulta il <a href="https://github.com/powerline/fonts">sito ufficiale</a> per maggiori informazioni e per il download.</p>

<h4 id="nerdfonts-consigliati">Nerdfonts (consigliati)</h4>

<p>I <strong>nerdfonts</strong> sono simili ai Powerline fonts, ma sono molto più completi: aggiungono il supporto a molti altri glifi non legati a Powerline (come le icone di Material Design, Font Awesome, e molte altre ancora).</p>

<p>Consulta il (https://www.nerdfonts.com/)[sito ufficiale] per maggiori informazioni e per il download.</p>

<h2 id="powerlevel10k">Powerlevel10k</h2>

<p><img src="https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/extravagant-style.png" alt="Un prompt, esagerato per l'utilizzo quotidiano, pensato per dimostrare le potenzialità di Powerlevel10k" /></p>

<p>Sebbene Powerline supporti Zsh, è invece consigliato <strong>Powerlevel10k</strong> che ha prestazioni superiori, maggiore personalizzazione e migliore supporto (differentemente da Powerline, tutto il necessario è già incluso e non esistono requisiti “consigliati”).</p>

<p>Come anticipato, Powerlevel10k non è supportato su shell diverse.</p>

<h3 id="installazione-powerlevel">Installazione Powerlevel</h3>

<p>L’installazione (maggiori informazioni <a href="https://github.com/romkatv/powerlevel10k#installation">qui</a>) varia a seconda del framework utilizzato (nessuno, Oh-My-Zsh, Prezto, e così via).</p>

<h4 id="installazione-manuale-nessun-framework">Installazione manuale (nessun framework)</h4>

<p>Se non si sta utilizzando alcun framework, l’installazione va effettuata in questo modo:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git clone <span class="nt">--depth</span><span class="o">=</span>1 https://github.com/romkatv/powerlevel10k.git ~/powerlevel10k
<span class="nb">echo</span> <span class="s1">'source ~/powerlevel10k/powerlevel10k.zsh-theme'</span> <span class="o">&gt;&gt;</span> ~/.zshrc
</code></pre></div></div>

<p>La cartella di installazione di default sarà <code class="language-plaintext highlighter-rouge">~/powerlevel10k</code>, ma può essere modificata all’occorrenza.</p>

<h4 id="oh-my-zsh">Oh-My-Zsh</h4>

<p>Per gli utenti Oh-My-Zsh:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git clone <span class="nt">--depth</span><span class="o">=</span>1 https://github.com/romkatv/powerlevel10k.git <span class="k">${</span><span class="nv">ZSH_CUSTOM</span><span class="k">:-</span><span class="nv">$HOME</span><span class="p">/.oh-my-zsh/custom</span><span class="k">}</span>/themes/powerlevel10k
<span class="nb">echo</span> <span class="s1">'ZSH_THEME="powerlevel10k/powerlevel10k"'</span> <span class="o">&gt;&gt;</span> ~/.zshrc
</code></pre></div></div>

<h4 id="prezto">Prezto</h4>

<p>Per gli utenti Prezto:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">echo</span> <span class="s1">'zstyle :prezto:module:prompt theme powerlevel10k'</span> <span class="o">&gt;&gt;</span> ~/.zpreztorc
</code></pre></div></div>

<h3 id="personalizzazione-powerlevel">Personalizzazione Powerlevel</h3>

<p>Una volta installato Powerlevel10k, la maggior parte della configurazione può essere effettuata <strong>interattivamente</strong> con:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>p10k configure
</code></pre></div></div>

<p>Al termine, verrà generato un file di configurazione (<code class="language-plaintext highlighter-rouge">~/.p10k.zsh</code>, a meno che il percorso di installazione di Powerlevel10k non sia stato modificato in precedenza).</p>

<p>La configurazione può essere personalizzata ulteriormente modificando il file come testo con <code class="language-plaintext highlighter-rouge">nano</code> o qualunque altro editor.</p>

<p>Le linee guida si possono trovare sulla (https://github.com/romkatv/powerlevel10k?tab=readme-ov-file#extremely-customizable)[pagina GitHub] del progetto.</p>

<h2 id="powerline">Powerline</h2>

<p>Per shell diverse da Zsh (in tal caso, è consigliata l’installazione di Powerlevel10k), va installato Powerline dopo aver soddisfatto alcuni requisiti:</p>

<h3 id="requisiti-powerline">Requisiti Powerline</h3>

<p>Python è l’unico requisito obbligatorio da soddisfare per utilizzare Powerline.</p>

<p>Assieme all’installazione di Python verrà installato anche il suo package manager, <code class="language-plaintext highlighter-rouge">pip</code> (se così non fosse, consulta (https://pip.pypa.io/en/latest/installation/)[questa] pagina).</p>

<h4 id="ubuntu">Ubuntu</h4>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>apt <span class="nb">install </span>python3
</code></pre></div></div>

<h4 id="fedora">Fedora</h4>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>dnf <span class="nb">install </span>python3
</code></pre></div></div>

<h4 id="arch-linux">Arch linux</h4>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pacman <span class="nt">-S</span> python-pipx
</code></pre></div></div>

<h3 id="installazione-powerline">Installazione Powerline</h3>

<p>Via pip:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pip <span class="nb">install </span>powerline-status
</code></pre></div></div>

<p>Su archlinux pipx:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pipx <span class="nb">install </span>powerline-status
</code></pre></div></div>

<p>Sul sito della documentazione c’è un’intera <a href="https://powerline.readthedocs.io/en/latest/installation.html#pip-installation">pagina</a> dedicata a ulteriori requisiti opzionali, sia per migliorare le prestazioni che per abilitare il supporto a nuovi segmenti.</p>

<h3 id="configurazione">Configurazione</h3>

<p>Nei seguenti paragrafi, <code class="language-plaintext highlighter-rouge">{repository_root}</code> va sostituito con quanto appare accanto a “<em>Location</em>: “ una volta digitato <code class="language-plaintext highlighter-rouge">pip show powerline-status</code>.</p>

<h4 id="bash">Bash</h4>

<p>Va aggiunto nel file <code class="language-plaintext highlighter-rouge">~/.bashrc</code>:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>powerline-daemon <span class="nt">-q</span>
<span class="nv">POWERLINE_BASH_CONTINUATION</span><span class="o">=</span>1
<span class="nv">POWERLINE_BASH_SELECT</span><span class="o">=</span>1

<span class="nb">source</span> <span class="o">{</span>repository_root<span class="o">}</span>/powerline/bindings/bash/powerline.sh
</code></pre></div></div>

<h4 id="fish">Fish</h4>

<p>Va aggiunto nel file <code class="language-plaintext highlighter-rouge">~/config.fish</code>:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">set </span>fish_function_path <span class="nv">$fish_function_path</span> <span class="s2">"{repository_root}/powerline/bindings/fish"</span>
powerline-setup
</code></pre></div></div>

<h3 id="personalizzazione-powerline">Personalizzazione Powerline</h3>

<p>Sfortunatamente, la personalizzazione dei segmenti del prompt è ben più macchinosa se confrontata con Powerlevel10k.</p>

<p>Il file di configurazione principale è situato in <code class="language-plaintext highlighter-rouge">~/.config/powerline/config.json</code> e può essere creato per sovrascrivere le impostazioni di default di Powerline (e che si applicano a tutti i software su cui può essere abilitato).</p>

<p>Per personalizzare il <strong>prompt dei comandi</strong>, è necessario creare e modificare il file <code class="language-plaintext highlighter-rouge">~/.config/powerline/themes/shell/default.json</code></p>

<p>Un esempio di configurazione molto semplice (che sovrascrive quella di default - situata in <code class="language-plaintext highlighter-rouge">{repository_root}/powerline/themes/shell/default.json</code>) è la seguente:</p>
<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
  </span><span class="nl">"default_module"</span><span class="p">:</span><span class="w"> </span><span class="s2">"powerline.segments.common"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"segments"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"left"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
      </span><span class="p">{</span><span class="w"> </span><span class="nl">"function"</span><span class="p">:</span><span class="w"> </span><span class="s2">"powerline.segments.common.env.user"</span><span class="w"> </span><span class="p">},</span><span class="w">
      </span><span class="p">{</span><span class="w"> </span><span class="nl">"function"</span><span class="p">:</span><span class="w"> </span><span class="s2">"powerline.segments.shell.cwd"</span><span class="w"> </span><span class="p">}</span><span class="w">
    </span><span class="p">],</span><span class="w">
    </span><span class="nl">"right"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
      </span><span class="p">{</span><span class="nl">"function"</span><span class="p">:</span><span class="w"> </span><span class="s2">"powerline.segments.shell.last_pipe_status"</span><span class="w"> </span><span class="p">}</span><span class="w">
    </span><span class="p">]</span><span class="w">
  </span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<p>Per personalizzare i <strong>colori del prompt</strong>, è necessario creare e modificare il file <code class="language-plaintext highlighter-rouge">~/.config/powerline/colorschemes/shell/default.json</code></p>

<p>I colori di default sono definiti nei vari file di configurazione in <code class="language-plaintext highlighter-rouge">{repository_root}/powerline/colorschemes</code>.</p>

<h3 id="altre-informazioni">Altre informazioni</h3>

<p>La pagina di aiuto per conoscere tutte le impostazioni di configurazione è disponibile sul <a href="https://powerline.readthedocs.io/en/latest/configuration/reference.html">sito ReadTheDocs di Powerline</a>.</p>

<p>Esiste anche la pagina specifica per ottenere maggiori informazioni sui <a href="https://powerline.readthedocs.io/en/latest/configuration/segments.html">segmenti</a>, più tutte le informazioni necessarie per abilitarli e configurarli.</p>

<h3 id="powerline-come-statusline">Powerline come statusline</h3>

<p>Powerline supporta non solamente la personalizzazione del prompt, ma anche della statusline di svariati altri software, come Vim.</p>

<h4 id="vim">Vim</h4>

<p>Se si sta utilizzando <code class="language-plaintext highlighter-rouge">~/.vimrc</code> con il supporto Python abilitato, vanno aggiunte le seguenti righe:</p>

<pre><code class="language-python3">python3 from powerline.vim import setup as powerline_setup
python3 powerline_setup()
python3 del powerline_setup
</code></pre>

<p>Una volta abilitato, la statusline di Vim dovrebbe apparire così:</p>

<p><img src="https://camo.githubusercontent.com/84c9d8d0189ee4a170f264b28ba3edd66b9f225b218374b9d3de1f4acbaedf52/68747470733a2f2f7261772e6769746875622e636f6d2f706f7765726c696e652f706f7765726c696e652f646576656c6f702f646f63732f736f757263652f5f7374617469632f696d672f706c2d6d6f64652d6e6f726d616c2e706e67" alt="Powerline statusline in Vim (normal mode)" /></p>]]></content><author><name>Midblyte</name></author><category term="ubuntu" /><category term="fedora" /><category term="archlinux" /><summary type="html"><![CDATA[Le interfacce da terminale non sono note per essere eleganti alla vista: il fatto che sia supportato solo il testo è una caratteristica intrinseca dei terminali, che ha profonde ragioni storiche.]]></summary></entry><entry><title type="html">#howto - Consultare il meteo</title><link href="https://linuxhub.it/articles/howto-meteo/" rel="alternate" type="text/html" title="#howto - Consultare il meteo" /><published>2024-09-14T07:00:00+00:00</published><updated>2024-09-14T07:00:00+00:00</updated><id>https://linuxhub.it/articles/howto-meteo</id><content type="html" xml:base="https://linuxhub.it/articles/howto-meteo/"><![CDATA[<p>Non capita a tutti di dover controllare il meteo dal proprio pc, essendo ormai presente come funzione di base in quasi tutti gli smartphone.</p>

<p>Che servano o meno, esistono diversi metodi da terminale per consultare il meteo.</p>

<h2 id="curl">CURL</h2>

<p>Tramite curl si possono interrogare alcuni siti per consultare il meteo, come <strong>wttr</strong> o <strong>open meteo</strong>.</p>

<h3 id="wttr">WTTR</h3>

<p>il metodo più semplice è sicuramente quello offerto dal sito wttr.in:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>curl wttr.in
</code></pre></div></div>

<p>Automaticamente, in base alla localizzazione data dalla propria connessione wifi, si avrà il meteo della propria zona in una serie di piccole ascii art:</p>

<pre><code class="language-plain">Weather report: Bari, Italy

     \  /       Partly cloudy
   _ /"".-.     +23(25) °C     
     \_(   ).   ↗ 34 km/h      
     /(___(__)  10 km          
                0.0 mm         
                                      
</code></pre>

<p>Tuttavia <em>la localizzazione può fallire</em>, tanto meglio quindi indicare direttamente la propria città così:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>curl wttr.in/NOMECITTA
</code></pre></div></div>

<blockquote>
  <p>NOTA:</p>

  <p>Sostituire eventuali spazi con carattere “underscore” <code class="language-plaintext highlighter-rouge">_</code></p>
</blockquote>

<h3 id="open-meteo">Open Meteo</h3>

<p>Un metodo un po’ più complesso è sicuramente quello di <strong>Open Meteo</strong>, che restituisce i dati sotto forma di JSON. Questo metodo in realtà non è adatto <strong>alla consultazione giornaliera del meteo da parte di un utente standard</strong>, ma più ad uno sviluppatore che vuole farsi la propria applicazione basata sul meteo.</p>

<p>Per fare la query, bisogna innanzitutto <em>conoscere le coordinate della propria città</em> in termini di longitudine e latitudine. Le informazioni restituite possono essere davvero tante, quindi si può scegliere quali si vogliono ricevere e quali no.</p>

<p>Tramite la <a href="https://open-meteo.com/en/docs">documentazione offerta sull’apposito sito</a> è possibile costruire la propria query personalizzata in modo da non perdere troppo tempo.</p>

<p>Ecco qui un esempio per le città di Catanzaro Lido e Rende (si possono selezionare più città) dove si vuole sapere la temperature per i prossimi 3 giorni a 2m dal mare, l’umidità e la probabilità di precipitazioni:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>curl https://api.open-meteo.com/v1/forecast?latitude<span class="o">=</span>38.8303,39.3315&amp;longitude<span class="o">=</span>16.6278,16.1804&amp;hourly<span class="o">=</span>temperature_2m,relative_humidity_2m,precipitation_probability&amp;forecast_days<span class="o">=</span>3
</code></pre></div></div>

<p>Il json restituito è tedioso da leggere su una riga sola, se disponiamo del tool <code class="language-plaintext highlighter-rouge">jq</code> possiamo formattarlo a dovere:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>curl https://api.open-meteo.com/v1/forecast?latitude<span class="o">=</span>38.8303,39.3315&amp;longitude<span class="o">=</span>16.6278,16.1804&amp;hourly<span class="o">=</span>temperature_2m,relative_humidity_2m,precipitation_probability&amp;forecast_days<span class="o">=</span>3 | json
</code></pre></div></div>

<blockquote>
  <p>NOTA:</p>

  <p>Si possono effettuare solo 10000 chiamate al giorno con la licenza gratuita e senza una chiave API personalizzata.</p>
</blockquote>

<p>I risultati ottenuti son divisi in due json separati ognuno dei quali per città in questo caso, e in ogni json per coordinata si ha una divisione ulteriore a lasso di tempo. Per fare un esempio, tagliando l’output del comando di sopra alla sola seconda città e per i soli primi 3 intervalli di tempo avremo:</p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"latitude"</span><span class="p">:</span><span class="w"> </span><span class="mf">39.3125</span><span class="p">,</span><span class="w">
    </span><span class="nl">"longitude"</span><span class="p">:</span><span class="w"> </span><span class="mf">16.1875</span><span class="p">,</span><span class="w">
    </span><span class="nl">"generationtime_ms"</span><span class="p">:</span><span class="w"> </span><span class="mf">0.03707408905029297</span><span class="p">,</span><span class="w">
    </span><span class="nl">"utc_offset_seconds"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w">
    </span><span class="nl">"timezone"</span><span class="p">:</span><span class="w"> </span><span class="s2">"GMT"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"timezone_abbreviation"</span><span class="p">:</span><span class="w"> </span><span class="s2">"GMT"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"elevation"</span><span class="p">:</span><span class="w"> </span><span class="mf">465.0</span><span class="p">,</span><span class="w">
    </span><span class="nl">"location_id"</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w">
    </span><span class="nl">"hourly_units"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
      </span><span class="nl">"time"</span><span class="p">:</span><span class="w"> </span><span class="s2">"iso8601"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"temperature_2m"</span><span class="p">:</span><span class="w"> </span><span class="s2">"°C"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"relative_humidity_2m"</span><span class="p">:</span><span class="w"> </span><span class="s2">"%"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"precipitation_probability"</span><span class="p">:</span><span class="w"> </span><span class="s2">"%"</span><span class="w">
    </span><span class="p">},</span><span class="w">
    </span><span class="nl">"hourly"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
      </span><span class="nl">"time"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
        </span><span class="s2">"2024-09-14T00:00"</span><span class="p">,</span><span class="w">
        </span><span class="s2">"2024-09-14T01:00"</span><span class="p">,</span><span class="w">
        </span><span class="s2">"2024-09-14T02:00"</span><span class="p">,</span><span class="w">
        </span><span class="err">//....</span><span class="w">
      </span><span class="p">],</span><span class="w">
      </span><span class="nl">"temperature_2m"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
        </span><span class="mf">15.7</span><span class="p">,</span><span class="w">
        </span><span class="mf">15.4</span><span class="p">,</span><span class="w">
        </span><span class="mf">15.3</span><span class="p">,</span><span class="w">
        </span><span class="err">//...</span><span class="w">
      </span><span class="p">],</span><span class="w">
      </span><span class="nl">"relative_humidity_2m"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
        </span><span class="mi">81</span><span class="p">,</span><span class="w">
        </span><span class="mi">82</span><span class="p">,</span><span class="w">
        </span><span class="mi">82</span><span class="p">,</span><span class="w">
        </span><span class="err">//...</span><span class="w">
      </span><span class="p">],</span><span class="w">
      </span><span class="nl">"precipitation_probability"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
        </span><span class="mi">3</span><span class="p">,</span><span class="w">
        </span><span class="mi">0</span><span class="p">,</span><span class="w">
        </span><span class="mi">3</span><span class="p">,</span><span class="w">
       </span><span class="err">//...</span><span class="w">
      </span><span class="p">]</span><span class="w">
    </span><span class="p">}</span><span class="w">
  </span><span class="p">}</span><span class="w">
</span><span class="p">]</span><span class="w">
</span></code></pre></div></div>

<p>Si ottiene l’informazione che per la città di rende, in data <code class="language-plaintext highlighter-rouge">2024-09-14T00:00</code> si avrà una temperatura di 15.7 gradi, un umidità di 81 e probabilità di precipitazione di 3%.</p>

<h4 id="latitudine-e-longitudine-con-le-api-di-open-meteo">Latitudine e longitudine con le API di open-meteo</h4>

<p>Si può utilizzare OPEN-METEO per avere latitudine e longitudine, per farlo scrivere:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>curl <span class="s1">'https://geocoding-api.open-meteo.com/v1/search?name=Cosenza&amp;count=3&amp;language=en&amp;format=json'</span> | jq
</code></pre></div></div>

<p>Sostituendo a “Cosenza” il nome della città. Se ci sono omonimie, verranno restituiti più risultati (Attualmente 3, modificare il numero dopo <code class="language-plaintext highlighter-rouge">count</code> per avere più o meno risultati).</p>

<h2 id="metar">Metar</h2>

<p>Metar è un tool open source per la decodifica di dei dati di una stazione meteo. Il codice si può trovare <a href="https://github.com/keesL/metar">su questo repository</a>.</p>

<h3 id="installazione-su-ubuntu-e-derivate">Installazione su Ubuntu e derivate</h3>

<p>Per installare su Ubuntu e derivate scrivere:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>apt <span class="nb">install </span>metar
</code></pre></div></div>

<h3 id="installazione-su-fedora">Installazione su Fedora</h3>

<p>Non c’è purtroppo un metodo ufficiale per installare <code class="language-plaintext highlighter-rouge">metar</code> su Fedora.</p>

<h3 id="installazione-su-archlinux">Installazione su ArchLinux</h3>

<p>Per installare su ArchLinux bisogna utilizzare AUR:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git clone https://aur.archlinux.org/metar.git

<span class="nb">cd </span>metar

makepkg <span class="nt">-si</span>
</code></pre></div></div>

<p>Oppure con il proprio AUR manager preferito.</p>

<h3 id="uso">Uso</h3>

<p>L’utilizzo richiede più step, innanzitutto bisogna cercare il proprio codice di stazione da verificare, consiglio il sito <a href="https://metar-taf.com/it/">METAR TAF ufficiale</a>, quindi impostare la propria stazione. Ad esempio per l’aereoporto di Lamezia Terme (Catanzaro) scrivere:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>metar <span class="nb">set </span>LICA
</code></pre></div></div>

<p>È più facile trovare una stazione ufficiale METAR in un aereoporto, tuttavia son presenti piccole stazioni meteo un po’ ovunque se si cerca bene. Ecco qualche codice:</p>

<ul>
  <li>Campobasso <code class="language-plaintext highlighter-rouge">LIBS</code></li>
  <li>Lecce <code class="language-plaintext highlighter-rouge">IT-0205</code></li>
  <li>Napoli <code class="language-plaintext highlighter-rouge">LIRN</code></li>
  <li>Lucca <code class="language-plaintext highlighter-rouge">LIQL</code></li>
  <li>Bologna <code class="language-plaintext highlighter-rouge">LIPE</code></li>
  <li>Como <code class="language-plaintext highlighter-rouge">LILY</code></li>
</ul>

<p>etc…</p>

<p>Una volta impostata la stazione scrivere:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>metar get
</code></pre></div></div>

<p>In output si avranno dati su vento, temperature, umidità e altro. Ad esempio:</p>

<pre><code class="language-plain">Lamezia Terme, Italy (LICA) 38-54N 016-15E
Sep 14, 2024 - 07:50 AM EDT / 2024.09.14 1150 UTC
Wind: from the W (280 degrees) at 20 MPH (17 KT):0
Visibility: greater than 7 mile(s):0
Sky conditions: mostly clear
Temperature: 73 F (23 C)
Dew Point: 53 F (12 C)
Relative Humidity: 49%
Pressure (altimeter): 29.88 in. Hg (1012 hPa)
ob: LICA 141150Z AUTO 28017KT 9999 FEW045/// 23/12 Q1012
</code></pre>

<h2 id="ansiweather">Ansiweather</h2>

<p>Un altro strumento è <strong>Ansiweather</strong>, un tool molto più semplice a portata di tutti che permette di avere un output semplice e pulito, senza disegni o altro. È uno strumento open source ed il codice sorgente <a href="https://github.com/fcambus/ansiweather">può essere trovato su Github</a>.</p>

<h3 id="installare-su-ubuntu-e-derivate">Installare su Ubuntu e derivate</h3>

<p>Per installare il tool su Ubuntu e derivate scrivere:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>apt-get <span class="nb">install </span>ansiweather
</code></pre></div></div>

<h3 id="installare-su-fedora">Installare su Fedora</h3>

<p>Per fedora non esistono al momento metodi ufficiali per l’installazione.</p>

<h3 id="installare-su-archlinux">Installare su ArchLinux</h3>

<p>Per installare su ArchLinux usare AUR:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git clone https://aur.archlinux.org/ansiweather.git
<span class="nb">cd </span>ansiweather
makepkg <span class="nt">-si</span>
</code></pre></div></div>

<h3 id="utilizzo-ansiweather">Utilizzo Ansiweather</h3>

<p>Per utilizzarlo basta scrivere:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ansiweather <span class="nt">-l</span> NOMECITTA,CODICENAZIONE <span class="nt">-f</span> NUMEROGIORNI
</code></pre></div></div>

<p>Ad esempio per avere una previsione della città di Catanzaro per i prossimi 3 giorni scrivere:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ansiweather <span class="nt">-l</span> Catanzaro,IT <span class="nt">-f</span> 3
</code></pre></div></div>

<p>L’output sarà:</p>

<pre><code class="language-plain">Catanzaro forecast: lun set 16: 23/16 °C - mar set 17: 22/15 °C - mer set 18: 26/17 °C - gio set 19: 25/18 °C 
</code></pre>]]></content><author><name>Davide Galati (in arte PsykeDady)</name></author><category term="ubuntu" /><category term="archlinux" /><category term="fedora" /><category term="meteo" /><category term="linux" /><summary type="html"><![CDATA[Non capita a tutti di dover controllare il meteo dal proprio pc, essendo ormai presente come funzione di base in quasi tutti gli smartphone.]]></summary></entry><entry><title type="html">#howto - Riavviare in emergenza con REISUB</title><link href="https://linuxhub.it/articles/howto-reisub/" rel="alternate" type="text/html" title="#howto - Riavviare in emergenza con REISUB" /><published>2024-09-09T07:00:00+00:00</published><updated>2024-09-09T07:00:00+00:00</updated><id>https://linuxhub.it/articles/howto-reisub</id><content type="html" xml:base="https://linuxhub.it/articles/howto-reisub/"><![CDATA[<p>Esiste una combinazione magica per riavviare in modo forzato il pc su Linux anche se totalmente bloccato. Ecco la combinazione REISUB.</p>

<h2 id="magic-sys-req">Magic Sys Req</h2>

<p>Il sistema di richieste di sistema Magic (Magic Sys Req) rappresenta una serie di combinazioni di tasti utilizzabili su Linux che permette di eseguire alcuni comandi di sistema a prescindere dallo stato in cui si trova, bypassando permessi, gui, e altri aspetti.</p>

<p>Normalmente questo sistema è disabilitato.</p>

<blockquote>
  <p><strong>Attenzione:</strong></p>

  <p>Per accedere al Magic Sys Req è necessario il tasto “R Sist”, normalmente si trova come alternativa (tasto di secondo livello) al tasto “Print”</p>
</blockquote>

<h2 id="riattivare-il-magic-sys-req">Riattivare il Magic Sys Req</h2>

<p>È possibile riattivare il sistema in due modi differenti:</p>

<ul>
  <li>temporaneo: ovvero valido fino a chiusura del pc.</li>
  <li>persistente: valido anche dopo il riavvio.</li>
</ul>

<h3 id="riavvio-temporaneo">Riavvio temporaneo</h3>

<p>Per riavviarlo fino a chiusura è possibile scrivere:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">echo</span> <span class="s2">"1"</span> | <span class="nb">sudo tee</span> /proc/sys/kernel/sysrq
</code></pre></div></div>

<p>Per disattivarlo:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">echo</span> <span class="s2">"0"</span> | <span class="nb">sudo tee</span> /proc/sys/kernel/sysrq
</code></pre></div></div>

<h3 id="riavvio-persistente">Riavvio persistente</h3>

<p>Per il riavvio persistente è necessario invece modificare il file <code class="language-plaintext highlighter-rouge">/etc/sysctl.conf</code></p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>kernel.sysrq <span class="o">=</span> 1
</code></pre></div></div>

<p>Per disattivare basta eliminare la stessa riga.</p>

<h2 id="elenco-delle-possibili-combinazioni">Elenco delle possibili combinazioni</h2>

<p>Tramite le Magic Sys Req è possibile dare una varietà di comandi, per l’elenco completo si può fare affidamento anche <a href="https://it.wikipedia.org/wiki/Magic_Sys_Req">alla relativa pagina di Wikipedia</a>.</p>

<p>Per eseguire una combinazione bisogna sempre premere i tasti <code class="language-plaintext highlighter-rouge">ALT+RSIST</code>, inoltre un ulteriore tasto. Di seguito un estratto (anche utile a capire il resto dell’articolo) dei tasti che è possibile premere:</p>

<ul>
  <li>r: passa la tastiera da modalità “raw” a modalità XLATE (passaggio necessario per dare le altre combinazioni)</li>
  <li>b: riavvio del sistema</li>
  <li>c: riavvia kexec e produce un dump di sistema</li>
  <li>i: invia il segnale di SIGKILL a tutti i processi eccetto quello di avvio</li>
  <li>j: scongela i file system bloccati</li>
  <li>n: riorganizza le priorità dei processi secondo metodologia Real Time</li>
  <li>u: rimonta tutti i file system in sola lettura</li>
  <li>s sincronizza i file system</li>
  <li>e: invia il segnale SIGTERM a tutti i processi eccetto quello di avvio</li>
  <li>v: ripristina i framebuffer della console</li>
</ul>

<h2 id="reisub">REISUB</h2>

<p>Con l’acronimo REISUB si intende quella sequenza di Magic Sys Req che, se date, riavvia in sicurezza il sistema se totalmente bloccato.</p>

<blockquote>
  <p><strong>ATTENZIONE:</strong></p>

  <p>Scrivete piano le combinazioni! Non abbiate fretta, ogni operazione ha un costo in termini di tempo, se fatte velocemente potrebbero non terminare correttamente e potreste perdere dati.</p>
</blockquote>

<p>Si analizzino le combinazioni</p>

<ul>
  <li>r: attiva le combinazioni di tastiera</li>
  <li>e: invia il segnale di SIGTERM</li>
  <li>i: invia il segnale di SIGKILL (più aggressivo)</li>
  <li>s: sincronizza i file system</li>
  <li>u: rimonta i file system in sola lettura</li>
  <li>b: riavvia</li>
</ul>

<p>Quindi tenendo premuto <code class="language-plaintext highlighter-rouge">ALT+RSIST</code> e scrivendo in <strong>lenta</strong> successione R,E,I,S,U,B, si riavvierà il sistema (a prescindere dal suo stato).</p>

<h3 id="g">G</h3>

<p>La lettera G cattura l’input nel caso sia trattenuto da qualche applicazione su X11, può essere usato per maggiore sicurezza prima della sequenza REISUB (che diventerebbe quindi GREISUB).</p>

<h2 id="magic-sys-req-in-remoto">Magic Sys Req in remoto</h2>

<p>È possibile utilizzare le combinazioni in remoto scrivendo sul file <code class="language-plaintext highlighter-rouge">/proc/sysrq-trigger</code>. Ad esempio per dare la combinazione con la lettera “i” scrivere:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">echo </span>B | <span class="nb">sudo tee</span> /proc/sysrq-trigger
</code></pre></div></div>]]></content><author><name>Davide Galati (in arte PsykeDady)</name></author><category term="emergenza" /><category term="bloccato" /><category term="linux" /><summary type="html"><![CDATA[Esiste una combinazione magica per riavviare in modo forzato il pc su Linux anche se totalmente bloccato. Ecco la combinazione REISUB.]]></summary></entry></feed>