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 :

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.

../_images/misc-04-docker-fig-01.drawio.png

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.

Installation de VS Code

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:

  • 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.

Installation de Git

Installer Git sur votre machine hôte en suivant les instructions de la documentation officielle :

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 push pour 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 ?
      1. Compresser les fichiers avant leur transfert

      1. Authentifier les machines et protéger les communications grâce au chiffrement

      1. Accélérer la connexion Internet

      1. 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 ?
      1. La clé privée

      1. La clé publique

      1. Les deux clés

      1. Aucun des deux

  • Pourquoi la clé privée ne doit-elle jamais être transmise au serveur lors d’une authentification SSH ?
      1. Parce qu’elle est trop volumineuse

      1. Parce que seule la clé publique est utilisée pour vérifier que le client possède bien la clé privée correspondante

      1. Parce que le serveur la possède déjà

      1. 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 ?
      1. Rien de particulier

      1. La connexion devient plus rapide

      1. Il risque de faire confiance à un attaquant qui se fait passer pour le serveur légitime

      1. Sa clé privée est automatiquement envoyée au serveur

  • Dans une authentification par clé publique, laquelle des affirmations suivantes est correcte ?
      1. La clé privée est envoyée au serveur pour être comparée.

      1. Le serveur vérifie que le client possède la clé privée correspondant à la clé publique enregistrée.

      1. Le serveur génère une nouvelle paire de clés à chaque connexion.

      1. 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 ?
      1. Elle permet de se connecter automatiquement sans saisir de mot de passe à chaque fois (si la clé est acceptée).

      1. Elle supprime le chiffrement des communications.

      1. Elle ne nécessite plus de compte utilisateur sur le serveur.

      1. 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.

SSH keys

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.

Cloner le repo

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 travail e3-programmation-labs-student ;

  • Sélectionner Reopen in Container pour 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.

Premier programme C (sans IA)

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 !
Premier programme Python (sans IA)

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 !
Synchronisation avec le repo distant

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 commande

  • Pour compiler le code C enregistré dans le fichier program.c, on utilise la commande

  • Pour 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 -m de la commande permet de spécifier un message explicatif

  • Pour 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