Installation et premiers pas
Suivre ce cours nécessite un environnement de travail opérationnel. Nous allons installer ici les outils nécessaires :
Docker Desktop pour disposer d’un environnement de travail reproductible ;
Visual Studio Code pour éditer les fichiers sources et les compiler/exécuter depuis le terminal intégré ;
Git pour la synchronisation dans le cloud.
Puis créer l’environnement de travail dans lequel nous allons écrire/exécuter nos programmes.
Docker
Docker est une technologie qui fournit un environnement de travail reproductible quelle que soit l’architecture de la machine hôte.
Note
La machine hôte est la machine physique sur laquelle on travaille. Cette machine fonctionne avec son propre système d’exploitation (Windows, Linux, macOS, etc.).
Un container Docker est une unité logicielle légère et portable qui fonctionne de manière identique quelle que soit la machine hôte sur laquelle il est déployé (Windows, Linux, macOS, cloud, etc.). Pour ce qui nous concerne, cette unité logicielle est un système d’exploitation Ubuntu sur lequel sont installés les outils nécessaires à l’apprentissage de l’informatique.
Les avantages de l’utilisation de containers sont nombreux :
isolation : chaque container s’exécute de manière isolée sans interférer avec le système hôte ;
portabilité : un container Docker peut être déployé sur n’importe quel système d’exploitation prenant en charge Docker ;
légereté : contrairement aux machines virtuelles, les containers partagent le noyau du système d’exploitation de l’hôte, ce qui les rend plus rapides et moins gourmands en ressources.
L’utilisation de containers Docker nécessite l’installation de Docker Desktop, l’application de gestion de Docker.
Installation de Docker Desktop
Installer Docker Desktop sur votre machine hôte en suivant les instructions de la documentation officielle :
Note
Pour les machines hôte Windows, activer le sous-système Windows pour Linux (WSL2) en suivant les instructions de Comment installer Linux sur Windows avec WSL.
Ensuite :
Pour les machines hôte Windows : Install Docker Desktop on Windows
Pour les machines hôte Linux : Install Docker Desktop on Linux
Pour les machines hôte macOS : Install Docker Desktop on macOS
Docker Desktop fonctionne sur une architecture client-serveur :
le client Docker, qui est l’interface en ligne de commande permettant d’interagir avec Docker dans un terminal et l’interface graphique ;
le daemon Docker, qui est le service responsable de la création et de l’exécution des containers ;
Note
Docker nécessite une distribution Linux pour fonctionner :
sur une machine hôte Windows, Docker Desktop fonctionne une distribution Linux (docker-destop) installée dans l’environnement WSL2 ;
sur macOS, Docker Desktop fonctionne également avec une machine virtuelle Linux ;
sur une machine hôte Linux, Docker Desktop fonctionne directement avec le noyau Linux.
Important
Quelle que soit l’architecture, Docker Desktop fournit une couche d’abstraction qui fonctionne de façon identique quelque soit le système d’exploitation.
Vérification de l’installation
Pour vérifier que Docker Desktop est correctement installé, dans un terminal de la machine hôte
$ docker --version
Docker version 29.6.1, build 8900f1d
$ docker info
Client:
Version: 29.6.1
Context: desktop-linux
Debug Mode: false
...
Lorsque les deux tests précédents sont concluants, on peut vérifier que Docker est capable de télécharger et d’exécuter un conteneur. dans un terminal
$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
4f55086f7dd0: Pull complete
d5e71e642bf5: Download complete
Digest: sha256:5e23090353324d887c48ad5e5c56d294eab81588df9605b07d1afe895f9cc8f8
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
Utiliser Docker
On lance un container Docker avec la commande docker run avec les options -it et le nom de l’image à exécuter. Par exemple, pour lancer un conteneur Ubuntu en mode interactif, on peut utiliser la commande suivante dans un terminal de la machine hôte
$ docker run -it --name myubuntu ubuntu:latest
Ce que fait cette commande :
docker run: crée et démarre un conteneur.-it: active le mode interactif avec un terminal (i = interactif, t = terminal).--name myubuntu: donne un nom au conteneur (optionnel)ubuntu:latest: télécharge l’image officielle d’Ubuntu depuis le Docker Hub (si elle n’est pas déjà présente sur le disque) et la lance.
Comme c’est une image Ubuntu minimale, les outils habituels comme Python ou Git ne sont pas installés de base. Vous devez utiliser apt pour les installer
# apt update # mettre à jour le gestionnaire de paquets
# apt install -y python3 # installer Python 3
On peut ensuite vérifier que Python fonctionne correctement dans le conteneur
# python3 --version
Pour sortir du conteneur et retourner dans le terminal de la machine hôte
# exit
Pour vérifier que le conteneur existe toujours (à l’arrêt)
$ docker ps -a
Pour supprimer le conteneur et nettoyer votre machine
$ docker rm myubuntu
Tout ce qui a été installé est effacé avec le conteneur, laissant votre machine hôte parfaitement propre.
Note
Pour les exercices et les labs de ce cours, vous utiliserez un conteneur Docker préconfiguré avec tous les outils nécessaires. Vous n’aurez donc pas besoin d’installer quoi que ce soit dans le conteneur.
Test de connaissances
Un container Docker est une unité logicielle et portable.
Contrairement aux machines virtuelles, les containers partagent le de l’hôte.
Les trois avantages principaux des containers Docker sont l’isolation, la et la légereté.
La commande pour vérifier que Docker est correctement installé est .
La commande pour vérifier que Docker fonctionne est .
VS Code
VS Code est un environnement de développement intégré (IDE) qui permet d’éditer, compiler et exécuter du code source dans de nombreux langages de programmation. Il est disponible pour Windows, Linux et macOS.
Installer VS Code sur votre machine hôte en suivant les instructions de la documentation officielle Download Visual Studio Code
Installer les extensions suivantes :
Vérifier que VS Code est correctement installé en lançant la commande code --version dans un terminal de la machine hôte. La version de VS Code doit s’afficher.
Pour profiter de la puissance de Visual Studio Code, consulter la documentation, et en particulier:
la description de l’interface utilisateur ;
la liste des raccourcis clavier pour Windows, Linux et MacOS.
VS Code est un environnement de développement intégré ou .
L’extension permet d’éditer et déboguer du code Python dans VS Code.
L’extension fournit un analyseur statique avancé pour Python.
La commande pour vérifier que VS Code est installé est .
Git
Git est un système de contrôle de version distribué qui permet d’enregistrer l’historique des modifications d’un projet. Son utilisation conjointe avec GitHub/Gitlab permet de disposer d’un espace de stockage dans le cloud. Cet environnement sera utilisé pour évaluer les travaux pratiques.
Installer Git sur votre machine hôte en suivant les instructions de la documentation officielle :
Pour une machine hôte Windows : Install Git on Windows
Pour une machine hôte Linux : Install Git on Linux
Pour une machine hôte macOS : Install Git on macOS
Vérifier que Git est correctement installé en lançant la commande git --version dans un terminal de la machine hôte. La version de Git doit s’afficher.
Synchronisation des repos local et distant
L’intérêt de Git est de pouvoir synchroniser un repo local avec un repo distant. Le repo local est celui qui est sur la machine hôte, le repo distant est celui qui est dans le cloud (GitLab). La synchronisation permet de disposer d’une sauvegarde dans le cloud.
Les principales commandes Git utilisées dans ce cours sont :
git add .pour ajouter tous les fichiers du répertoire courant à l’index Git ;
git commit -m "message"pour enregistrer les modifications dans le repo local ;
git pushpour mettre à jour le repo distant avec les modifications locales.
Git est un système de contrôle de version .
GitHub et GitLab permettent de stocker les projets Git dans le .
La commande pour ajouter des fichiers à l’index Git est .
Un repository Git est un espace de stockage pour les modifications d’un projet.
Les labs
Ce cours est accompagné de labs qui permettent de mettre en pratique les concepts abordés. Ces labs sont disponibles dans un repo hébergé sur le serveur GitLab de l’ESIEE.
Forker le repo des labs
Forker un repo c’est copier un repo existant sur Gitlab pour en créer une copie parfaite dans son espace GitLab personnel. Il s’agit ici de créer une copie du repo commun dans votre espace GitLab personnel pour pouvoir travailler dessus sans interférer avec les travaux des autres étudiants, ni avec le repo commun.
Connectez vous sur https://git.esiee.fr/ avec vos identifiants ESIEE
Ouvrez le repo https://git.esiee.fr/esiee-cs/e3-programmation-labs-student, faites un fork en renseignant les champs suivants :
Project name : e3-programmation-labs-student
Project URL : https://git.esiee.fr/<STUDENT-LOGIN>/e3-programmation-labs-student
Branches to include : All branches
Visibility level : Private
Fork project
Astuce
<STUDENT-LOGIN> représente ici le login ESIEE. Par exemple, l’élève Adam Labrosse a pour login labrossa et son repo est disponible à l’URL https://git.esiee.fr/labrossa/e3-programmation-labs-student
Vous disposez maintenant de votre propre repo GitLab dans votre espace personnel. C’est dans cet espace que vous allez travailler
SSH
Le workflow va nécessiter des échanges entre votre machine hôte et votre repo GitLab personnel. Pour cela, il est nécessaire de configurer un accès sécurisé entre les deux. C’est le rôle du protocole SSH (Secure SHell) qui permet d’authentifier les machines et de protéger les communications grâce au chiffrement.
- Quel est le rôle du protocole SSH dans les échanges entre votre machine hôte et GitLab ?
Compresser les fichiers avant leur transfert
Authentifier les machines et protéger les communications grâce au chiffrement
Accélérer la connexion Internet
Remplacer le protocole HTTP
- Lorsqu’un utilisateur génère une paire de clés SSH, quel fichier doit-il copier sur le serveur ou dans son compte GitLab ?
La clé privée
La clé publique
Les deux clés
Aucun des deux
- Pourquoi la clé privée ne doit-elle jamais être transmise au serveur lors d’une authentification SSH ?
Parce qu’elle est trop volumineuse
Parce que seule la clé publique est utilisée pour vérifier que le client possède bien la clé privée correspondante
Parce que le serveur la possède déjà
Parce qu’elle est recréée à chaque connexion
- Que se passe-t-il si un utilisateur accepte sans vérification la clé publique d’un serveur inconnu lors de la première connexion ?
Rien de particulier
La connexion devient plus rapide
Il risque de faire confiance à un attaquant qui se fait passer pour le serveur légitime
Sa clé privée est automatiquement envoyée au serveur
- Dans une authentification par clé publique, laquelle des affirmations suivantes est correcte ?
La clé privée est envoyée au serveur pour être comparée.
Le serveur vérifie que le client possède la clé privée correspondant à la clé publique enregistrée.
Le serveur génère une nouvelle paire de clés à chaque connexion.
Les clés publique et privée doivent être stockées sur le serveur.
- Quel est l’avantage principal d’une authentification SSH par paire de clés par rapport à une authentification uniquement par mot de passe ?
Elle permet de se connecter automatiquement sans saisir de mot de passe à chaque fois (si la clé est acceptée).
Elle supprime le chiffrement des communications.
Elle ne nécessite plus de compte utilisateur sur le serveur.
Elle permet à plusieurs utilisateurs de partager la même clé privée.
Pour bénéficier d’une connexion sécurisée entre votre machine hôte et votre repo GitLab personnel, il est nécessaire de générer une paire de clés SSH sur votre machine hôte et d’ajouter la clé publique dans votre compte GitLab.
Générer une paire de clés SSH sur votre machine hôte
Consulter Use SSH keys with GitLab dont un résumé est donné ci dessous.
Ouvrir un terminal Git Bash (Windows) ou bash (Linux) sur votre machine hôte et suivre les instructions ci dessous.
Astuce
Voilà un résumé des commandes à exécuter et leur signification. Le caractère ~ représente le répertoire racine de l’utilisateur
ls ~/.ssh # lister le contenu du répertoire ~/.ssh
mkdir -p ~/.ssh # créer le répertoire ~/.ssh s'il n'existe pas
cat ~/.ssh/id_ed25519.pub # afficher la clé publique si elle existe
ssh-keygen -t ed25519 # générer une nouvelle paire de clés SSH
Copier la clé publique dans votre compte GitLab
Il existe maintenant une paire de clés SSH sur votre machine hôte. L’étape suivante consiste à copier la clé publique dans votre compte GitLab. Un résumé de la procédure décrite dans Use SSH keys with GitLab est donné ci dessous.
Sign in to GitLab.
In the upper-right corner, select your avatar.
Select Edit profile.
In the left sidebar, select Access > SSH keys.
Select Add new key.
In the Key box, paste the contents of your public key
In the Title box, type a description, like Work Laptop or Home Workstation.
Vérifier la connexion SSH avec le serveur
Exécuter la commande suivante dans un terminal de votre machine hôte pour vérifier que la connexion SSH avec le serveur GitLab est opérationnelle
ssh -T git@git.esiee.fr
Lors de la première connexion, votre machine hôte ne connait pas le serveur et vous devez manuellement accepter la clé publique du serveur. Le message affiché dans le terminal est semblable à celui ci (le hostname, l’adresse IP et la clé seront ceux du serveur GitLab de l’ESIEE)
The authenticity of host 'git.esiee.fr (xxx.xxx.xxx.xxx)' can't be established.
ECDSA key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
Are you sure you want to continue connecting (yes/no)?
You should receive a welcome message.
Si la connexion SSH est opérationnelle, vous devez recevoir un message de bienvenue du serveur semblable à celui ci
Welcome to GitLab, @<STUDENT-LOGIN>!
Cloner le repo des labs dans votre espace personnel
Vous disposez à cette étape de votre propre repo dans votre espace personnel GitLab et d’une connexion SSH active. Il est maintenant nécessaire de le cloner sur votre machine hôte pour pouvoir travailler dessus. Pour cela, ouvrir un terminal sur la machine hôte, se placer dans le répertoire e3-programmation créé précédemment, puis exécuter la commande suivante
git clone git@git.esiee.fr:<STUDENT-LOGIN>/e3-programmation-labs-student.git .
Astuce
Si vous rencontrez des problèmes pour établir la connexion SSH avec le serveur GitLab, vous pouver utiliser le protocole HTTPS. Une authentification par mot de passe sera alors nécessaire.
git clone https://git.esiee.fr/<STUDENT-LOGIN>/e3-programmation-labs-student.git
L’environnement de travail est résumé dans le schéma ci dessous.
Important
Ce repo est susceptible d’être modifié par l’enseignant (ajout ou modification de labs) au cours du semestre. Vous en serez averti par un message du LMS. Pour récupérer les modifications, il faut établir la connexion entre le repo local et le repo upstream (une seule fois):
git remote add upstream https://git.esiee.fr/esiee-cs/e3-programmation-labs-student.git
puis, à chaque fois que vous voulez récupérer les modifications
git fetch upstream # récupérer les modifications du repo upstream
git merge upstream/main # fusionner les modifications dans le repo local
Validation de l’environnement
Pour vérifier que l’environnement de travail est opérationnel sur la machine hôte, nous allons écrire un premier programme simple dans les deux langages que nous allons utiliser dans ce cours.
Ouvrir VS Code sur la machine hôte :
File > Open Folder...puis sélectionner le répertoire de travaile3-programmation-labs-student;Sélectionner
Reopen in Containerpour lancer le container Docker. Cette opération peut prendre quelques minutes la première fois que le container est lancé, car il faut télécharger l’image Docker et installer les outils nécessaires. Les accès suivants sont plus rapides.
L’environnement de travail est prêt.
Il est nécessaire que VS Code soit démarré sur la machine hôte, pointe vers le répertoire e3-programmation-labs-student et que le container Docker soit lancé.
Créer un fichier exercices/hello.c et y placer le code source du programme C ci dessous.
1#include <stdio.h>
2
3int main(){
4 printf("Hello World !\n");
5 return 0;
6}
Dans un terminal, compiler et exécuter le programme pour vérifier que l’environnement de travail est opérationnel
$ gcc -std=c99 -Wall -Wextra hello.c -o hello
$ ./hello
Hello World !
Il est nécessaire que VS Code soit démarré sur la machine hôte, pointe vers le répertoire e3-programmation-labs-student et que le container Docker soit lancé.
Créer un fichier exercices/hello.py et y placer le code source du programme Python ci dessous.
1print("Hello World !")
Dans un terminal, exécuter le programme pour vérifier que l’environnement de travail est opérationnel
$ python3 hello.py
Hello World !
Il est nécessaire que VS Code soit démarré sur la machine hôte, pointe vers le répertoire e3-programmation-labs-student et que le container Docker soit lancé.
Les fichiers hello.c et hello.py ont été créés dans le repo local qui est donc « en avance » sur le repo distant (il contient des modifications qui ne sont pas sur le repo distant). Il est donc nécessaire de synchroniser ces deux repos.
Dans un terminal, depuis la racine du répertoire de travail, exécuter les commandes suivantes
$ git add . # ajouter tous les fichiers modifiés à l'index Git
$ git commit -m "add hello.c and hello.py" # enregistrer les modifications dans le repo local
$ git push
Vérifier que le repo distant est bien à jour en vous connectant sur votre compte GitLab et en ouvrant le repo e3-programmation-labs-student. Les fichiers hello.c et hello.py doivent être présents.
✨ Si vous rencontrez des difficultés, soumettez les messages d’erreur à l’IA.
Pour exécuter le code Python enregistré dans le fichier
program.py, on utilise la commandePour compiler le code C enregistré dans le fichier
program.c, on utilise la commandePour exécuter le programme généré à l’étape précédente on utilise la commande pour exécuter le programme compilé.
Pour ajouter des fichiers à l’index Git, on utilise la commande
Pour enregistrer les modifications dans le repo local, on utilise la commande
L’option
-mde la commande permet de spécifier un message explicatifPour mettre à jour le repo distant avec les modifications locales, on utilise la commande
Chaque modification importante doit être synchronisée avec le repo via
Sur Windows, pour disposer d’un vrai noyau Linux, il faut installer
Pour initialiser un répertoire de travail dans VS Code, on utilise
Pour afficher le terminal dans VS Code, on utilise