[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