CAPES NSI – Préparer l’épreuve Python du CAPES informatique

CAPES NSI préparer l’épreuve de programmation Python. Cet article fait suite aux quatre premières parties qu’il est possible de consulter ici et vous permettre de préparer le CAPES informatique :

CAPES NSI Python

CAPES NSI Introduction

Je traite ici des bases du langage Python pour l’apprendre rapidement. En France ces bases sont enseignées en lycée aux classes de seconde SNT, première et terminale NSI. Elles font également partie du programme de connaissance pour le CAPES Informatique.

Regroupement de fonctions :

Un module est un fichier qui contient un ensemble de fonctions que vous souhaitez inclure dans votre application.

Exemple fichier monmodule.py :

def salutations(nom):
  print("Salut " + nom)

Utilisation du module dans un programme Python :

import monmodule

monmodule.salutations("Sébastien")

Renommer le module :

import monmodule as mod

mod.salutations("Daniel")

La fonction dir est une fonction intégrée pour répertorier tous les noms de fonction (ou noms de variable) dans un module.

import platform

res = dir(platform)
print(res) 

Il est possible de n’importer que des parties d’un module, en utilisant le mot-clé from.

from monmodule import salutations

salutations("Jean")

Packages :

Les packages permettent une structuration hiérarchique de l’espace de noms du module.

Les packages aident à éviter les collisions entre les noms de modules.

La création d’un package est assez simple, car elle utilise la structure en répertoire du système d’exploitation.

Si on considère un répertoire nommé pkg qui contient deux modules, module1.py et module2.py.

Le contenu des modules est:

def test():
    print('test module 1')

class Toto:
    pass
def test2():
    print('test module 2')

class Joe:
    pass

Avec cette structure, si le répertoire pkg est dans un emplacement où il peut être trouvé (càd un des répertoires contenus dans sys.path).

Il est possible de se référer aux deux modules (pkg.module1, pkg.module2) et de les importer :

import pkg.module1, pkg.module2

pkg.module1.test()
x = pkg.module2.Joe()

Valeurs aléatoires (random value) :

import random

print(random.random()) #Retourne un nombre décimal aléatoirement entre 0 et 1
print(random.randint(10,20)) #Retourne un entier dans l'écart défini
membre = ["Seb","Jean","Louise"]
print(random.choice(membre)) #Retourne un élément de la liste aléatoirement

CAPES NSI – Liens Externes :

https://www.python.org/

https://fr.wikibooks.org/wiki/Programmation_Python

CAPES NSI Python – Liens Internes :

https://128mots.com/index.php/2021/01/26/ordinateur-quantique-prix/

https://128mots.com/index.php/category/python/

Python les bases en plus de 128 mots [Partie 3]

Cet article fait suite aux deux premières parties qu’il est possible de consulter ici :

Je traite ici des bases du langage Python pour l’apprendre rapidement. En France ces bases sont enseignées en lycée aux classes de seconde SNT, première et terminale NSI. Elles font également partie du programme de connaissance pour le CAPES NSI.

Tuples :

Un tuple est une collection ordonnée comme les listes et immuable (qui ne change pas).

exempleTuple = ("pomme", "poire", "fraise")
print(exempleTuple)
print(exempleTuple[1])
print(exempleTuple[-1]) #L'indexation négative signifie à partir de la fin, -1 se réfère au dernier élément, -2 se réfère à l'avant-dernier élément, etc.
print(exempleTuple[1:2]) #Vous pouvez spécifier une plage d'index en spécifiant par où commencer et où terminer la plage.
z = list(exempleTuple) #conversion tuple en liste
z[1] = "banane" 
x = tuple(z) #conversion liste en tuple

for x in exempleTuple: #Boucle sur un tuple
  print(x) 

if "poire" in exempleTuple: #test d'existence dans un tuple
  print("Oui") 

Unpacking :

coordonnees = (1,2,3)
x,y,z = coordonnees
print(x)

Dictionnaires :

Un dictionnaire est une collection non ordonnée, modifiable et indexée.

client = {
   "nom": "Elodie",
   "age": "45",
   "annee": 1980
 }

print(client["age"])
client["nouvelleCle"] = "nouvelleValeur" #ajoute une nouvelle clé et valeur
client.get("solde") #renvoi 'None' car la clé n'existe pas

Fonctions :

Les fonctions permettent d’organiser le code en morceau réutilisables. En Python, une fonction est définie à l’aide du mot clé def.

def exemple_fonction():
  print("TestFonction")

exemple_fonction()

Les données peuvent être passées aux fonctions en tant que paramètre. Vous pouvez ajouter autant de paramètres que vous le souhaitez, il suffit de les séparer par une virgule.

def exemple_fonction(prenom):
  print("Bonjour " + prenom)

exemple_fonction("John")
exemple_fonction("Pierre")

Python les bases en plus de 128 mots [Partie 2]

Cet article fait suite à la première partie qu’il est possible de consulter ici : https://128mots.com/index.php/2019/12/04/python-les-bases-capes-nsi-snt-en-plus-de-128-mots/

Comme pour le premier article, je traite ici des bases du langage Python pour l’apprendre rapidement. En France ces bases sont enseignées en lycée aux classes de seconde SNT, première et terminale NSI. Elles font également partie du programme de connaissance pour le CAPES NSI.

Priorité des opérateurs :

Je récapitule la priorité des opérateurs en Python, de la priorité la plus haute à la priorité la plus basse

  • Parenthèses () : groupement d’opérations
  • Exposant : x ** y
  • Multiplication, multiplication de matrice, division, division entière, modulo : *, @, /, //, %
  • Addition, soustraction : +, –

Fonctions mathématiques :

import math
  • math.ceil(2.6) entier supérieur
  • math.floor(-5.3) partie entière, donne ici -8.0.
  • math.sqrt : racine carrée.
  • math.pow(5, 5) : 5 puissance 5.
  • math.exp(2) : fonction exponentielle.
  • math.log(2) : fonction logarithme
  • math.log(3, 2) : log en base 2.
  • math.factorial(4) : factorielle
  • math.fsum(L) : somme des éléments d’une liste
  • math.sin, math.cos, math.tan : fonctions trigonométriques
  • math.pi : pi
  • math.degrees(y) : conversion de radians en degrés
  • math.radians(y) : conversion de degrés en radians

Expressions conditionnelles :

Python s’appuie sur l’indentation pour définir la portée du code.

x = 100
y = 23
if x > y:
  print("x plus grand que y")
elif a == b:
  print("égalité")
else:
  print("y plus grand que x")

Chaines de caractères formatées (f-strings) :

import math
print(f'La valeur de pi est {math.pi:.3f}.')

Listes à deux dimensions (matrices) :

matrix = [[1, 2, 3], [4,5, 6], [7, 8, 9]]
print(matrix[0][1])

Méthodes sur les listes :

list.append('n') #Ajoute un élément en fin de liste
list.insert(0,'a') #Ajoute un élément à la position spécifiée
liste.pop(1) #Enleve l'élément de la liste à la position spécifiée
liste.sort() #Trie la liste
liste.reverse() #Retourne la liste
liste.copy()   #retourne une copie de la liste

Tri fusion Python – implémentation de l’algorithme

Le tri fusion suit le paradigme diviser pour régner qui consiste à diviser la tâche initiale en deux tâches similaires plus petites. Cet article présente une implémentation du tri fusion python.

Le tri fusion suit le paradigme diviser pour régner qui consiste à diviser la tâche initiale en deux tâches similaires plus petites. Cet article présent une implémentation du tri fusion python.

Introduction

L’algorithme est le suivant :
Diviser en deux moitiés la liste à trier.
On trie chacune d’entre elles.
Fusionner les deux moitiés obtenues pour reconstituer la liste triée.

On applique récursivement cet algorithme c’est à dire jusqu’à ce que la liste à trier soit constituée d’un seul élément.

tri fusion python
Tri fusion (source : wikipedia)
#Tri fusion fonction de division du tableau
def tri_fusion(tableau):
    if  len(tableau) <= 1: 
        return tableau
    pivot = len(tableau)//2
    tableau1 = tableau[:pivot]
    tableau2 = tableau[pivot:]
    gauche = tri_fusion(tableau1)
    droite = tri_fusion(tableau2)
    fusionne = fusion(gauche,droite)
    return fusionne


#Tri fusion fonction de fusion de 2 listes
def fusion(tableau1,tableau2):
    indice_tableau1 = 0
    indice_tableau2 = 0    
    taille_tableau1 = len(tableau1)
    taille_tableau2 = len(tableau2)
    tableau_fusionne = []
    while indice_tableau1<taille_tableau1 and indice_tableau2<taille_tableau2:
        if tableau1[indice_tableau1] < tableau2[indice_tableau2]:
            tableau_fusionne.append(tableau1[indice_tableau1])
            indice_tableau1 += 1
        else:
            tableau_fusionne.append(tableau2[indice_tableau2])
            indice_tableau2 += 1
    while indice_tableau1<taille_tableau1:
        tableau_fusionne.append(tableau1[indice_tableau1])
        indice_tableau1+=1
    while indice_tableau2<taille_tableau2:
        tableau_fusionne.append(tableau2[indice_tableau2])
        indice_tableau2+=1
    return tableau_fusionne

tableau = [11, 222, 3, 899, 24, 5, 46, 67]
print(tableau)
tableau_trie = tri_fusion(tableau)
print(tableau_trie)

A propos de tri fusion

Enfin, Le tri fusion fonctionne par comparaison. La complexité de l’algorithme pour n entrée est n log n, donc asymptotiquement optimal.

La technique est de diviser pour régner. Et l’algorithme fait principalement une opération de fusion (deux listes triées peuvent être fusionnées en temps linéaire).

Tri fusion python : liens externes

https://www.geeksforgeeks.org/merge-sort/

http://lwh.free.fr/pages/algo/tri/tri_fusion.html

https://pixees.fr/informatiquelycee/n_site/isn_algo_diviser_pour_regner.html

https://fr.wikipedia.org/wiki/Tri_fusion

https://graal.hypotheses.org/tag/algorithme-de-wagner-fischer

https://fr.wikipedia.org/wiki/Algorithme_de_Wagner-Fischer

https://fr.wikipedia.org/wiki/Distance_de_Levenshtein

https://medium.com/@sddkal/wagner-fischer-algorithm-be0d96893f6d

https://www.python-course.eu/levenshtein_distance.php

Liens internes sur les algorithmes

https://128mots.com/index.php/category/python/

https://128mots.com/index.php/category/graphes/

https://128mots.com/index.php/2020/02/17/lalgorithme-de-dijkstra-dans-un-graphe-pondere-et-oriente-en-plus-de-128-mots/

Pour calculer la distance de Levenshtein avec un algorithme non récursif. On utilise une matrice qui contient les distances de Levenshtein. Alors Ce sont les distances entre tous les préfixes de la première chaîne et tous les préfixes de la seconde chaîne de caractères.

Edu python – Tutorial pour apprendre le Python

Edu python tutorial pour apprendre le python : En python tout est objet. Un objet est un morceau de code qui est caractérisé par :Des données, des Méthodes : Ce sont des mécanismes pour manipuler les données.

Edu python

Introduction Edupython

Création de l’objet

Un objet de type chaine de caractère est créé dans l’espace des objets via le caractère ” ou ‘.

Les appels de méthode se font via un point :

'hello'.upper()

Un nom de variable permet de stocker une référence à l’objet :

compteur = 1

La variable qui s’appelle compteur référence l’objet 1

En python le nom de variable contient des lettres et des chiffres mais ne peut commencer par un chiffre. Une bonne pratique est de donner un bon nom de variable.

Exemple :

ma_variable = 5

Déréférencement :

ma_variable = 'HELLO'

Python est langage à typage fort, le type est lié à l’objet et non à la variable.

del ma_variable

La commande del supprime la variable de l’espace des variables. Si l’objet n’a plus de référence un mécanisme de libération de la mémoire s’active : le garbage collector.

Edu python – Liens internes :

https://128mots.com/index.php/category/python/

https://128mots.com/index.php/2021/01/19/levenshtein-python/

edu python – Liens externes :

https://www.python.org/

https://openclassrooms.com/fr/courses/4262331-demarrez-votre-projet-avec-python

Exemple d’alorithme python :

Voici l’implémentation en python de l’algorithme de Wagner & Fischer (Wagner-Fischer). Il permet de calculer la distance de Levenshtein (distance entre deux chaines de caractères).

Premièrement le but de l’algorithme est de trouver le coût minimal. Coût minimal pour transformer une chaîne en une autre. Alors une fonction récursive permet de retourner le nombre minimal de transformation. Et pour transformer une sous-chaine de A avec n caractères en une sous-chaine de B avec le même nombre de caractères. La solution est donnée. Il faut calculer la distance entre les 2 lettres à la même position dans la chaine A et B. Alors Soit les lettres et la lettre précédentes sont identiques. Soit il y a une différence et dans ce cas on calcule 3 côuts. Alors le premier est de supprimer une lettre le la chaine A. Et d’insérer une lettre dans la chaine A pour substituer une lettre de la chaine A. Alors On peut alors trouver le cout minimal.

import numpy as np
def levenshtein(chaine1, chaine2):
    taille_chaine1 = len(chaine1) + 1
    taille_chaine2 = len(chaine2) + 1
    levenshtein_matrix = np.zeros ((taille_chaine1, taille_chaine2))
    for x in range(taille_chaine1):
        levenshtein_matrix [x, 0] = x
    for y in range(taille_chaine2):
        levenshtein_matrix [0, y] = y
    for x in range(1, taille_chaine1):
        for y in range(1, taille_chaine2):
            if chaine1[x-1] == chaine2[y-1]:
                levenshtein_matrix [x,y] = min(
                    levenshtein_matrix[x-1, y] + 1,
                    levenshtein_matrix[x-1, y-1],
                    levenshtein_matrix[x, y-1] + 1
                )
            else:
                levenshtein_matrix [x,y] = min(
                    levenshtein_matrix[x-1,y] + 1,
                    levenshtein_matrix[x-1,y-1] + 1,
                    levenshtein_matrix[x,y-1] + 1
                )
    return (levenshtein_matrix[taille_chaine1 - 1, taille_chaine2 - 1])
print("distance de levenshtein = " + str(levenshtein("Lorem ipsum dolor sit amet", "Laram zpsam dilir siy amot")))

Le langage Python en moins de 128 mots

Python est un langage de programmation qui est caractérisé par :

  • sa lisibilité : La syntaxe du langage est articulé sur la présentation (importance de l’indentation)
  • Pragmatique : L’objectif est de faire des programmes efficaces qui contiennent le moins de lignes de code possible.

Il est également facile d’accès, on peut ainsi facilement échanger avec d’autre programmeur.

La première version de python date de 1994, Python 3 date de 2008. Le langage est stable puisque les anciennes versions du langages continuent d’être maintenue (mise à jour).

Python est portable, il fonctionne sur la plupart des plateformes (mobile, PC, MAC, Linux …), il y a beaucoup de librairies disponibles.

Python est sous licence PSF, le débat sur les évolutions est démocratique et sont soumises au créateur du langage Guido Van Rossum.

Couplage dans un Graphe en moins de 128 mots

Un couplage est un ensemble d’arête deux à deux indépendantes : elle ne partagent pas de sommets.

Exemple de couplage dans un graphe : les 2 arrêtes rouges ne partagent pas de sommets (2 à 2 indépendantes)

Couplage parfait : Chaque sommet du graphe est dans exactement une arrête du couplage

Exemple de couplage parfait dans un graphe

Un graphe parfait a un nombre pair de sommets (la réciproque n’est pas vraie)

Un couplage parfait est un couplage de taille maximale (impossible à agrandir, on ne peut pas coupler plus), la réciproque n’est pas vraie.

Exemple de couplage maximal mais pas de taille max (càd il est possible de faire par exemple un couplage avec 3 arrêtes)

Exemple d’utilisation : Dans une entreprises logistique les salariés ont un ou plusieurs permis leur permettant de rouler un certain type de véhicule. On peut représenter le problème dans un graphe avec comme sommet les salariés et les véhicules de l’entreprise. Pour résoudre le problème il faut alors trouver un couplage de taille max.

Algorithme glouton pour trouver un couplage maximal :

Etape 1 : On sélectionne une arrête aléatoirement et on la mémorise dans une copie du graphe (à gauche)

Sélection de l’arrête

Etape 2 : On supprime les arrêtes qui sont incidentes aux deux sommets et on sélectionne une autres arrête aléatoirement

Etape 3 : On supprime les arrêtes qui sont incidentes aux deux sommets, on obtient alors un couplage maximal

Le Web expliqué en moins de 128 mots

Internet est un réseau informatique, le Web est un réseau d’information qui sont reliées entre elles par l’hypertexte.

Le serveur Web fournit les informations quand on lui demande : des requêtes qui sont faites par des clients Web.

Le navigateur permet de consulter les informations, il envoie une requête HTTP sur le réseau internet.

Le moteur de recherche répond par une liste d’url. Les pages Web contiennent du code HTML décrit la structure et le contenu du document. La feuille de style CSS contient la mise en forme du code.

Le navigateur interprète HTML et CSS et l’affiche lisible par l’internaute. Les Robots du moteur de recherche sont appelés des « araignées » il parcourt les pages Web et leurs liens : ils font du crawl de site web.

Glossaire sur les graphes en un peu plus de 128 mots

source wikipedia : Graphe non orienté

Graphe (Graph) : Un ensemble de point reliés entre eux

Sommets (vertices, a vertex) : Les points d’un graphe s’appellent des sommets
Sommets adjacents (adjacent vertices) : Deux sommets sont adjacents si ils sont reliés entre eux
Arête (edge) : La liaison entre deux sommets s’appelle une arête si la relation entre deux sommet n’est pas orientée (pas de notion de précédence, ou d’ordre dans lequel on visite les deux sommets).

source wikipedia : graphe orienté


Arc (arc): La liaison orientée entre deux sommet (c’est une flèche qui indique le sens de la relation orientée, il y a une notion d’ordre d’exécution et de contrainte pour visiter les deux sommets)
Le degré d’un sommet (the degree of a vertex) : Nombre d’arêtes qui partent d’un sommet.
Ordre d’un graphe (order of a graph) : Le nombre de sommet dans un graphe.
Graphe Connexe (connected graph) : Un graphe est connexe si tous les sommets sont reliés par une chaine quelconque.
Chaine Eulerienne (eulerian path) : Une chaine qui prend toutes les arêtes une seule fois du graphe.


Matrice d’adjacente : La matrice d’adjacence d’un graphe est une matrice dont les lignes et les colonnes sont toutes deux indexées par les sommets du graphe, avec un 1 dans la cellule pour la rangée i et la colonne j lorsque les sommets i et j sont adjacents, et un 0 sinon.

source wikipedia : matrice d’adjacence

CookieViz téléchargement, installation et utilisation

CookieViz est outil de visualisation qui permet de mesurer l’impact des cookies lors de votre propre navigation.

https://linc.cnil.fr/fr/cookieviz-une-dataviz-en-temps-reel-du-tracking-de-votre-navigation

Introduction – Installer et utiliser CookieViz

La page est git est https://github.com/LINCnil/CookieViz

J’installe MAMP : https://www.mamp.info/en/downloads/

MAMP est une compilation de logiciels gratuits open source permettant de gérer des sites Web dynamiques sur des ordinateurs exécutant macOS ou Windows : Apache, le serveur Web; MySQL, le système de gestion de base de données; et PHP, Perl ou Python, langages de programmation utilisés pour le développement Web.

Installer Homebrew : Homebrew est un système de gestion logiciel gratuit open source qui simplifie l’installation de logiciels sur le système d’exploitation macOS d’Apple et Linux.

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Le script demande de passer en mode superutilisateur via la commande sudo et demande de taper le mot de passe à plusieurs reprise.

A la fin de l’installation on obtient ==> Installation successful!

J’installe mitmdump qui est dans le paquet mitmproxy

brew install mitmproxy

Valider l’installation en tappant mitmdump –version

mitmdump --version
 Mitmproxy: 4.0.4
 Python:    3.7.5
 OpenSSL:   OpenSSL 1.1.1d  10 Sep 2019
 Platform:  Darwin-17.7.0-x86_64-i386-64bit

Démarrage de CookieViz

Je démarre MAMP et non MAMP PRO qui est payant

J’obtiens la page d’accueil de mon serveur Web Apache qui est démarré sur le port 8888 par défaut je peut l’atteindre en tapant localhost:8888 comme url dans mon navigateur.

Si je vais dans le menu MAMP > Preferences je peux modifier les ports utilisés.

j’ai téléchargé depuis le source github de cookieViz https://github.com/LINCnil/CookieViz via le lien Clone and download. Il est aussi possible de démarrer un terminal et de se placer à la racine du serveur WEB Apache.

Par défaut la racine est dans /Applications/MAMP/htdocs/ mais vous pouvez la modifier via l’interface graphique MAMP

cd /Applications/MAMP/htdocs/
git clone https://github.com/LINCnil/CookieViz.git

Démarrer CookieViz

Par défaut l’utilisateur par défaut de la base de donnée est “root” et le mot de passe “root”
Pour changer le mot de passe par defaut :
https://documentation.mamp.info/en/MAMP-Mac/How-Tos/Change-the-password-of-the-MySQL-root-user/
/Applications/MAMP/Library/bin/mysqladmin -u root -p password

Ajout d’un utilisateur phpmyadmin > mysql > user ‘ajouter un utilisateur’ onglet Comptes utilisateurs

J’ai ajouté un user ‘cookvi’ avec mot de passe ‘cookvi’

J’ai édité le fichier settings.inc via un editeur de texte ou la commande nano

/**
 * The database server used by CookieViz.
 * Default is 'localhost' and should be fine for most cases.
 * If 'localhost' doesn't work and the database runs locally, try '127.0.0.1'.
 */
define('DB_SERVER', '127.0.0.1:8889');

...

define('DB_USER', 'cookvi');

/**
 * The password of the CookieViz database user.
 */
define('DB_PASSWD', 'cookvi');

J’ai ensuite édité le fichier nano monitor_mitmdump.php du répertoire /soft

cd /Applications/MAMP/htdocs/CookieViz/soft/
nano monitor_mitmdump.php 

je suis allé dans http://localhost:8888/phpmyadmin/ et j’ai créé une nouvelle base CookieViz

J’ai cliqué sur la base de donnée créée et j’ai utilisé la fonction “importer” et j’ai chargé le fichier /Applications/MAMP/htdocs/CookieViz/cookieviz/sql/url_referer-1.sql qui contient la structure de table

// Edit the four values below
$PROXY_HOST = “localhost”; // Proxy server address
$PROXY_PORT = “8082”; // Proxy server port
$PROXY_USER = “”; // Username
$PROXY_PASS = “”; // Password

CookieViz – Modification pour compatibilité php5 et php7

CookieViz est compatible php5 et non phpt7 il faut prévoir des changement dans le code :

Remplacement de :

$link = mysql_connect('localhost', '', '') par $link = mysqli_connect('127.0.0.1:8889', 'cookvi', 'cookvi','CookieViz') 
mysql_select_db('CookieViz') par mysqli_select_db($link,'CookieViz')
mysql_error() par mysqli_connect_error()
mysql_query($query) par mysqli_query($link, $query)
mysql_fetch_assoc($result) par mysqli_fetch_assoc($result) 
mysql_close($link) par mysqli_close($link)  

Démarrer un serveur mitmdump sur le port 8082 :
mitmdump -p 8082 -w mitmdump.log

Je lance maintenant le script php /Applications/MAMP/htdocs/CookieViz/soft/monitor_mitmdump.php

Au niveau de firefox je suis allé dans les préférence réseau dans les paramètre généraux et j’ai configuré le proxy

CookieViz installer et utiliser

On constate qu’on a des connexions qui passent par le proxy
Proxy server listening at http://*:8081
127.0.0.1:49915: clientconnect
127.0.0.1:49915: CONNECT www.youtube.com:443
<< Cannot establish TLS with client (sni: www.youtube.com): TlsException(“SSL handshake error: Error([(‘SSL routines’, ‘ssl3_read_bytes’, ‘sslv3 alert bad certificate’)])”)
127.0.0.1:49917: clientconnect
127.0.0.1:49915: clientdisconnect
127.0.0.1:49917: GET http://detectportal.firefox.com/success.txt
<< 200 OK 8b
127.0.0.1:49919: clientconnect
127.0.0.1:49920: clientconnect
127.0.0.1:49919: GET http://detectportal.firefox.com/success.txt?ipv4
<< 200 OK 8b
127.0.0.1:49920: GET http://detectportal.firefox.com/success.txt?ipv6
<< 200 OK 8b

Les résultats sont alors visualisables sur le serveur web http://localhost:8888/CookieViz/cookieviz/

Liens externes :

https://fr.wikipedia.org/wiki/Cookie_(informatique)

https://fr.wikipedia.org/wiki/Serveur_web

https://www.noodo-wifi.com/faq/cookie-informatique/

Liens internes :

https://128mots.com/index.php/category/sciences-numeriques-et-technologie/

https://128mots.com/index.php/category/nsi/

https://128mots.com/index.php/category/non-classe/