Aprire una directory remota con Emacs e Tramp

Questo articolo ha lo scopo di spiegare come associare un tasto per aprire una directory remota nel Dired buffer dell’editor Emacs. Se state pensando che si tratti di un’operazione molto semplice, allora probabilmente avete già raggiunto un alto livello di esperienza con Emacs, potete regolarvi liberamente e passare oltre ciò che sto per dire. In caso contrario forse troverete questa guida utile.

Avendo avuto l’esigenza di imparare il linguaggio di programmazione PHP, mi capita di scrivere il codice d’esempio che trovo nei libri e di provarlo direttamente sulla mia VPS (Virtual Private Server) online. Inizialmente effettuavo un login sul server e con l’editor “Vi” creavo e modificavo i file sorgenti, ma questo procedimento si è rivelato quasi subito improduttivo. Inoltre, avrei potuto perdere gli esercizi qualora la connessione si fosse interrotta prima del backup. Dato che quell’editor non mi soddisfava, ho cercato una soluzione alternativa. Così ho scelto Emacs, per alcuni buoni motivi: è un editor per terminale a caratteri che si integra bene anche nel desktop grafico; si possono estendere le sue funzioni con il linguaggio lisp ed oggi è possibile usarlo in tutte le applicazioni che richiedono un editor di testo, dalla programmazione in linguaggio C alla lettura della posta elettronica. Sono stati creati pacchetti che aggiungono giochi, IDE, debugging, web server, ecc. “Alcune caratteristiche utili di Emacs sono a portata di mano, ma qualche volta occorrono anni per scoprirle“ (cit. Great Emacs Features).

Il Dired buffer di Emacs
Il Dired buffer di Emacs

Ho accennato al Dired: è il buffer di Emacs (Dired sta per Directory Edit) contenente l’elenco dei file di una directory. Qui è possibile compiere le operazioni di file management. Consiglio di aprire l’editor con questo buffer; voi potete entrare in dired mode aggiungendo la seguente istruzione lisp al file di configurazione .emacs che trovate nella home del vostro account Unix.


;;
;; Dired mode
;;
(custom-set-variables 
      ‘(initial-buffer-choice “~/”))

Ci sono utenti Unix che usano soltanto Emacs perché è un ambiente di lavoro potente e completo, grazie all’interprete Lisp che permette di estenderlo continuamente con nuove funzioni. Per esempio, Tramp è un pacchetto distribuito con Emacs per modificare i file remoti. Quest’esigenza è veramente diffusa oggi, dato che spesso i programmatori e gli amministratori di sistema devono avere a che fare con la gestione di file che risiedono su un altro calcolatore collegato alla Rete. Tramp usa una connessione con shell remota fra quelle disponibili: rlogin, telnet o ssh, e può trasferire i file usando rcp o un programma simile. Siccome queste applicazioni non sempre sono presenti su un sistema Unix è bene accertarsi di averle altrimenti Tramp non funzionerà. Ad ogni modo è possibile configurare Emacs mentre è in esecuzione: premere prima i tasti M-x, inserire nel mini buffer il comando customize-variable, inviare e specificare la variabile tramp-default-method. Emacs è dotato di autocompletamento pertanto la pressione del tasto TAB evita gli errori di scrittura. Naturalmente è ancora valido il file di configurazione .emacs visto in precedenza, qui dovremmo semplicemente aggiungere il seguente codice Lisp

;;
;; Tramp default method
;;
(require ‘tramp)
(setq-default tramp-default-method “ssh”)

Avete bisogno che sia attiva la connessione remota nel Dired buffer per modificare la variabile tramp-default-method mentre state eseguendo Emacs. La sintassi che vi permette di aprire una directory è simile a quella usata per cercare o creare un file sul computer locale, ovvero


C-x C-f /user@host#port:/path/to/directory/or/file

Qui C-x e C-f corrisponde alla pressione dei tasti CTRL+x e CTRL+f, il resto è un percorso di file preceduto dall’indirizzo e dalla porta ssh del server, dal nome dell’utente di login, separati dal simbolo della posta elettronica. Se volessimo usare un solo tasto per aprire la directory remota più utilizzata? Dobbiamo conoscere il linguaggio Lisp, ma non è un problema. Un trucco comune applicato dagli utenti dell’editor Emacs consiste nell’utilizzare l’istruzione repeat-complex-command. Dopo aver digitato il comando Tramp per l’apertura di una directory remota, dobbiamo premere C-x ESC ESC e il mini buffer presenterà l’espressione eLisp corrispondente all’ultima azione compiuta. Voi potete copiarla e incollarla nel vostro file di configurazione .emacs con alcune opportune aggiunte, come ho fatto io.

(find-file "/ferocious@192.168.0.3#21002:/home/web/sandbox/php t)

Il binding, cioè l’associazione di un tasto a un’azione, si realizza con la seguente istruzione lisp generale:

(global-set-key KEY COMMAND)

A noi serve una funzione che possa essere inserita nell’espressione precedente come un comando (al posto di COMMAND) e che faccia l’operazione che desideriamo. Una funzione in Lisp è un blocco di codice racchiuso fra parentesi tonde, io le ho assegnato il nome find-file-remote e ho espressamente specificato che richiede per funzionare il modulo Tramp. Notare che ogni istruzione deve essere altresì specificata fra parentesi all’interno del blocco.

;;
;; Binding for Tramp operations
;;
(defun find-file-remote ()
(interactive)
(require ‘tramp)
(find-file “/ferocious@192.168.0.3#21002:/home/web/sandbox/php”))

Ora dobbiamo compiere l’ultimo passo: la scelta del tasto da abbinare all’operazione di connessione che va specificato come argomento nell’espressione Lisp con global-set-key.

(global-set-key (kbd “C-<f5>”) ‘find-file-remote)

In Rete è facile trovare tutorial che affrontano l’argomento del binding, cioè l’associazione di tasti ad azioni particolarmente ripetute, in tutte le sue sfaccettature perché Emacs è tra gli editor largamente utilizzati su Unix. Uno dei principali punti di forza è l’interprete eLisp che permette di aggiungere funzioni all’ambiente di lavoro. Poiché l’editor si basa su Lisp ci si devono allora aspettare operazioni che possono essere implementate solo con questo linguaggio di programmazione. Tuttavia per raggiungere lo scopo di questo articolo è servito più intuizione che padronanza della materia.

Il driver Nvidia e il problema di num_physpages

A luglio Linus Torvald rimosse la variabile num_physpages dalla versione 3.11 del kernel di Linux. Questa decisione ha però determinato una conflittualità tra il codice sorgente del driver fornito da Nvidia e il kernel stesso. La num_physpages era definita nel gestore mm della memoria di Linux.

Oggi, l’ultimo driver stabile di Nvidia è il 319.60 e ci sono ancora i riferimenti alla variabile suddetta nel file d’intestazione nv-linux.h. Se anche voi avete una distribuzione con il kernel 3.11 (o più recente) e tentate, come ho fatto io, di compilare il driver per le schede video, otterrete il seguente messaggio di errore:


In file included from /tmp/selfgz4790/NVIDIA-Linux-x86_64-319.49/kernel/os-interface.c:26:0:
   /tmp/selfgz4790/NVIDIA-Linux-x86_64-319.49/kernel/os-interface.c: In function ‘os_get_system_memory_size’:
   /tmp/selfgz4790/NVIDIA-Linux-x86_64-319.49/kernel/nv-linux.h:1040:41: error: ‘num_physpages’ undeclared (first use in this function)
    #define NV_NUM_PHYSPAGES                num_physpages
                                            ^

Come già detto, num_physpages è stata tolta da Torvalds, quindi per il momento non c’è altra soluzione che correggere il file nv-linux.h del driver con una patch oppure un editor di testo. Potete scaricare la patch dalla Rete, ma si tratta di un file specifico per una particolare versione del driver di Nvidia che dovreste adattare alla vostra situazione. A questo indirizzo troverete le istruzioni per procedere nel modo corretto. Oltre a servirvi di una patch, in alternativa potete modificare il file nv-linux.h durante l’installazione del driver, per esempio seguendo questa procedura:

  1. Eseguite l’installer di Nvidia con l’opzione -x, il comando decomprirà l’archivio che contiene il codice sorgente del driver.
  2. Modificate il file nv-linux.h, che trovate nella directory kernel, con un editor, vi oppure gedit vanno benissimo.
  3. Cercate la riga che ha la seguente definizione in linguaggio C #define NV_NUM_PHYSPAGES   num_physpages, dovreste trovarla inserita fra altre definizioni, esattamente come nell’esempio sottostante:
    
    #if !defined(NV_VMWARE):
    #define NV_NUM_PHYSPAGES                num_physpages
    #define NV_GET_CURRENT_PROCESS()        current-&gt;tgid
    #define NV_IN_ATOMIC()                  in_atomic()
    
  4. Dopo la riga corrispondente all’istruzione condizionale #if, ma prima della definizione #define NV_GET_CURRENT_PROCESS ecc. dovete creare un nuovo blocco che corrisponda al seguente codice per il preprocessore C:
    
    #if LINUX_VERSION_CODE &gt;= KERNEL_VERSION(3, 11, 0)</p>
    #define NV_NUM_PHYSPAGES                get_num_physpages()
    #else</p>
    #define NV_NUM_PHYSPAGES                num_physpages
    #endif
    
  5. Ultimate le vostre modifiche, avrete esattamente questo:
    
    #if !defined(NV_VMWARE)
    #if LINUX_VERSION_CODE &gt;= KERNEL_VERSION(3, 11, 0)</p>
    #define NV_NUM_PHYSPAGES                get_num_physpages()
    #else
    #define NV_NUM_PHYSPAGES                num_physpages
    #endif</p>
    #define NV_GET_CURRENT_PROCESS()        current-&gt;tgid
    #define NV_IN_ATOMIC()
    
  6. Potete ora chiudere l’editor ed eseguire il comando nvidia-installer che trovate nella directory principale del driver.

Ubuntu 13.10 è in circolazione da poco tempo e utilizza un kernel recentissimo che non è compatibile con il driver per le schede video GeForce. Il bug dovrebbe essere ormai già noto ai programmatori di Nvidia, anche se il problema non sembra molto diffuso fra gli utenti. In questo caso è bastato cercare la patch con un motore di ricerca, usando i termini num_physpage, kernel 3.11 e Nvidia. Vista l’importanza raggiunta da Linux, e in particolare dalla distribuzione Ubuntu, mi aspetto da un giorno all’altro un driver che sia compatibile con il recente kernel 3.11 e 3.12.

Nvidia non deve abbassare i prezzi

Dovrebbe abbassare i prezzi Nvidia? A questa domanda una fonte che conosce profondamente l’industria delle schede video ha detto, in un’intervista rilasciata alla rivista PCR, che non è necessario un gioco al ribasso sul prezzo di listino delle GeForce Titan. La fonte ritiene che il nuovo processore grafico Radeon R9 290X  di AMD non batterà di molto il modello di prima classe di Nvidia. I benchmark di alcuni siti specializzati mostrano quest’oggi una differenza modestissima di FPS: con un test di 45 secondi fatto eseguendo il gioco Tom Raider a qualità “ultra” e alla risoluzione di 3840×2160, è risutato che solo quattro frame per secondo separano le due schede. Inoltre, c’è anche una diceria che circola intensamente a proposito di un modello erede del Titan che Nvidia metterebbe in vendita per competere meglio con il nuova accelleratore grafico di AMD. Se fosse vera, sarebbe opportuno effettuare il taglio al prezzo della Titan.

Diamoci un taglio
Diamoci un taglio

Al di là dell’aspetto economico di queste schede di prima classe, bisogna considerare che si tratta di bench effettuati a risoluzioni HD, pochi giocatori le usano. Inoltre, queste schede per il momento non hanno sbocco nel gaming sotto Linux dove tra i driver dei due produttori c’è troppa disparità di qualità (vd. i recenti bench di Miachael Larabel) e l’offerta di video game è limitata.

Fonte:

  1. ‘Nvidia doesn’t need to lower prices to compete with new AMD R7/R9 cards’

Nouveau e CPUFreq: Geforce 9800 supera GTX680

Il recente test di Michael Larabel sul driver AMD open source, fra le due versione del kernel 3.11 e 3.12 (da git), ha reso evidente un miglioramento delle prestazioni del computer. Lo stesso test è stato ripetuto con il driver Nouveau, però in questo caso il guadagno è risultato minimo con le schede denominate Kepler e Fermi. Per quale motivo? Il motivo è che il driver open source non supporta ancora il reclock, ovvero la selezione del livello delle prestazioni della GPU.

I cambiamenti nel codice di CPUFreq (il modulo che governa la frequenza d’esercizio della CPU) hanno giovato alle GPU Radeon, ma non a tutte quelle di marca nVidia. Da tempo c’è la possibilità di fare “re-clocking” delle schede grafiche GeForce: fino alla serie 7 il reclock avveniva in fase di boot e non interessava la velocità della VRAM; a partire dalla serie 8, i modelli M dei portatili avevano la capacità di riaggiustare sia il clock della RAM video sia quello del core della GPU. Questa modifica fu decisa per ridurre i consumi energetici quando la GPU si trovava per lo più in riposo. Il clock era impostato a una velocità intermedia fra il valore massimo e quello minimo d’esercizio. Con le GeForce 200 il clock al boot era impostato a ⅓ della velocità massima della GPU. Con le schede video denominate Fermi (dalla serie 400 alla 600) le prestazioni sono peggiorate perché il clock di default è al 10% della frequenza massima d’esercizio e non c’è ancora modo di fare reclock usando il driver Nouveau. Per questo motivo nel test di Michael la scheda 9800GTX ha superato una GeForce GTX680.

PTS: Nouveau bench con Xonotic
PTS: Nouveau bench con Xonotic

Thermaltake Silver-River II

Ho sia un PC desktop che un portatile e cercavo una soluzione per gestirli con un unico profilo utente, senza spendere tanti soldi. Potevo mantenerne due sincronizzati ma così avrei sprecato troppo spazio (all’incirca 8 GB di dati) e tempo tra upload e download da uno all’altro; inoltre sarei stato costretto a lasciare i due computer accesi per la sincronizzazione. Nel mio caso era meglio condividere un disco rigido fra i due elaboratori.
Il Thermaltake Silver River II è un dispositivo ultra compatto con collegamento USB per il trasporto dei dati memorizzati su un hard disk di tipo SATA da 2.5” di larghezza, quelli comunemente montati all’interno dei portatili.

Confezione Silver-River II
Confezione Silver-River II

La scatola di questa componente hardware ha dimensioni contenute, di solido cartone e con una veste grafica elegante. Lo sfondo bianco mette subito in risalto l’immagine dell’apparecchio posta al centro della parte superiore della scatola. Le informazioni tecniche più dettagliate sono riportate sul lato inferiore, mentre sui fianchi appaiono alcune piccole foto dei suoi caratteri distintivi: la rifinitura a taglio di diamante; la superficie di metallo trattata con abrasivi e verniciata di nero; l’indicatore LED e gli accessori presenti nella confezione (il cacciavite, la custodia protettiva, la garanzia e le istruzioni d’installazione). L’imballaggio nel complesso garantisce l’adeguata protezione del dispositivo.

Un imballaggio accurato
Un imballaggio accurato

Il montaggio è una procedura elementare, tant’è che le istruzioni sono stampate sulla singola facciata di un foglio volante e descrivono una sequenza di sei operazioni, dall’apertura del box al collegamento USB:

  1. Togliere la coppia di viti che sigillano il contenitore.
  2. Sfilare il pannello di controllo per l’unità disco rigido.
  3. Collegare l’hard disk da 2” alla presa SATA del circuito stampato.
  4. Infilare la memoria di massa nel corpo del dispositivo Silver-River II.
  5. Avvitare le viti.
  6. Connettere il cavo USB alla presa del box e a quella del PC.
Collegamento unità - scheda
Collegamento unità – scheda

A questo punto, con il computer acceso e collegato all’unità, ho effettuato un test della velocità di lettura, prima con un programma generico e grafico (il gestore di dischi di Ubuntu), successivamente con un programma specifico e orientato ai caratteri (il ben noto hdparm). Dati alla mano, le prestazioni in fase di lettura erano il cinquanta per cento di quelle dello stesso disco rigido quando montato all’interno del PC. Thermaltake non dichiara il transfer rate del Silver-River II, ma è risultato nella media per questo tipo di periferica: 32 MB/s (si veda a tal proposito l’altro mio test su un Hard Disk esterno con Icy Box).

Test Samsung HM321HI esterno
Test Samsung HM321HI esterno

Nella scelta di un drive portatile, l’importante è che l’alimentazione sia fornita dal collegamento USB, per minimizzare l’ingombro e agevolare l’installazione; il Silver-River II ha questo prerequisito. La trasportabilità, la condivisione e il salvataggio (backup) dei dati, sono gli altri tre aspetti che contano. Anche se è possibile utilizzarlo per avviare il sistema operativo, non risulta conveniente perché il segnale trasmesso viaggia al di sotto della massima banda disponibile, ovvero circa la metà del collegamento USB (480 Mbit/s) e un terzo del canale SATA (1500 Mbit/s).

Collegamento Silver-River II
Collegamento Silver-River II