GPL? No, AGPL

Giugno 30th, 2009

La licenza storica del progetto GNU è la GPL. Essa è apprezzata da alcuni e mal sopportata da altri perchè, oltre a garantire all’utente le quattro libertà del software, è dotata di un forte copyleft.

Copyleft è il contrario di copyright. Significa che una licenza, oltre a garantire delle libertà, impone (se di imposizione si può parlare) che queste libertà vengano preservate. Un copyleft minimo consiste nello stabilire che, quando un software viene stabilito, esso sia accompagnato dalla stessa licenza con la quale lo si è avuto. In caso contrario una persona potrebbe prendere un software libero e distribuirlo come software proprietario.

Il copyleft della GPL è particolarmente forte, perchè vieta di aggiungere parti di codice proprietario al programma. Si può modificare e migliorare il software e non distribuirlo. Ma se si desidera distribuirne una versione modificata, i sorgenti delle proprie modifiche devono poter essere visionati da chiunque riceva il software stesso e devono essere coperti da licenza GPL o altre licenze compatibili. Il software o parte di esso inoltre non potrà essere usato come modulo per un software non libero. Vi sono poi ulteriori “restrizioni”, che in realtà non sono altro che garanzie di libertà per l’utente finale.

Ma la GPL ha un forte limite: il suo spirito originale viene completamente snaturato se utilizzata con applicazioni web. Questo perchè quando essa è stata scritta internet non esisteva.
Spieghiamo questo limite con un esempio. Paperino scrive un programma, poniamo un web forum, e lo distribuisce sul suo sito. La licenza è la GPL. Topolino scarica questo forum e lo installa a sua volta sul suo sito. Dal suo punto di vista è software libero: può usarlo come vuole, studiarne i sorgenti, modificarlo e distribuirlo (anche in versione modificata). Infatti, dopo aver constatato che manca una funzione di ricerca tra i messaggi vecchi, Topolino stesso la implementa. Fa qualche prova e si sfrega le mani: va che è una scheggia! Paperoga si collega quotidianamente al sito di Topolino e usa il forum. Un giorno decide di mettere su un forum anche lui, si collega al sito di Paperino, scarica il programma e lo installa. La funzionalità di ricerca non c’è e purtroppo Paperoga non ha le conoscenze per implementarla. Topolino (che mi è sempre stato un po’ antipatico) non ha condiviso con la comunità il codice che ha scritto.
Questo non è giusto: Paperoga usa il forum che gira sul sito di Topolino, è a tutti gli effetti un utente del software. Eppure non gode di nessuna delle quattro libertà sopra citate. Perchè? Tecnicamente perchè non ne ha mai ricevuto una copia. Lo usa attraverso una rete. Topolino, non distribuendo il programma in sè, non è tenuto a fornire nè i sorgenti nè la licenza GPL.
Tutto ciò è perfettamente legale ma profondamente contrario alle intenzioni di chi ha scritto la licenza.

Fortunatamente la società Affero ha scritto una nuova licenza, che è in realtà una variante della GPL. E’ la licenza chiamata GNU Affero General Public License, o semplicemente AGPL. Essa è molto simile alla GPL ma con un’aggiunta importante. Stabilisce che chi modifica il software ricevuto e lo installa su un server pubblico deve condividere con la comunità le modifiche apportate.

In questo modo viene a cadere l’assurda distinzione tra chi utilizza un software dopo averne ricevuta una copia e chi lo utilizza attraverso la rete. Almeno in teoria.

Due saggi di Eben Moglen

Giugno 28th, 2009

Consiglio la lettura di due saggi “politici” riguardanti il software libero. Entrambi sono di Eben Moglen, che è stato l’autore originale della licenza GPL e ha collaborato fino alla stesura di una bozza per la terza versione.

Spero che la lunghezza e il fatto che il primo sia in inglese non scoraggino la lettura. Se siete a conoscenza di traduzioni in italiano di Anarchism tiumphant vi prego di segnalarmele.

Buona lettura.

LGPL, una strana licenza

Giugno 28th, 2009

La licenza libera per eccellenza scritta e utilizzata dal progetto GNU è la General Public License (GPL). Fin dagli albori o quasi, alla GPL hanno affiancato un’altra licenza un po’ meno libera: la LGPL. Questo acronimo inizialmente stava per Library General Public License e questo ha portato molti sviluppatori a credere che fosse la licenza più adatta per le librerie. Per risolvere l’inconveniente il nome della licenza è stato cambiato in Lesser General Public License: licenza pubblica “un po’ meno generale”.

Infatti le librerie, per essere libere e dotate di un buon copyleft, dovrebbero essere rilasciate con licenza GPL o AGPL. La LGPL è un compromesso tra la libertà assoluta che la GPL giustamente esige e le logiche di mercato. Infatti la differenza tra queste due licenze è molto semplice: una libreria LGPL, pur essendo tecnicamente libera, può essere utilizzata all’interno di un software commerciale.

Sembra strano che il progetto GNU e la Free Software Foundation non possano tollerare che alcune righe di codice proprietario siano inserite in un programma libero (la GPL giustamente lo vieta) ma allo stesso tempo chiudano un occhio se una libreria libera implementa funzionalità che poi verranno utilizzate da software proprietari. In altre parole: un programma libero con un pezzo di codice proprietario non va bene; un programma proprietario con un pezzo di software libero va bene. Eticamente non regge.

Oltretutto interi programmi (e non solo librerie) sono stati rilasciati con licenza LGPL e sono considerati liberi.

Sul sito di GNU vi è un articolo intitolato Why you shouldn’t use the Lesser GPL for your next library, nel quale, oltre a spiegare perchè la LGPL normalmente non dovrebbe essere usata, si spiega perchè in alcuni casi sia ritenuta preferibile. Essenzialmente il ragionamento è questo: se una libreria offre funzionalità che nessun’altra libreria offre, o se la sua qualità è nettamente superiore a quella delle librerie non libere, è giusto che sia rilasciata come GPL; se però teme la concorrenza di altre librerie proprietarie, la sua licenza potrebbe essere la LGPL. Il motivo addotto da GNU è il seguente: i software proprietatari, se possono scegliere quali librerie usare, le scelgono tra quelle che permettono al programma stesso di rimanere non libero; se le librerie libere sono nettamente superiori alle loro concorrenti, non devono porsi questo problema, perchè un software per essere di qualità potrebbe/dovrebbe utilizzarle e divenire libero; se invece non lo sono, per trovare una maggiore diffusione, devono permettere il proprio utilizzo all’interno di programmi non liberi, quindi usare la LGPL.

Il progetto GNU, quindi, sembra partire dal presupposto che un programma proprietario che utilizza una o più licenze LGPL sia eticamente migliore di un programma proprietario che non utilizza alcuna libreria libera. Questo potrebbe essere in parte vero, ma mi rifiuto di esaminare il problema da questo punto di vista. Loro stessi, in altri casi, rifiutano questo tipo di approccio: si veda l’articolo di Stallman Avoiding ruinous compromises, nel quale definisce “rovinoso compromesso” l’inserimento di driver non liberi all’interno delle distribuzioni GNU/Linux allo scopo di aumentarne la diffusione.

Se poi lo scopo è non imporre limitazioni per vie legali, chiedendo implicitamente protezione a quegli stessi poteri che limitano tutte le nostre libertà (digitali e non), allora non bisognerebbe usare alcuna licenza. In tal caso si deve dichiarare esplicitamente il proprio software di pubblico dominio, per che in caso contrario All rights are reserved, come dice la SIAE. Questa è una scelta di tipo diverso, che non giudico migliore nè peggiore.

Usare la LGPL per diffondere maggiormente una libreria, accettando un compromesso eticamente ancor meno accettabile (potenziamento di software proprietari/monopolistici), non è peggio che includere driver proprietari?
Non sarebbe ora che la Free Software Foundation e il progetto GNU allargassero il proprio concetto di “Rovinoso compromesso” e dessero alle fiamme la licenza LGPL?

Ac LAB updates

Giugno 28th, 2009

Invito di nuovo chi segue il mio blog a visitare Ac LAB (Anti-cloud LAB), che continua ad arricchirsi con contenuti interessanti.

Ora è possibile inserire commenti agli articoli. La registrazione non è richiesta (anzi, non è proprio possibile).

Ac LAB - aclab.indivia.net
Riprenditi il cervello!

Commenti su Opera Unite

Giugno 19th, 2009

Ne hanno parlato tutti i principali siti e blog di informazione che trattano di informatica. Il nuovo servizio di Opera sta passando come un’alternativa al cloud computing, ma è proprio così? A ben guardare no: è semplicemente un cloud computing “moderato” basato su software proprietario. Eppure potrebbe rappresentare ugualmente una novità interessante…

Il mio articolo su Ac LAB

Gestire il download dei file in PHP

Giugno 6th, 2009

Una delle operazioni più comuni sul web è il download dei file. Eppure non tutti sanno come fare. In realtà l’argomento è molto semplice, però bisogna fare attenzione a un paio di cose…

Le basi

Per prima cosa, occorre mandare degli header HTTP che dicano al browser che gli stiamo mandando un file da scaricare. Gli header devono essere inviati prima di qualsiasi altro contenuto.

header('Content-Type: application/abiword', true);
header('Content-Disposition: attachment; filename="esempio.abw"', true);
@set_time_limit(1200);
@readfile('esempio.abw');

In questo esempio, abbiamo inviato tre informazioni negli header:

  • il file è di tipo Abiword;
  • il file deve essere scaricato (Content-Disposition: attachment);
  • il file, per default, una volta scaricato dovrebbe chiamarsi “esempio.abw”.

Infine, con readfile, si manda il contenuto del file vero e proprio. Allungare il timeout di esecuzione dello script è importante, perchè vogliamo che l’utente abbia il tempo di scaricare il file. E’ comunque sconsigliabile eliminare completamente il timeout, a meno che il file non sia veramente di grosse dimensioni.

E’ possibile suggerire al browser di visualizzare il formato al suo interno, se possibile, lasciando ovviamente la possibilità all’utente di salvarlo. Questo è possibile se i file vengono visualizzati da un qualche plugin. Per farlo:

header('Content-Disposition: inline; filename="esempio.abw"', true);

Sicurezza

Generalmente non si crea uno script per permettere di scaricare un solo file; con lo stesso script è possibile scaricare diversi file. Il file desiderato solitamente è indicato da una variabile presente nella querystring che nell’esempio chiameremo file:

header('Content-Type: application/abiword', true);
header('Content-Disposition: attachment; filename="' . $_GET['file'] . ‘”‘, true);
@set_time_limit(1200);
@readfile($_GET['file']);

Questo esempio mostra esattamente ciò che non si deve fare. Infatti, con uno script simile, un utente avanzato sarà in grado di scaricare un qualsiasi file presente nelle directory del sito, a patto naturalmente di scoprirne il nome. Provate infatti a pensare cosa accade nel caso seguente:

  • i file fa scaricare si trovano nella directory ‘downloads’;
  • l’utente chiama lo script in questo modo: http://www.esempio.com/script.php?file=../index.php

Le conseguenze sono evidenti. Siccome noi non vogliamo che i visitatori dei siti possano scaricare eventuali file contenenti password e altri dati sensibili, dovremo fare in modo che il carattere “/” venga ignorato.

$file = 'downloads/' . str_replace('/', '', $_GET['file']);
header(’Content-Type: application/abiword’, true);
header(’Content-Disposition: attachment; filename=”‘ . $file . ‘”‘, true);
@set_time_limit(1200);
@readfile($file);

Ma il file esiste?

Il discorso riguardante la sicurezza ci fa venire in mente che, in effetti, il file indicato nella querystring potrebbe anche non esistere. In questo caso vorremo inviare un errore HTTP 404, lo stesso che si riscontra cercando di accedere a una pagina inesistente.

if (file_exists($file)) {
  // ...
  // download
  // ...
} else {
  header('HTTP/1.0 404 Not Found', true);
  die();
}

Se vogliamo essere precisi, in alcuni casi può essere più appropriato mandare uno stato HTTP differente:

  • 301 Moved Permanently - il file è stato spostato / rinominato;
  • 302 Moved Temporarily - il file è stato spostato / rinominato temporaneamente;
  • 303 See Other - il file si trova ad un altro indirizzo;
  • 409 Conflict - il file è aperto in scrittura e non può essere letto;
  • 410 Gone - il file è stato cancellato, è scappato o non può uscire perchè sta male.

Nei casi degli stati 301, 302 e 303, il nuovo URL del file dovrebbe essere fornito con l’header Location:

header('HTTP/1.0 301 Moved Permanently', true);
header('Location: http://aclab.indivia.net/i_am_here_now.txt', true);

Dimensioni del file

Quando si inizia un download, il browser (o qualsiasi altro programma) si aspetta che il server gli comunichi le dimensioni del file. Nel caso di file di piccole dimensioni ciò non è importante (anche se è buona educazione farlo), ma nel caso di file di grosse dimensioni diventa consigliabile. Se il browser conosce le dimensioni del file, sa a che punto è arrivato e può comunicare, ad esempio: 32% completato.

$fileSize = @filesize ($file);
if ($fileSize)
  header('Content-Length: ' . $fileSize, true);

La cache

Nella maggior parte dei casi, un file messo a disposizione per il download non verrà mai verificato, o per lo meno rimarrà immutato nel breve-medio periodo. In tal caso, soprattutto se è di grosse dimensioni, si può risparmiare molta banda dicendo al browser che può metterlo in cache. Anche se può sembrare illogico capita spesso che un utente scarichi lo stesso file più di una volta: lo ha cancellato per errore, non sa più dove lo ha salvato, non si ricorda come si chiama, lo ha solo visualizzato senza salvarlo…

header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // data passata

File binari

Se il file da scaricare è binario occorre specificarlo negli header.

header('Content-Type: application/octet-stream');
header('Content-Transfer-Encoding: binary');

Suonare note in Pascal

Giugno 5th, 2009

In (Free) Pascal abbiamo una funzione che ci permette di emettere un suono dall’altoparlantino di sistema. In questo articolo ci baseremo su questa funzione. I computer moderni, sprovvisti di altoparlantino interno, a mio parere sono difettosi e devono essere sostituiti e rimborsati. Non è possibile giocare a un gioco stile Pacman senza sentire BIP ogni volta che mangiamo un puntino bianco.

Le funzioni

La funzione che attiva l’altoparlantino è sound(int). Il parametro che accetta è la frequenza del suono che intendiamo emettere.

Non esiste un parametro che indichi la durata del suono. Per questo motivo a un certo punto dovremo chiamare la funzione che disattiva l’altoparlante: nosound().

Tra la chiamata a sound() e la chiamata nosound() dovrà ovviamente trascorrere un lasso di tempo, durante il quale il suono verrà emesso. La funzione che fa trascorrere il tempo è delay(int), che accetta come parametro la durata dell’inattività in microsecondi.

La frequenza

E’ chiaro che, per suonare una nota con sound(), dobbiamo conoscerne la frequenza. Più questa è alta, più il suono emesso sarà alto. Ma ogni nota ha la sua frequenza particolare.

Il sistema all’interno del quale si trovano le note, con le loro particolari frequenze, è detto scala. Non esiste una sola scala: nel corso della storia se ne sono usate diverse. Quella che utilizziamo oggi è la scala temperata.

Una breve spiegazione su come conoscere la frequenza di ogni nota è a questo indirizzo:
http://ulisse.sissa.it/chiediAUlisse/domanda/2004/Ucau040418d001

Una spiegazione più approfondita si trova qui:
http://www.soloclassica.it/scalatemperata.htm

Codice

Ecco una funzione scritta in Pascal per suonare una nota:

procedure note(tone:integer; duration:integer);
begin
  sound(round(440 * (pow(sqrt(2, 12), tone))));
  delay(duration * unit_duration);
end;

Il primo parametro è il numero corrispondente alla nota. La nota numero 0 è il LA centrale, la 1 sarà il LA#, etc. Il secondo parametro è la durata in “unità”. Il programma non sa se l’unità sia un quarto, un sedicesimo e qualcos’altro, nè ci tiene a saperlo. E’ importante però che sia definita, a livello di programma, la costante unit_duration, che indica la durata dell’unità in microsecondi.

Un banalissimo esempio di utilizzo:

note(1, 1);
note(3, 1);
note(4, 2);
nosound;

LA SI DOOO

Implementare la potenza e la radice quadrata

Giugno 4th, 2009

Vediamo come implementare gli algoritmi dell’elevazione a potenza (pow) e della radice quadrata (sqrt) implementandoli in Pascal. Testati ovviamente con Free Pascal.

function pow(a:real; n:integer):real;
var
  i:integer;
  x:real;
begin
  x:=1;
  if n<>0 then
    for i:=1 to abs(n) do
      x:=x*a;
   if n<0 then
    x:=1/x;
  pow:=x;
end;

function sqrt(a:real;n:integer):real;
const
  precision_max=5;
var
   i,precision:integer;
   x:real;
begin
  x:=0;
  for precision:=0 downto - precision_max do
  begin
    for i:=0 to 9 do
      if pow(x + pow(10, precision)*i,n) > a then break;
    dec(i);
    x := x + pow(10, precision)*i;
  end;
  sqrt:=x;
end;

coalesce() in PHP

Giugno 2nd, 2009

MySQL ha una funzione COALESCE() che accetta un numero variabile di parametri e restituisce il primo parametro con un valore diverso da NULL.

E’ possibile implementarla in maniera semplice anche in PHP:

function coalesce()
  // returns first non-null param
{
  $nargs = func_get_args();
  for ($i=0; $i<$nargs; $i++) {
    if (!is_null(func_get_arg($i)))
      return func_get_arg($i);
  }
  return null;
}

Una versione leggermente diversa potrebbe restituire il primo parametro con valore non vuoto (stringhe vuote, 0, false):

function coalesce2()
  // returns first non-empty param
{
  $nargs = func_get_args();
  for ($i=0; $i<$nargs; $i++) {
    if (!emptyl(func_get_arg($i)))
      return func_get_arg($i);
  }
  return null;
}

Gli usi possono essere molteplici. Si supponga ad esempio di voler stampare un valore preso da un database ma non essere sicuri che tale valore sia presente:

echo coalesce($row['valore1'], ‘Non disponibile’);

Oppure si potrebbe usarla per leggere un output che potrebbe essere fornito dall’utente:

$mode = coalesce($_GET['mode'], $_COOKIE['mode'], DEFAULT_MODE);

Happy hacking!

Nasce dal basso Ac LAB (Anti-cloud LAB)

Maggio 28th, 2009

Sempre più spesso i programmi di cui ci serviamo, i nostri dati e i nostri documenti si trovano su computer remoti. In parte questo concetto sta alla base di internet: visualizzo un sito creato da uno che vive in australia… ma da tempo questo fenomeno ha superato i limiti consigliati dal buon senso.

Ormai affidiamo quotidianamente le nostre comunicazioni, i nostri dati, i nostri pensieri, i frutti della nostra creatività alle multinazionali, senza avere la più pallida idea di cosa ne facciano realmente.

Il Software Libero non è tale per chi lo subisce. Se non lo posso modificare, non posso studiarne le modifiche apportate da altri, e anzi non so nemmeno che software è (perchè gira su un server in Arizona), ecco che i più apprezzati software liberi diventano proprietari.

Ci stiamo affidando a tecnologie sulle quali non abbiamo alcun controllo; stiamo perdendo le capacità e la voglia di controllarle; non conosciamo chi le controlla… siamo uomini e donne o clienti di Facebook?

Ac LAB (anti-cloud laboratory) mira alla diffusione di informazioni su chi controlla i nostri dati, su come lo fa, su quali pericoli concreti ci minacciano. Ma anche su quali alternative possiamo costruire da soli, senza metterci nelle mani di qualche multinazionale.

aclab.indivia.net
Riprenditi il tuo cervello!