Cours de Florent.

# Système de fichier, Codage et découverte du terminal II/II

## Éditeur et fichier texte

Qu'on programme ou qu'on prépare un mail, il faut éditer un fichier texte.
Ce texte va transiter sur le réseau ou être stocké dans un fichier selon un code bien choisi. 

Le code ASCII est inspiré de code pour le télégraphe, comme le code Baudot (1870) : c'est un standard américain initialement pour teleprinter (Bell lab 1961). Il comporte en plus des codes pour des caractères imprimables (chiffres, lettres minuscules et majuscules latines, etc) de nombreux codes pour des opérations spécifiques au mécanisme de communication d'un teleprinter maintenant obsolètes.

[Code Baudot](https://en.wikipedia.org/wiki/Baudot_code)
[ASCII](https://en.wikipedia.org/wiki/ASCII)

### digression
L'ordre des charactères induit par la valeur de leur code ASCII est utilisé pour trier du texte ASCII.
> ASCII-code order is also called ASCIIbetical order

Trier, stocker, indexer et chercher de l'information sont des tâches essentielles qu'on automatise dès la fin du XIXe siècle.

Pour automatiser le recensement américain (le census de 1880 a demandé 8 ans...), Herman Hollerith met au point une machine electro-mécanique manipulant des cartes perforées et flottant dans des bains de mercure. Son entreprise et 4 autres forment un conglomérat qui deviendra IBM en 1924.

[Machines à tabuler](https://en.wikipedia.org/wiki/Tabulating_machine)

### Et si notre alphabet est plus grand?
Pour tester un clavier, ou exhiber une fonte, on peut en anglais écrire.
> The quick brown fox jumps over the lazy dog

En français, on pourra utiliser
> Dès Noël, où un zéphyr haï me vêt de glaçons würmiens, je dîne d’exquis rôtis de bœuf au kir, à l’aÿ d’âge mûr, &cætera.

[tester un clavier](https://fr.wikipedia.org/wiki/The_quick_brown_fox_jumps_over_the_lazy_dog)

De nombreux pays vont donc étendre/changer le code ASCII pour y introduire leurs symboles (par exemple les accents en français) avec un soucis d'internationalisation.
En effet, le code ascii ne peut pas facilement accommoder tous les alphabets même si on se restreint aux alphabets latins ou grecs car nous avons seulement 7 bits soit 2^7=128 codes.
On ajoute donc un bit de plus pour permettre d'échanger des données textuelles "internationales".

[ISO/IEC 8859](https://en.wikipedia.org/wiki/ISO/IEC_8859)

Il y a en fait 15 variantes selon les besoins de langues avec des besoins proches.
Un des plus connu, adapté pour le français, est la version 1

[latin-1](https://en.wikipedia.org/wiki/ISO/IEC_8859-1)

Ces systèmes restent trop limités car ni vraiment adapté pour de la typographie, ni applicable pour tous les alphabets en usage. 
Depuis 2008, le standard est l'UTF-8 (sur le web initialement). 
C'est une abbréviation de

> Unicode Transformation Format – 8-bit

où Unicode signifie

> Universal Coded Character Set

Une idée intéressante de ce code est qu'on va utiliser un **nombre variable de bytes** (entre 1 et 4). 
Typiquement ce qu'on codait en ASCII prendra 1 byte, toutes les langues couvertes par la norme ISO 8859 pourront coder leurs caractères avec au plus 2 bytes, les caractères fréquents de CJK avec 3 bytes et le reste avec 4 permet de coder des symboles moins fréquents (de math, des emoji etc). 

[UTF-8](https://en.wikipedia.org/wiki/UTF-8)

## Discussion au tableau de UTF-8
Calcul du nombre de symboles qu'on peut coder.
Perte de place pour les symboles codés par 1 bloc, 2 blocs, 3 blocs, 4 blocs.

évocation du changement de pratique autres systèmes de codage vs UTF-8 (graphiques sur wikipedia).

### Détails techniques de WSL

Le système de fichier linux WSL est monté dans le système windows.
On peut a priori transférer des fichiers vers windows mais pas l'inverse.

Linux ne permet a priori pas d'accéder au système de fichier windows.

Attention. si vous réinstallez WSL vous allez écraser votre home et tout le travail fait sous linux.

[Où est le home linux sous WSL](https://superuser.com/questions/1185033/what-is-the-home-directory-on-windows-subsystem-for-linux)

Vous pouvez lancer dans l'explorateur de fichier windows le home linux en saisissant dans votre terminal linux la commande suivante.

```bash
explorer.exe .
```

Si vous avez installé WSL sans créer de compte utilisateur, vous êtes l'administrateur système linux, connu sous le nom de root. L'invite du terminal indique un dièse \#

Pas de danger vous ne pouvez rien casser dans le système windows.

Par contre par défaut vous êtes dans ... system32 le répertoire système de windows.
Le système winos ne vous laisse pas écrire de fichier à cet endroit.
Il faut vous placer ailleur, par exemple en saisissant la commande suivante.


```bash
cd
```


### explication au tableau de la navigation

   _ .. pour revenir en arrière
   _ . pour là où on est
   _ ~ pour votre home linux
   _ / pour la racine du système de fichier linux.

Question ontologique de l'oeuf ou la poule: qui est le .. de / ?



### exercice

1. Ouvrez un terminal.
1. Créer un répertoire folderA (commande mkdir).
1. Placez vous dans ce répertoire (commande cd, pour change directory).
1. Créer un fichier vide grapevine.txt (commande touch).
1. Ouvrez le avec un éditeur de texte (par exemple gedit ou emacs voir nano ou vim).
1. Copiez dans ce fichier un texte de votre choix avec de nombreux caractères qui ne sont pas codable en ascii.
1. Sauvez le.
1. Envoyez un mail avec en pièce jointe ce fichier à votre voisine ou voisin de table.
1. Ouvrez le fichier de votre voisin, sauvez le sous le nom grapevine2.txt et testez si vous pouvez lire le fichier correctement avec votre éditeur.

Parfois votre éditeur ne détectera pas correctement et automatiquement le codage.
Vous pouvez dans certains cas forcer ce codage (e.g. dans emacs Options-Multilingual environment).

### exercice
la commande suivante permet de revenir dans le répertoire parent.
```bash
cd .. 
```

Complétez votre arborescence pour arriver à celle-ci.
```
folderA
  grapevine.txt
  grapevine2.txt
  folderAA
    toto.txt
    titi.txt
folderB
    toto.txt
folderC
    tata.txt
```

NB. vous pouvez le faire sans utiliser un éditeur ni un logiciel de naviguation de fichier graphique. Seulement en ligne de commande.

La commande 

```bash
man
```
permet d'avoir accès au manuel.

testez par exemple

```bash
man ls
```
lisez cette documentation pour chercher l'option qui permet un affichage récursif.


**Correction Indicative**

```bash
mkdir folderA
mkdir folderB
mkdir folderC
cd folderA/
touch grapevine.txt
mkdir folderAA
cd folderAA/
touch toto.txt
touch titi.txt
cd ../
cd ..
cd folderB
touch toto.txt
cd ..
cd folderC/
touch tata.txt
cd ..
ls -R
history | cut -c 8-
```

NB. la dernière commande permet d'enlever les numéros de l'historique. 
    Le | (on dit pipe) permet d'envoyer le résultat de history dans la commande cut.
    La commande cut avec ces options permet d'enlever le numéro de l'historique.
    C'est d'ailleurs avec cette commande que j'ai fabriqué la correction indicative ci-dessus.
    
### exercice

Dans un second temps vous pouvez créer un lien / ou créer un raccourci avec votre système de naviguation de fichier graphique (probablement nautilus sous ubuntu) de grapevine.txt dans le répertoire folderC.

Vous pouvez aussi vous placer vous dans folderC et écrire en ligne de commande
```bash
ln -s ../folderA/grapevine.txt
```

Selon votre configuration en revenant en arrière et en faisant à nouveau un ls avec l'option permettant l'affichage récursif vous allez voir le nom du grapevin.txt sous une couleur différente de l'original.

Nous allons d'abord chercher dans le manuel ce que fait l'option -l de ls
```bash
man ls
```
puis nous allons tester sur notre lien en faisant
```bash
ls -l
```

Je n'ai pas traité en cours les parties ci-dessous.
Vous pouvez ouvrir chaque section en cliquant sur le triangle.

<details><summary>Zoom sur les briques élémentaires du système de fichier</summary>
<p>



### exercice 

L'arbre de notre système de fichier est fabriqué à partir de 2 éléments.
    1. une feuille de l'arbre = des données stockées à une certaine adresse dans la mémoire
    2. un noeud interne de l'arbre = des données stockées à une certaine adresse dans la mémoire qui associe un nom (de fichier ou de répertoire) à un élément de type 1. ou 2. identifiable par le système. En gros le fichier correspondant à un répertoire est une sorte de *livret de famille*.
    
En pratique, le système utilise une structure de donnée particulière à la fois pour les fichiers et les répertoires (puisqu'il s'agit dans les deux cas de fichiers) qui s'appelle un [inode](https://en.wikipedia.org/wiki/Inode).


En pratique vous pouvez utiliser l'option suivante pour affichier les numéros des inode.
```bash
ls -i
```

### exercice pour aller encore plus loin
Nous avons évoqué les liens symboliques qui sont des raccourcis.
Littéralement c'est juste un fichier texte un peu spécial qui contient comme données la chaîne de caractère du fichier vers lequel on pointe.

Donc quand on a fait ci-dessus.
```bash
ln -s ../folderA/grapevine.txt
```
On a fabriqué un fichier raccourci spécial qui contient essentiellement l'information
```bash
../folderA/grapevine.txt
```
Si vous utilisez la même commande mais en omettant l'option -s vous êtes en train de définir un nouveau nom pour l'inode du fichier grapevine.txt

Donc la métaphore de l'arbre n'est pas tout à fait correcte puisque par plusieurs chemins dans les répertoires il est possible d'atteindre le même fichier.

La commande de suppression de fichier rm (pour remove) ne supprime pas vraiment l'inode, elle va juste effacer le nom du fichier (et la référence vers l'inode associé à ce nom) dans le répertoire.

[Détails sur stackoverflow](https://stackoverflow.com/questions/185899/what-is-the-difference-between-a-symbolic-link-and-a-hard-link)

NB. Je n'ai pas testé sous WSL puisque je n'ai pas windows. Il serait amusant de regarder ce qui arrive aux fichiers linux avec plusieurs noms quand on les regarde en vue détaillée dans l'explorateur de fichier de windows. A priori NTFS a une notion compatible

</p>
</details>


### Commandes utilisées jusqu'à présent
```bash
mkdir
cd
touch
ls
ln
```

<details><summary>Manipuler du texte avec la commande tr</summary>
<p>

## Manipulation de fichier

Pour simplifier un texte, par exemple pour l'indexer ou pour normaliser un nom dans une base de données il est fréquent qu'on bascule un mot en majuscule.
Nous allons travailler avec la commande tr qui permet de faire de tel changement caractère par caractère.
Par exemple ceci permet de transformer les minuscules en majuscule.

```bash
tr '[a-z]' '[A-Z]' 
```
La commande tr attend un flux textuel en entrée et transmet un flux textuel en sortie. 
On parle de filtre pour ce genre de commande.
On ne peut pas a priori lui passer de fichier en paramètre.
Il faut *rediriger* le contenu du fichier vers la commande.

```bash
tr '[a-z]' '[A-Z]' < grapevine.txt
```
Par défaut le résultat apparaît à l'écran.

On peut rediriger ce résultat dans un fichier en utilisant >

```bash
tr '[a-z]' '[A-Z]' < grapevine.txt > grapevineUp.txt
```
Vous pouvez consulter le contenu d'un fichier directement en utilisant la commande more
```bash
more grapevineUp.txt
```
Attention toutefois avec > car le contenu du fichier si il existe est écrasé.

Il existe une variante utile >> qui écrit à la fin du fichier.
C'est utilisé par exemple pour créer des fichiers de log.

### exercice

Redirigez le résultat de la commande history dans un fichier de sauveguarde myFirstDayWithTheCommandLine.txt.


```bash
history > myFirstDayWithTheCommandLine.txt
```
Vous pouvez consulter ce fichier en utilisant more.

Vous pouvez voir le haut du fichier en faisant head, la fin du fichier en faisant tail.

## Code de césar

Cherchez à appliquer le code de césar (rot13) à un fichier contenant du texte non accentué (i.e. ascii historique).

Envoyez le par mail à votre voisin.

Ce dernier doit le décoder.

```bash
tr '[A-Z]' '[N-ZA-M]'
```
</p>
</details>


## droit d'accès

chmod

Il s'agit de la commande permettant de changer les droits pour un fichier.


## Bonus : jouons avec le pipe

1. installer fortune
1. installer cowsay

```bash
echo moooooo | cowsay
```


```bash
fortune
```


```bash
fortune | cowsay
```

## Bonus : sl

1. installer sl (dans le terminal de votre collègue quand il va boire un café)
1. demandez lui de vous montrer comment ls fonctionne très rapidement (il va probalement écrire sl au lieu de ls à un moment)




