Visualizzazione post con etichetta Tutorial. Mostra tutti i post
Visualizzazione post con etichetta Tutorial. Mostra tutti i post

giovedì 22 dicembre 2016

Iniziare a programmare con SDL 2 su Linux - parte 2


Nella prima parte di questo tutorial abbiamo visto come installare tutti gli strumenti di sviluppo e abbiamo creato il nostro primo programma sfruttando la libreria SDL 2. In questa seconda parte approfondiremo meglio l'utilizzo di g++ e valgrind, inoltre miglioreremo il nostro SDL Hello World.

Per tutti coloro che sono nuovi utenti del mondo Linux o che comunque non hanno esperienza nell'invocazione del compilatore g++ ho pensato di fare un po' di chiarezza sulla sintassi di questo comando.

La sintassi più semplice è
$ g++ [file sorgente]

L'eseguibile avrà il nome di default a.out.
Per specificare il nome dell'eseguibile basta aggiungere l'opzione -o [nome eseguibile], quindi
$ g++ [file sorgente] -o [nome eseguibile]

Se ci sono più file sorgenti basta elencarli
$ g++ [file sorgente 1] [file sorgente 2] -o [nome eseguibile]

Per finire, se dobbiamo utilizzare una libreria, come SDL 2 nel nostro caso, dobbiamo comunicarlo al linker tramite l'opzione -l (elle minuscola) seguita dal nome della libreria senza spazi.
$ g++ [file sorgenti] -o [nome eseguibile] -l[nome libreria]

Per la libreria SDL 2 scriveremo -lSDL2

Bene, questo è quanto abbiamo visto finora nella prima parte del tutorial, ma avrete notato che, quando la lista dei file sorgente aumenta, invocare g++ diventa decisamente scomodo.
Per semplificare il tutto possiamo utilizzare il comando make.

Il funzionamento di make è molto semplice, dobbiamo creare un file di testo dove forniremo tutte le informazioni necessarie per la compilazione, quali il compilatore da invocare, la lista dei file sorgente, le opzioni da passare al compilatore, ecc...
Una volta preparato il file chiamato Makefile, basterà invocare make e questo invocherà g++ per noi.
Questo è un esempio di Makefile per compilare il nostro SDL Hello World


Il contenuto del Makefile è abbastanza semplice da capire, man mano che aggiungiamo un file sorgente o un file header basterà aggiungerlo alla lista nel Makefile. Possiamo apportare tutte le modifiche che vogliamo nel Makefile e basterà invocare il comando make per compilare ed ottenere il file eseguibile.
Oltre a questo make si occupa di verificare se dall'ultima compilazione è cambiato qualcosa nei file sorgente, se nulla è cambiato ci verrà notificato.
Copiate ed incollate il testo in un file e salvatelo con il nome Makefile nella stessa directory dei file sorgente. Ora provate ad eseguire il comando
$ make

Decisamente più comodo, non è vero?



Passiamo ad un altro argomento: valgrind.
La scorsa volta avevamo installato valgrind in quanto ottimo strumento di debugging, in particolare per gli errori nella gestione delle allocazioni di memoria. La sintassi è semplice
$ valgrind ./[nome eseguibile]

L'eseguibile verrà avviato all'interno dell'ambiente di debugging di valgrind, il quale analizzerà tutte le allocazioni di memoria e le relative de-allocazioni delle stesse. Al termine del programma verrà stampato sul terminale un resoconto completo con un elenco degli eventuali errori rilevati.

Proviamolo con il nostro SDL Hello World
$ valgrind ./sdl_helloworld

L'esecuzione risulterà più lenta e alla fine avremo sul terminale un resoconto dettagliato.
Senza entrare troppo nei particolari, quello che ci interessa più di tutto il resto è l'ultima riga:
ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 6 from 2)

Nella sezione LEAK SUMMARY potete trovare altri dettagli sulle allocazioni di memoria.
E' ovvio che non è solo il vostro codice che viene analizzato, ma anche quello delle librerie utilizzate, quindi alcuni memory leaks possono essere causati da quest'ultime.

Bene, torniamo all'argomento principale di questo tutorial, SDL 2.
Nello scorso esempio abbiamo utilizzato la funzione SDL_loadBMP(), che carica un'immagine di tipo BMP (Windows bitmap) in un oggetto SDL_Surface.
Per quanto questa funzione sia molto comoda e semplice da utilizzare, il formato BMP è piuttosto limitato e scarsamente utilizzato al giorno d'oggi.
Nella libreria principale di SDL 2 non ci sono altre funzioni per caricare immagini di tipo diverse, quali ad esempio PNG o JPG, ma fortunatamente c'è un'altra libreria dedicata a questo scopo: SDL_image.

Prima cosa da fare è installare sul nostro sistema questa libreria.
$ su
(verrà richiesta la password di root)
# apt install libsdl2-image-dev



Ora che abbiamo installato SDL_image possiamo modificare il programma per aprire un'immagine di tipo PNG.

Aggiungiamo l'include con il file header di questa libreria in helloengine.h
#include <SDL2/SDL_image.h>

Come la libreria SDL 2 anche questa va inizializzata, quindi nella funzione init() della classe HelloEngine (helloengine.cc) aggiungiamo queste righe di codice per inizializzare SDL_image per il caricamento di immagini PNG, subito sotto l'inizializzazione di SDL 2.

// inizializzazione SDL_image per i file di tipo PNG
if ((IMG_Init(IMG_INIT_PNG) & IMG_INIT_PNG) != IMG_INIT_PNG)
{
    on_SDL_error(std::cout, "IMG_Init");
    return false;
}

Ora andiamo a modificare la parte di codice che carica l'immagine, è sempre nella funzione init() poco più in basso. Utilizzeremo la funzione IMG_LoadTexture() che ci restituisce direttamente un puntatore ad un oggetto di tipo SDL_Texture, quindi non avremo bisogno di crearla passando per un SDL_Surface.

// carica l'immagine in texture
std::string name = "helloworld.png";
if ((texture = IMG_LoadTexture(renderer, name.c_str())) == nullptr)
    on_SDL_error(std::cout, "IMG_LoadTexture");

Potete convertire l'immagine BMP in una di tipo PNG utilizzando Gimp e salvatela con il nome helloworld.png.

Prima di compilare ricordatevi che stiamo utilizzando un'altra libreria, quindi dovremo modificare il nostro Makefile aggiungendo -lSDL2_image alla lista delle librerie da linkare, subito dopo -lSDL2.

Terminate le modifiche questo è quello che dovreste ottenere
Compilate con
$ make

Ed ora avviate il programma
$ -/sdl_helloworld

Se non avete fatto errori il programma funzionerà come prima.
Bene, in questa seconda parte del tutorial dedicato ad SDL 2 abbiamo preso maggior confidenza con gli strumenti di sviluppo e debugging, inoltre abbiamo visto come usare la libreria SDL_image.
Nel prossimo tutorial faremo ulteriori modifiche e vedremo come funziona la gestione degli eventi.

mercoledì 14 dicembre 2016

QEMU - Emulatore e gestore di macchine virtuali su Linux

Prima di iniziare ad utilizzare QEMU su Linux facciamo un po di chiarezza sulla differenza tra un emulatore ed una macchina virtuale.

Il primo ha lo scopo di emulare l'hardware di una macchina (che può essere totalmente differente dal sistema emulante, o sistema host) al fine di eseguire il software originariamente scritto per girare sul sistema emulato. Ad esempio, sul nostro PC con processore x86 potremmo emulare una macchina con processore POWER o ARM. Sono molto popolari anche gli emulatori di console e vecchi computer degli anni 80 che ci permettono di giocare ai vecchi classici di un tempo, come ad esempio il MAME (Multiple Arcade Machine Emulator).

Una macchina virtuale invece ci permette di creare una macchina all'interno di un'altra, sulla quale potremmo installare un sistema operativo che rimarrà in un ambiente “protetto” e separato dal sistema ospitante. Una macchina virtuale pura non emula un hardware differente da quello in cui gira, ma si limita a replicarlo.

Ci sono diversi software di virtualizzazione piuttosto conosciuti quali VirtualBox (ora di Oracle) e soluzioni commerciali quali WMware Workstation Player o Pro.

Preferendo utilizzare un software libero ed open source abbiamo QEMU che ci permette sia di emulare un hardware differente da quello host, sia di creare una macchina virtuale sulla quale poter installare un secondo sistema operativo.
Un grande vantaggio di QEMU è la possibilità di utilizzare KVM (Kernel Virtual Machine), un modulo del kernel Linux che permette di ottenere prestazioni migliori grazie allo sfruttamento delle funzioni di virtualizzazione hardware offerte dai processori che li supportano.

In questa breve guida introduttiva utilizzerò un sistema basato su processore x86 64 bit con sistema operativo Debian GNU/Linux 8.6.

Iniziamo con l'installazione del software:

$ su
Per iniziare una sessione come utente amministratore root, vi verrà richiesta la password di root.

# apt update

# apt upgrade
Per aggiornare il sistema.

# apt install qemu
Installerà tutti i pacchetti necessari per l'utilizzo di QEMU.

# exit
Per tornare a lavorare con il vostro id utente e non più come root.

Prima cosa da fare è creare un'immagine disco virtuale che verrà utilizzata da QEMU come fosse un hard disk, a questo scopo utilizziamo il comando qemu-img.

$ qemu-img create virtualhd.img 20G
Questo comando crea un file di immagine disco chiamato virtualhd.img della grandezza di 20 Gb.
Per ottenere ulteriori informazioni sulla sintassi di qemu-img potete invocare l'aiuto veloce con il seguente comando:
$ qemu-img –help

A questo punto abbiamo un'immagine disco vuota dove poter installare il nostro sistema operativo, ora andremo ad utilizzare un file .iso del primo CD di installazione di Debian per sperimentare il funzionamento di QEMU. Se preferite potete ovviamente utilizzare un sistema operativo differente.
In questo caso non voglio emulare una macchina diversa da quella ospitante, quindi utilizzerò il comando dedicato ai sistemi x86 64 bit.

$ qemu-system-x86_64 -cdrom debian-8.6.0-amd64-CD-1.iso -drive file=virtualhd.img -m size=2048 -enable-kvm

qemu-system-x86_64 è il comando che invoca l'utilizzo di una macchina virtuale x86 64 bit.
-cdrom è l'opzione che indica quali immagine disco è da considerarsi come CD virtuale, in questo caso abbiamo indicato debian-8.6.0-amd64-CD-1.iso come file di immagine.
-drive invece indica il file da considerare come hard disk virtuale, utilizzeremo quello appena creato virtualhd.img.
-m è l'opzione che indica la quantità di memoria da utilizzare sulla nostra macchina virtuale, size=2048 assegna 2 Gb di RAM.
-enable-kvm per finire attiva l'utilizzo del modulo kernel KVM.
Anche con questo comando potete accedere alla guida sulla sintassi e le tante opzioni disponibili con il solito –help.

Non appena avrete eseguito questo comando si aprirà una finestra che visualizzerà lo schermo della macchina virtuale in esecuzione e potrete procedere all'installazione del sistema operativo.
Il sistema ospite sarà eseguito in modo indipendente dal sistema ospitante e qualsiasi operazione su disco sarà in realtà eseguita sul file immagine del disco virtuale, sarete quindi liberi di sperimentare senza rischiare di danneggiare il vostro sistema principale.

Avvio del disco di installazione di Debian 8.6

Avvio della macchina virtuale dopo l'installazione del sistema, menù di GRUB

Debian 8.6 in funzione sulla macchina virtuale


domenica 7 agosto 2016

Password dimenticata: come reimpostare la password in Debian 8 GNU/Linux


Può succedere di dimenticare la password utente o quella di root (o entrambe) di un sistema che utilizziamo poco, vediamo un modo rapido per resettare le password.

Avviate il computer e attendete che compaia il menu di GRUB 2.

Utilizzando i tasti cursore su/giu selezionate la voce per avviare il sistema e premete il tasto 'e' per accedere alla modalità di modifica.

Sempre con i tasti freccia muovete il cursore alla fine della riga di avvio del kernel e aggiungete la voce “init=/bin/bash” in modo simile a quanto potete vedere nell'immagine.

modalità modifica in GRUB 2


A questo punto premete la combinazione di tasti Ctrl + x per avviare il sistema.

Alla fine della procedura di boot, invece di vedere la classica interfaccia grafica per il login, vi troverete nel terminale con accesso come root.

Il filesystem del sistema risulterà montato in modalità di sola lettura, dovrete abilitare la scrittura sul disco per poter modificare le password.
Digitate il comando:

mount -w -o remount /

Non vi resta che modificare la password di root digitando il comando:

passwd

Vi verrà chiesto di inserire due volte la nuova password.

Potrete anche modificare la password utente con lo stesso comando aggiungendo il proprio nome utente:

passwd nome_utente

Anche in questo caso dovrete reinserire la nuova password due volte.

Ora che avete ripristinato le password spegnete il computer e riavviate normalmente, ora avete di nuovo accesso completo al vostro sistema.

giovedì 19 novembre 2015

Come collegarsi alla rete Wi-Fi dal terminale


Di solito il computer si collega automaticamente alla rete Wi-Fi senza bisogno del nostro intervento, altre volte invece bastano pochi click per farlo. Può capitare però di trovarci di fronte al terminale e non avere alcuna interfaccia grafica per collegare il nostro computer alla rete Wi-Fi, per esempio quando l'installazione dei driver grafici non è andata a buon fine.
In questa breve guida vi mostrerò come collegarci dalla riga di comando.

Durante la guida darò per scontato che abbiate effettuato il login come root o che prima di procedere abbiate eseguito il comando su per eseguire i comandi come super utente. Altrimenti potete sempre anteporre la parola sudo ad ogni comando.

Trovare la scheda Wi-Fi installata


Prima cosa da fare bisognerà trovare la scheda Wi-Fi installata sul nostro computer, useremo il comando iw

> iw dev

Produrrà un output simile a questo

phy#0
Interface wlan0
ifindex 3
wdev 0x1
addr 9c:d2:1e:61:a6:86
type managed
channel 6 (2437 MHz), width: 20 MHz, center1: 2437 Mhz

Nel mio caso ho una scheda di rete Wi-Fi chiamata wlan0

Visualizzare lo stato della scheda Wi-Fi


Ora possiamo controllare lo stato della scheda con il seguente comando

> ip link show wlan0

Otterremo un risultato simile a questo

3: wlan0: <BROADCAST,MULTICAST> mtu 1500 qdisc mq state DOWN mode DEFAULT group default qlen 1000
link/ether 9c:d2:1e:61:a6:86 brd ff:ff:ff:ff:ff:ff

Come potete intuire dalla parola DOWN lo stato della Wi-Fi è spenta.

Accendere la scheda di rete Wi-Fi


Per attivare la scheda Wi-Fi procediamo con

> ip link set wlan0 up

Controlliamo di nuovo lo stato

> ip link show wlan0

Questa volta il risultato dovrebbe essere questo

3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DORMANT group default qlen 1000
link/ether 9c:d2:1e:61:a6:86 brd ff:ff:ff:ff:ff:ff

Notate come questa volta lo stato è UP

Controllare lo stato della connessione


Ora che la scheda Wi-Fi è attiva, controlliamo lo stato della connessione

> iw wlan0 link

il risultato sarà

Not connected.
Non siamo connessi.

Cercare le reti disponibili


Ora cerchiamo le reti Wi-Fi disponibili

> iw wlan0 scan

Otterremo una lunga lista di informazioni per ogni rete trovata come questa


BSS 9c:d3:6d:b4:a4:10(on wlan0) -- associated
TSF: 914250503275 usec (10d, 13:57:30)
freq: 2437
beacon interval: 100 TUs
capability: ESS Privacy ShortSlotTime (0x0411)
signal: -41.00 dBm
last seen: 172 ms ago
Information elements from Probe Response frame:
SSID: My_Network
Supported rates: 1.0* 2.0* 5.5 11.0 18.0 24.0 36.0 54.0
DS Parameter set: channel 6
ERP: Barker_Preamble_Mode
ERP D4.0: Barker_Preamble_Mode
RSN: * Version: 1
* Group cipher: CCMP
* Pairwise ciphers: CCMP
* Authentication suites: PSK
* Capabilities: 16-PTKSA-RC 1-GTKSA-RC (0x000c)
Extended supported rates: 6.0 9.0 12.0 48.0
HT capabilities:
Capabilities: 0x186c
HT20
SM Power Save disabled
RX HT20 SGI
RX HT40 SGI
No RX STBC
Max AMSDU length: 7935 bytes
DSSS/CCK HT40
Maximum RX AMPDU length 65535 bytes (exponent: 0x003)
Minimum RX AMPDU time spacing: 8 usec (0x06)
HT RX MCS rate indexes supported: 0-7
HT TX MCS rate indexes are undefined
HT operation:
* primary channel: 6
* secondary channel offset: no secondary
* STA channel width: 20 MHz
* RIFS: 1
* HT protection: no
* non-GF present: 1
* OBSS non-GF present: 0
* dual beacon: 0
* dual CTS protection: 0
* STBC beacon: 0
* L-SIG TXOP Prot: 0
* PCO active: 0
* PCO phase: 0
WPS: * Version: 1.0
* Wi-Fi Protected Setup State: 2 (Configured)
* Selected Registrar: 0x0
* Response Type: 3 (AP)
* UUID: 1620a1d7-a8d6-d819-4860-8a40e4e07abf
* Manufacturer: NETGEAR, Inc.
* Model: WNR1000v3
* Model Number: WNR1000v3
* Serial Number: 83258
* Primary Device Type: 6-0050f204-1
* Device name: WNR1000v3
* Config methods: Label, PBC
WMM: * Parameter version 1
* u-APSD
* BE: CW 15-1023, AIFSN 3
* BK: CW 15-1023, AIFSN 7
* VI: CW 7-15, AIFSN 2, TXOP 3008 usec
* VO: CW 3-7, AIFSN 2, TXOP 1504 usec

Le informazioni più importanti che ci occorrono sono il nome della rete ed il protocollo di sicurezza. Il nome della rete è quello che segue la parola SSID (Service Set Identifier), in questo caso è My_Network. Il protocollo di sicurezza è invece RSN, meglio conosciuto come WPA2.

Creare un file di configurazione WPA/WPA2


Per poterci collegare ad una rete Wi-Fi protetta da passphrase con protocollo WPA/WPA2 avremo bisogno di preparare un file di configurazione con questo comando:

> wpa_passphrase My_Network >> /etc/wpa_supplicant.conf

Subito dopo aver premuto invio dovremo digitare la passphrase per collegarci alla rete, quindi verrà creato il file di configurazione in /etc/wpa_supplicant.conf. Il file di configurazione così creato non andrà comunque a sostituire le configurazioni già esistenti.

Collegarsi alla rete Wi-Fi protetta da passphrase WPA/WPA2


Ora che abbiamo preparato tutto il necessario possiamo collegarci alla rete con

> wpa_supplicant -B -D wext -i wlan0 -c /etc/wpa_supplicant.conf

Controlliamo di nuovo lo stato della connessione 

> iw wlan0 link

 Questa volta ci dovrebbe mostrare la connessione avvenuta.

Connected to 9c:d3:6d:b4:a4:10 (on wlan0)
SSID: My_Network
freq: 2437
RX: 10476343 bytes (59172 packets)
TX: 743393 bytes (5687 packets)
signal: -49 dBm
tx bitrate: 65.0 MBit/s MCS 6 short GI

bss flags: short-slot-time
dtim period: 0
beacon int: 100

Ottenere un indirizzo IP dal DHCP


Possiamo ottenere un indirizzo IP con il comando

> dhclient wlan0

E verificare l'indirizzo IP con

> ip addr show wlan0

Otterrete qualcosa come questo

3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 9c:d2:1e:61:a6:86 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.5/24 brd 10.0.0.255 scope global dynamic wlan0
valid_lft 82996sec preferred_lft 82996sec
inet6 fe80::9ed2:1eff:fe61:a686/64 scope link
valid_lft forever preferred_lft forever

L'indirizzo IP è quello che segue la parola inet, in questo caso 10.0.0.5.

Testare la connessione


Per finire possiamo fare un test della connessione con il buon vecchio comando ping


Se il risultato è simile al seguente siete connessi

PING www.google.com (74.125.232.146) 56(84) bytes of data.
64 bytes from mil02s05-in-f18.1e100.net (74.125.232.146): icmp_seq=1 ttl=52 time=38.3 ms
64 bytes from mil02s05-in-f18.1e100.net (74.125.232.146): icmp_seq=2 ttl=52 time=37.9 ms
64 bytes from mil02s05-in-f18.1e100.net (74.125.232.146): icmp_seq=3 ttl=52 time=38.2 ms

Fermate l'esecuzione di ping con la combinazione di tasti Ctrl + c.

Il vostro sistema è online!





martedì 29 settembre 2015

Personalizzare il menù di GRUB 2 (Debian/Ubuntu e derivate): sistema operativo di default, immagine di sfondo e colore del testo


GRUB 2 è il bootloader di GNU, cioè quel programma che, all'avvio del computer, si occupa di caricare in memoria il kernel del sistema operativo.
Dopo aver installato la nostra distribuzione GNU/Linux preferita, all'avvio del PC, verrà visualizzato il menù di GRUB 2, dove potremo scegliere, tra le altre opzioni, quale sistema operativo caricare.
Vediamo quali modifiche possiamo apportare alla configurazione di GRUB 2 per adattarlo alle nostre necessità.

Questa guida è scritta in modo specifico per distribuzioni GNU/Linux Debian e derivate come Ubuntu e Mint. I concetti di base sono comunque validi anche su altre distribuzioni GNU/Linux.



Scelta del sistema operativo da avviare

Il comportamento di default di GRUB 2 è quello di attendere alcuni secondi la scelta dell'utente prima di avviare automaticamente il sistema operativo che ha installato GRUB 2 (in un PC con dual-boot Windows e GNU/Linux, quest'ultimo sarà avviato di default salvo scelta differente da parte dell'utente).

1) Cambiare il sistema operativo di default

Nel caso preferissimo avviare di default un altro sistema operativo basterà apportare la seguente modifica:

Avviate il terminale e portatevi sulla directory /etc/default con il comando cd

> cd /etc/default

Ora andremo a modificare il file grub contenuto in questa cartella (in questa guida userò il text editor nano, ma se preferite potrete utilizzarne un altro a piacimento).

> sudo nano grub

Verrà visualizzato un file di testo come il seguente:

# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.
# For full documentation of the options in this file, see:
# info -f grub -n 'Simple configuration'

GRUB_DEFAULT=0
#GRUB_HIDDEN_TIMEOUT=0
GRUB_HIDDEN_TIMEOUT_QUIET=true
GRUB_TIMEOUT=10
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""

# Uncomment to enable BadRAM filtering, modify to suit your needs
# This works with Linux (no patch required) and with any kernel that obtains
# the memory map information from GRUB (GNU Mach, kernel of FreeBSD ...)
#GRUB_BADRAM="0x01234567,0xfefefefe,0x89abcdef,0xefefefef"

# Uncomment to disable graphical terminal (grub-pc only)
#GRUB_TERMINAL=console

# The resolution used on graphical terminal
# note that you can use only modes which your graphic card supports via VBE
# you can see them in real GRUB with the command `vbeinfo'
#GRUB_GFXMODE=640x480

# Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux
#GRUB_DISABLE_LINUX_UUID=true

# Uncomment to disable generation of recovery mode menu entries
#GRUB_DISABLE_RECOVERY="true"

# Uncomment to get a beep at grub start
#GRUB_INIT_TUNE="480 440 1"

La righe che iniziano con il carattere # sono considerate commenti e quindi ignorate. Il sistema operativo di default è indicato dall'opzione GRUB_DEFAULT che di solito è impostato al valore 0, cioè il primo sistema indicato sulla lista di GRUB 2. Sostituendo 0 con un altro numero potremmo scegliere il sistema di default (0 il primo nella lista, 1 il secondo, 2 il terzo e così via).

Ora salvate le modifiche ed uscite dal text editor (se state utilizzando nano salvate con la combinazione di tasti Ctrl-O, confermando il nome del file premendo Invio. Quindi uscite con Ctrl-X).

Ora da terminale aggiornate la configurazione di GRUB2 eseguendo il seguente script:

> sudo update-grub

Ricordatevi che le sole modifiche al file grub non hanno alcun effetto sulla configurazione di GRUB2 se non eseguite lo script di aggiornamento. Ora potete riavviare e testare le modifiche apportate.

2) Avvio di default del sistema operativo utilizzato precedentemente

Questa opzione è quella che reputo più comoda, è particolarmente utile quando dobbiamo riavviare un sistema, come ad esempio a seguito di un aggiornamento del kernel.

Andiamo ancora a modificare il file grub in /etc/default. Per attivare questa opzione dovremmo aggiungere una riga prima di GRUB_DEFAULT ed inserire quanto seguente:

GRUB_SAVEDEFAULT=true

Questa opzione attiva il salvataggio dell'ultima scelta fatta. Ora modifichiamo la riga sottostante per scegliere come sistema di default quello salvato.

GRUB_DEFAULT=saved

Come prima salviamo il file ed aggiorniamo GRUB 2 eseguendo il solito script.

> sudo update-grub

Modificare l'aspetto del menu di GRUB 2

Una cosa comune alla maggior parte degli utenti GNU/Linux è la voglia di personalizzazione del proprio sistema, a partire dalla prima cosa che viene visualizzata dopo aver acceso il computer: il menu di GRUB 2.

1) Aggiungere un'immagine di sfondo al menu

Per avere un'immagine di sfondo basterà aggiungere questa opzione al solito file grub in /etc/default

GRUB_BACKGROUND="percorso del file immagine"

GRUB 2 supporta l'uso di immagini in formato PNG, JPG/JPEG e TGA. Scegliete accuratamente un'immagine della giusta risoluzione e fate in modo che sia salvata in uno dei formati supportati.

Ora la domanda è dove mettere l'immagine da utilizzare con GRUB 2?

Io ho l'abitudine di metterla in /usr/share/images/grub. Andate in /usr/share con il comando

> cd /usr/share

Ora visualizzate il contenuto per controllare se c'è una directory chimata images, se non c'è potrete crearla con il seguente comando

> sudo mkdir images

Ora andate all'interno della directory images

> cd images

Create la directory grub al suo interno

> sudo mkdir grub

Ora abbiamo una cartella dedicata a contenere le immagini destinate a GRUB 2. Copiate l'immagine che volete utilizzare con il comando cp. Per farlo andate nella directory dove avete l'immagine con il comando cd (per tornare alla propria home directory potete usare il comando cd senza indicare alcun percorso), quindi digitate

> sudo cp nome immagine /usr/share/images/grub/nome immagine

Se per esempio la vostra immagine si chiama splash.png scriverete

> sudo cp splash.png /usr/share/images/grub/splash.png

Ora andiamo a modificare il solito file grub in /etc/default per indicare il percorso completo dell'immagine nell'opzione GRUB_BACKGROUND, se per esempio l'immagine si chiama splash.png scriverete quanto segue

GRUB_BACKGROUND=”/usr/share/images/grub/splash.png”

Salvate e uscite dal text editor, quindi ricordatevi di aggiornare GRUB 2 con il solito script

> sudo update-grub

Ora riavviate ed ammirate il nuovo look.

2) Cambiare i colori del testo del menu

Potrebbe essere necessario cambiare i colori del testo del menu di GRUB 2 per migliorarne la leggibilità dopo aver aggiunto un'immagine di sfondo, o semplicemente perché vogliamo personalizzare anche questi.

Per cambiare i colori del testo dobbiamo modificare il file 05_debian_theme che si trova in /etc/grub.d

> cd /etc/grub.d

> sudo nano 05_debian_theme

Questo file di testo è molto lungo ed apparentemente abbastanza complesso. Dovete scorrere il file lentamente e trovare le seguenti righe:

if [ -z "${2}" ] && [ -z "${3}" ]; then
     echo " true"
fi

I colori che vogliamo modificare sono i seguenti:
  • - menu_color_highlight = sono i colori del testo evidenziato e del suo sfondo all'interno del box contenente il menù
  • - menu_color_normal = sono i colori del testo non evidenziato e del suo sfondo all'interno del box contenente il menù
  • - menu_color = sono i colori del testo e del suo sfondo al di fuori del box contenente il menù

La sintassi della scelta del colore è la seguente:

menu_color=colore_testo/colore_sfondo

E questi sono i colori accettati da GRUB2:
  • black
  • blue
  • brown
  • cyan
  • dark-gray
  • green
  • light-cyan
  • light-blue
  • light-green
  • light-gray
  • light-magenta
  • light-red
  • magenta
  • red
  • white
  • yellow

Ora modifichiamo le righe trovate precedentemente come segue:

if [ -z "${2}" ] && [ -z "${3}" ]; then
     #echo " true"
     echo " set color_highlight=red/green"
     echo " set color_normal=light-cyan/black"
fi

Abbiamo aggiunto il carattere # davanti alla riga echo “ true” per farla diventare un commento ed abbiamo aggiunto due righe con la scelta dei colori del testo evidenziato e non, all'interno del box contenente il menù.

Modificate a piacimento i colori, ma fate attenzione a non modificare il colore di sfondo di color_normal. Infatti se il colore di sfondo è impostato come black, questo sarà trasparente e lascerà vedere l'immagine sottostante, se lo modificate con un altro colore allora non sarà trasparente ed il risultato finale non sarà gradevole.

Al termine della modifica salvate il file e ricordate sempre di aggiornare la configurazione con lo script update-grub.

Riavviate e controllate che il look finale sia leggibile e di vostro gradimento.

mercoledì 11 settembre 2013

Raspberry Pi - come impostare un numero IP statico

In questa guida spiegherò come impostare un indirizzo IP statico sul vostro Raspberry Pi, prima di iniziare la procedura pratica vorrei illustrare un po di teoria.
Un indirizzo IP serve ad identificare un dispositivo collegato in rete, generalmente il vostro router assegna dinamicamente un indirizzo IP ad ogni nuovo dispositivo collegato. Se abbiamo un computer collegato alla rete casalinga e lo scolleghiamo, il suo indirizzo IP viene liberato e lo stesso potrebbe essere assegnato ad un altro nuovo dispositivo che dovesse collegarsi successivamente. La stessa cosa avviene per il vostro Raspberry Pi, il quale ad ogni riavvio potrebbe avere un indirizzo IP differente.
Avere un IP dinamico risulta quindi decisamente scomodo quando vogliamo accedere in remoto al nostro Raspberry Pi, infatti ogni volta dovremmo essere a conoscenza del suo indirizzo IP. Questo vale sia per accedere al nostro hard disk condiviso tramite Samba, sia per accedere a Transmission-daemon o aMule-daemon e ancora se vogliamo accedere tramite SSH.
Impostare un IP statico farà in modo che, all'avvio, il Raspberry Pi otterrà sempre lo stesso indirizzo IP e di conseguenza sapremo sempre a quale indirizzo trovarlo.
Detto questo effettuiamo il login ed iniziamo a conoscere come vedere quale indirizzo IP ha attualmente il Raspberry Pi con il seguente comando:

sudo ifconfig

Questo comando visualizza molte informazioni riguardanti la connessione di rete, in particolare quelle della sezione denominata eth0 riguardano la connessione via cavo ethernet, wlan0 invece riguarda la connessione Wi-Fi.
Le informazioni che ci saranno utili sono l'indirizzo IP, descritto come "indirizzo inet:" e il numero della "Maschera". Un indirizzo IP è formato da quattro serie di numeri separati da un punto, anche la maschera ha un formato simile e di solito è 255.255.255.0, ma non sempre.

Un'altra informazione necessaria è l'indirizzo IP del nostro router, possiamo trovarla con il seguente comando:

route

Anche in questo caso verranno visualizzate diverse informazioni, il valore che vi interessa lo troverete nella riga che inizia con "default", sotto la colonna Gateway.
Nella riga subito sotto invece, sotto la colonna Genmask, troverete il valore della maschera che dovrebbe essere la stessa di quella trovata con ifconfig.

Ora che abbiamo ottenute tutte le informazioni possiamo andare a modificare il file interfaces che si trova in /etc/network/, quindi scriviamo:

cd /etc/network

Facciamo una copia di sicurezza di interfaces in modo da poterlo ripristinare in qualsiasi momento.

sudo cp interfaces interfaces.backup

Ora apriamo interfaces con l'editor di testo nano:

sudo nano interfaces

Il file di default dovrebbe essere come questo:

auto lo

iface lo inet loopback
iface eth0 inet dhcp

allow-hotplug wlan0
iface wlan0 inet manual
wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp

Prima cosa da fare è aggiungere il carattere # all'inizio della riga "iface eth0 inet dhcp", questo la farà diventare un commento e verrà ignorata.
Quindi subito sotto aggiungiamo le seguenti righe:

auto eth0
iface eth0 inet static

Di seguito aggiungiamo nell'ordine l'indirizzo IP del Raspberry Pi, l'indirizzo del router ed infine la maschera, come segue:

address [indirizzo_IP_del_Raspberry_PI]
gateway [indirizzo_IP_del_router]
netmask [numero_della_maschera]

Alla fine il vostro file dovrebbe somigliare a questo:

auto lo

iface lo inet loopback
#iface eth0 inet dhcp
auto eth0
iface eth0 inet static

address 11.96.182.58
gateway 11.96.172.1
netmask 255.255.255.0

allow-hotplug wlan0
iface wlan0 inet manual
wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp

Salviamo premendo i tasti Ctrl + o, premiamo il tasto Invio per confermare il nome del file, quindi usciamo dall'editor con Ctrl + x.
Ora riavviamo il Raspberry Pi scrivendo

sudo reboot

Se non avete fatto errori ora l'indirizzo IP sarà quello da voi impostato.
Verifichiamo se la connessione ad internet funziona provando con il comando ping sul sito di Google o qualunque altro indirizzo valido.

ping www.google.com

Il risultato deve essere qualcosa del genere:

PING www.google.com (173.194.40.20) 56(84) bytes of data.
64 bytes from mil02s06-in-f20.1e100.net (173.194.40.20): icmp_req=1 ttl=51 time=264 ms
64 bytes from mil02s06-in-f20.1e100.net (173.194.40.20): icmp_req=3 ttl=51 time=267 ms
64 bytes from mil02s06-in-f20.1e100.net (173.194.40.20): icmp_req=4 ttl=51 time=232 ms
64 bytes from mil02s06-in-f20.1e100.net (173.194.40.20): icmp_req=5 ttl=51 time=237 ms

Fermatelo premendo Ctrl + c.
Avete finito, il vostro Raspberry Pi ora ha l'indirizzo IP statico e saprete sempre come collegarvi in remoto.

sabato 24 agosto 2013

Raspberry Pi - come installare e configurare aMule-daemon

Nel precedente post vi ho guidati nell'installazione e configurazione di Transmission-daemon sul Raspberry Pi, vediamo adesso come installare aMule-daemon, il client peer-to-peer per le reti di scambio file eDonkey e Kademlia. Come Transmission-daemon anche aMule-daemon lavora in background e si potrà controllare in remoto da un computer o altro dispositivo collegato alla rete.

aMule - il client peer-to-peer per le reti eDonkey e Kademlia


Prima di iniziare la procedura di installazione assicuratevi di aver collegato e configurato correttamente un disco esterno tramite porta USB, se non lo avete già fatto fatelo ora (qui troverete come farlo).
A questo punto poniamo il caso che il vostro disco sia montato in /mnt/nas.
Prima di installare aMule-daemon aggiorniamo la lista dei pacchetti del repository con

> sudo apt-get update

quindi installiamo con

> sudo apt-get install amule-daemon amule-utils amule-utils-gui

aMule avrà bisogno di 2 cartelle, una dove mettere i file completati ed una dove mettere i file temporanei.
Se non abbiamo già due cartelle adatte allo scopo sul nostro disco esterno possiamo crearle adesso.

> mkdir /mnt/nas/incoming

> mkdir /mnt/nas/temp

Ora avvieremo per la prima volta aMule in modo che questo crei i file di configurazione, otterremo un messaggio d'errore, ma ignoratelo, è normale che succeda.

> amuled

I file di configurazione verranno messi in una cartella nascosta nella nostra home, il suo nome è .aMule. Le cartelle che hanno il nome che inizia con un punto sono nascoste, ma potete vederle aggiungendo l'opzione -a al comando ls, così

> ls -a

Ora impostiamo un password per aMule invocando il comando:

> amuled -e

Ci verrà chiesto di inserire la password.

Se per qualche strano motivo non riuscite ad impostare la password con il comando amuled -e, allora potrete inserirla manualmente nel file di configurazione in questo modo:
Inserite il sequente comando inserendo la password da voi scelta al posto di password.

> echo -n "password" | md5sum | awk '{print $1}'

Verrà visualizzato sul terminale una serie di lettere e numeri apparentemente senza senso, in realtà quella è la vostra password criptata in md5.

Copiatela ed aprite il file di configurazione per inserire la password con

> nano .aMule/amule.conf

amule.conf è un file piuttosto lungo, ad ogni riga corrisponde un'impostazione. Per rendere più ordinata questa lunga lista di opzioni, è stata suddivisa in sezioni contrassegnate da un nome posto tra parentesi quadre.

Cercate la sezione [ExternalConnect] ed inserite la password criptata alla voce ECPassword. Poche righe sotto cercate la sezione[WebServer] ed inserite di nuovo la password criptata alla voce Password.

Ora che la password è inserita, continuiamo con la modifica del file di configurazione. Se non lo avete già aperto per inserire la password manualmente apritelo adesso con il comando

> nano .aMule/amule.conf


Nella sezione [eMule] andate alla riga che inizia con TempDir ed inserite l'indirizzo della cartella per i file temporanei:

TempDir=/mnt/nas/temp

Poi trovate la riga con IncomingDir ed inserite l'indirizzo della cartella per i file completati:

IncomingDir=/mnt/nas/incoming

Per default l'indirizzo di queste due cartelle è dentro la cartella .aMule, questo vorrebbe dire utilizzare la scheda SD per scaricare i nostri file! Per questo motivo le modifichiamo inserendo gli indirizzi delle cartelle sull'HD esterno.

Se il vostro provider internet è Fastweb sarebbe preferibile impostare le URL dei nodi Kad e dei server ed2k. Potete farlo trovando le righe che iniziano rispettivamente con KadNodesUrl e Ed2kServersUrl, modificandole come segue:

KadNodesUrl=http://www.adunanza.net/files/emule/adu_nodes.dat
Ed2kServersUrl=http://update.adunanza.net/servers.met

Ora andate a cercare la sezione [ExternalConnect] ed assicuratevi che la riga AcceptExternalConnections sia impostata ad 1 come segue:

AcceptExternalConnections=1

Questo rende attivo il collegamento in remoto al demone.
Per finire, nella sezione [WebServer] modifichiamo questa riga come segue:

Enabled=1

Questa attiva il server web o meglio una pagina web che permette il controllo del programma.
Possiamo salvare le modifiche premendo i tasti Ctrl + o, premiamo il tasto Invio per confermare il nome del file, quindi usciamo dall'editor con Ctrl + x.
Ora sarà necessario modificare un altro file per permettere allo script di avvio del demone di funzionare correttamente.

> sudo nano /etc/default/amule-daemon

Nella riga AMULED_USER inserite il vostro nome utente

AMULED_USER="nome_utente"

Salvate e uscite dall'editor con i soliti Ctrl + o, Invio e Ctrl + x.
La configurazione è completata, ora potete avviare aMule-daemon con il comando

amuled -f

l'opzione -f forza l'avvio in background, in questo modo potrete chiudere il terminale e lasciarlo lavorare.

Accedere ad aMule-daemon in remoto da un altro computer

Per poter accedere in remoto e controllare aMule abbiamo due possibilità, la prima è quella di utilizzare l'apposita pagina web creata dal web server di aMule-daemon, la seconda è quella di installare l'interfaccia grafica del programma sul computer che vogliamo utilizzare per controllarlo.

Utilizzare la pagina web è la cosa più semplice ed immediata, senza contare il vantaggio di poter utilizzare qualsiasi tipo di device per controllare il demone, l'importante è che abbia un browser internet.
Per accedere alla pagina web di aMule-daemon dovete inserire nel browser l'indirizzo IP del Raspberry Pi seguito dal carattere : (due punti) ed il numero della porta che di default è 4711. Sarà qualcosa del genere:

172.16.254.1:4711

Vi comparirà una pagina con la richiesta di inserire la password, digitate la password che avete usato per aMule e accederete alla pagina di controllo del demone.

la pagina di aMule vi chiede la password per l'accesso


Per collegarvi in remoto dal vostro computer desktop è possibile installare ed utilizzare l'interfaccia grafica aMuleGUI. Il vantaggio di utilizzare l'interfaccia grafica è quello di avere un controllo completo del programma, come se fosse installato sul vostro computer. Se utilizzate Ubuntu potete installarlo utilizzando Ubuntu Software Center cercando aMuleGUI, per altri sistemi derivati da Debian potete installarlo da Terminale con il comando

sudo apt-get install amule-utils-gui

Per altre distribuzioni GNU/Linux utilizzate i comandi destinati all'installazione dei pacchetti.
L'utilizzo di aMuleGUI è molto simile a quello del programma aMule, appena avviato vi comparirà una finestra con i dati relativi alla connessione in remoto.

Parametri di connessione in remoto ad aMule-daemon


Nel campo "Connetti a" inserite l'indirizzo IP del vostro Raspberry Pi, nel campo successivo inserite il numero della porta che di default è 4712. Per finire inserite la password che avete utilizzato per aMule e fate un click sul tasto Connetti.

Buon utilizzo!