[hack] [Primipassi]Epistemologia della scelta, un criterio euristico: il comando file]

Gianni Casalini casalini@autistici.org
Dom 7 Mar 2004 14:51:57 CET


Ho ripescato questa e-mail di Marco Bodrato e volevo condividerla 
con qualcuno.
Mi sembra un'impostazione molto interessante e un ottimo esempio di
scrittura.

Ciao
Gianni


----------  Messaggio inoltrato  ----------


To: primipassi@gulp.dm.unipi.it
From: Marco Bodrato <bodrato@gulp.linux.it>
Subject: [Primipassi]Epistemologia della scelta, un criterio
 euristico: il comando file Reply-To: primipassi@gulp.linux.it
Date: Thu, 27 Nov 2003 11:14:19 +0100

Ciau...

> A proposito di man: nelle sue versioni in italiano usa la parola
> euristica, che ho sentito usare anche da marco. Ho avuto modo di
> cercare su quattro diversi vocabolari, ciascuno da' un
> significato diverso, ma bene o male hanno tutti a che fare con la
> ricerca della verita' o almeno di stadi piu' avanzati della
> conoscenza.
> Non ricordo in contesto in cui era inserita la parola in
> questione in man o nel discorso di Marco, ma mi pare che non ci
> legasse molto. In Linux-ese che significa?

Ti sei persa una piccola panoramica sull'"euristica" :-/

Significa "la stessa cosa", solo in un altro inquadramento
 contestuale...

Nell'epistemologia si dice che una buona "euristica" guida la
 scienza nella scelta della strada da seguire per progredire nella
 conoscenza. (Lakatos? forse questo e` il significato che trovi sul
 vocabolario)

Dal punto di vista conoscitivo (o dell'intelligenza artificiale) un
 criterio "euristico" guida l'individuo (o programma) nel dare una
 risposta anche quando non tutti i dati del problema sono a
 disposizione.

"euristica" viene dal greco, dal verbo che significa trovare. Come
 la famosa esclamazione "eureka!", indica il trovare una buona
 idea, che pur non hai ancora verificato esser corretta.

"euristica" si contrappone ad "algoritmo", perche' nel secondo caso
 hai passi precisi che ti portano ad una risposta certa.

"euristica" e` ben di piu' che procedere per "tentativi ed errori",
 perche' presuppone la cotruzione di un modello conoscitivo. Con
 l'euristica non faccio "tutti i tentativi", ma seguo dei criteri
 per prediligere quei tentativi che piu' probabilmente mi
 porteranno alla risposta corretta.

In breve un programma che segue criteri euristici, fara` una
 superficiale analisi del problema e tentera` di dare una risposta
 ("la verita`"), che molto probabilmente sara` corretta, ma in casi
 particolari potrebbe in seguito rivelarsi errata.


Oggi abbiamo frugato un poco nel comando "file", che con criteri
 euristici cerca di capire "cos'e`" un file (un immagine? un testo?
 un eseguibile? un filmato?). L'uso del comando "file" sara` la
 buona euristica che guida l'utente nella scelta del comando da
 eseguire per prendere conoscenza del contenuto.

A seguire qualche appunto sulla lezione fatta, visto che gli
 assenti erano parecchi, gia` che ci sono mettero` qualche comando
 avanzato qua e la`. Scrivero` le righe di comando con "$"
 all'inizio, dove vedreste il "prompt".


1) scaricato l'archivio compresso
http://www.gulp.linux.it/primipassi/corso.tgz (attenzione e`
 grosso!)

2) scompattato il file con...

$ mkdir scompattiamoloqui
$ cd scompattiamoloqui
$ tar -x -z -f ../corso.tgz

Fare una directory ed entrarci evita che i file si sparpaglino.
L'ultimo comando avrebbe potuto essere:

$ tar xzf ../corso.tgz 			# oppure #
$ gunzip -c ../corso.tgz | tar xf -	# oppure #
$ unp ../corso.tgz


3) l'archivio conteneva una trentina di file, tutti rigorosamente
 senza estensione... per capire cosa sono si esegue l'utilissimo
 "file *" che di ogni file tenta di indovinare cosa puo' contenere.


4) Guardiamo tutti i file che contengono immagini, che potremmo
 elencare con

$ file * | grep "image data"

Tutti questi possono essere aperti con "gimp" che ci permette anche
 di ritoccare, o piu' semplicemente visualizzati con "display" o
 con "xloadimage" o molti altri programmi...
Per aprirli tutti contemporaneamente (solo le immagini, in
 qualunque formato)

$ gimp $( file * | grep "image data"|cut -f1 -d: )


5) Per i file audio (MP3, MP2, Sun/NeXT audio, wav, OGG...
 quest'ultimo e` un formato compresso libero) possiamo usare "xmms"
 in modo grafico o semplicemente "play" in modo testo. "sox"
 permette di cambiare un formato in un altro (come "convert" per le
 immagini), ma riconosce i file in base all'estensione, quindi
 bisogna metterla.


6) C'e` un eseguibile Windows... possiamo comunque provare a
 eseguirlo...

$ file putty
putty:       MS-DOS executable (EXE), OS/2 or MS Windows
$ wine putty

Ci chiedera` di configurare wine... con un po' di pratica e di
configurazione e` possibile far funzionare alcuni programmi .exe
 dentro Linux.


7) per alcuni file contenenti documenti

$ file testdvi
testdvi:     TeX DVI file (TeX output 2003.04.20:0532\213)
$ xdvi testdvi
$ file testps
testps:      PostScript document text conforming at level 2.0
$ gv testps			# oppure # pstotext testps|less
$ file testpdf
testpdf:     PDF document, version 1.2
$ gv testpdf			# oppure #
$ xpdf testpdf			# oppure #
$ acroread testpdf	#che pero` non e` software libero


8) c'e` un filmato "fli", per vedere filmati conviene usare
 "mplayer", se non c'e` "xine" oppure "vlc". Attenzione, perche'
 esiste una miriade di formati... Tutti e tre questi programmi sono
 in grado di visualizzare anche DVD, anche se il miglior programma
 in questo caso e` "ogle". Molti DVD sono protetti con una (debole)
 cifratura, per vederli e` necessario aggirarla, la libreria per
 mettere tutti i programmi appena citati in grado di fare questa
 cosa si chiama "libdecss", ma sulle distribuzioni standard non si
 trova.


9) Quando la risposta di "file" non ci dice molto... provando con
 man -k possiamo capire quali programmi possono fare al caso
 nostro.

$ file testmidi
testmidi:    Standard MIDI data (format 1) using 10 tracks at 1/192
$ man -k midi
timidity (1)         - MIDI to WAV converter and player
TiMidity++ (1) [timidity] - MIDI to WAV converter and player
timidity.cfg (5)     - configure file of TiMidity++
$ timidity testmidi

E suona...


10) restano ancora gli archivi
$ file *|grep "archive data"
testarj:     ARJ archive data, v11, slash-switched, original name:
 , os: Unix testym:      LHa (2.x) archive data [lh5]
testzoo:     Zoo archive data, v2.10, modify: v2.0+, extract: v1.0+
$ man -k lha arj zoo		#ci dice con quali programmi scompattare
$ unp $( file *|grep "archive data"| cut -f1 -d: )


11) Uno dei file e` un eseguibile, in particolare il comando "file"
 infatti

$ file file
file: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for
GNU/Linux 2.2.0, dynamically linked (uses shared libs), stripped

Per eseguirlo dobbiamo dargli l'attributo di esecuzione, quindi
specificare che vogliamo eseguire _quel_ "file" e non quello di
 sistema

$ chmod a+x file
$ ./file

Se non funzionasse potremmo provare a scoprire di quali librerie il
programma ha bisogno con "ldd file".
Qui c'e` stata una breve parentesi su eseguibili e librerie:

$ which bash			# ci dice dove trova il programma bash
/bin/bash
$ file $( which bash )		# equivalente a "file /bin/bash"
/bin/bash: ELF 32-bit LSB executable, Intel 80386, version 1
 (SYSV), for GNU/Linux 2.2.0, dynamically linked (uses shared
 libs), stripped $ ldd $( which bash )
	libncurses.so.5 => /lib/libncurses.so.5 (0x40029000)
	libdl.so.2 => /lib/libdl.so.2 (0x40065000)
	libc.so.6 => /lib/libc.so.6 (0x40068000)
	/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

Se qualche riga avesse mostrato "... => not found " avremmo capito
 quale libreria manca sul sistema per poter eseguire quel file.
Per curiosita` potete scoprire che non tutti i comandi sono binari,
 alcuni sono script bash (o altro) ad esempio

$ file $(which ldd)
/usr/bin/ldd: Bourne-Again shell script text executable
$ less $(which ldd)
...


12) Purtroppo il comando "file" non e` preciso nel riconoscere i
 vari formati di Microsoft Office, che possono essere tutti aperti
 con OpenOffice.org

$ openoffice $( file *|grep "Microsoft Office Document"|cut -f1 -d:
 )

La riga precedente apre tutti i documenti e fogli elettronici
 presenti nella directory. Per aprire i file generati da un word
 processor puo' essere piu' veloce "abiword", per i fogli
 elettronici "gnumeric". Va anche notato che su alcune
 distribuzioni openoffice si chiama "soffice" (Knoppix), oppure
 "OOo" o "OpenOffice" ...
Per visualizzare in modo testo un documento word esiste il comando
"antiword" (non c'e` su Knoppix), oppure potete sempre provare a
 sbirciare con "less", in particolare in accoppiata con "strings".

$ strings schededoc | less

Questo meccanismo e` molto piu' potente di quanto possa sembrare,
 la riga seguente manda una mail a tutti gli indirizzi di posta
 elettronica che trova nella tabella "iscrittixls", con soggetto
 "123 Prova" e come corpo del messaggio il contenuto del file
 "test".

$ cat test | mail -s "123 Prova" $( strings iscrittixls |grep
 "@.*\\." )

Il comando "strings" puo` essere divertente anche per frugare nei
 file eseguibili... per trovare opzioni o messaggi nascosti, con
 qualcosa come

$ strings -n 10 $( which tar ) | less


13) Per concludere abbiamo ripreso brevemente un giochino coi
 processi, lanciando un programma inutile che comprime una
 successione infinita di zeri e butta via il risultato, tre righe
 quasi equivalenti per far questo

$ cat /dev/zero | gzip -c | cat >/dev/null &
$ gzip -c </dev/zero >/dev/null &
$ nice gzip -c </dev/zero >/dev/null &

Dopo averne lanciati alcuni, con "top" vediamo che i processi
 "gzip" stanno usando molto tempo-macchina, molta CPU. Vedremo che
 uno dei tre "gzip" ne sta usando meno... e` quello lanciato con
 "nice", che e` piu' gentile, meno invadente... Sempre dentro "top"
 possiamo rendere meno invadenti anche gli altri con "r", il numero
 del processo e il numero di nice, compreso tra -20 (massima
 priorita`) e 20 (massima cortesia, minor priorita`). L'utente puo`
 cambiare il "nice" solo dei propri processi e puo` solo
 aumentarlo. Al solito "root" puo' tutto. Per terminare tutti i
 processi inutili di cui sopra

$ killall gzip




Alla prossima,
	Marco

PS: spero che chi si intende di filosofia perdoni il mio uso
 disinvolto dei termini all'inizio del messaggio :-)

--
GPG fingerprint: 5972 C482 24C1 E7E6 2AA0  275D 1150 EE33 ciao 00B0
lynx -source http://linuz.sns.it/~bodrato/ciao00B0.html | gpg
 --import



----- End forwarded message -----

--
GPG fingerprint: 5972 C482 24C1 E7E6 2AA0  275D 1150 EE33 ciao 00B0
lynx -source http://linuz.sns.it/~bodrato/ciao00B0.html | gpg
 --import

-------------------------------------------------------





Maggiori informazioni sulla lista golem-hack