JavascriptProva

martedì 5 giugno 2012

Rudimenti di terminale Linux: spostare e copiare cartelle

Adesso che ho imparato a creare e distruggere cartelle vuote e piene, mi rimane spostare e copiare cartelle.

Creo una cartella:
antonello@ubuntu:~$ ls
Documenti         Immagini  Musica    Scaricati  Video
examples.desktop  Modelli   Pubblici  Scrivania
antonello@ubuntu:~$ mkdir MiaCartella
antonello@ubuntu:~$ ls
Documenti         Immagini     Modelli  Pubblici   Scrivania
examples.desktop  MiaCartella  Musica   Scaricati  Video
antonello@ubuntu:~$ cd MiaCartella
antonello@ubuntu:~/MiaCartella$ mkdir Uno
antonello@ubuntu:~/MiaCartella$ mkdir Due
antonello@ubuntu:~/MiaCartella$ ls
Due  Uno
antonello@ubuntu:~/MiaCartella$ cd Uno
antonello@ubuntu:~/MiaCartella/Uno$ mkdir CartellaDelCavolo
antonello@ubuntu:~/MiaCartella/Uno$ ls
CartellaDelCavolo
antonello@ubuntu:~/MiaCartella/Uno$ cd ..
antonello@ubuntu:~/MiaCartella$ cd ..
antonello@ubuntu:~$ 
Ecco: ho creato una cartella CartellaDelCavolo posta nella cartella Uno.
La voglio spostare nella cartella Due.
antonello@ubuntu:~$ mv MiaCartella/Uno/CartellaDelCavolo MiaCartella/Due/CartellaDelCavolo
antonello@ubuntu:~$ cd MiaCartella/Uno
antonello@ubuntu:~/MiaCartella/Uno$ cd ../Due
antonello@ubuntu:~/MiaCartella/Due$ ls
CartellaDelCavolo
antonello@ubuntu:~/MiaCartella/Due$ 
Fatto.
Adesso copio la cartella anche nella cartella Uno: Dopo vari impazzimenti ho capito che cp funzionerà per i files, ma non per le cartelle per le quali ci vuole il parametro -r.

Ecco l'errore:
antonello@ubuntu:~$ cp MiaCartella/Due/CartellaDelCavolo MiaCartella/Uno/CartellaDelCavolo
cp: omitting directory `MiaCartella/Due/CartellaDelCavolo'
antonello@ubuntu:~$ 


Ed ecco la correzione:
antonello@ubuntu:~$ cp -r MiaCartella/Due/CartellaDelCavolo MiaCartella/Uno/CartellaDelCavolo
antonello@ubuntu:~$ cd MiaCartella/Uno
antonello@ubuntu:~/MiaCartella/Uno$ ls
CartellaDelCavolo
antonello@ubuntu:~/MiaCartella/Uno$ cd ..
antonello@ubuntu:~/MiaCartella$ cd Due
antonello@ubuntu:~/MiaCartella/Due$ ls
CartellaDelCavolo
antonello@ubuntu:~/MiaCartella/Due$ 
Ecco che funziona: la cartella si trova in tutte e due le cartelle!

lunedì 4 giugno 2012

Rudimenti di terminale Linux

Parallelamente, riattacco Linux.
Ubuntu versione 12.04

Terminale:
io@ubuntu:~$ 
Su quale directory mi trovo?
Qual è il comando analogo al DIR del dos?
Non lo ricordo... vediamo.

Ecco, dovrebbe essere ls.
Ci provo.
io@ubuntu:~$ ls
Documenti         Immagini  Musica    Scaricati  Video 
examples.desktop  Modelli   Pubblici  Scrivania 
io@ubuntu:~$ 
Bene.
Ricordo che c'è un codice colore.
Qui mi vengono delle voci colorate in azzurro. Cosa saranno?
Dovrebbero essere delle directory, mentre quello scritto normalmente è un'altra cosa.
Vediamo se trovo materiale su questo codice colore...

Sì: eccolo: questo blu è il colore delle directory.
Ora, quindi, se queste sono cartelle, scendiamo più a fondo in una di queste.
Come si fa a cambiare cartella? Vediamo qual è il corrispettivo di CD.

Dovrebbe essere sempre cd.
Proviamo.
io@ubuntu:~$ cd documenti
bash: cd: documenti: No such file or directory
io@ubuntu:~$ cd Documenti
io@ubuntu:~/Documenti$
E infatti funziona, con l'unica avvertenza che Linux è case sensitive!

Adesso elenco il contenuto della sottocartella Documenti.
io@ubuntu:~/Documenti$ ls
io@ubuntu:~/Documenti$ 
E' vuota.
Vediamone un'altra:
io@ubuntu:~/Documenti$ cd..
cd..: command not found
io@ubuntu:~/Documenti$ cd ..
io@ubuntu:~$ cd Immagini
io@ubuntu:~/Immagini$ ls
io@ubuntu:~/Immagini$ cd ..
io@ubuntu:~$ cd Scrivania
io@ubuntu:~/Scrivania$ ls
gnome-terminal.desktop
io@ubuntu:~/Scrivania$ 
Ho combinato alcuni macelli.
Ma ho imparato alcune cose.
Per ritornare al livello superiore si digita quasi come in DOS cd .. ma senza slash, e con uno spazio prima dei puntini, altrimenti non funziona.
Sono sceso nella directory Scrivania e ottengo un file colorato in verde.
Che significa?

Ecco la risposta che ho trovato:
Green color - Executable or recognized data file
Dunque questo file, essendo il terminal, è un file eseguibile, e per questo è verde!

Ora dei comandi sulle cartelle... In effetti, per il DOS non è che li ricordi tutti... Potrebbe essere un'occasione per ripassarli anche per il DOS.

Una cartella si può creare, distruggere, spostare, copiare.
io@ubuntu:~$ mkdir Cavolata
io@ubuntu:~$ ls
Cavolata   examples.desktop  Modelli  Pubblici   Scrivania
Documenti  Immagini          Musica   Scaricati  Video
io@ubuntu:~$ rmdir Cavolata
io@ubuntu:~$ ls
Documenti         Immagini  Musica    Scaricati  Video
examples.desktop  Modelli   Pubblici  Scrivania
io@ubuntu:~$ 
Perfetto!

Però eliminare una cartella non vuota è diverso.
Metto un file di testo inventato sul momento in una cartella di nuova creazione, usando la finestra...

Ecco la situazione:
io@ubuntu:~$ ls
Cavolata   examples.desktop  Modelli  Pubblici   Scrivania
Documenti  Immagini          Musica   Scaricati  Video
io@ubuntu:~$ cd Cavolata
io@ubuntu:~/Cavolata$ ls
cavolicchio
io@ubuntu:~/Cavolata$ 
Ora torno al livello superiore e provo a rimuovere la cartella Cavolata con rmdir.
io@ubuntu:~/Cavolata$ cd ..
io@ubuntu:~$ rmdir Cavolata
rmdir: failed to remove `Cavolata': Directory not empty
io@ubuntu:~$ 
E ottengo un messaggio di errore proprio perchè la directory non è vuota.

Il comando è rm -rf.
Proviamo:
io@ubuntu:~$ rm -rf Cavolata
io@ubuntu:~$ ls
Documenti         Immagini  Musica    Scaricati  Video
examples.desktop  Modelli   Pubblici  Scrivania
io@ubuntu:~$ 
E funziona!

sabato 2 giugno 2012

Dissezione del file oggetto: il campo Locat del subrecord FIXUP del record FIXUPP

Dunque...

Vediamo cosa abbiamo ricavato finora.

I record SEGDEF definiscono le caratteristiche dei vari segmenti.
In pratica, definiscono:
  • L'allineamento;
  • Il rango (combine);
  • la lunghezza.

I record LEDATA, per quanto ricordo, contengono il "contenuto" vero e proprio dei segmenti.

La parte più difficile è il record FIXUPP.
Esso, a parte i primi tre bytes di rito, contiene un subrecord che, a quanto ho capito, può essere di due tipi: FIXUP o THREAD (non meglio da me conosciuti, prendiamoli per buoni).
Se si tratti di un subrecord FIXUP o THREAD, dipende dal primo byte di questo subrecord.
Vediamo sul pratico...

Il codice che identifica il record FIXUPP è il 9C.
00 B4 00 CD 16 B4 4C CD-21 F2 9C 0F 00 C8 03 54
01 C4 10 54 01 C4 15 50-02 07 00 DA 8A 06 00 C1


Eccolo isolato:
9C 0F 00 C8 03 54 01 C4 10 54 01 C4 15 50 02 07 00 DA


...e depurato dei tre bytes rituali iniziali e dell'ultimo (checksum):
C8 03 54 01 C4 10 54 01 C4 15 50 02 07 00

Ora, questa sequenza di bytes è fatta di un unico sottorecord, che può essere di tipo THREAD o di tipo FIXUP, e la differenza è specificata dal primo bit.
Mi sembra ovvio che, essendo il primo bytes C8, il primo bit è pari a 1, il che significa che si tratta di un sottorecord di tipo FIXUP.

Salto tutto il capitolo del documento relativo ai subrecord di tipo THREAD e vado a qualli di tipo FIXUP.

Il primo campo del subrecord FIXUP si chiama Locat, ed è lungo due bytes.
Eccolo isolato:
C8 03 54 01 C4 10 54 01 C4 15 50 02 07 00
  • Il primo bit del campo Locat è quello che identifica il record come di tipo FIXUP.
  • Il secondo bit del campo Locat distingue fra self-relative e segment-relative fizup. Non ricordo bene cosa significhi, ho una vaga idea...
  • I successivi 4 bit formano il sottocampo Location e specificano il tipo di aggiustamento che va fatto: credo si tratti di specificare se quello da aggiustare è l'offset o l'indirizzo di segmento o ambedue...
  • I restanti 10 bits formano il Segment Data Offset, ossia indicano la posizione dove effettuare il riaggiustamento nel record LEDATA precedente.

Che macello!!!.
Vediamo il campo Locat di questo subrecord di tipo FIXUP:
C8 03 = 1100-1000 0000-0011
Dividiamo i sottocampi:
1-1-0010-0000000011.
Il primo bit è 1, il che identifica questo sottorecord come un sottorecord di tipo FIXUP e non THREAD.
Il secondo bit è 1, il che significa che si tratta di un aggiustamento segment-relative.
Il campo successivo è Location, e indica il tipo di aggiustamento che va fatto, in questo caso il suo valore è 2, e significa che è un aggiustamento 16 bit-base.
Vediamolo con dispObj:
FIXUPP:  Type 9C, Offset 006A
         Segment-relative base location 003 (003),
           Frame & Target segment DATA
         Segment-relative word offset location 010 (010),
           Frame & Target segment DATA
         Segment-relative word offset location 015 (015),
           Frame & Target segment TEXT, offset 0007
    0000:9C 0F 00 C8 03 54 01 C4-10 54 01 C4 15 50 02 07 ­ ...╚.T.─.T.─.P..
    0010:00                                              ­ .
Ho beccato il primo di tre aggiustamenti.
"Segment-relative base location".

E abbiamo visto i primi tre sottocampi di Locat.
Adesso vediamo l'altro, che è 00000000011, ossia 3, e indica in quale offset del LEDATA precedente va fatto l'aggiustamento.
Corrisponde a quanto detto dal dispObj, ossia 003.
Andiamo a vedere il LEDATA:
0000:EB 07 BA 00 00 8E DA FA-FA B4 00 B0 03 CD 10 A1
0010:00 00 2E 8B 1E 00 00 B4-00 CD 16 B4 4C CD 21
Eccolo!

Ora mi esercito con gli altri, sempre sul campo Locat.
Riprendo il record, e lo separo nei vari sottorecords FIXUP:
C8 03 54 01 
C4 10 54 01 
C4 15 50 02 07 00
(l'ultimo sottorecord FIXUPP è più lungo, non so perchè, lo vedrò poi) Ecco i campi Locat.
1100-1000 0000-0003

1100-0100 0001-0000

1100-0100 0001-0101


Dividiamoli in sottocampi:
1 1 0010 0000000003

1 1 0001 0000010000

1 1 0001 0000010101
Traduzione: Nel primo campo Locat il sottorecord è FIXUP, la correzione è segment-relative, si tratta di una rilocazione dell'indirizzo di segmento (base location). La posizione nel LEDATA è 003.

Nel secondo campo Locat il sottorecord è FIXUP, la correzione è segment-relative, si tratta di una rilocazione di offset. La posizione nel LEDATA è 010.

Nel terzo campo Locat il sottorecord è FIXUP, la correzione è segment-relative, si tratta di una rilocazione di offset. La posizione nel LEDATA è 015.

Confrontiamo col responso di dispObj:
FIXUPP:  Type 9C, Offset 006A
         Segment-relative base location 003 (003),
           Frame & Target segment DATA
         Segment-relative word offset location 010 (010),
           Frame & Target segment DATA
         Segment-relative word offset location 015 (015),
           Frame & Target segment TEXT, offset 0007
Esatto!!!