APPLICAZIONE DI WEB INTELLIGENCE ALLE MAN PAGE DI LINUX

Perch:
Conoscere tutti i programmi presenti fin dall'installazione di una macchina GNU/Linux  un'impresa titanica, e nonostante l'esperienza che si pu accumulare c' sempre un programma od un aspetto di un programma che non si conosceva. Si rende quindi cos indispensabile, sia per chi si avvicina a linux per la prima volta, sia per chi gi ha esperienza, un metodo efficiente ed efficace per la ricerca di informazioni.
Ormai i modermi motori di ricerca sul web sono un ottimo strumento di aiuto per chi si avvicina al mondo GNU/Linux ma spesso si dimentica l'ottima documentazione presente _all'interno_ del sistema stesso. Una risorsa da non sottovalutare: le MAN PAGE.
Questo progetto si prefigge quindi di facilitare il recupero di informazioni dalle man page.

Cos' una man page:
Man page  l'abbreviazione di MANual PAGE, ovvero documentazione su di un particolare programma (in genere applicazioni testuali)
L'utilit delle man page  indiscutibile, descrive brevemente la funzionalit del comando, descrive dettagliatamente ogni singolo parametro che pu essere passato al programma, indica argomenti correlati ...
Ogni man page  suddiva in genere in paragrafi in modo da facilitarne la lettura e sono raggruppate in sezioni predefinite:

1 - Comandi utente, che possono essere avviati da chiunque.
2 - Chiamate di sistema, cio funzioni fornite dal kernel.
3 - Funzioni di libreria.
4 - Periferiche, cio, nomi speciali nella directory /dev.
5 - Descrizione di formati di files, esempio /etc/lilo.conf.
6 - Giochi.
7 - Miscellanea.
8 - Utility di amministrazione del sistema che solo root pu eseguire.
9 - Altro (specificatamente in Linux) documentazione relativa al kernel.
n - Nuova documentazione, che pu essere spostata nella sezione appropriata.
o - Documentazione obsoleta.
l - Documentazione che fa riferimento a questo particolare sistema.

Strumenti attuali:
L'unico strumento che consente di reperire informazioni dalle man page  apropos(ovviamente si potrebbe anche pensare di leggersi tutte le man), ma secondo me  uno strumento che pu essere migliorato, non permette infatti la ricerca di pi di un termine alla volta (o meglio lo permette solo se le parole sono consecutive), e limita la ricerca dei termini solo all'interno del campo name, se vogliamo per esempio cercare le man page che hanno un qualche legame con "regular expression" potremmo usare apropos "regular expression" (in questo caso "regular espression" viene visto come un termine singolo).
ecco una parte dell'output:

bash-2.05b$ apropos "regular expression"| grep -v Tcl | grep -v PCRE
bzegrep [bzgrep]     (1)  - search possibly bzip2 compressed files for a regular expression
bzfgrep [bzgrep]     (1)  - search possibly bzip2 compressed files for a regular expression
bzgrep               (1)  - search possibly bzip2 compressed files for a regular expression
pcregrep             (1)  - a grep with Perl-compatible regular expressions
pcretest             (1)  - a program for testing Perl-compatible regular expressions
perlfaq6             (1)  - Regular Expressions ($Revision: 1.20 $, $Date: 2003/01/03 20:05:28 $)
perlre               (1)  - Perl regular expressions
perlrequick          (1)  - Perl regular expressions quick start
perlreref            (1)  - Perl Regular Expressions Reference
perlretut            (1)  - Perl regular expressions tutorial
re                   (3pm)  - Perl pragma to alter regular expression behaviour
regex                (7)  - POSIX 1003.2 regular expressions
regexp               (n)  - Match a regular expression against a string
regsub               (n)  - Perform substitutions based on regular expression pattern matching
XML::RegExp          (3pm)  - Regular expressions for XML tokens
zgrep                (1)  - search possibly compressed files for a regular expression

ma per esempio non compare grep, oppure bash, e altri programmi che riconoscono o gestiscono espressioni regolari, questo perch come detto la ricerca avviene solo nel titolo della man page.

Altro esempio:
bash-2.05 apropos ls

....
...
XtCancelSelectionRequest [XtCreateSelectionRequest] (3x)  - bundle multiple selection conversion requests into a single request using MULTIPLE target
XtIsTopLevelShell [XtClass] (3x)  - obtain and verify a widget's class
yuv4mpeg             (5)  - video stream format used by pipe-based MJPEGtools
yuvmedianfilter      (1)  - A filter for yuv images produced by the mjpeg tools

bash-2.05b$ apropos ls | wc -l
1625

il comando ha restituito 1625 file che sono decisamente troppi
tra l'altro non ricerca la parola ls ma i caratteri l e s affiancati. (ecco il motivo delle cos' tante man page trovate)

apropos risulta quindi uno strumento utile ma spesso non restituisce il risultato voluto, costringendo l'utente all'uso di altri sistemi di ricerca.

Obiettivo del progetto:
questo progetto si prefigge di creare una sorta di motore di ricerca per le man page, permettendo:
1) ricerche con termini multipli in and or o not
2) analisi completa delle man page

Schema del progetto:

Sostanzialmente il progetto si divide in 2 grandi parti, il primo riguarda la creazione del database, il secondo invece si preoccupa di interrogare il db per fornire la risposta alla query dell'utente. Per permettere ricerche booleane di termini si  deciso di riccorere all'uso degli inverted file in quanto permettono di soddisfare velocemente ogni tipo di richiesta tramite poche e semplici operazione.

- creazione del database:
Per la creazione del db si deve sostanzialmente analizzare ogni singola man page ed indicizzare ogni songola parola.
Ogni man page:
1)  scritta usando dei particolari tag (che vengono utilizzati dal comando man per la formattazione e visualizzazione) che devono venir rimossi prima di processare la man page
2)  divisa in paragrafi, per cui l'analisi dei termini pu essere ristretta solo ad alcuni.

Si  scelto di usare perl per questa parte del progetto, per un motivo fondamentale: gestire stringhe con il perl  estremamente semplice ed efficace :), inoltre fornisce array dinamici e hash direttamente e questo  un notevole vantaggio rispetto ad altri linguaggi. 

Implementazione:
La creazione del db viene effettuata analizzando le dir presenti nella variabile di ambiente MANPATH. Ogni man page trovata viene elabrata in questo modo:
- tolti tutti i commenti
- estrazione campo NAME
- rimozione dei tag
- rimozione termini poco significativi (parole pi corte di 2 parole)
- rimozione termini in stop list
- elaborazione singoli termini

ogni termine viene stemmato (Vd algoritmo per stemming pi avanti) ed inserito in un hash.
dopo di che si procede alla creazione del db. Vengono genetari 3 file: il file_dizionario, il file_man_page, il file_inverted.

Il file_man_page contiene la lista delle man page analizzate con un identificativo univoco.
Il file_inverted contiene una lista di liste degli id della man page. Ogni lista i-esima  formata dalle man page che contengono la parola i-esima.
Il file_dizionatio contiene una lista delle parole con associato un puntatore all'inizio della corrispettiva lista in file_inverted

con questo tipo di struttura   possibile effettuare operazioni booleane di termini semplicemente lavorando sulla concatenazione, intersezione e differenza delle liste associate ad ogni parola.

L'and corrisponde alla interezione
L'or corrisponde alla concatenazione
Il not corrisponde alla differenza

- interrogazione db

Ogni parametro inserito dall'utente viene dapprima stemmato, e poi ricercato nel dizionario. Verr restituito un valore che indica l'inizio della lista della parola corrispondente (il valore associato alla parola non  altro che un puntatore all'interno del file_inverted).
Una volta letta la lista associata alla man page si procede in questo modo:
se i termini sono in and tra di loro si fa l'intersezione delle liste
se i termini sono in or si fa la concatenazione
se i termini sono in not si calcola la differenza

Per quanto riguarda l'implementazione si  scelto di usare python perch:
1) permette di gestire le liste ed eseguire operazioni di filtraggio su di esse in maniera molto semplice
2)  un linguaggio che volevo provare :)

Conclusioni:
