Qualche parola dal nostro ufficio di traduzione: di solito tutti si impegnano a tradurre i materiali e le pubblicazioni più recenti e noi non facciamo eccezione. Ma i terminali non sono qualcosa che viene aggiornato una volta alla settimana. Pertanto, abbiamo tradotto per voi un articolo di Antoine Beaupré, pubblicato nella primavera del 2018: nonostante la sua notevole “età” per gli standard moderni, a nostro avviso, il materiale non ha perso affatto la sua attualità. Inoltre, originariamente questa era una serie di due articoli, ma abbiamo deciso di combinarli in un unico grande post.
I terminali occupano un posto speciale nella storia del computer, ma negli ultimi decenni sono stati costretti a sopravvivere insieme alla riga di comando poiché le interfacce grafiche sono diventate onnipresenti.
Alcuni terminali presentano buchi di sicurezza decisamente sorprendenti, inoltre la maggior parte ha un insieme di funzioni completamente diverse, dal supporto per un'interfaccia a schede allo scripting. Sebbene noi
Ecco i terminali che ho recensito:
Queste potrebbero non essere le versioni più recenti, dal momento che al momento in cui scrivo ero limitato alle build stabili, che ho potuto implementare su Debian 9 o Fedora 27. L'unica eccezione è Alacritty. È un discendente dei terminali accelerati dalla GPU ed è scritto in un linguaggio insolito e nuovo per questo compito: Rust. Ho escluso i terminali web dalla mia recensione (compresi quelli su
Supporto Unicode
Ho iniziato i miei test con il supporto Unicode. Il primo test dei terminali è stato quello di visualizzare la stringa Unicode da
Per impostazione predefinita, xterm utilizza il classico carattere "fisso", che, secondo
Questi screenshot sono stati acquisiti in Fedora 27, poiché forniva risultati migliori rispetto a Debian 9, dove alcune versioni precedenti di terminali (in particolare mlterm) non erano in grado di gestire correttamente i caratteri. Fortunatamente questo è stato risolto nelle versioni successive.
Ora notiamo come viene visualizzata la riga in xterm. Si scopre che il simbolo Mem e il successivo semitico
“Molti programmi per computer non sono in grado di visualizzare correttamente il testo bidirezionale. Ad esempio, il nome ebraico "Sarah" è composto dai caratteri sin (ש) (che appare a destra), poi resh (ר) e infine he (ה) (che dovrebbe apparire a sinistra)."
Molti terminali falliscono questo test: Alacritty, terminali Gnome e XFCE derivati da VTE, urxvt, st e xterm visualizzano "Sara" in ordine inverso, come se avessimo scritto il nome come "Aras".
Un altro problema con i testi bidirezionali è che devono essere allineati in qualche modo, soprattutto quando si tratta di mescolare testi RTL e LTR. Gli script RTL dovrebbero essere eseguiti dal lato destro della finestra del terminale, ma cosa dovrebbe succedere ai terminali che utilizzano per impostazione predefinita l'inglese LTR? La maggior parte di essi non ha meccanismi speciali e allinea tutto il testo a sinistra (anche in Konsole). Le eccezioni sono pterm e mlterm, che aderiscono agli standard e allineano a destra tali linee.
Protezione dall'inserimento
La prossima caratteristica critica che ho identificato è la protezione anti-inserimento. Sebbene sia ampiamente noto che incantesimi come:
$ curl http://example.com/ | sh
sono comandi push per l'esecuzione del codice, poche persone sanno che i comandi nascosti possono intrufolarsi nella console quando si copia e incolla da un browser Web, anche dopo un'attenta ispezione.
git clone git: //git.kernel.org/pub/scm/utils/kup/kup.git
si trasforma in una tale seccatura quando viene incollato dal sito Web di Horn nel terminale:
git clone /dev/null;
clear;
echo -n "Hello ";
whoami|tr -d 'n';
echo -e '!nThat was a bad idea. Don'"'"'t copy code from websites you don'"'"'t trust!
Here'"'"'s the first line of your /etc/passwd: ';
head -n1 /etc/passwd
git clone git://git.kernel.org/pub/scm/utils/kup/kup.git
Come funziona? Il codice dannoso è incluso nel blocco , che viene spostato fuori dalla vista dell'utente utilizzando i CSS.
set enable-bracketed-paste on
Sfortunatamente, il sito di test di Horn mostra anche come aggirare questa protezione attraverso la formattazione del testo stesso e finire prematuramente per applicare ad esso la modalità Tra parentesi. Funziona perché alcuni terminali non filtrano correttamente le sequenze di escape prima di aggiungerne di proprie. Ad esempio nel mio non sono mai riuscito a portare a termine con successo i test di Konsole anche con la configurazione corretta .inputrc file. Ciò significa che puoi facilmente danneggiare la configurazione del tuo sistema a causa di un'applicazione non supportata o di una shell configurata in modo errato. Ciò è particolarmente pericoloso quando si accede a server remoti, dove un accurato lavoro di configurazione è meno comune, soprattutto se si hanno molte macchine remote di questo tipo.
Una buona soluzione a questo problema è il plugin di conferma incolla per il terminale urxvt, che chiede semplicemente il permesso di inserire qualsiasi testo che contenga ritorni a capo. Non ho trovato un'opzione più sicura per l'attacco testuale descritto da Horn.
Schede e profili
Una caratteristica popolare in questo momento è il supporto per un'interfaccia a schede, che definiremo come una finestra di terminale contenente diversi altri terminali. Questa funzione differisce per i diversi terminali e, sebbene i tradizionali terminali xterm non supportino affatto le schede, incarnazioni di terminali più moderne come Xfce Terminal, GNOME Terminal e Konsole hanno questa funzione. Urxvt supporta anche le schede, ma solo se usi un plugin. Ma in termini di supporto delle schede in sé, Terminator è il leader indiscusso: non solo supporta le schede, ma può anche disporre i terminali in qualsiasi ordine (vedi immagine sotto).
Un'altra caratteristica di Terminator è la capacità di "raggruppare" queste schede insieme e inviare le stesse sequenze di tasti a più terminali contemporaneamente, fornendo uno strumento rozzo per eseguire operazioni di massa su più server contemporaneamente. Una funzionalità simile è implementata anche in Konsole. Per utilizzare questa funzionalità in altri terminali, è necessario utilizzare software di terze parti come
Le schede funzionano particolarmente bene se abbinate ai profili: ad esempio, puoi avere una scheda per la posta elettronica, un'altra per la chat e così via. Questo è ben supportato da Konsole Terminal e GNOME Terminal. Entrambi consentono a ciascuna scheda di avviare automaticamente il proprio profilo. Terminator supporta anche i profili, ma non sono riuscito a trovare un modo per avviare automaticamente determinati programmi quando apri una scheda specifica. Altri terminali non hanno affatto il concetto di “profilo”.
Increspature
L'ultima cosa di cui parlerò nella prima parte di questo articolo è l'aspetto dei terminali. Ad esempio GNOME, Xfce e urxvt supportano la trasparenza, ma recentemente hanno abbandonato il supporto per le immagini di sfondo, costringendo alcuni utenti a passare al terminale
Alcuni terminali analizzano anche il testo per individuare i modelli URL per rendere i collegamenti selezionabili. Questo vale per tutti i terminali derivati da VTE, mentre urxvt richiede un plugin speciale che trasformerebbe gli URL con un clic o utilizzando una scorciatoia da tastiera. Altri terminali Ho testato gli URL di visualizzazione in altri modi.
Infine, una nuova tendenza nei terminali è l'opzionalità dello scroll buffer. Ad esempio, st non ha un buffer di scorrimento; si presuppone che l'utente utilizzerà un multiplexer terminale come tmux e
Anche Alacritty non dispone di buffer per il backscroll, ma
subtotali
Nella seconda parte del materiale (nell'originale si trattava di due articoli diversi - ca. sentiero) confronteremo prestazioni, utilizzo della memoria e latenza. Ma possiamo già vedere che alcuni dei terminali in questione presentano gravi carenze. Ad esempio, gli utenti che lavorano regolarmente con script RTL potrebbero voler prendere in considerazione mlterm e pterm, poiché sono più bravi a gestire attività simili rispetto ad altri. Anche Konsole si è comportata bene. Gli utenti che non lavorano con gli script RTL possono scegliere qualcos'altro.
In termini di protezione contro l'inserimento di codice dannoso, urxvt si distingue per la sua speciale implementazione di protezione contro questo tipo di attacco, che mi sembra decisamente conveniente. Per coloro che cercano qualche fronzolo, vale la pena dare un'occhiata a Konsole. Infine, vale la pena notare che VTE è un'ottima base per terminali, che garantisce il supporto dei colori, il riconoscimento degli URL e così via. A prima vista, il terminale predefinito fornito con il tuo ambiente preferito potrebbe soddisfare tutti i requisiti, ma lasciamo aperta questa domanda finché non ne comprendiamo le prestazioni.
Continua la conversazione
In generale, le prestazioni dei terminali di per sé possono sembrare un problema inverosimile, ma a quanto pare, alcuni di essi mostrano una latenza sorprendentemente elevata per un software di questo tipo. Successivamente esamineremo anche quella che viene tradizionalmente chiamata “velocità” (in realtà, questa è la velocità di scorrimento) e il consumo di memoria del terminale (con l'avvertenza che questo non è così critico oggi come lo era decenni fa).
ritardo
Dopo uno studio approfondito delle prestazioni del terminale, sono giunto alla conclusione che il parametro più importante a questo riguardo è la latenza (ping). Nel suo articolo
Ma cos’è la latenza e perché è così importante? Nel suo articolo Fatin lo definisce come “il ritardo tra la pressione di un tasto e il corrispondente aggiornamento dello schermo” e lo cita
Fatin spiega che questo ping ha conseguenze più profonde della semplice soddisfazione: “la digitazione diventa più lenta, si verificano più errori e la tensione oculare e muscolare aumenta”. In altre parole, un grande ritardo può portare a errori di battitura e anche a una minore qualità del codice, poiché comporta un carico cognitivo aggiuntivo sul cervello. Ma quel che è peggio è che il ping "aumenta lo sforzo degli occhi e dei muscoli", il che sembra implicare
Alcuni di questi effetti sono noti da molto tempo e i risultati
Fatin ha condotto i suoi test sugli editor di testo; ha creato uno strumento portatile chiamato
Ecco i risultati delle mie misurazioni, così come alcuni risultati di Fatin, per dimostrare che il mio esperimento concorda con i suoi test:
La prima cosa che mi ha colpito è stato il miglior tempo di risposta dei programmi più vecchi come xterm e mlterm. Con la latenza di registro peggiore (2,4 ms), hanno funzionato meglio del terminale moderno più veloce (10,6 ms per st). Nessun terminale moderno scende al di sotto della soglia dei 10 millisecondi. In particolare, Alacritty non riesce a soddisfare l'affermazione "l'emulatore di terminale più veloce disponibile", sebbene i suoi punteggi siano migliorati rispetto alla sua prima recensione nel 2017. Infatti, gli autori del progetto
Tuttavia, le differenze potrebbero non essere evidenti alla vista. Come spiega Fatin, “non devi essere consapevole del ritardo affinché abbia un effetto su di te”. Fatin mette in guardia anche sulla deviazione standard: “qualsiasi disturbo nella latenza (jitter) crea ulteriore stress a causa della sua imprevedibilità”.
Il grafico sopra è ripreso su Debian 9 puro (stretch) con
Velocità di scorrimento
Il test successivo è un tradizionale test di "velocità" o "larghezza di banda", che misura la velocità con cui il terminale può scorrere una pagina visualizzando grandi quantità di testo sullo schermo. La meccanica del test varia; il test originale consisteva semplicemente nel generare la stessa stringa di testo utilizzando il comando seq. Altri test includono il test di Thomas E. Dickey (manutentore di xterm), che ripetutamente
Qui vediamo l'rxvt e lo st superare la concorrenza, seguiti dal più recente Alacritty, progettato con particolare attenzione alle prestazioni. Seguono Xfce (famiglia VTE) e Konsole, che sono quasi due volte più veloci. L'ultimo è xterm, che è cinque volte più lento di rxvt. Durante il test, anche xterm si è increspato molto, rendendo difficile vedere il testo che passa anche se era la stessa riga. Konsole era veloce, ma a volte era complicato: il display si bloccava di tanto in tanto, mostrando il testo parziale o non mostrandolo affatto. Altri terminali mostravano chiaramente le stringhe, inclusi st, Alacritty e rxvt.
Dickey spiega che le differenze di prestazioni sono dovute alla progettazione dei buffer di scorrimento nei diversi terminali. In particolare accusa rxvt e gli altri terminali di "non seguire le regole generali":
“A differenza di xterm, rxvt non ha tentato di visualizzare tutti gli aggiornamenti. Se rimane indietro, rifiuterà alcuni aggiornamenti per recuperare il ritardo. Ciò ha avuto un impatto maggiore sulla velocità di scorrimento apparente che sull'organizzazione della memoria interna. Uno svantaggio era che l'animazione ASCII era un po' imprecisa."
Per correggere questa lentezza percepita di xterm, Dickey suggerisce di utilizzare la risorsa
Consumo di risorse
Indipendentemente dal fatto che abbia senso considerare la velocità di scorrimento come un parametro di prestazione, questo test ci permette di simulare il carico sui terminali, che a sua volta ci permette di misurare altri parametri come la memoria o l'utilizzo del disco. Le metriche sono state ottenute eseguendo il test specificato ss sotto il monitoraggio del processo Python. Ha raccolto i dati del contatore
In questo test, l'ST è al primo posto con il consumo medio di memoria più basso di 8 MB, il che non sorprende considerando che l'idea principale del design è la semplicità. mlterm, xterm e rxvt consumano un po' di più - circa 12 MB. Un altro risultato degno di nota è Alacritty, che richiede 30 MB per essere eseguito. Poi ci sono i terminali della famiglia VTE con cifre da 40 a 60 MB, che non sono pochi. Questo consumo può essere spiegato dal fatto che questi terminali utilizzano librerie di livello superiore, ad esempio GTK. Konsole arriva ultimo con un enorme consumo di memoria di 65 MB durante i test, anche se questo può essere giustificato dalla sua gamma molto ampia di funzionalità.
Rispetto ai risultati precedenti ottenuti dieci anni fa, tutti i programmi hanno iniziato a consumare notevolmente più memoria. Xterm richiedeva 4 MB, ma ora richiede 15 MB solo all'avvio. C'è un aumento simile nel consumo per rxvt, che ora richiede 16 MB. Il terminale Xfce occupa 34 MB, ovvero tre volte più grande di prima, ma il terminale GNOME richiede solo 20 MB. Naturalmente tutti i test precedenti sono stati effettuati su architettura a 32 bit. All'LCA 2012 Rusty Russell
Tuttavia, non posso fare a meno di pensare che allocare più memoria a qualcosa di così fondamentale come il terminale sia uno spreco di risorse. Questi programmi dovrebbero essere i più piccoli tra i più piccoli, dovrebbero poter girare su qualsiasi “scatola”, anche su una scatola da scarpe, se mai dovessimo arrivare al punto in cui dovranno essere dotati di sistemi Linux (e voi sapete che sarà così ). Ma con questi numeri, l’utilizzo della memoria diventerà un problema in futuro in qualsiasi ambiente che utilizzi più terminali diversi da quelli più leggeri e con capacità limitate. Per compensare ciò, GNOME Terminal, Konsole, urxvt, Terminator e Xfce Terminal dispongono di una modalità Daemon che consente di controllare più terminali attraverso un unico processo, limitando il consumo di memoria.
Durante i miei test, sono arrivato a un altro risultato inaspettato riguardo alla lettura-scrittura del disco: mi aspettavo di non vedere nulla qui, ma si è scoperto che alcuni terminali scrivono i dati più voluminosi su disco. Pertanto, la libreria VTE mantiene effettivamente un buffer di scorrimento sul disco (questa funzionalità
conclusione
Nella prima parte dell'articolo, abbiamo scoperto che i terminali basati su VTE hanno un buon set di funzionalità, ma ora vediamo che questo comporta alcuni costi in termini di prestazioni. Adesso la memoria non è più un problema perché tutti i terminali VTE possono essere controllati attraverso un processo Daemon, che ne limita l'appetito. Tuttavia, i sistemi più vecchi che hanno limitazioni fisiche sulla quantità di RAM e buffer del kernel potrebbero ancora aver bisogno di versioni precedenti dei terminali, poiché consumano molte meno risorse. Sebbene i terminali VTE abbiano ottenuto buoni risultati nei test di throughput (scorrimento), la loro latenza di visualizzazione è superiore alla soglia impostata nella Guida dell'utente di GNOME. Gli sviluppatori VTE dovrebbero probabilmente tenerne conto. Se teniamo conto del fatto che anche per gli utenti Linux alle prime armi l'incontro con un terminale è inevitabile, possono renderlo più facile da usare. Per i geek esperti, il passaggio dal terminale predefinito può anche significare meno affaticamento degli occhi e la possibilità di evitare futuri infortuni e malattie legate al lavoro dovuti a lunghe sessioni di lavoro. Purtroppo solo i vecchi xterm e mlterm ci portano alla soglia magica del ping di 10 millisecondi, cosa inaccettabile per molti.
Le misurazioni benchmark hanno inoltre dimostrato che, a causa dello sviluppo degli ambienti grafici Linux, gli sviluppatori hanno dovuto scendere a numerosi compromessi. Alcuni utenti potrebbero voler considerare i normali gestori di finestre poiché forniscono una significativa riduzione del ping. Sfortunatamente, non è stato possibile misurare la latenza per Wayland: il programma Typometer che ho utilizzato è stato creato per ciò che Wayland è progettato per impedire: spiare altre finestre. Spero che il compositing di Wayland funzioni meglio di X.org, e spero anche che in futuro qualcuno trovi un modo per misurare la latenza in questo ambiente.
Fonte: habr.com