Difference between revisions of "Trinity desktop environment raspberry pi 2"

From Studiosg
Jump to navigationJump to search
(Aggiunto una nota circa l'avvenuto rilascio dei sorgenti corretti per TDENETWORK)
(Aggiornamento pagine a nuova struttura)
Line 1: Line 1:
Benvenuti nella pagina Wiki di Simone Giustetti.
+
{{header_it|title=Installazione di TDE 14.0.1 su SlackwareArm Linux 14.1| keyword={{Template:keyword_it_tde}}| description=Installazione di Trinity Desktop Environment e Slackware Linux 14.1 per architettura ARM su Raspberry Pi 2 | link_page=En/Trinity_desktop_environment_raspberry_pi_2}}
 
 
 
 
Lingue: [[En/Trinity_desktop_environment_raspberry_pi_2 |English]] - '''Italiano'''
 
 
 
----
 
  
 
Il '''Raspberry Pi''' &egrave; un computer di dimensioni molto ridotte, occupa una superficie paragonabile ad una carta di credito, e dal costo contenuto, una trentina di Euro, progettato con il fine di '''insegnare la programmazione ai pi&ugrave; giovani'''. La prima versione fu introdotta il 29 Febbraio del 2012 dalla [https://www.raspberrypi.org fondazione Raspberry Pi], che ne cura tuttora lo sviluppo e gestisce gli aggiornamenti. Nel Febbraio del 2015, &egrave; stato rilasciato il primo modello della nuova generazione di Raspberry Pi: Il '''Raspberry Pi 2'''. Una macchina dotata di un processore Quad Core a 900 MHz e 1 Gb di memoria RAM integrata: una potenza di calcolo di tutto rispetto, migliaia di volte superiore alla dotazione dei server che installavo alcuni anni fa. Ci&ograve; conferma come il Raspberry Pi sia ideale per lo sviluppo di progetti complessi ed articolati e che sto diventando veramente vecchio >_< .
 
Il '''Raspberry Pi''' &egrave; un computer di dimensioni molto ridotte, occupa una superficie paragonabile ad una carta di credito, e dal costo contenuto, una trentina di Euro, progettato con il fine di '''insegnare la programmazione ai pi&ugrave; giovani'''. La prima versione fu introdotta il 29 Febbraio del 2012 dalla [https://www.raspberrypi.org fondazione Raspberry Pi], che ne cura tuttora lo sviluppo e gestisce gli aggiornamenti. Nel Febbraio del 2015, &egrave; stato rilasciato il primo modello della nuova generazione di Raspberry Pi: Il '''Raspberry Pi 2'''. Una macchina dotata di un processore Quad Core a 900 MHz e 1 Gb di memoria RAM integrata: una potenza di calcolo di tutto rispetto, migliaia di volte superiore alla dotazione dei server che installavo alcuni anni fa. Ci&ograve; conferma come il Raspberry Pi sia ideale per lo sviluppo di progetti complessi ed articolati e che sto diventando veramente vecchio >_< .
Line 35: Line 30:
 
   Disk identifier: 0x00000000
 
   Disk identifier: 0x00000000
 
    
 
    
      Device Boot      Start        End     Blocks  Id  System
+
  Device     Boot      Start   End         Blocks     Id  System
   /dev/sdc1            8192    31116287    15554048    c W95 FAT32 (LBA)
+
   /dev/sdc1            8192    31116287    15554048    c   W95 FAT32 (LBA)
  
 
Scaricare l'immagine di installazione di '''SlacwareArm''' in una directory locale
 
Scaricare l'immagine di installazione di '''SlacwareArm''' in una directory locale
Line 58: Line 53:
 
   Disk identifier: 0x08dd8e65
 
   Disk identifier: 0x08dd8e65
 
    
 
    
      Device Boot     Start         End     Blocks  Id  System
+
  Device     Boot       Start   End         Blocks  Id  System
   /dev/sdc1  *          32      156287      78128    c W95 FAT32 (LBA)
+
   /dev/sdc1  *          32      156287      78128    c   W95 FAT32 (LBA)
  
 
=== Pacchetti di Installazione ===
 
=== Pacchetti di Installazione ===
Line 146: Line 141:
  
 
La variabile &egrave; stata introdotta nella riga che invoca il comando '''make''', immediatamente dopo la fase di configurazione del codice sorgente:
 
La variabile &egrave; stata introdotta nella riga che invoca il comando '''make''', immediatamente dopo la fase di configurazione del codice sorgente:
 +
<syntaxhighlight lang="bash">
 
   '''make''' VERBOSE=1 ${JOB_NUM}
 
   '''make''' VERBOSE=1 ${JOB_NUM}
 +
</syntaxhighlight>
 
Come standard per i pacchetti si &egrave; optato per '''un livello di parallelismo pari a 6''' in accordo con i vecchi script ufficiali di compilazione di KDE 3 per Slackware. La variabile definita negli script SlackBuild deve essere impostata attraverso il file '''TDE.options''', contenente le opzioni di compilazione per l'intero ambiente desktop.
 
Come standard per i pacchetti si &egrave; optato per '''un livello di parallelismo pari a 6''' in accordo con i vecchi script ufficiali di compilazione di KDE 3 per Slackware. La variabile definita negli script SlackBuild deve essere impostata attraverso il file '''TDE.options''', contenente le opzioni di compilazione per l'intero ambiente desktop.
 +
<syntaxhighlight lang="bash">
 
   JOB_NUM=-j6
 
   JOB_NUM=-j6
 +
</syntaxhighlight>
 
Per impostare un livello di parallelismo maggiore o minore sar&agrave; sufficiente variare il valore numerico impostato dopo l'opzione ''-j''. Un valore pari a ''-j1'' implicher&agrave; l'uso di un singolo core '''disabilitando di fatto la compilazione in parallelo'''.
 
Per impostare un livello di parallelismo maggiore o minore sar&agrave; sufficiente variare il valore numerico impostato dopo l'opzione ''-j''. Un valore pari a ''-j1'' implicher&agrave; l'uso di un singolo core '''disabilitando di fatto la compilazione in parallelo'''.
  
 
=== Errori Dovuti al Parallelismo ===
 
=== Errori Dovuti al Parallelismo ===
 
Esistono segnalazioni da parte di utenti che lamentano l'insorgere di errori durante la compilazione di alcuni pacchetti di TDE quando il livello di parallelismo impostato &egrave; maggiore di 1. La maggior parte delle segnalazioni riguardano due pacchetti: '''tdebindings''' e '''tdemultimedia'''. I test eseguiti durante la stesura del presente articolo non hanno rilevato alcun problema, cionondimeno se tali problemi dovessero presentarsi sar&agrave; possibile aggirarli durante la compilazione impostando un valore di parallelismo pari ad 1. A tal fine dovr&agrave; essere modificato il contenuto del file globale '''TDE.options''', oppure le opzioni specifiche per il singolo pacchetto contentue nel relativo file '''local.options'''. Se ad esempio si volesse generare un pacchetto per '''tdebindings''' senza ricorrere alla compilazione parallela sar&agrave; sufficiente spostarsi nella directory contente gli script di compilazione, il codice sorgente ed il file local.options: /usr/src/trinity/base/tdebindings nel nostro caso, aprire il file '''local.options''' con un programma di elaborazione di testi a scelta ed aggiungere la riga:
 
Esistono segnalazioni da parte di utenti che lamentano l'insorgere di errori durante la compilazione di alcuni pacchetti di TDE quando il livello di parallelismo impostato &egrave; maggiore di 1. La maggior parte delle segnalazioni riguardano due pacchetti: '''tdebindings''' e '''tdemultimedia'''. I test eseguiti durante la stesura del presente articolo non hanno rilevato alcun problema, cionondimeno se tali problemi dovessero presentarsi sar&agrave; possibile aggirarli durante la compilazione impostando un valore di parallelismo pari ad 1. A tal fine dovr&agrave; essere modificato il contenuto del file globale '''TDE.options''', oppure le opzioni specifiche per il singolo pacchetto contentue nel relativo file '''local.options'''. Se ad esempio si volesse generare un pacchetto per '''tdebindings''' senza ricorrere alla compilazione parallela sar&agrave; sufficiente spostarsi nella directory contente gli script di compilazione, il codice sorgente ed il file local.options: /usr/src/trinity/base/tdebindings nel nostro caso, aprire il file '''local.options''' con un programma di elaborazione di testi a scelta ed aggiungere la riga:
 +
<syntaxhighlight lang="bash">
 
   JOB_NUM=-j1
 
   JOB_NUM=-j1
 +
</syntaxhighlight>
 
Apportata la modifica sar&agrave; possibile lanciare immediatamente la compilazione del pacchetto tramite lo script SlackBuild presente nella medesima directory:
 
Apportata la modifica sar&agrave; possibile lanciare immediatamente la compilazione del pacchetto tramite lo script SlackBuild presente nella medesima directory:
 
   '''sh''' ./tdebindings.SlackBuild
 
   '''sh''' ./tdebindings.SlackBuild
Line 164: Line 165:
 
==== TDELIBS ====
 
==== TDELIBS ====
 
Durante il primo tentativo di compilare il pacchetto '''tdelibs''' la procedura &egrave; fallita rendendo il seguente errore:
 
Durante il primo tentativo di compilare il pacchetto '''tdelibs''' la procedura &egrave; fallita rendendo il seguente errore:
 +
<syntaxhighlight lang="cmake">
 
   [  0%] Building C object dcop/KDE-ICE/CMakeFiles/kICE-static.dir/accept.c.o
 
   [  0%] Building C object dcop/KDE-ICE/CMakeFiles/kICE-static.dir/accept.c.o
 
   In file included from <command-line>:0:0:
 
   In file included from <command-line>:0:0:
Line 173: Line 175:
 
   make[1]: *** [dcop/KDE-ICE/CMakeFiles/kICE-static.dir/all] Error 2
 
   make[1]: *** [dcop/KDE-ICE/CMakeFiles/kICE-static.dir/all] Error 2
 
   make: *** [all] Error 2
 
   make: *** [all] Error 2
 +
</syntaxhighlight>
  
 
Inizialmente si &egrave; pensato ad un potenziale problema derivante dal parallelismo introdotto dato che la versione 14.0.0 del pacchetto non presentava alcun difetto. Un secondo tentativo eseguito impostando l'opzione '''-j1''' ha reso esito analogo. Scartata la compilazione parallela come causa potenziale del problema si &egrave; proceduto a verificare che tutti i prerequisiti fossero stati correttamente installati e che il file '''ntqglobal.h''' fosse presente nel sistema. Il comando '''find''' ha confermato l'esistenza di un file con tale nome:
 
Inizialmente si &egrave; pensato ad un potenziale problema derivante dal parallelismo introdotto dato che la versione 14.0.0 del pacchetto non presentava alcun difetto. Un secondo tentativo eseguito impostando l'opzione '''-j1''' ha reso esito analogo. Scartata la compilazione parallela come causa potenziale del problema si &egrave; proceduto a verificare che tutti i prerequisiti fossero stati correttamente installati e che il file '''ntqglobal.h''' fosse presente nel sistema. Il comando '''find''' ha confermato l'esistenza di un file con tale nome:
Line 182: Line 185:
  
 
Il problema &egrave; stato risolto '''aggiungendo un percorso di ricerca per i file include''' durante la fase di compilazione del codice sorgente. A tal fine sono state aggiunte le righe:
 
Il problema &egrave; stato risolto '''aggiungendo un percorso di ricerca per i file include''' durante la fase di compilazione del codice sorgente. A tal fine sono state aggiunte le righe:
 +
<syntaxhighlight lang="bash">
 
   # Add some include paths to the standard compiler flags otherwise the build
 
   # Add some include paths to the standard compiler flags otherwise the build
 
   # process will fail with an error
 
   # process will fail with an error
 
   SLKCFLAGS="${SLKCFLAGS} -I${PREFIX}/include"
 
   SLKCFLAGS="${SLKCFLAGS} -I${PREFIX}/include"
 +
</syntaxhighlight>
 
Aventi lo scopo di accodare '''/opt/trinity/include''' all'elenco dei percorsi predefiniti. Lo script modificato gira con successo.
 
Aventi lo scopo di accodare '''/opt/trinity/include''' all'elenco dei percorsi predefiniti. Lo script modificato gira con successo.
  
 
==== TDENETWORK ====
 
==== TDENETWORK ====
 
Nel caso del pacchetto '''tdenetwork''' il problema non si &egrave; presentato immediatamente, ma relativamente pi&ugrave; tardi a procedura avanzata: durante la fase di copia dei file costituenti l'installazione. L'errore reso nel caso specifico era:
 
Nel caso del pacchetto '''tdenetwork''' il problema non si &egrave; presentato immediatamente, ma relativamente pi&ugrave; tardi a procedura avanzata: durante la fase di copia dei file costituenti l'installazione. L'errore reso nel caso specifico era:
 +
<syntaxhighlight lang="cmake">
 
   [ 71%] Building CXX object krdc/vnc/CMakeFiles/vnc-static.dir/threads.cpp.o
 
   [ 71%] Building CXX object krdc/vnc/CMakeFiles/vnc-static.dir/threads.cpp.o
 
   /tmp/build/tmp-tdenetwork/tdenetwork/krdc/vnc/threads.cpp: In function 'void output(const char*, ...)':
 
   /tmp/build/tmp-tdenetwork/tdenetwork/krdc/vnc/threads.cpp: In function 'void output(const char*, ...)':
Line 197: Line 203:
 
   make[1]: *** [krdc/vnc/CMakeFiles/vnc-static.dir/all] Error 2
 
   make[1]: *** [krdc/vnc/CMakeFiles/vnc-static.dir/all] Error 2
 
   make: *** [all] Error 2
 
   make: *** [all] Error 2
 +
</syntaxhighlight>
  
 
Anche in questo caso si &egrave; proceduto verificando che il problema non fosse una conseguenza diretta del livello di parallelismo pari a 6, ma nuovamente i test hanno dimostrato che la causa dovesse essere cercata altrove. Leggendo la documentazione relativa alle classi TQString e TQCString interessate:
 
Anche in questo caso si &egrave; proceduto verificando che il problema non fosse una conseguenza diretta del livello di parallelismo pari a 6, ma nuovamente i test hanno dimostrato che la causa dovesse essere cercata altrove. Leggendo la documentazione relativa alle classi TQString e TQCString interessate:
Line 204: Line 211:
  
 
Per ovviare definitivamente al problema &egrave; stata preparata la seguente '''patch''':
 
Per ovviare definitivamente al problema &egrave; stata preparata la seguente '''patch''':
 +
<syntaxhighlight lang="cpp">
 
   *** krdc/vnc/threads.cpp        2015-09-13 20:01:24.889992277 +0200
 
   *** krdc/vnc/threads.cpp        2015-09-13 20:01:24.889992277 +0200
 
   --- krdc/vnc/threads.cpp        2015-09-13 19:59:20.899992324 +0200
 
   --- krdc/vnc/threads.cpp        2015-09-13 19:59:20.899992324 +0200
Line 222: Line 230:
 
    
 
    
 
         va_end(args);
 
         va_end(args);
 
+
</syntaxhighlight>
 +
 
 
Richiamata dallo script di compilazione mediante le righe:
 
Richiamata dallo script di compilazione mediante le righe:
 +
<syntaxhighlight lang="bash">
 
   # Patch the krdc/vncn/threads.cpp source file in order to solve an issue with the
 
   # Patch the krdc/vncn/threads.cpp source file in order to solve an issue with the
 
   #  output function.
 
   #  output function.
   '''patch''' ''-p0 -i'' ${SRCDIR}/threads_sprintf.patch
+
   patch -p0 -i ${SRCDIR}/threads_sprintf.patch
 +
</syntaxhighlight>
  
 
In seguito, spulciando le segnalazioni presenti nel bug tracker del progetto Trinity ne &egrave; stata trovata una relativa al problema sopra descritto: [http://bugs.pearsoncomputing.net/show_bug.cgi?id=2525 BUG 2525]. La patch &egrave; stata proposta come soluzione.
 
In seguito, spulciando le segnalazioni presenti nel bug tracker del progetto Trinity ne &egrave; stata trovata una relativa al problema sopra descritto: [http://bugs.pearsoncomputing.net/show_bug.cgi?id=2525 BUG 2525]. La patch &egrave; stata proposta come soluzione.
Line 263: Line 274:
  
 
* Smistare gli archivi contenenti il codice sorgente per i pacchetti nelle omonime directory contenute in '''base''', '''library''' e '''prerequisite'''. Il file '''TDE.options''', di cui viene fornito un esempio, contiene le opzioni di compilazione per l'intero ambiente:
 
* Smistare gli archivi contenenti il codice sorgente per i pacchetti nelle omonime directory contenute in '''base''', '''library''' e '''prerequisite'''. Il file '''TDE.options''', di cui viene fornito un esempio, contiene le opzioni di compilazione per l'intero ambiente:
 +
<syntaxhighlight lang="bash">
 
   # Global options used to build TDE.
 
   # Global options used to build TDE.
 
   #
 
   #
Line 278: Line 290:
 
   TAG="sg"
 
   TAG="sg"
 
   TAR_OPTION="-xjvf"
 
   TAR_OPTION="-xjvf"
 +
</syntaxhighlight>
  
 
* Aprire il file con un qualsiasi programma di elaborazione di testo ed impostare i valori desiderati per le variabili contenute. Le variabili che dovrebbero essere popolate con riguardo all'architettura e alle preferenze personali sono:
 
* Aprire il file con un qualsiasi programma di elaborazione di testo ed impostare i valori desiderati per le variabili contenute. Le variabili che dovrebbero essere popolate con riguardo all'architettura e alle preferenze personali sono:
Line 294: Line 307:
  
 
Una nota a parte merita il pacchetto '''tde-i18n''' contenente i file di localizzazione in tutte le lingue supportate da TDE. Lo script principale contiene le istruzioni necessarie ad eseguirne la compilazione, ma l'operazione risulta essere molto onerosa in termini di tempo perci&ograve; '''le istruzioni sono commentate''' ed i pacchetti di localizzazione vengono ignorati. Se si desiderasse generare anche i file di localizzazione sar&agrave; necessario modificare lo script TDE.SlackBuild rimuovendo il commento dalla riga:
 
Una nota a parte merita il pacchetto '''tde-i18n''' contenente i file di localizzazione in tutte le lingue supportate da TDE. Lo script principale contiene le istruzioni necessarie ad eseguirne la compilazione, ma l'operazione risulta essere molto onerosa in termini di tempo perci&ograve; '''le istruzioni sono commentate''' ed i pacchetti di localizzazione vengono ignorati. Se si desiderasse generare anche i file di localizzazione sar&agrave; necessario modificare lo script TDE.SlackBuild rimuovendo il commento dalla riga:
 +
<syntaxhighlight lang="bash">
 
   #  bash ./${PKG}.SlackBuild
 
   #  bash ./${PKG}.SlackBuild
 +
</syntaxhighlight>
 
modificandola in
 
modificandola in
 +
<syntaxhighlight lang="bash">
 
       bash ./${PKG}.SlackBuild
 
       bash ./${PKG}.SlackBuild
 +
</syntaxhighlight>
  
 
=== Tempistiche ===
 
=== Tempistiche ===
Line 338: Line 355:
 
----
 
----
  
Lingue: [[En/Trinity_desktop_environment_raspberry_pi_2 |English]] - '''Italiano'''
+
{{footer_it | link_page=En/Trinity_desktop_environment_raspberry_pi_2}}

Revision as of 12:14, 21 December 2016

Benvenuti nella pagina Wiki di Simone Giustetti.


Lingue: English - Italiano


Il Raspberry Pi è un computer di dimensioni molto ridotte, occupa una superficie paragonabile ad una carta di credito, e dal costo contenuto, una trentina di Euro, progettato con il fine di insegnare la programmazione ai più giovani. La prima versione fu introdotta il 29 Febbraio del 2012 dalla fondazione Raspberry Pi, che ne cura tuttora lo sviluppo e gestisce gli aggiornamenti. Nel Febbraio del 2015, è stato rilasciato il primo modello della nuova generazione di Raspberry Pi: Il Raspberry Pi 2. Una macchina dotata di un processore Quad Core a 900 MHz e 1 Gb di memoria RAM integrata: una potenza di calcolo di tutto rispetto, migliaia di volte superiore alla dotazione dei server che installavo alcuni anni fa. Ciò conferma come il Raspberry Pi sia ideale per lo sviluppo di progetti complessi ed articolati e che sto diventando veramente vecchio >_< .

Raspian, una versione di Debian GNU Linux appositamente modificata, è il sistema operativo ufficialmente supportato e fornito dalla fondazione Raspberry Pi. Esiste comunque la possibilità di installare altri sistemi operativi sugli apparati. Una qualsiasi distribuzione Linux compatibile con l'architettura ARM, ad esempio SlackwareARM 14.1, girerà egregiamente sul Rasperry Pi 2 fornendo all'utenza tutte le applicazioni e gli strumenti abitualmente disponibili su un comune PC. Molte applicazioni risultano fluide e reattive, mentre altre perdono nel confronto con le prestazioni di un moderno portatile. Una nota dolente è rappresentata dall'ambiente desktop KDE 4, che richiede una quantità di risorse forse eccessiva per il Raspberry Pi. Una potenziale soluzione consisterebbe nell'impiego di un desktop leggero ad esempio XFCE, ma ciò comporta rinunciare a molte delle ottime applicazioni integrate in KDE. Una soluzione alternativa alquanto laboriosa, ma decisamente più soddisfacente consiste nell'installazione di TDE. Il progetto Trinity Desktop Environment ha lo scopo di continuare lo sviluppo del ramo 3 di KDE migliorando l'esperienza utente e mantenendo aggiornato il supporto hardware. TDE rappresenta un ambiente desktop maturo, ricco di applicazioni e funzionalità, decisamente più leggero di KDE 4 e, come tale, meglio indicato per macchine con risorse limitate.

Nel proseguo dell'articolo verrà illustrato come installare la versione 14.0.1 del Trinity Desktop Environment, TDE in breve, sul Raspberry Pi e SlackwareARM 14.1.


SlackwareARM sul Raspberry Pi 2

Il primo passo consiste ovviamente nell'installare l'ultima versione disponibile di SlackwareARM sul Raspberry Pi 2. La fondazione Raspberry Pi non supporta la distribuzione derivata Slackware, nè SlackwareARM fornisce supporto per il Raspberry Pi. Non di meno l'operazione non si discosta molto da una normale installazione di Slackware Linux su PC ed in rete è possibile reperire documentazione esaustiva in merito. Le poche difformità nascono dalle differenze architetturali intercorrenti tra sistemi embedded e personal computer come ad esempio l'assenza di un BIOS, di un lettore CD/DVD e di altri componenti tipici di un PC.

Prima di procedere sarà necessario procurarsi:

  • Una scheda MicroSD da 16 Gb su cui verrà installato il sistema operativo.
  • Un lettore di schede MicroSD per PC.
  • Una pennetta USB da almeno 4 Gb su cui copiare i pacchetti di installazione.
  • Mouse USB, tastiera USB, monitor, cavi e tutto il necessario per il funzionamento del Raspberry Pi.

Preparazione della Scheda MicroSD

Le operazioni di installazione devono essere eseguite da un utente con privilegi elevati quale root. Salvo dove diversamente specificato nel proseguo dell'articolo si presupporrà che stiate operando come root.

Collegare la scheda al PC mediante l'apposito lettore. La scheda correttamente rilevata dovrebbe comparire nell'elenco dei dischi reso dal comando fdisk come nel seguente esempio:

  fdisk -l
  Disk /dev/sdc: 15.9 GB, 15931539456 bytes
  255 heads, 63 sectors/track, 1936 cylinders, total 31116288 sectors
  Units = sectors of 1 * 512 = 512 bytes
  Sector size (logical/physical): 512 bytes / 512 bytes
  I/O size (minimum/optimal): 512 bytes / 512 bytes
  Disk identifier: 0x00000000
  
  Device     Boot      Start   End         Blocks      Id  System
  /dev/sdc1            8192    31116287    15554048    c   W95 FAT32 (LBA)

Scaricare l'immagine di installazione di SlacwareArm in una directory locale

cd /tmp
wget http://rpi2.fatdog.eu/files/img/rpi2-slackwarearm-install_13Mar15_fd.img.xz
wget http://rpi2.fatdog.eu/files/img/rpi2-slackwarearm-install_13Mar15_fd.img.xz.md5

Ad operazione terminata eseguire un controllo di congruenza per accertarsi che l'immagine non si sia corrotta durante il trasferimento:

md5sum -c rpi2-slackwarearm-install_13Mar15_fd.img.xz.md5

Nel caso il comando rendesse un errore sarà necessario scaricare nuovamente il file immagine sperando che il problema non si ripeta. Altrimenti si potrà procedere copiando l'immagine sulla scheda MicroSD mediante il comando dd:

xz -dc rpi2-slackwarearm-install_13Mar15_fd.img.xz | dd of=/dev/sdc bs=65536

Ove /dev/sdc è la scheda MicroSD collegata al PC e precedentemente rilevata. Il buon esito della copia potrà essere verificato utilizzando nuovamente il comando fdisk per accertarsi che le dimensioni della partizione siano mutate e che sia stato attivato il flag di boot:

  fdisk -l
  Disk /dev/sdc: 15.9 GB, 15931539456 bytes
  4 heads, 32 sectors/track, 243096 cylinders, total 31116288 sectors
  Units = sectors of 1 * 512 = 512 bytes
  Sector size (logical/physical): 512 bytes / 512 bytes
  I/O size (minimum/optimal): 512 bytes / 512 bytes
  Disk identifier: 0x08dd8e65
  
  Device      Boot       Start   End          Blocks   Id  System
  /dev/sdc1   *          32      156287       78128    c   W95 FAT32 (LBA)

Pacchetti di Installazione

Non esistono immagini ISO di SlackwareARM dato che la grande maggioranza dei dispositivi basati su architettura ARM non è dotata di lettore CD/DVD e che anche collegandone uno esterno via USB non sarebbe comunque possibile eseguire il boot dai supporti. SlackwareARM può essere installata in due modi dopo aver avviato il programma di installazione:

  1. Leggendo i pacchetti esportati via rete tramite protocollo NFS.
  2. Leggendo i pacchetti da un supporto collegato via USB.

Nel proseguo dell'articolo si utilizzerà la seconda opzione. Un elenco di locazioni da cui scaricare i pacchetti può essere reperito al seguente indirizzo. Una volta scaricati, i pacchetti costituenti SlackwareARM devono essere copiati sulla pennetta USB che dovrà essere collegata al Raspberry Pi durante l'installazione.

Avviare l'Installazione di SlackwareARM

Ultimati i preparativi si potrà cominciare l'installazione vera e propria.

  • Inserire la scheda MicroSD nell'apposito lettore integrato nel Raspberry Pi.
  • Collegare tastiera e mouse USB.
  • Collegare la chiavetta USB contenente i pacchetti di SlackwareARM precedentemente scaricati.
  • Collegare il cavo HDMI/RCA al monitor.
  • Accendere il monitor.
  • Collegare il cavo di alimentazione al Raspberry Pi.

Se tutto va bene sul Raspberry Pi si accenderanno in sequenza la spia rossa dell'alimentazione e la spia verde collegata al lettore MicroSD che incomincerà a lampeggiare. Sulla parte alta del monitor compariranno un numero di lamponi pari al numero di core e più sotto la schermata di selezione della tastiera. In caso contrario qualcosa non funziona: potrebbe trattarsi di un problema dell'immagine di installazione risolvibile ripetendo l'operazione di scrittura della scheda MicroSD oppure un problema della scheda stessa; in quest'ultimo caso sarà necessario sostituirla e provarne un'altra.

Impostazione di Data e Ora

Il Raspberry Pi non è dotato di un orologio hardware perciò ad ogni avvio la data di sistema viene azzerata al 1 Gennaio 1970 ed è necessario impostare data ed ora correnti. Tale operazione deve essere eseguita anche durante l'installazione altrimenti la procedura si rifiuterà di installare pacchetti di molti anni più recenti del sistema ipotizzando un errore di configurazione. Per impostare la data di sistema sarà necessario:

  • Selezionare un layout di tastiera dall'elenco fornito.
  • Collegarsi come utente root (Durante l'installazione non viene richiesta una password).
  • Lanciare il comando date con l'opzione -s per impostare la data:
date -s "<day> <month> <date> <hour>:<minute>:<second> <year>"

Ove

<day> = Stringa di 3 lettere che specifica il giorno della settimana in inglese.
<month> = Mese dell'anno rappresentato con una stringa di 3 lettere.
<date> = Giorno del mese rappresentato con 2 cifre numeriche.
<year> = Anno rappresentato con 4 cifre numeriche.
<hour> = Ora rappresentata con 2 cifre numeriche.
<minute> = Minuti rappresentati con 2 cifre numeriche.
<second> = Secondi rappresentati con 2 cifre numeriche.
Es: date -s "Thu Sep 3 16:06:35 2015"

Nel caso in cui la rete fosse configurata e funzionante sarà invece possibile aggiornare la data di sistema interrogando un server NTP esterno mediante il comando:

ntpdate pool.ntp.org

Partizionamento della Scheda MicroSD

La scheda MicroSD è gestita come un disco e come tale deve essere partizionata. Creare un numero di partizioni maggiore di uno garantisce una maggior sicurezza per i dati residenti sul sistema oltre che una maggiore flessibilità nell'eseguire aggiornamenti, back-up o per reinstallare il sistema. Il primo passo consiste nell'individuare la scheda tra i supporti riconosciuti dal sistema mediante il comando fdisk di cui si riporta un estratto:

  fdisk -l
  /dev/mmcblk0
  /dev/mmcblk0p1

La scheda corrisponde al dispositivo /dev/mmcblk0 mentre /dev/mmcblk0p1 è la prima partiziona, che contiene i file di avvio. Per partizionare la scheda è possibile far ricorso al comando cfdisk comune in moltissime distribuzioni Linux:

cfdisk /dev/mmcblk0

La partizione esistente non deve essere modificata. Oltre ad essa sarà necessario creare una partizione di swap, tipologia 082, di almeno 256 Mb di dimensione, una partizione di root, ove installare il sistema ed una partizione /home per i dati dell'utenza. È ovviamente possibile creare molte altre partizioni secondo le proprie esigenze; quelle elencate rappresentano una configurazione minima. Verificare che il flag di boot della prima partizione VFAT sia attivo prima di salvare la tabella delle partizioni ed uscire da cfdisk.

Copia dei Pacchetti

Montare la pennetta USB contenente i pacchetti di SlackwareARM su di una directory locale ed avviare il programma di installazione mediante il comando setup, che presenterà le schermate standard di una installazione di Slackware Linux.

  • Attivare la partizione di swap.
  • Attivare la partizione di sistema e le altre configurate.
  • Salvare la configurazione delle partizioni nel file /etc/fstab.
  • Attivare la partizione di boot (VFAT) facendo attenzione ad impostare umask 177 in fase di mount onde evitare che ne sia sovrascritto il contenuto per errore.
  • Selezionare la sorgente dei pacchetti specificando la directory ove è stata in precedenza montata la pennetta USB.
  • Selezionare la tipologia di installazione ed avviare la copia dei pacchetti.

Come anticipato in precedenza lo scopo del presente articolo consiste nel dimostrare che TDE 14.0.1 rappresenti un ottimo rimpiazzo per KDE 4 pertanto si consiglia di non installare i pacchetti relativi a KDE 4 ed alla versione 4 delle librerie Qt. Le librerie Qt4 potrebbero essere richieste da programmi non necessariamente legati a KDE 4 e possono convivere con TQt: la versione di Qt 3 manutenuta dal progetto Trinity. Purtroppo la presenza di Qt4 può causare problemi durante la compilazione dei pacchetti costituenti il Trinity Desktop Environment pertanto si consiglia di rimandarne l'installazione a dopo aver ultimato quella di TDE.

Configurazione di Sistema

Il programma di installazione di SlackwareARM ricalca quello standard di Slackware perciò la procedura di configurazione va a toccare tutti i punti gestiti da quest'ultimo:

  • Configurazione del mouse.
  • Configurazione dell'interfaccia di rete.
    • Impostazione del nome della macchina.
    • Impostazione del dominio.
    • Impostazione di un indirizzo IP statico oppure configurazione del servizio DHCP.
  • Configurazione dei servizi da avviare al boot.
  • Selezione di un font per la console.
  • Configurazione del fuso orario.
  • Configurazione del Window Manager predefinito. Operazione che dovrà essere ripetuta dopo aver compilato ed installato TDE.
  • Impostazione della password per l'utente root.

In chiusura il programma di installazione chiederà di eseguire un riavvio del sistema. Non riavviare immediatamente e procedere invece collegandosi ad un nuovo terminale per:

  • Rimuovere pacchetti inutili:
ROOT=/mnt removepkg kernel_kirkwood kernel-modules-kirkwood
ROOT=/mnt removepkg kernel_armv7 kernel-modules-armv7
  • Rimuovere il file initrd.gz dalla partizione di boot:
mount -t vfat /dev/mmcblk0p1 /mnt/boot
rm /mnt/boot/initrd.gz
  • Installare il firmware per il Raspberry Pi ed i dati per il kernel:
ROOT=/mnt installpkg /rpi2-extra/kernel* /rpi2-extra/rpi2*

Ultimate le operazioni sopra elencate si potrà smontare la sorgente dei pacchetti di installazione ed eseguire il riavvio. L'installazione di SlackwareARM sul Raspberry Pi è conclusa ed al termine della procedura di avvio sarà possibile collegarsi al sistema appena installato per procedere all'installazione di TDE.


Installazione di Trinity Desktop Environment su Raspberry Pi 2

Il 6 Settembre del 2015 è stata ufficialmente rilasciata la versione 14.0.1 del Trinity Desktop Environment. Si tratta di un rilascio di bug fix e rappresenta il risultato di svariati mesi di lavoro per correggere i problemi segnalati dagli utenti. Non esistono pacchetti precompilati di TDE per Slackware Linux. Non per PC e neppure per dispositivi basati su architettura ARM. Si dovrà pertanto procedere compilando i singoli pacchetti a partire dal codice sorgente. Gli archivi compressi contenenti il codice sorgente per i pacchetti possono essere scaricati dal seguente indirizzo. Trattandosi di una versione di bug fix, la 14.0.1 non si discosta di molto dalla precedente 14.0.0 la cui procedura di compilazione è stata oggetto di un precedente articolo a cui si rimanda per una descrizione dettagliata degli script di compilazione. Nel proseguo dell'articolo verranno invece descritte le differenze e le aggiunte introdotte specificamente per la versione 14.0.1.

Compilazione in Parallelo

I moderni processori sono costituiti da più core: una soluzione architetturale che consente di eseguire molte istruzioni in parallelo. Tale caratteristica può essere sfruttata dai compilatori recenti consentendo di ridurre drasticamente le tempistiche di generazione del codice eseguibile. Molti pacchetti costituenti il Trinity Desktop Environment possono trarre giovamento dalla compilazione in parallelo mentre in altri causa la generazione di errori. Per aggirare l'insorgere potenziale di errori, gli script realizzati in occasione del rilascio di TDE 14.0.0 non utilizzavano alcuna forma di parallelismo nel generare i pacchetti. Uno spreco di risorse se si considera che il Raspberry Pi 2, come la maggior parte dei processori in commercio, dispone di 4 core. Si è pertanto deciso di rettificare la scelta cautelativa di qualche mese fa introducendo negli script una nuova variabile adibita al controllo del livello di parallelismo: JOB_NUM.

La variabile è stata introdotta nella riga che invoca il comando make, immediatamente dopo la fase di configurazione del codice sorgente:

   '''make''' VERBOSE=1 ${JOB_NUM}

Come standard per i pacchetti si è optato per un livello di parallelismo pari a 6 in accordo con i vecchi script ufficiali di compilazione di KDE 3 per Slackware. La variabile definita negli script SlackBuild deve essere impostata attraverso il file TDE.options, contenente le opzioni di compilazione per l'intero ambiente desktop.

   JOB_NUM=-j6

Per impostare un livello di parallelismo maggiore o minore sarà sufficiente variare il valore numerico impostato dopo l'opzione -j. Un valore pari a -j1 implicherà l'uso di un singolo core disabilitando di fatto la compilazione in parallelo.

Errori Dovuti al Parallelismo

Esistono segnalazioni da parte di utenti che lamentano l'insorgere di errori durante la compilazione di alcuni pacchetti di TDE quando il livello di parallelismo impostato è maggiore di 1. La maggior parte delle segnalazioni riguardano due pacchetti: tdebindings e tdemultimedia. I test eseguiti durante la stesura del presente articolo non hanno rilevato alcun problema, cionondimeno se tali problemi dovessero presentarsi sarà possibile aggirarli durante la compilazione impostando un valore di parallelismo pari ad 1. A tal fine dovrà essere modificato il contenuto del file globale TDE.options, oppure le opzioni specifiche per il singolo pacchetto contentue nel relativo file local.options. Se ad esempio si volesse generare un pacchetto per tdebindings senza ricorrere alla compilazione parallela sarà sufficiente spostarsi nella directory contente gli script di compilazione, il codice sorgente ed il file local.options: /usr/src/trinity/base/tdebindings nel nostro caso, aprire il file local.options con un programma di elaborazione di testi a scelta ed aggiungere la riga:

   JOB_NUM=-j1

Apportata la modifica sarà possibile lanciare immediatamente la compilazione del pacchetto tramite lo script SlackBuild presente nella medesima directory:

  sh ./tdebindings.SlackBuild

Le considerazioni riportate sopra hanno valore generale e possono essere utilizzate anche per tdemultimedia o qualsiasi altro pacchetto che presentasse problemi riconducibili alla compilazione in parallelo.

Script SlackBuild Modificati

Sebbene la maggior parte dei pacchetti siano rimasti invariati nel passaggio dalla versione 14.0.0 alla 14.0.1, in alcuni casi sono state introdotte nuove dipendenze o purtroppo nuovi errori per cui è nata la necessità di ricorrere a patch correttive. Di seguito sono riportate le modifiche apportate ad alcuni specifici script di compilazione:

TDELIBS

Durante il primo tentativo di compilare il pacchetto tdelibs la procedura è fallita rendendo il seguente errore:

   [  0%] Building C object dcop/KDE-ICE/CMakeFiles/kICE-static.dir/accept.c.o
   In file included from <command-line>:0:0:
   /usr/include/tqt/tqt.h:54:23: fatal error: ntqglobal.h: No such file or directory
   #include <ntqglobal.h>
                        ^
   compilation terminated.
   make[2]: *** [dcop/KDE-ICE/CMakeFiles/kICE-static.dir/accept.c.o] Error 1
   make[1]: *** [dcop/KDE-ICE/CMakeFiles/kICE-static.dir/all] Error 2
   make: *** [all] Error 2

Inizialmente si è pensato ad un potenziale problema derivante dal parallelismo introdotto dato che la versione 14.0.0 del pacchetto non presentava alcun difetto. Un secondo tentativo eseguito impostando l'opzione -j1 ha reso esito analogo. Scartata la compilazione parallela come causa potenziale del problema si è proceduto a verificare che tutti i prerequisiti fossero stati correttamente installati e che il file ntqglobal.h fosse presente nel sistema. Il comando find ha confermato l'esistenza di un file con tale nome:

  find / -name "ntqglobal.h"
  /opt/trinity/include/ntqglobal.h

Spulciando i dettagli dei pacchetti installati si è ricevuta conferma che si trattasse del file corretto:

  grep ntqglobal.h /var/log/packages/*
  /var/log/packages/tqt3-R14.0.1-arm-1sg:opt/trinity/include/ntqglobal.h

Il problema è stato risolto aggiungendo un percorso di ricerca per i file include durante la fase di compilazione del codice sorgente. A tal fine sono state aggiunte le righe:

   # Add some include paths to the standard compiler flags otherwise the build
   # process will fail with an error
   SLKCFLAGS="${SLKCFLAGS} -I${PREFIX}/include"

Aventi lo scopo di accodare /opt/trinity/include all'elenco dei percorsi predefiniti. Lo script modificato gira con successo.

TDENETWORK

Nel caso del pacchetto tdenetwork il problema non si è presentato immediatamente, ma relativamente più tardi a procedura avanzata: durante la fase di copia dei file costituenti l'installazione. L'errore reso nel caso specifico era:

   [ 71%] Building CXX object krdc/vnc/CMakeFiles/vnc-static.dir/threads.cpp.o
   /tmp/build/tmp-tdenetwork/tdenetwork/krdc/vnc/threads.cpp: In function 'void output(const char*, ...)':
   /tmp/build/tmp-tdenetwork/tdenetwork/krdc/vnc/threads.cpp:113:10: error: 'class TQString' has no member named 'vsprintf'
   message.vsprintf(format, args);
            ^
   make[2]: *** [krdc/vnc/CMakeFiles/vnc-static.dir/threads.cpp.o] Error 1
   make[1]: *** [krdc/vnc/CMakeFiles/vnc-static.dir/all] Error 2
   make: *** [all] Error 2

Anche in questo caso si è proceduto verificando che il problema non fosse una conseguenza diretta del livello di parallelismo pari a 6, ma nuovamente i test hanno dimostrato che la causa dovesse essere cercata altrove. Leggendo la documentazione relativa alle classi TQString e TQCString interessate:

  man tqt3-tqcstring
  man tqt3-tqstring

è emerso che queste non disponessero di un metodo vsprintf, come segnalato dall'errore. Esiste invece un metodo chiamato sprintf, implementato come una chiamata al precedente. Da cui si è dedotto che la soluzione consistesse nel sostituire il metodo vsprintf con sprintf nel codice della funzione output del file threads.cpp. Apportata la modifica e lanciato il comando make install la compilazione si è conclusa con successo.

Per ovviare definitivamente al problema è stata preparata la seguente patch:

   *** krdc/vnc/threads.cpp        2015-09-13 20:01:24.889992277 +0200
   --- krdc/vnc/threads.cpp        2015-09-13 19:59:20.899992324 +0200
   ***************
   *** 110,116 ****
         va_start(args, format);
   
         TQString message;
   !       message.vsprintf(format, args);
   
         va_end(args);
   
   --- 110,116 ----
         va_start(args, format);
   
         TQString message;
   !       message.sprintf(format, args);
   
         va_end(args);

Richiamata dallo script di compilazione mediante le righe:

   # Patch the krdc/vncn/threads.cpp source file in order to solve an issue with the
   #   output function.
   patch -p0 -i ${SRCDIR}/threads_sprintf.patch

In seguito, spulciando le segnalazioni presenti nel bug tracker del progetto Trinity ne è stata trovata una relativa al problema sopra descritto: BUG 2525. La patch è stata proposta come soluzione.

Aggiornamento: La patch è stata rifiutata perchè l'origine dell'errore è stata identificata altrove. Sembra che parte del codice per il prossimo rilascio 14.1.0 sia finito nell'archivio del 14.0.1. Esistono due soluzioni per l'errore:

  1. Scaricare il codice sorgente dal repository GIT di TDE.
  2. Aspettare la sostituzione dell'archivio contenente il codice sorgente di tdenetwork con la versione corretta.

Quale che sia la strada adottata, applicare la patch al codice corretto causerà un errore. Per prevenirlo è necessario commentare le righe aggiunte allo script SlackBuild.

Aggiornamento: Ad inizio Ottobre sono stati rilasciati gli archivi conteneti il codice sorgente corretto della versione 14.0.1. La patch inclusa per correggere il problema di compilazione del pacchetto tdenetwork non è più necessaria. Il build tree è stato aggiornato commentando le righe che applicavano la patch. Per cortesia accertatevi di aver scaricato gli archivi contenenti il codice sorgente aggiornato prima di lanciare la procedura di compilazione.


Non sono state necessarie modifiche ad alti script appartenenti ai gruppi: base, library e prerequisite di TDE.

Legare Tutto Assieme

Per semplificare l'operazione di compilazione di TDE è stato preparato uno script principale: TDE.SlackBuild avente lo scopo di guidare la procedura richiamando quelli per specifici pacchetti nell'ordine suggerito dalla documentazione. Una copia dello script e dell'intero build tree è scaricabile sotto forma di archivio compresso dal seguente indirizzo. Una volta scaricato l'archivio ed il codice sorgente del progetto TDE in una directory locale quale /tmp si potrà procedere seguendo i passi dettagliati nel seguito:

  • Creare la directory /usr/src/trinity:
mkdir /usr/src/trinity
  • Copiare l'archivio contenente il build tree in tale directory
cp /tmp/tde_build_tree_sg-14.0.1-2.tar.bz2 /usr/src/trinity
  • Spostarsi nella directory /usr/src/trinity
cd /usr/src/trinity
  • Estrarre il contenuto dell'archivio utilizzando il comando tar:
tar -jxf tde_build_tree_sg-14.0.1-2.tar.bz2

La directory /usr/src/trinity verrà così popolata:

  ls -la
  total 14
  drwxr-xr-x   7 root root 1024 Sep 14 19:52 .
  drwxr-xr-x   5 root root 1024 Sep 14 19:52 ..
  -rw-r--r--   1 root root  314 Sep 14 14:53 TDE.options
  drwxr-xr-x 113 root root 7168 Sep 14 17:40 application
  drwxr-xr-x  22 root root 1024 Jan  1  1970 base
  drwxr-xr-x  13 root root 1024 Jan  1  1970 library
  drwxr-xr-x  16 root root 1024 Jan  1  1970 prerequisite
  drwxr-xr-x   4 root root 1024 Jan  1  1970 tde_build_script
  • Smistare gli archivi contenenti il codice sorgente per i pacchetti nelle omonime directory contenute in base, library e prerequisite. Il file TDE.options, di cui viene fornito un esempio, contiene le opzioni di compilazione per l'intero ambiente:
   # Global options used to build TDE.
   #
   # Do not place here package specific options. Use a file named
   # "local.options" in the build root directory of the package
   # instead.
   
   ARCH="arm"
   ARCHIVE_FORMAT="tar.bz2"
   BUILD="1"
   JOB_NUM="-j6"
   MARCH="arm"
   PREFIX="/opt/trinity"
   SRCVER="R14.0.1"
   TAG="sg"
   TAR_OPTION="-xjvf"
  • Aprire il file con un qualsiasi programma di elaborazione di testo ed impostare i valori desiderati per le variabili contenute. Le variabili che dovrebbero essere popolate con riguardo all'architettura e alle preferenze personali sono:
    • ARCH e MARCH che impostano l'architettura per cui si desideri compilare i pacchetti: arm nel caso del Raspberry Pi 2.
    • BUILD che dovrebbe essere incrementato ogni volta che si apporta una modifica alla procedura.
    • JOB_NUM che specifica il livello di parallelismo utilizzato per compilare i pacchetti.
    • PREFIX che impone la directory di installazione di TDE. Impostare /opt/trinity consente la convivenza di TDE e KDE 4.
    • SRCVER è la versione di TDE che si desidera compilare.
    • TAG è l'identificatore di chi esegue la compilazione. Impostare una stringa a piacere.
  • Spostarsi nella directory /usr/src/trinity/tde_build_script/bin e lanciare la procedura di generazione dei pacchetti:
cd /usr/src/trinity/tde_build_script/bin
sh ./TDE.SlackBuild

Lo script si farà autonomamente carico di compilare ogni pacchetto e di installarlo. I pacchetti generati ed i relativi file di log potranno essere reperiti nella directory /tmp.

Una nota a parte merita il pacchetto tde-i18n contenente i file di localizzazione in tutte le lingue supportate da TDE. Lo script principale contiene le istruzioni necessarie ad eseguirne la compilazione, ma l'operazione risulta essere molto onerosa in termini di tempo perciò le istruzioni sono commentate ed i pacchetti di localizzazione vengono ignorati. Se si desiderasse generare anche i file di localizzazione sarà necessario modificare lo script TDE.SlackBuild rimuovendo il commento dalla riga:

   #   bash ./${PKG}.SlackBuild

modificandola in

      bash ./${PKG}.SlackBuild

Tempistiche

Per capire quanto il livello di parallelismo incida sulla tempistica di compilazione dell'intero ambiente sono riportati alcuni dati relative alla generazione dei pacchetti inerenti Trinity Desktop Environment su Rasperry Pi 2. I dati coprono la tempistica relativa alla compilazione dei prerequisiti, dell'ambiente completo con l'esclusione dei pacchetti di localizzazione e, infine, delle librerie opzionali. Non sono state prese in considerazione le applicazioni a corredo di TDE. Personalmente non uso quasi nessuna di tali applicazioni e l'ambiente funziona perfettamente anche senza. L'operazione di compilazione con un livello di parallelismo pari a 1 in totale ha richiesto 47 ore. Impostando un parallelismo pari a 6 invece la tempistica è scesa sotto le 20 ore con un notevole risparmio di tempo.


Conclusioni

Nel corso del presente articolo è stato affrontato il tema dell'installazione di SlackwareARM e di Trinity Desktop Environment su un Raspberry Pi modello 2. L'operazione si è rivelata semplice e lineare e ha consentito di dotare il Raspberry Pi di un ambiente grafico completo, funzionale e leggero. In conclusione si riportano alcune immagini dell'ambiente desktop in funzione.

Desktop clean.jpeg

Fig: 1 - Come si presenta il desktop all'avvio di TDE.

Desktop krdc.jpeg

Fig: 2 - La schermata di avvio di KRDC programma che ha creato qualche problema compilando tdenetwork.

Desktop ksirtet.jpeg

Fig: 3 - Il mitico Ksirtet.

Desktop tdevelop.jpeg

Fig: 4 - TDevelop un IDE per sviluppatori integrato nell'ambiente desktop.


Per commenti, consigli, domande inviate una e-mail all'indirizzo studiosg [chiocciola] giustetti [punto] net.


Link esterni





Lingue: English - Italiano