Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
didattica:triennale:so:ay_1819:progettofebbraio [2019/11/03 10:33]
michele created
didattica:triennale:so:ay_1819:progettofebbraio [2020/09/17 16:55] (current)
Line 4: Line 4:
 ==== Descrizione ==== ==== Descrizione ====
 L'​obiettivo del progetto è quello di sviluppare l'​applicazione ''​find''​ che consente di individuare il numero di occorrenze di un insieme di stringhe all'​interno di un gruppo di file. Per determinare il numero di occorrenze (e la loro posizione) si consiglia di utilizzare l'​Algoritmo di [[https://​en.wikipedia.org/​wiki/​Knuth–Morris–Pratt_algorithm|Knuth-Morris e Pratt]]. Ad ogni esecuzione l'​applicazione produrrà in output la lista dei file analizzati con le occorrenze della stringa nel testo insieme alle informazioni riguardante la posizioni della stesse. Le stesse informazioni prodotte in output potranno essere salvate su di un file esterno. L'​obiettivo del progetto è quello di sviluppare l'​applicazione ''​find''​ che consente di individuare il numero di occorrenze di un insieme di stringhe all'​interno di un gruppo di file. Per determinare il numero di occorrenze (e la loro posizione) si consiglia di utilizzare l'​Algoritmo di [[https://​en.wikipedia.org/​wiki/​Knuth–Morris–Pratt_algorithm|Knuth-Morris e Pratt]]. Ad ogni esecuzione l'​applicazione produrrà in output la lista dei file analizzati con le occorrenze della stringa nel testo insieme alle informazioni riguardante la posizioni della stesse. Le stesse informazioni prodotte in output potranno essere salvate su di un file esterno.
 +
 +I sorgenti devono essere consegnati in un archivio ''​.zip''​ o ''​.tgz''​. Gli script Makefile o CMake devono essere acclusi per supportare la compilazione.  ​
  
 ==== Report ==== ==== Report ====
Line 25: Line 27:
 Il file terminerà con una riga vuota (''​\r\n''​). Il file terminerà con una riga vuota (''​\r\n''​).
  
-Le parole vengono elencate nel report in ordine alfabetico mentre per ogni parola i file vengono presentati in ordine decrescente per occorrenza.+Le parole vengono elencate nel report in ordine alfabetico mentre per ogni parola i file vengono presentati in ordine decrescente per occorrenza. Nel caso di più file con il medesimo numero di occorrenze i file verranno presentati in ordine alfabetico (usando il path assoluto)
  
-Se ad esempio consideriamo i file messi a disposizione al seguente link, collocati nella directory ''/​home/​loreti/​Documents'',​ il risultato della ricerca delle parole ''​aria'',​ ''​una''​ e ''​genio'',​ il risultato sarà:+Se ad esempio consideriamo i file messi a disposizione al seguente ​{{ :​didattica:​triennale:​so:​ay_1819:​example_find.zip |link}}, collocati nella directory ''/​home/​loreti/​Documents'',​ il risultato della ricerca delle parole ''​aria'',​ ''​una''​ e ''​genio'',​ il risultato sarà:
  
 <​code>​ <​code>​
Line 39: Line 41:
 OCCURRENCES 0\r\n OCCURRENCES 0\r\n
 WORD genio\r\n WORD genio\r\n
-TOTAL 2\r\n+TOTAL 1\r\n
 FILE /​home/​loreti/​Documents/​5maggio.txt\r\n FILE /​home/​loreti/​Documents/​5maggio.txt\r\n
 OCCURRENCES 1\r\n OCCURRENCES 1\r\n
Line 46: Line 48:
 OCCURRENCES 0\r\n OCCURRENCES 0\r\n
 WORD una\r\n WORD una\r\n
-TOTAL 2\r\n+TOTAL 5\r\n
 FILE /​home/​loreti/​Documents/​marzo1821.txt\r\n FILE /​home/​loreti/​Documents/​marzo1821.txt\r\n
 OCCURRENCES 4\r\n OCCURRENCES 4\r\n
Line 59: Line 61:
 </​code>​ </​code>​
  
 +==== Funzionalità e Uso ====
 +
 +L'​applicazione ''​find''​ può essere usata sia per generare dei report delle analisi che per estrarre informazioni da report generati in esecuzioni precedenti. ​
 +
 +== Generazione di report ==
 +
 +Per generare un nuovo report occorre indicare le parole da ricercare e le directory o file dove eseguire la ricerca. I file e le directory da analizzare verranno elencate in un file, da passare come input al programma, con la seguente struttura:
 +
 +<​code>​
 +<​path1>​ [r]\r\n
 +<​path2>​ [r]\r\n
 +...
 +<​pathk>​ [r]\r\n
 +\r\n
 +</​code>​
 +
 +Ogni ''<​pathi>''​ potrà essere un path assoluto o relativo ad un file o directory. Nel secondo caso, il parametro ''​r'',​ opzionale, indicherà se occorra analizzare ricorsivamente le sottodirectory. Se non presente solo i file regolari nella directory verranno analizzati. ​
 +
 +L'​elenco delle parole da ricercare, invece, verrà passato al programma attraverso un file della forma:
 +
 +<​code>​
 +word1\r\n
 +word2\r\n
 +...
 +</​code>​
 +
 +L'​esecuzione del programma avverrà quindi con i seguenti parametri:
 +
 +<​code>​
 +find (--words|-w) <​wordfile>​ (--input|-i) <​inputfile> ​
 +</​code>​
 +
 +In questo caso il report verrà stampato a termine dell'​esecuzione.
 +
 +Per salvare il report su un file particolare occorrerà aggiungere il parametro
 +
 +<​code>​
 +--output|-o <​outputfile>​
 +</​code>​
 +
 +Durante la fase di analisi sarà possibile ignorare i file con specifiche estensioni, aggiungendo il parametro:
 +
 +<​code>​
 +--exclude|-e <ext>
 +</​code>​
 +
 +Infine, per visionare il processo di analisi si potrà aggiungere il parametro
 +
 +<​code>​
 +--verbose|-v
 +</​code>​
 +
 +In questo caso per ogni file (o directory) analizzata occorrerà stampare messaggi che indicano l'​inizio dell'​elaborazione,​ il termine ed il tempo necessario all'​analisi. Un possibile schema potrebbe essere (i tempi riportati non sono indicativi):​
 +
 +<​code>​
 +Inizio elaborazione parola: aria
 +Inizio elaborazione directory: /​home/​loreti/​Documents
 +Inizio elaborazione file: /​home/​loreti/​Documents/​marzo1821.txt
 +Fine elaborazione file: /​home/​loreti/​Documents/​marzo1821.txt (0.2 sec)
 +Inizio elaborazione file: /​home/​loreti/​Documents/​5maggio.txt
 +Fine elaborazione file: /​home/​loreti/​Documents/​5maggio.txt (0.1 sec)
 +Fine elaborazione parola: aria
 +</​code>  ​
 +
 +== Analisi dei report ==
 +
 +Una volta generato il file di report, il programma ''​find''​ potrà essere usato per recuperare le informazioni salvate. Potremmo:
 +
 +
 +*  Stampare la lista dei file dove occorre almeno ''<​n>''​ volte la parola ''<​word>'':​
 +
 +<​code>​
 +find --report|-r <​reportfile>​ --show <​word>​ <n>
 +</​code>​
 +
 +Se ''<​n>''​ viene omesso, si utilizza il valore ''​1''​.
 +
 +
 +*  Stampare tutte le posizioni dove la parola ''<​word>''​ occorre nel file ''<​file>'':​
 +
 +<​code>​
 +find --report|-r <​reportfile>​ --show <​word>​ --file <​file>​
 +</​code>​
 +
 +Se ''<​word>''​ non occorre in ''<​file>'',​ viene stampato a video un messaggio opportuno. ​
  
  
 ====== Addendum per 12 CFU ====== ====== Addendum per 12 CFU ======
  
-Gli studenti che devono sostenere il programma di Sistemi Operativi con 12CFU devono ​contattare ​il docente ​per ottenere ​le specifiche adattate.+Gli studenti che devono sostenere il programma di Sistemi Operativi con 12CFU devono ​sviluppare un server ''​findd''​ che è in grado di raccogliere le informazioni inviate dai vari client. L'​invocazione del server è la seguente 
 + 
 +<​code>​ 
 +findd [--port|-p <​port>​]  
 +</​code>​ 
 + 
 +In questo caso il server rimarrà in ascolto sulla porta ''<​port>''​ (se omessa si userà la porta di default ''​9999''​).  
 + 
 +Inoltre, il programma ''​find''​ potrà prendere come parametri aggiuntivi ''<​label>'',​ ''<​host>''​ e ''<​port>''​ che identifica il server a cui inviare le informazioni ed una etichetta ​per recuperare ​le info: 
 + 
 +<​code>​ 
 +find (--words|-w) <​wordfile>​ (--input|-i) <​inputfile>​ [--host|-h <​host>​ --port|-p <​port>​ --label|-l <​label>​]  
 +</​code>​ 
 + 
 +Se indicati ''<​label>'',​ ''<​host>''​ e ''<​port>'',​ le informazioni non verranno salvate localmente ma inviate al server. 
 + 
 +Per recuperare informazioni dal server remote, il programma ''​find''​ potrà essere eseguito con le seguenti opzioni:  
 + 
 +<​code>​ 
 +fine --host|-h <​host>​ --port|-p <​port>​ --label|-l <​label>​ --show <​word>​ <n> 
 +</​code>​ 
 + 
 +<​code>​ 
 +fine --host|-h <​host>​ --port|-p <​port>​ --label|-l <​label>​ --show <​word>​ --file <​file>​ 
 +</​code>​
  
 +Le informazioni fornite dal server verranno visualizzate a sullo standard output.