Introduzione al Calcolatore

La diffusione attuale dei computer è frutto di una costante evoluzione della tecnologia (da valvole termoioniche, a transistor, a circuiti integrati) che ne ha reso possibile l'utilizzo da parte di un pubblico sempre più ampio e non necessariamente specializzato: Mainframe, Minicomputer, Microcomputer, Home computer, Personal computer.

Malgrado le differenze, tutti i computer hanno in comune almeno le seguenti caratteristiche:


Gli utenti
Programmi applicativi
es. Word, Firefox
Il Sistema Operativo (S.O.)
es. Windows XP, Linux
La parte Hardware (Hw)
es. processore, memoria




Architettura del calcolatore

Un computer é composto da un gran numero di elementi interagenti.
Anche se qui rappresentiamo un pc fisso, gli stessi componenti sono presenti nei portatili e (a parte alcune eccezioni, come la tastiera) nei piú moderni palmari e dispositivi mobili.

  1. Video (Display)
  2. Scheda madre (Motherboard)
  3. CPU (Microprocessore)
  4. RAM (Memoria Primaria)
  5. Schede di espansione (grafica, rete, etc.)
  6. Alimentatore
  7. CD/DVD Drive
  8. HD (Memoria secondaria)
  9. Tastiera
  10. Mouse

Ma tutte queste componenti hardware interagiscono scambiandosi segnali elettrici!
Come può una persona riuscire a controllarne il funzionamento in maniera agevole?
Grazie al Sistema Operativo!




Il Sistema Operativo

Un S.O. è un particolare programma che agisce da intermediario fra utente e hardware di un computer
  • Il S.O. è responsabile del controllo e gestione dell'hardware che costituisce un computer e quindi di tutte le operazioni di base
  • Il S.O. dovrebbe permettere di utilizzare le componenti hardware nel modo più efficiente e efficace possibile
  • Il suo scopo è di fornire un ambiente nel quale gli utenti siano in grado di eseguire applicazioni
  • Il S.O. gestisce l'accesso degli utenti al sistema e tutti i processi in esecuzione
  • I S.O. moderni devono rendere possibile e conveniente l'utilizzo di un computer anche a utenti non esperti, facilitando l'interazione attraverso le periferiche disponibili
Esempi di Sistemi Operativi sono:
MS-DOS, Windows (XP, Vista, 7), Mac OS, OS/2, UNIX, Linux

Ognuno di questi S.O. fornisce all'utente un modo diverso di lavorare, di interagire con le componenti hardware, di realizzare i propri lavori, hobby e progetti scientifici e artistici




Da UNIX a Linux

UNIX fu sviluppato alla fine degli anni sessanta presso i laboratori Bell (Bell Labs) della AT&T introducendo una serie di principi tuttora ritenuti universalmente validi.
In particolare, UNIX doveva:
  • essere indipendente dall'hardware su cui doveva essere eseguito
  • fornire operazioni concettualmente semplici (fare una sola cosa ma farla bene)
  • favorire l'uso dell'output di un programma come input di un altro
  • fornire un ambiente di supporto alla programmazione
E inoltre
  • Multiutente e multitasking: più utenti possono collegarsi al sistema e eseguire task/processi contemporaneamente (con un meccanismo detto timesharing)

UNIX è il primo S.O. a essere (ri)scritto (nel 1973) in un linguaggio ad alto livello, il C (mutuamente influenzato da UNIX) invece che in Assembly (linguaggio macchina), disgregando la diffusa convinzione che solo con linguaggi di basso livello si potesse garantire un livello accettabile di efficienza

  • Diffuso rapidamente in ambito accademico grazie a licenze gratuite dei Bell Labs (fine anni '70)

  • Esistono numerosi dialetti, per tutte le macchine (da personal computer a mainframe), con stesse funzionalità di base e buona compatibilità

  • Nel 1992, lo studente (!) finlandese Linus Thorvald ha sviluppato (il kernel di) Linux, una versione open source di UNIX per PC Intel 386, utilizzando strumenti della Free Software Foundation.

Linux è oggi disponibile per tutte le piattaforme e i processori più diffusi... e adesso è anche facile da installare e da aggiornare!




UNIX in generale

  • Tutte le informazioni sono organizzate in file: documenti, sorgenti di programmi, applicazioni, immagini, ...
  • File System gerarchico: file (archivio) e directory (cartelle)
  • Due modalità di interazione con l'utente, con vantaggi complementari:

    • grafica, come sotto Windows (intuitiva, possibile anche per novizi, invita all'esplorazione...)

    • testuale, tramite shell interattiva (richiede maggiore conoscenza del sistema, più potente...)

  • Sia la shell che l'interfaccia grafica (basata su X Window System X11) forniscono, in modo diverso, le stesse funzionalità:

    • accedere al sistema
    • spostarsi nel file system
    • creare / modificare / eliminare file
    • eseguire applicazioni



Il file system

  • Un file è un contenitore di informazioni: un documento, un programma, i dati di un esperimento, una fotografia..., ma anche un dispositivo di input/output, una zona di memoria interna,... (in UNIX anche operazioni come accesso a periferiche o comunicazioni tra processi avvengono tramite file speciali)

  • Una directory è un file che indicizza altri file.

  • Ogni file ha un nome, che può contenere lettere, numeri, e i caratteri "." (punto) e "_" (sottolineatura o underscore) [meglio evitare gli spazi!!!]
    Spesso il nome di un file ha un suffisso o estensione, che ne indica il tipo (main.c indica un programma C, letter.txt indica un file di solo testo...)

  • UNIX è case-sensitive: una lettera minuscola e la corrispondente maiuscola sono diverse!!!
    Ad esempio, possiamo avere nella stessa directory i file piPPo e Pippo

  • I file sono organizzati in una struttura chiamata file system, rappresentabile come un albero (come analogia considerate un albero genealogico):
    • Una struttura con tre elementi: radice, nodi, archi (relazioni tra nodi)
    • La radice dell'albero è la directory /, detta root
    • I nodi sono file (i nodi interni sono directory)
    • Gli archi descrivono la struttura gerarchica (relazione padre-figlio)

Esempio di struttura di un file system UNIX




Directory importanti e Pathname

Alcune directory importanti:
  • Della root directory (indicata con /) abbiamo già parlato.

  • I file di ogni utente UNIX sono memorizzati in una directory del file system chiamata la home directory o home dell'utente (indicata con ~).

  • In ogni istante, ogni utente collegato al sistema si trova concettualmente posizionato in un ben preciso nodo del file system (detto directory corrente e indicato con .), da cui può spostarsi tramite opportuni comandi

  • La directory immediatamente sopra quella corrente è detta directory padre e indicata con ..

Nota: questa convenzione NON si generalizza aumentando il numero di .. per raggiungere la directory padre della directory padre e così via!

I percorsi (o path) sono rappresentati testualmente inserendo un simbolo / tra ogni padre e figlio (senza spazi). Per esempio:

/usr/       /usr/bin       /usr/bin/emacs

Un pathname specifica la precisa locazione di un file all'interno del file system.

  • pathname assoluto: dice come raggiungere un file partendo dalla radice del file system (quindi comincia sempre con /). Per esempio:
    /usr/bin/emacs

  • pathname relativo: dice come raggiungere un file partendo dalla directory corrente. Per esempio:
    ../../X11/man se la directory corrente è /usr/bin/emacs

  • Due file in directory diverse dello stesso albero possono avere lo stesso nome. Possiamo distinguerli usando il loro pathname assoluto, che li identifica in modo univoco nel file system:

      /usr/bin
      /bin/
      /usr/X11/bin/
      



La shell

La shell è un interprete di comandi: legge ciascuna linea di comando, ne interpreta le diverse componenti e la esegue

  • Ogni sistema UNIX mette a disposizione vari tipi di shell. Le shell più diffuse sono: (sh, bash, csh, tcsh): il default per voi è bash

  • Da X-Window si lancia come una qualunque applicazione (generalmente si chiama "Terminal" ed é elencata sotto "Accessori" o "Sistema"...)

  • La shell è un interprete di comandi che ripetutamente:

    • stampa un prompt
    • legge un comando scritto dall'utente e terminato con enter/return/invio
    • esegue il comando o segnala un errore se non è in grado di completarlo

  • I comandi possibili sono moltissimi, ma ne bastano pochi per cominciare...



Perché usare una shell testuale?

  • Potenza e semplicità: I comandi UNIX sono progettati per risolvere problemi specifici. Sono semplici (senza menu e opzioni nascoste) e proprio per questo potenti (es. grep parola filename)

  • Velocità e flessibilità: è più veloce scrivere pochi caratteri da tastiera piuttosto che cercare un programma opportuno e usare le operazioni che fornisce sulla base delle proprie specifiche esigenze

  • Accessibilità: permette di accedere efficientemente ad un sistema in remoto (es. ssh machine)




Sintassi dei comandi UNIX

La sintassi tipica dei comandi UNIX è la seguente:
comando  <opzioni>   <argomenti>

Opzioni:

  • Sono facoltative e influiscono sul funzionamento del comando
  • Consistono generalmente di un hyphen (il simbolo di trattino -) seguito da una sola lettera (es. ls -l). Possono avere un argomento (es. dvips -o p.ps p.dvi). Spesso più opzioni possono essere raggruppate insieme dopo un solo trattino (es. ls -al )
Argomenti:
  • Si possono avere più argomenti o anche nessuno
  • Alcuni argomenti sono opzionali. Se non specificati assumono valori di default



I comandi UNIX: Esempi

  • nessun argomento: il comando date mostra ora e data corrente
    date

  • un solo argomento: il comando cd cambia la directory corrente in quella specificata dal suo argomento
    cd ../emacs

  • un'opzione ed un argomento: il comando wc conta il numero di parole, caratteri, righe in un file di testo, in base all'opzione specificata
    wc -w elenco.txt conta le parole nel file elenco.txt
    wc -c elenco.txt conta i caratteri nel file elenco.txt
    wc -l elenco.txt conta le linee nel file elenco.txt

  • numero arbitrario di argomenti: il comando cat concatena e mostra sullo schermo il contenuto dei file passati come argomento
    cat orarioLUN.txt orariMAR.txt orarioMER.txt orarioGIO.txt

  • più opzioni ed un argomento di default: lista dettagliata (l,long) di tutti (a,all) i file, con dimensione (s,size). L'argomento di default è la directory corrente
    ls -als

Alcune informazioni utili
Per avere informazioni su di un comando e vederne tutte le opzioni possibili, provare l'opzione --help, oppure i comandi man o info (ad esempio, "ls --help", "man ls", "info ls")
La shell fa una completion automatica: se si scrive l'inizio di un comando o di un file e si batte TAB, la shell completa il nome per quanto possibile.



La directory corrente e comandi di navigazione

La linea di comando è concettualmente posizionata in una directory, la directory corrente (che all'inizio di ogni sessione è la home dell'utente collegato), nella quale vengono eseguiti i comandi.

Per fare riferimento a files o directory, oltre al path assoluto si può usare il path relativo, che parte dalla directory corrente.

Comando Significato
dirs stampa la directory corrente [working directory]
pwd stampa il pathname assoluto della director corrente
cd la home diventa la directory corrente
cd <nuovaDir> <nuovaDir> diventa la directory corrente
ls stampa il contenuto della directory corrente
ls <directory> stampa il contenuto di <directory>
ls -l stampa anche informazioni aggiuntive (diritti, dimensione...)
ls -a stampa anche files/directory che iniziano per "."

Esempio: visitando una home
Comando Significato
-> pwd stampa il pathname assoluto della directory corrente
-> ls lista la directory corrente
-> cd .. la direcory padre diventa la directory corrente
-> ls -sh mydocs lista la directory mydocs con opzioni size e human readable
-> cd la home diventa la directory corrente




Creare, cancellare, copiare e spostare file

Per creare un file si possono usare moltissimi comandi: il più semplice è touch. In generale, tutti i comandi che modificano un file lo creano se esso non esiste già.

Comandi per creare e cancellare file e directory
Comando Significato
touch <file> cambia l'orario di accesso e di modifica di <file>; se non esiste, lo crea
mkdir <dir> crea la directory <dir>
rmdir <dir> cancella la directory <dir>, ma solo se è vuota.
rm <f1> ... <fn> cancella i files <f1> ... <fn>
rm -r <dir> cancella la directory <dir> con il suo contenuto
rm -i ... cancella l'argomento chiedendo conferma
rm -f ... cancella l'argomento senza chiedere conferma

Comandi per spostare e copiare file e directory
cp <source> <dest> copia il file o directory <source> in <dest>
cp <f1> ... <fn> <dir> copia <f1> ... <fn> nella directory <dir>
cp -r <dir1> <dir2> copia <dir1> e tutto il suo contenuto in <dir2>
cp -i ... copia chiedendo conferma prima di sovrascrivere
cp -f ... copia senza chiedere conferma prima di sovrascrivere
mv <source> <dest> copia <source> in <dest> e rimuove <source>
mv <f1> ... <fn> <dir> sposta <f1> ... <fn> nella directory <dir>
mv -i ... muove chiedendo conferma prima di sovrascrivere
mv -f ... muove senza chiedere conferma prima di sovrascrivere




Visualizzare i file di testo

Comandi per visualizzare il contenuto di file di testo
less <file>
more <file>
visualizzano pagina per pagina il contenuto di <file>, che deve essere un file di testo
cat <f1> ... <fn> concatena i file <f1> ... <fn> e ne mostra il contenuto
sort <f1> ... <fn> mostra le righe in <f1> ... <fn> ordinate lessicograficamente

Per visualizzare correttamente file che non sono di testo occorre usare le corrispondenti applicazioni.

Come default, i comandi visti sopra dirigono il contenuto dei file sullo standard output.




Emacs

Emacs è un editor di testo molto utilizzato sotto UNIX, che offre moltissime funzionalità: si tratta di un vero e proprio ambiente di sviluppo integrato, non grafico.

Per lanciare Emacs ed editare il file primofile, basta eseguire nella shell il comando

    -> emacs primofile &
La "e commerciale" (&) serve a lanciare Emacs in background, in modo da non bloccare l'esecuzione della shell.

Alcune cose da sapere (e sperimentare) su Emacs:

  • Emacs fa un backup del file chiamandolo primofile~.

  • Quando si modifica un file con Emacs, in realtà si modifica una copia del file tenuta da Emacs in un buffer (nell'esempio, un file chiamato #primofile#). Le modifiche vanno salvate per renderle permanenti.

  • Emacs permette di lavorare su più file alla volta. Non c'è bisogno di mandare in esecuzione più copie di Emacs. Il menu Buffer permette di passare da un file all'altro.

  • Se i caratteri della finestra di edit vi sembrano troppo piccoli per riuscire a lavorarci, lanciare Emacs col comando emacs -fn 10x20

  • Si può interagire con Emacs usando il mouse e i menu, oppure con opportune combinazioni di tasti. Un'introduzione all'uso di Emacs (con i tasti!!!) si trova nell'Emacs Tutorial, che si può invocare con C-h t oppure dal menu Help



Editing della linea di comando e comandi Emacs

Molte shell offrono funzioni di editing della linea di comando che sono "ereditate" dall'editor emacs.

Ecco alcune delle funzioni più utili:

    Ctrl-e va a fine riga
    Ctrl-a va a inizio riga
    Ctrl-k cancella il resto della linea (kill)
    Ctrl-y reinserisce la stringa cancellata (yank)
    Ctrl-d cancella il carattere sul cursore (delete)
    Ctrl-x Ctrl-s salva il file (save)
    Ctrl-x Ctrl-c esce da Emacs


Esercizi

[01]  Partendo dalla vostra home directory esplorare il file system posizionandovi nella vostra directory padre. Elencare i files in essa contenuti.

[02]  Posizionandovi nella vostra home directory, create una nuova sottodirectory chiamata Num_Utili e copiateci il file di testo Rubrica.txt che trovate nella home directory della prof. Gori (~gorir).
Editare il file con emacs in modo da cancellare (con gli opportuni comandi emacs) tutte le righe che non contengono informazioni utili (es. righe vuote, righe di asterischi,....).

[03]  Creare nella propria propria home directory una nuova directory Num_Pers.
Creare poi un nuovo file MiaRubrica.txt nella directory Num_Pers.
Editare il file MiaRubrica.txt con emacs per inserire 5-6 nomi di amici con la città di provenienza e un recapito telefonico anche inventato (usare esattamente lo stesso formato dei dati utilizzato nel file Rubrica.txt).

[04]  Stampare a video il contenuto del file Rubrica.txt.
Provate ad usare tutti e tre i comandi a vostra disposizione per questo, cat, more e less.
Stampate ora a video il contenuto ordinato del file.