GNU e il software libero

I programmi che scrivo e che pubblico su questo sito, i codici che presento o le risorse a cui faccio riferimento cercano di essere il più possibile attinenti alla filosofia del progetto GNU. Basti notare, infatti, come nell’ambito della programmazione in Gambas sia nato qualche fork del mio programma Parlas. Questo ovviamente non sarebbe stato possibile se il mio software non fosse stato libero.

Ma cos’è il progetto GNU e cosa significa Software Libero? Traggo la descrizione direttamente dal sito ufficiale:

Il Progetto GNU è stato lanciato nel 1984 per sviluppare un sistema operativo Unix-compatibile completo che fosse software libero: il sistema GNU.

Il kernel di GNU non è ancora stato completato, quindi GNU è usato con il kernel Linux. La combinazione di GNU e Linux è il sistema operativo GNU/Linux, ora usato da milioni di persone.

Talvolta tale combinazione è chiamata impropriamente Linux. Ci sono molte varianti, o “distribuzioni”, di GNU/Linux.

Noi consigliamo di usare quelle distribuzioni GNU/Linux che sono al 100% software libero; in altre parole, pienamente rispettose della libertà.

Il nome GNU è un acronimo ricorsivo per “GNU’s Not Unix” (GNU Non è Unix) e si pronuncia “gh-nu“ (con la g dura, una sola sillaba senza pause tra la g e la n).

Il “Software Libero” è una questione di libertà, non di prezzo. Per capire il concetto, bisognerebbe pensare alla “libertà di parola” e non alla “birra gratis”. (NdT: il termine “free” in inglese significa sia gratuito che libero).

L’espressione “Software Libero” si riferisce alla libertà dell’utente di eseguire, copiare, distribuire, studiare, cambiare e migliorare il software. Più precisamente, esso si riferisce a quattro tipi di libertà per gli utenti del software:

  • Libertà di eseguire il programma, per qualsiasi scopo (libertà 0).
  • Libertà di studiare come funziona il programma e adattarlo alle proprie necessità (libertà 1). L’accesso al codice sorgente ne è un prerequisito.
  • Libertà di ridistribuire copie in modo da aiutare il prossimo (libertà 2).
  • Libertà di migliorare il programma e distribuirne pubblicamente i miglioramenti, in modo tale che tutta la comunità ne tragga beneficio (libertà 3). L’accesso al codice sorgente ne è un prerequisito.

Password di root nei propri programmi


Ci sono volte in cui nello scrivere i propri programmi si ricorra ai comandi che GNU/Linux offre da riga di comando. Scegliere questo approccio semplifica la vita ai programmatori rendendo i programmi più leggeri e sfruttando appieno la più potente delle “armi” *nix: il terminale!

Si sa però (basta avere un minimo di dimestichezza con il mondo del pinguino) che ci sono dei comandi che possono essere eseguiti solo dall’amministratore del sistema che nei sistemi operativi GNU/Linux prende il nome di root. Quand si prova ad eseguire un comando da amministratore viene chiesta la password, ovvero la password di root. Come fare allora a restituire al sistema questa parola chiave in maniera sicura? Il primo problema che sorge infatti è la sicurezza. Trasmettere una parola così delicata in chiaro significherebbe compromettere quella sicurezza su cui il sistema operativo libero basa la sua diffusione. Ovviamente ci sarebbe la possibilità di criptare la parola digitata e poi decriptarla solo per permettere al comando del terminale di leggerla, ma questo renderebbe il programma alquanto complesso. Come fare allora?
Se si sta sviluppando un programma ad interfaccia grafica e si lavora su sistemi *buntu e derivate è possibile usare due ottimi strumenti gksudo e ksudo; entrambi svolgono lo stesso lavoro ma la differenza tra i due è che uno lavora in ambiente GNOME e l’altro in ambiente KDE. Essi vanno a sostituire il normale uso di sudo in modo che al momento di immettere la password di root si presenti una finestra che vada ad agevolare il lavoro di trasmissione della stessa al comando senza compromettere la normale sicurezza del sistema e quindi del nostro codice.

ESEMPIO

Immaginiamo di voler installare un normale software mediante terminale. Il comando sarebbe

sudo apt-get install programma

e il terminale ci mostrebbere la classica richiesta

[sudo] password for user:

Se invece sostuiamo il comando con

gksudo apt-get install programma

allora ci si presenta davanti una finestra nella quale immettere la parola chiave.

In questo modo si può con molta praticità eseguire comandi da root senza preoccuparsi di gestire la correttezza della sua password.

E’ da precisare che qualora il comando da eseguire con permessi di root prevede alcuni parametri contraddistinti dal segno – allora tale comando va chiuso tra apici.

ESEMPIO:

gksudo 'cat -h'

Qualora sappiate se questo metodo funziona anche con altri sistemi o conoscete per altre distro che svolgano lo stesso lavoro vi chiedo di segnalarmelo per poter completare il post.

Giocare coi codici: alfabeto farfallino.


Ci sono dei giochi appartenenti al nostro periodo infantile che per un motivo o per l’altro ci restano nella mente.
L’altro giorno mentre camminavo per strada e sentito alcune bambine esprimersi in una maniera al quanto strana; non ci ho messo molto per capire che parlavano tra loro in un particolare alfabeto detto farfallino.

Ascoltare le bambine mi ha fatto venire in mente un piccolo dubbio: è possibile creare un traduttore che mi permetta di passare dall’italiano al farfallino e dal farfallino all’italiano? Diciamo che il traduttore no l’ho creato ma mi sono preso la briga di creare due funzioni per passare da una a l’altra codifica. Ovviamente ho scelto Gambas come linguaggio per via della rapidità con la quale si può scrivere il codice.

Dopo varie prove sono arrivato alla stesura delle due funzioni che svolgessero il lavoro che avevo il bisogno che svolgesse. Il lavoro si è dimostrato molto più semplice di quanto pensassi e ora analizziamo il codice delle funzioni.

DA ITALIANO A FARFALLINO

PUBLIC FUNCTION farfallino(parola AS String) AS String

DIM temp_st AS String
DIM ritorno_st AS String

temp_st = parola

ritorno_st = Replace(temp_st, "a", "afa")
temp_st = ritorno_st

ritorno_st = Replace(temp_st, "e", "efe")
temp_st = ritorno_st

ritorno_st = Replace(temp_st, "i", "ifi")
temp_st = ritorno_st

ritorno_st = Replace(temp_st, "o", "ofo")
temp_st = ritorno_st

ritorno_st = Replace(temp_st, "u", "ufu")

RETURN ritorno_st

END

Come si può vedere il codice è molto semplice e si basa sulla sostituzione delle vocali con l’equivalente struttura farfallina. La funzione infatti accetta una parola come argomento e restituisce una stringa. La parola viene copiata in una variabile stringa nella quale viene di volta in volta cercata e sostituita la vocale. Da notare che dopo ogni sostituzione la nuova stringa viene salvata in quella in cui si cercano le vocali…questo perchè, se ciò non venisse fatto, verrebbe vista e sostituita solo la vocale u, essendo l’ultima ed essere visualizzata.

DA FARFALLINO A ITALIANO

PUBLIC FUNCTION sfarfallino(parola AS String) AS String

DIM temp_st AS String
DIM ritorno_st AS String

temp_st = parola

ritorno_st = Replace(temp_st, "afa", "a")
temp_st = ritorno_st

ritorno_st = Replace(temp_st, "efe", "e")
temp_st = ritorno_st

ritorno_st = Replace(temp_st, "ifi", "i")
temp_st = ritorno_st

ritorno_st = Replace(temp_st, "ofo", "o")
temp_st = ritorno_st

ritorno_st = Replace(temp_st, "ufu", "u")

RETURN ritorno_st

END

La funzione che svolge il lavoro inverso della funzione farfallino (fantasiosamente chiamata sfarfallino :-D) si basa sullo stesso principio della funzione precedente. Si cerca nella parola passata alla funzione la componente farfallina e la si sostituisce con la semplice vocale. Ad ogni sostituzione la parola in cui cercare viene aggiornata altrimenti si presenterebbe l’errore spiegato prima.

Da notare che a differenza della prima funzione, che è sempre corretta e non presenta mai errori, la seconda può cadere in false traduzioni. Basti pensare alla parola afa ad esempio. Essa verrà riscritta come una semplice a nonostante il suo senso sia giusto. Pertanto se si volesse rendere la funzione migliore si dovrebbero scrivere delle eccezioni, in base alla lingua in uso, sulla conversione delle parole.

Come sempre ho implementato le funzioni in una classe Gambas da poter implementare nei proprio progetti. Trovare la classe nella colonna a destra tra i Download col nome di Gambas-classe-stringa.

IMPORTARE LA CLASSE

Come fare ad importare la classe nel proprio progetto?Prima di tutto scaricare il file, una volta terminato il download scompattiamo l’archivio zip e dalla cartella copiamo il file stringa.class e incolliamolo nella cartella dove risiede il nostro progetto Gambas. Ora apriamo Gambas e come prima riga nel codice del form in cui utilizzeremo le funzioni della classe scriviamo quanto segue:


PRIVATE Stringa AS NEW stringa

In questo modo possiamo accedere alla funzione con la sintassi:

Stringa.farfallino(stringa_da_convertire)

Stringa.sfarfallino(stringa_da_convertire)

Ovviamente questo è solo un gioco e non pretendo che la funzione possa essere davvero utile a qualcuno.