Compare commits
No commits in common. "main" and "doc-messagerie" have entirely different histories.
main
...
doc-messag
2
.obsidian/app.json
vendored
|
|
@ -8,4 +8,4 @@
|
|||
"alwaysUpdateLinks": true,
|
||||
"useMarkdownLinks": true,
|
||||
"newLinkFormat": "relative"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,702 +0,0 @@
|
|||
#!/bin/bash
|
||||
# Relève la fiche d'une machine, et l'envoie au serveur de l'install party.
|
||||
#
|
||||
# Ce script vit dans le dépôt du wiki, à côté d'install.sh : il est lu et
|
||||
# versionné comme lui, et c'est de là qu'il faut le prendre.
|
||||
#
|
||||
# wget https://gitea.alpinux.org/alpinux.cedrica5l/alpinux-wiki/raw/branch/main/code/linux/linux-mint/alpi-fiche.sh
|
||||
# chmod +x alpi-fiche.sh
|
||||
# sudo ./alpi-fiche.sh --check # depuis la session live, avant d'installer
|
||||
# sudo ./alpi-fiche.sh # après l'installation
|
||||
#
|
||||
# Sur le réseau de l'install party, plus court :
|
||||
#
|
||||
# wget http://10.0.0.1/alpi-fiche.sh && chmod +x alpi-fiche.sh && sudo ./alpi-fiche.sh --check
|
||||
#
|
||||
# Pourquoi la garder sur le serveur plutôt que sur le poste : trois semaines
|
||||
# plus tard, quand quelqu'un rappelle parce que « ça rame », on n'a plus la
|
||||
# machine sous la main. Savoir qu'elle a huit ans, quatre gigaoctets de
|
||||
# mémoire et un disque mécanique qui commence à réallouer des secteurs répond
|
||||
# à la question avant de l'avoir posée.
|
||||
#
|
||||
# Ce qui est envoyé : le modèle, le processeur, la mémoire, les disques et
|
||||
# leur santé, le système installé.
|
||||
#
|
||||
# Deux de ces champs touchent à la personne, et il faut le dire plutôt que de
|
||||
# prétendre le contraire — la première version de cet en-tête annonçait « rien
|
||||
# qui touche à la personne », ce qui était faux :
|
||||
#
|
||||
# · le NOM DE LA MACHINE, choisi pendant l'installation, contient très
|
||||
# souvent un prénom ;
|
||||
# · l'ADRESSE MATÉRIELLE de la carte réseau identifie durablement l'appareil.
|
||||
#
|
||||
# Les deux servent : le nom pour s'y retrouver, l'adresse pour rapprocher la
|
||||
# fiche du bail DHCP. Mais ils appartiennent à la personne dont on installe
|
||||
# l'ordinateur — il faut le lui dire. Ne sont en revanche jamais envoyés : son
|
||||
# nom d'utilisateur, ses fichiers, son historique, ni rien de ce qu'elle a
|
||||
# installé. Le numéro de série est tronqué à quatre caractères.
|
||||
#
|
||||
# alpi-fiche relève et envoie
|
||||
# alpi-fiche --montrer relève et affiche, sans rien envoyer
|
||||
# alpi-fiche --check relève, envoie, et rend un verdict
|
||||
#
|
||||
# Le mode « --check » est fait pour tourner **depuis la clé USB, avant
|
||||
# d'installer** : c'est le seul moment où l'on peut encore renoncer. Un disque
|
||||
# qui se déclare défaillant, on ne passe pas une heure à installer dessus — on
|
||||
# le dit à son propriétaire et on cherche une autre solution.
|
||||
|
||||
set -u
|
||||
|
||||
# Bash ne compte les caractères — et non les octets — que si la locale le dit.
|
||||
# C'est ce qui aligne les colonnes du tableau des disques.
|
||||
export LC_ALL="${LC_ALL:-C.UTF-8}"
|
||||
|
||||
# Le temps que met la collecte, en millisecondes.
|
||||
#
|
||||
# Une machine n'est relevée qu'une fois quand elle n'a pas connu de session
|
||||
# live : il n'y a alors pas d'écart entre deux passages à mesurer. Cette durée-
|
||||
# ci existe toujours, et elle se compare — elle dit ce que la machine met à
|
||||
# s'interroger elle-même : lire le SMART de ses disques, réveiller ceux qui
|
||||
# dorment, énumérer ses barrettes. Un plateau qui rame se voit là.
|
||||
#
|
||||
# On arrête le chronomètre à la fin de la collecte, avant le verdict : celui-ci
|
||||
# attend une touche, et l'on mesurerait la personne devant l'écran.
|
||||
DEBUT_NS="$(date +%s%N 2>/dev/null || echo 0)"
|
||||
|
||||
# smartctl et dmidecode vivent dans /usr/sbin, que le PATH d'un shell ordinaire
|
||||
# ne contient pas toujours — un « command -v » y échouait alors que le binaire
|
||||
# était là.
|
||||
PATH="$PATH:/usr/sbin:/sbin"
|
||||
|
||||
SERVEUR="${ALPI_SERVEUR:-http://alpicache.lan}"
|
||||
MONTRER=0
|
||||
CHECK=0
|
||||
case "${1:-}" in
|
||||
--montrer) MONTRER=1 ;;
|
||||
--check) CHECK=1 ;;
|
||||
esac
|
||||
|
||||
if [ -t 1 ]; then
|
||||
V=$'\e[32m'; O=$'\e[33m'; R=$'\e[31m'; B=$'\e[1m'; D=$'\e[2m'; Z=$'\e[0m'
|
||||
else
|
||||
V=""; O=""; R=""; B=""; D=""; Z=""
|
||||
fi
|
||||
|
||||
# Ce dont le relevé a besoin, et qu'il installe lui-même plutôt que de rendre
|
||||
# un verdict à trous.
|
||||
#
|
||||
# « état des disques inconnu » n'aide personne : c'est précisément la réponse
|
||||
# qu'on était venu chercher. Les deux paquets pèsent moins de deux mégaoctets,
|
||||
# ils sont dans le cache, et l'installation prend deux secondes sur le réseau
|
||||
# de l'install party. On ne le fait qu'en root, qu'avec apt, et sans rien
|
||||
# demander d'autre.
|
||||
completer_outils() {
|
||||
[ "$(id -u)" = "0" ] || return 0
|
||||
command -v apt-get >/dev/null 2>&1 || return 0
|
||||
|
||||
local manquants=""
|
||||
command -v smartctl >/dev/null 2>&1 || manquants="$manquants smartmontools"
|
||||
command -v dmidecode >/dev/null 2>&1 || manquants="$manquants dmidecode"
|
||||
[ -z "$manquants" ] && return 0
|
||||
|
||||
echo "==> Installation de ce qui manque au relevé :$manquants"
|
||||
# Par le cache s'il répond, directement sinon. « -qq » pour ne pas noyer
|
||||
# l'écran : ce n'est pas l'objet de la manœuvre.
|
||||
local proxy=""
|
||||
if command -v wget >/dev/null 2>&1 \
|
||||
&& wget -q --spider --timeout=3 "$SERVEUR/" 2>/dev/null; then
|
||||
proxy="-o Acquire::http::Proxy=http://apt-proxy:3142"
|
||||
fi
|
||||
DEBIAN_FRONTEND=noninteractive apt-get $proxy -qq -y install $manquants \
|
||||
>/dev/null 2>&1 \
|
||||
|| echo " (échec — le relevé se fera sans)"
|
||||
# Ce qui vient d'arriver est dans /usr/sbin, que le PATH d'un shell
|
||||
# ordinaire ne contient pas toujours.
|
||||
PATH="$PATH:/usr/sbin:/sbin"
|
||||
}
|
||||
|
||||
completer_outils
|
||||
|
||||
lire_dmi() {
|
||||
cat "/sys/class/dmi/id/$1" 2>/dev/null | tr -d '\n' | sed 's/^ *//; s/ *$//'
|
||||
}
|
||||
|
||||
echapper() {
|
||||
# De quoi écrire du JSON sans rien installer : guillemets, antislashs et
|
||||
# sauts de ligne, et c'est tout ce qui peut nous arriver ici.
|
||||
printf '%s' "$1" | sed 's/\\/\\\\/g; s/"/\\"/g' | tr -d '\n\r'
|
||||
}
|
||||
|
||||
champ() { printf '"%s":"%s"' "$1" "$(echapper "${2:-}")"; }
|
||||
|
||||
# --- La machine ------------------------------------------------------------
|
||||
|
||||
MODELE="$(lire_dmi product_name)"
|
||||
MARQUE="$(lire_dmi sys_vendor)"
|
||||
SERIE="$(lire_dmi product_serial)"
|
||||
# Le numéro de série identifie un objet, pas une personne, mais il n'a rien à
|
||||
# faire dans un fichier qu'on partage : on n'en garde que les quatre derniers
|
||||
# caractères, assez pour distinguer deux machines du même modèle.
|
||||
SERIE="${SERIE: -4}"
|
||||
BIOS="$(lire_dmi bios_date)"
|
||||
|
||||
PROCESSEUR="$(awk -F': ' '/^model name/{print $2; exit}' /proc/cpuinfo)"
|
||||
COEURS="$(nproc 2>/dev/null || echo '?')"
|
||||
MEMOIRE_KO="$(awk '/^MemTotal/{print $2}' /proc/meminfo)"
|
||||
|
||||
SYSTEME=""
|
||||
if [ -r /etc/os-release ]; then
|
||||
SYSTEME="$(. /etc/os-release; echo "${PRETTY_NAME:-$NAME $VERSION}")"
|
||||
fi
|
||||
NOYAU="$(uname -r)"
|
||||
ARCHITECTURE="$(uname -m)"
|
||||
|
||||
# Sommes-nous sur la clé USB, ou sur le système installé ?
|
||||
#
|
||||
# La distinction n'est pas cosmétique : les deux relevés répondent à deux
|
||||
# questions différentes. Celui de la session live dit « peut-on installer sur
|
||||
# cette machine ? » et se fait avant d'effacer quoi que ce soit. Celui d'après
|
||||
# dit « qu'avons-nous installé, et sur quoi ». Les garder séparés permet de
|
||||
# comparer — un disque qui allait bien le matin et qui se plaint le soir, cela
|
||||
# se voit.
|
||||
#
|
||||
# Le signe qui ne trompe pas est la racine : une session live la monte en
|
||||
# overlay au-dessus d'un squashfs, ce qu'aucun système installé ne fait. S'y
|
||||
# ajoute « boot=casper » ou « boot=live » sur la ligne de commande du noyau.
|
||||
#
|
||||
# L'existence de /cdrom ou de /rofs, elle, ne prouve rien : l'installateur de
|
||||
# Mint laisse un /cdrom vide derrière lui, et la première version de ce script
|
||||
# a donc déclaré « session live » une machine parfaitement installée. On ne les
|
||||
# retient que s'ils sont réellement montés.
|
||||
MOMENT="post-installation"
|
||||
if findmnt -n -o FSTYPE / 2>/dev/null | grep -qE '^(overlay|aufs|squashfs)$' \
|
||||
|| grep -qE '(^| )boot=(casper|live)( |$)' /proc/cmdline 2>/dev/null \
|
||||
|| mountpoint -q /rofs 2>/dev/null \
|
||||
|| { mountpoint -q /cdrom 2>/dev/null \
|
||||
&& findmnt -n -o FSTYPE /cdrom 2>/dev/null | grep -qE '^(iso9660|squashfs)$'; }; then
|
||||
MOMENT="live"
|
||||
fi
|
||||
|
||||
# --- La mémoire, barrette par barrette ------------------------------------
|
||||
#
|
||||
# La question qu'on pose vraiment devant une machine lente : peut-on en
|
||||
# ajouter ? Elle demande trois réponses — combien de connecteurs, combien
|
||||
# d'occupés, et de quel type. Un slot libre en DDR3 ne se remplit pas avec ce
|
||||
# qu'on a dans le tiroir.
|
||||
#
|
||||
# dmidecode lit cela dans la table du BIOS. Il est présent par défaut sur
|
||||
# Debian, Ubuntu et Mint ; s'il manque, on ne prétend rien plutôt que de
|
||||
# deviner.
|
||||
|
||||
BARRETTES="["
|
||||
SLOTS_TOTAL=0
|
||||
SLOTS_PRIS=0
|
||||
TYPE_MEMOIRE=""
|
||||
VITESSE_MEMOIRE=""
|
||||
if command -v dmidecode >/dev/null 2>&1 && [ "$(id -u)" = "0" ]; then
|
||||
premier=1
|
||||
# Chaque bloc « Memory Device » décrit un connecteur, occupé ou non.
|
||||
while IFS= read -r bloc; do
|
||||
emplacement="$(printf '%s' "$bloc" | sed -n 's/.*|Locator:\([^|]*\).*/\1/p' | sed 's/^ *//; s/ *$//')"
|
||||
taille="$(printf '%s' "$bloc" | sed -n 's/.*|Size:\([^|]*\).*/\1/p' | sed 's/^ *//; s/ *$//')"
|
||||
type_="$(printf '%s' "$bloc" | sed -n 's/.*|Type:\([^|]*\).*/\1/p' | sed 's/^ *//; s/ *$//')"
|
||||
vitesse="$(printf '%s' "$bloc" | sed -n 's/.*|Speed:\([^|]*\).*/\1/p' | sed 's/^ *//; s/ *$//')"
|
||||
forme="$(printf '%s' "$bloc" | sed -n 's/.*|Form Factor:\([^|]*\).*/\1/p' | sed 's/^ *//; s/ *$//')"
|
||||
reference="$(printf '%s' "$bloc" | sed -n 's/.*|Part Number:\([^|]*\).*/\1/p' | sed 's/^ *//; s/ *$//')"
|
||||
# La vitesse configurée est celle à laquelle la barrette travaille
|
||||
# vraiment ; « Speed » n'est que ce dont elle serait capable. L'écart
|
||||
# entre les deux explique bien des machines qui « rament » sans raison
|
||||
# apparente : une DDR4-3200 bridée à 2133 par la carte mère, ou deux
|
||||
# barrettes dépareillées qui s'alignent sur la plus lente.
|
||||
vitesse_reelle="$(printf '%s' "$bloc" | sed -n 's/.*|Configured Memory Speed:\([^|]*\).*/\1/p' | sed 's/^ *//; s/ *$//')"
|
||||
fabricant="$(printf '%s' "$bloc" | sed -n 's/.*|Manufacturer:\([^|]*\).*/\1/p' | sed 's/^ *//; s/ *$//')"
|
||||
rang="$(printf '%s' "$bloc" | sed -n 's/.*|Rank:\([^|]*\).*/\1/p' | sed 's/^ *//; s/ *$//')"
|
||||
tension="$(printf '%s' "$bloc" | sed -n 's/.*|Configured Voltage:\([^|]*\).*/\1/p' | sed 's/^ *//; s/ *$//')"
|
||||
largeur="$(printf '%s' "$bloc" | sed -n 's/.*|Data Width:\([^|]*\).*/\1/p' | sed 's/^ *//; s/ *$//')"
|
||||
detail="$(printf '%s' "$bloc" | sed -n 's/.*|Type Detail:\([^|]*\).*/\1/p' | sed 's/^ *//; s/ *$//')"
|
||||
[ -z "$emplacement" ] && continue
|
||||
|
||||
SLOTS_TOTAL=$(( SLOTS_TOTAL + 1 ))
|
||||
case "$taille" in
|
||||
*"No Module"*|""|"Unknown") taille="" ;;
|
||||
*) SLOTS_PRIS=$(( SLOTS_PRIS + 1 ))
|
||||
[ -z "$TYPE_MEMOIRE" ] && [ "$type_" != "Unknown" ] && TYPE_MEMOIRE="$type_"
|
||||
# Deux barrettes de vitesses différentes s'alignent sur la plus
|
||||
# lente : c'est celle-là qu'il faut retenir pour la machine.
|
||||
if [ -n "$vitesse_reelle" ] && [ "$vitesse_reelle" != "Unknown" ]; then
|
||||
nombre="${vitesse_reelle%% *}"
|
||||
case "$nombre" in
|
||||
''|*[!0-9]*) ;;
|
||||
*) if [ -z "$VITESSE_MEMOIRE" ] || [ "$nombre" -lt "$VITESSE_MEMOIRE" ]; then
|
||||
VITESSE_MEMOIRE="$nombre"
|
||||
fi ;;
|
||||
esac
|
||||
fi ;;
|
||||
esac
|
||||
|
||||
[ "$premier" = 0 ] && BARRETTES="$BARRETTES,"
|
||||
premier=0
|
||||
BARRETTES="$BARRETTES{$(champ emplacement "$emplacement"),$(champ taille "$taille"),\
|
||||
$(champ type "$type_"),$(champ vitesse "$vitesse"),$(champ vitesse_reelle "$vitesse_reelle"),\
|
||||
$(champ forme "$forme"),$(champ reference "$reference"),$(champ fabricant "$fabricant"),\
|
||||
$(champ rang "$rang"),$(champ tension "$tension"),$(champ largeur "$largeur"),\
|
||||
$(champ detail "$detail")}"
|
||||
done < <(dmidecode -t memory 2>/dev/null \
|
||||
| awk '/^Memory Device$/{bloc=""; dedans=1; next}
|
||||
/^$/{if (dedans && bloc != "") print bloc; dedans=0; bloc=""}
|
||||
dedans {gsub(/^[ \t]+/, ""); bloc = bloc "|" $0}
|
||||
END{if (dedans && bloc != "") print bloc}')
|
||||
fi
|
||||
BARRETTES="$BARRETTES]"
|
||||
|
||||
TABLE_DISQUES=""
|
||||
|
||||
# Remplir une colonne à la bonne largeur.
|
||||
#
|
||||
# « printf %-10s » compte les octets, pas les caractères : « mécanique » en
|
||||
# pèse dix pour neuf signes, et la colonne suivante glisse d'un cran. Bash,
|
||||
# lui, sait compter les caractères quand la locale est en UTF-8 — on lui
|
||||
# laisse ce travail, et l'on force la locale plutôt que d'espérer.
|
||||
colonne() {
|
||||
local texte="$1" largeur="$2" cote="${3:-gauche}" n
|
||||
n=${#texte}
|
||||
if [ "$n" -gt "$largeur" ]; then
|
||||
printf '%s' "${texte:0:$largeur}"
|
||||
return
|
||||
fi
|
||||
local blancs=""
|
||||
while [ "$n" -lt "$largeur" ]; do blancs="$blancs "; n=$((n + 1)); done
|
||||
if [ "$cote" = droite ]; then printf '%s%s' "$blancs" "$texte"
|
||||
else printf '%s%s' "$texte" "$blancs"; fi
|
||||
}
|
||||
|
||||
# --- Les disques -----------------------------------------------------------
|
||||
#
|
||||
# lsblk donne la taille et le type ; le drapeau « rotational » du noyau
|
||||
# distingue un disque mécanique d'un SSD sans rien installer. C'est la
|
||||
# distinction qui compte : une machine lente avec un disque mécanique de dix
|
||||
# ans ne s'arrangera pas avec un système plus léger.
|
||||
|
||||
DISQUES="["
|
||||
premier=1
|
||||
for chemin in /sys/block/*; do
|
||||
nom="$(basename "$chemin")"
|
||||
case "$nom" in loop*|ram*|sr*|zram*|dm-*) continue ;; esac
|
||||
[ -r "$chemin/size" ] || continue
|
||||
taille=$(( $(cat "$chemin/size") * 512 ))
|
||||
[ "$taille" -lt 1000000000 ] && continue # moins d'un Go : pas un disque
|
||||
rotatif="$(cat "$chemin/queue/rotational" 2>/dev/null || echo '?')"
|
||||
modele="$(cat "$chemin/device/model" 2>/dev/null | sed 's/ *$//')"
|
||||
|
||||
# L'état SMART, s'il est lisible. Sans smartctl on ne prétend rien.
|
||||
sante=""
|
||||
reallocations=""
|
||||
pending=""
|
||||
illisibles=""
|
||||
heures=""
|
||||
usure=""
|
||||
ecrit=""
|
||||
if command -v smartctl >/dev/null 2>&1; then
|
||||
sortie="$(smartctl -H -A "/dev/$nom" 2>/dev/null)"
|
||||
sante="$(printf '%s' "$sortie" | grep -iE 'overall-health|SMART Health' \
|
||||
| sed 's/.*: *//' | head -1)"
|
||||
reallocations="$(printf '%s' "$sortie" \
|
||||
| awk '/Reallocated_Sector_Ct|Reallocated_Event/{print $10; exit}')"
|
||||
# Les secteurs que le disque n'arrive plus à lire. Ils manquaient à la
|
||||
# fiche, et c'est ce qui a fait qu'alpicache annonçait « sain » un
|
||||
# disque déclaré à remplacer : il ne les avait jamais reçus.
|
||||
pending="$(printf '%s' "$sortie" | awk '$2 == "Current_Pending_Sector"{print $10; exit}')"
|
||||
illisibles="$(printf '%s' "$sortie" | awk '$2 == "Offline_Uncorrectable"{print $10; exit}')"
|
||||
heures="$(printf '%s' "$sortie" | awk '/Power_On_Hours/{print $10; exit}')"
|
||||
|
||||
# L'usure d'un SSD, en pour cent de vie consommée.
|
||||
#
|
||||
# Un disque mécanique s'use en tournant, un SSD en écrivant : les
|
||||
# heures de marche ne disent rien de son état. Chaque constructeur a
|
||||
# son attribut, et deux conventions coexistent — les uns comptent ce
|
||||
# qui est consommé, les autres ce qui reste. On ramène tout à
|
||||
# « consommé », qui est le sens qu'on veut lire. NVMe donne directement
|
||||
# « Percentage Used » ; pour les SATA, la colonne VALUE part de 100 et
|
||||
# descend.
|
||||
usure="$(printf '%s' "$sortie" | awk '/Percentage Used:/{gsub(/[^0-9]/,"",$3); print $3; exit}')"
|
||||
if [ -z "$usure" ]; then
|
||||
usure="$(printf '%s' "$sortie" | awk '
|
||||
/Media_Wearout_Indicator|Wear_Leveling_Count|SSD_Life_Left|Percent_Lifetime_Remain/ {
|
||||
if ($4 ~ /^[0-9]+$/ && $4 <= 100) { print 100 - $4; exit }
|
||||
}')"
|
||||
fi
|
||||
# Ce que le disque a écrit depuis sa mise en service : l'autre façon de
|
||||
# juger un SSD, dont les modèles courants tiennent 100 à 600 To.
|
||||
ecrit="$(printf '%s' "$sortie" | awk '
|
||||
/Total_LBAs_Written|Host_Writes_32MiB|Total_Host_Writes/ {
|
||||
if ($10 ~ /^[0-9]+$/) { print $10; exit }
|
||||
}
|
||||
/Data Units Written:/ { gsub(/[^0-9]/,"",$4); print $4; exit }')"
|
||||
fi
|
||||
|
||||
# Les mêmes chiffres, mis en table pour être lus par quelqu'un. Le verdict
|
||||
# ne dit que ce qui cloche ; on veut aussi voir ce qui va, et sur quoi le
|
||||
# verdict se fonde.
|
||||
taille_go="$(awk -v o="$taille" 'BEGIN{printf "%.1f", o/1000000000}' | tr . ,)"
|
||||
secteurs="—"
|
||||
for valeur in "${pending:-0}" "${illisibles:-0}" "${reallocations:-0}"; do
|
||||
case "$valeur" in ''|*[!0-9]*) continue ;; esac
|
||||
[ "$valeur" -gt 0 ] && secteurs="!"
|
||||
done
|
||||
[ "$secteurs" = "!" ] && secteurs="$(printf '%s/%s/%s' \
|
||||
"${reallocations:-0}" "${pending:-0}" "${illisibles:-0}")"
|
||||
usure_dite="—"
|
||||
if [ "$rotatif" = 1 ]; then
|
||||
case "$heures" in ''|*[!0-9]*) ;; *)
|
||||
usure_dite="$heures h"
|
||||
[ "$heures" -ge 8760 ] && usure_dite="$usure_dite ($(( heures / 8760 )),$(( (heures % 8760) * 10 / 8760 )) an)" ;;
|
||||
esac
|
||||
else
|
||||
case "$usure" in ''|*[!0-9]*) ;; *) usure_dite="usé à $usure %" ;; esac
|
||||
fi
|
||||
TABLE_DISQUES="$TABLE_DISQUES$(
|
||||
colonne "$nom" 7; printf ' '
|
||||
colonne "${modele:-—}" 20; printf ' '
|
||||
colonne "$([ "$rotatif" = 1 ] && echo mécanique || echo SSD)" 10; printf ' '
|
||||
colonne "$taille_go Go" 10 droite; printf ' '
|
||||
colonne "${sante:-—}" 8; printf ' '
|
||||
colonne "$usure_dite" 16; printf ' '
|
||||
printf '%s' "$secteurs")"$'\n'
|
||||
|
||||
[ "$premier" = 0 ] && DISQUES="$DISQUES,"
|
||||
premier=0
|
||||
DISQUES="$DISQUES{$(champ nom "$nom"),$(champ modele "$modele"),\
|
||||
\"octets\":$taille,$(champ type "$([ "$rotatif" = 1 ] && echo mécanique || echo SSD)"),\
|
||||
$(champ sante "$sante"),$(champ reallocations "$reallocations"),\
|
||||
$(champ pending "$pending"),$(champ illisibles "$illisibles"),$(champ heures "$heures"),\
|
||||
$(champ usure "$usure"),$(champ ecrit "$ecrit")}"
|
||||
done
|
||||
DISQUES="$DISQUES]"
|
||||
|
||||
# L'occupation, telle qu'elle est maintenant.
|
||||
OCCUPATION="["
|
||||
premier=1
|
||||
while read -r point taille utilise dispo pourcent; do
|
||||
[ "$premier" = 0 ] && OCCUPATION="$OCCUPATION,"
|
||||
premier=0
|
||||
OCCUPATION="$OCCUPATION{$(champ point "$point"),\"taille\":$taille,\
|
||||
\"utilise\":$utilise,$(champ pourcent "$pourcent")}"
|
||||
done < <(df -B1 --output=target,size,used,avail,pcent 2>/dev/null \
|
||||
| awk 'NR>1 && $2+0 > 1000000000 {print $1, $2, $3, $4, $5}')
|
||||
OCCUPATION="$OCCUPATION]"
|
||||
|
||||
# --- Le rapport ------------------------------------------------------------
|
||||
|
||||
# L'adresse matérielle de l'interface par laquelle on sort — celle que le
|
||||
# serveur a vue en donnant le bail, donc celle qui permettra de rapprocher
|
||||
# cette fiche de la machine servie. « ip -o link » a failli nous donner
|
||||
# l'adresse de diffusion, qui est la même pour tout le monde.
|
||||
INTERFACE="$(ip -o -4 route show default 2>/dev/null | awk '{print $5; exit}')"
|
||||
[ -z "$INTERFACE" ] && INTERFACE="$(ls /sys/class/net 2>/dev/null \
|
||||
| grep -v '^lo$' | head -1)"
|
||||
MAC="$(cat "/sys/class/net/$INTERFACE/address" 2>/dev/null)"
|
||||
|
||||
RAPPORT="{$(champ machine "$(hostname)"),$(champ mac "$MAC"),\
|
||||
$(champ marque "$MARQUE"),$(champ modele "$MODELE"),$(champ serie "$SERIE"),\
|
||||
$(champ bios "$BIOS"),$(champ processeur "$PROCESSEUR"),\"coeurs\":${COEURS:-0},\
|
||||
\"memoire_ko\":${MEMOIRE_KO:-0},$(champ systeme "$SYSTEME"),$(champ noyau "$NOYAU"),\
|
||||
$(champ architecture "$ARCHITECTURE"),$(champ moment "$MOMENT"),\
|
||||
$(champ type_memoire "$TYPE_MEMOIRE"),\
|
||||
$(champ vitesse_memoire "$VITESSE_MEMOIRE"),\
|
||||
\"slots_total\":$SLOTS_TOTAL,\"slots_pris\":$SLOTS_PRIS,\"barrettes\":$BARRETTES,\
|
||||
\"disques\":$DISQUES,\"occupation\":$OCCUPATION}"
|
||||
|
||||
DUREE_MS=0
|
||||
case "$DEBUT_NS" in
|
||||
''|*[!0-9]*) ;;
|
||||
0) ;;
|
||||
*) FIN_NS="$(date +%s%N 2>/dev/null || echo 0)"
|
||||
case "$FIN_NS" in
|
||||
''|*[!0-9]*|0) ;;
|
||||
*) DUREE_MS=$(( (FIN_NS - DEBUT_NS) / 1000000 )) ;;
|
||||
esac ;;
|
||||
esac
|
||||
[ "$DUREE_MS" -lt 0 ] && DUREE_MS=0
|
||||
RAPPORT="${RAPPORT%\}},\"duree_releve_ms\":$DUREE_MS}"
|
||||
|
||||
if [ "$MONTRER" = 1 ]; then
|
||||
if command -v python3 >/dev/null 2>&1; then
|
||||
printf '%s' "$RAPPORT" | python3 -m json.tool 2>/dev/null || printf '%s\n' "$RAPPORT"
|
||||
else
|
||||
printf '%s\n' "$RAPPORT"
|
||||
fi
|
||||
exit 0
|
||||
fi
|
||||
|
||||
[ "$CHECK" = 1 ] && printf " %sLa fiche est envoyée à alpicache…%s\n\n" "$D" "$Z"
|
||||
echo "Relevé : $([ "$MOMENT" = live ] && echo "session live, avant installation" \
|
||||
|| echo "système installé")"
|
||||
echo "Machine : $MARQUE $MODELE"
|
||||
echo "Processeur : $PROCESSEUR ($COEURS cœurs)"
|
||||
if [ "$SLOTS_TOTAL" -gt 0 ]; then
|
||||
echo "Mémoire : $(( MEMOIRE_KO / 1024 )) Mo ${TYPE_MEMOIRE:+$TYPE_MEMOIRE }\
|
||||
${VITESSE_MEMOIRE:+à $VITESSE_MEMOIRE MT/s }· \
|
||||
$SLOTS_PRIS connecteur(s) occupé(s) sur $SLOTS_TOTAL"
|
||||
else
|
||||
echo "Mémoire : $(( MEMOIRE_KO / 1024 )) Mo"
|
||||
fi
|
||||
echo "Système : $SYSTEME"
|
||||
echo
|
||||
|
||||
MOTIFS=""
|
||||
|
||||
# --- Le verdict ------------------------------------------------------------
|
||||
#
|
||||
# Trois réponses possibles, et une seule question : peut-on installer sur cette
|
||||
# machine ? Les seuils viennent de ce qu'on rencontre en install party, pas
|
||||
# d'un idéal — une machine de dix ans avec 4 Go et un disque sain fait très
|
||||
# bien l'affaire, et c'est souvent celle qu'on nous apporte.
|
||||
|
||||
# Le verdict sort toujours, live ou non. C'est l'information qu'on est venu
|
||||
# chercher : la première version ne le rendait qu'en session live, et le
|
||||
# relevé d'après installation défilait sans rien dire de l'état des disques —
|
||||
# précisément ce dont on voulait parler au propriétaire.
|
||||
[ "$MONTRER" = 1 ] || CHECK=1
|
||||
|
||||
if [ "$CHECK" = 1 ]; then
|
||||
GRAVITE=0 # 0 rien à signaler · 1 à surveiller · 2 ne pas installer
|
||||
REMARQUES=""
|
||||
|
||||
note() {
|
||||
[ "$1" -gt "$GRAVITE" ] && GRAVITE="$1"
|
||||
REMARQUES="$REMARQUES$2"$'\n'
|
||||
# Le même motif, débarrassé de ses couleurs et de ses retours à la
|
||||
# ligne, pour qu'alpicache dise exactement ce qui a été dit ici.
|
||||
if [ "$1" -ge 1 ]; then
|
||||
# Une note tient sur plusieurs lignes à l'écran ; le motif, lui,
|
||||
# est d'un seul tenant — il ira dans une case de tableau.
|
||||
nu="$(printf '%s' "$2" | tr '\n' ' ' | sed -e 's/\x1b\[[0-9;]*m//g' \
|
||||
-e 's/[[:space:]]\{1,\}/ /g' \
|
||||
-e 's/^ *[!?✗·] *//' \
|
||||
-e 's/^ *//' -e 's/ *$//')"
|
||||
[ -n "$nu" ] && MOTIFS="$MOTIFS$nu"$'\n'
|
||||
fi
|
||||
}
|
||||
|
||||
# Les disques. C'est pour eux qu'on fait ce contrôle.
|
||||
for chemin in /sys/block/*; do
|
||||
nom="$(basename "$chemin")"
|
||||
case "$nom" in loop*|ram*|sr*|zram*|dm-*) continue ;; esac
|
||||
[ -r "$chemin/size" ] || continue
|
||||
taille=$(( $(cat "$chemin/size") * 512 ))
|
||||
[ "$taille" -lt 1000000000 ] && continue
|
||||
|
||||
if ! command -v smartctl >/dev/null 2>&1; then
|
||||
note 1 " ${O}?${Z} état des disques inconnu — smartmontools n'est pas installé.
|
||||
${D}sudo apt install -y smartmontools${Z} ${D}(il passera par le cache)${Z}"
|
||||
break
|
||||
fi
|
||||
|
||||
sortie="$(smartctl -H -A "/dev/$nom" 2>/dev/null)"
|
||||
if printf '%s' "$sortie" | grep -qiE 'overall-health.*(FAILED|FAILING)'; then
|
||||
note 2 " ${R}✗${Z} ${B}/dev/$nom se déclare défaillant${Z} — ne pas installer dessus."
|
||||
fi
|
||||
# Les trois attributs ne disent pas la même chose, et les confondre
|
||||
# revient à sous-estimer les deux qui comptent.
|
||||
#
|
||||
# Reallocated_Sector_Ct des secteurs déjà remplacés par la réserve
|
||||
# du disque. Quelques-uns sont de l'usure
|
||||
# ordinaire ; c'est leur nombre qui parle.
|
||||
# Current_Pending_Sector des secteurs que le disque n'arrive plus à
|
||||
# lire et n'a pas encore pu déplacer. Ce
|
||||
# qu'ils contenaient est en train d'être
|
||||
# perdu. Un seul suffit à s'inquiéter.
|
||||
# Offline_Uncorrectable des secteurs définitivement illisibles.
|
||||
#
|
||||
# Les deux derniers ne sont pas de l'usure mais une panne en cours :
|
||||
# on ne les mesure pas à la même aune que le premier.
|
||||
for attribut in Reallocated_Sector_Ct Current_Pending_Sector Offline_Uncorrectable; do
|
||||
valeur="$(printf '%s' "$sortie" | awk -v a="$attribut" '$2 == a {print $10; exit}')"
|
||||
case "$valeur" in ''|*[!0-9]*) continue ;; esac
|
||||
[ "$valeur" = "0" ] && continue
|
||||
case "$attribut" in
|
||||
Reallocated_Sector_Ct)
|
||||
libelle="secteur(s) déjà remplacé(s)"
|
||||
if [ "$valeur" -ge 50 ]; then
|
||||
note 2 " ${R}✗${Z} /dev/$nom : ${B}$valeur $libelle${Z} — disque à remplacer."
|
||||
else
|
||||
note 1 " ${O}!${Z} /dev/$nom : $valeur $libelle — à surveiller."
|
||||
fi ;;
|
||||
Current_Pending_Sector)
|
||||
note 2 " ${R}✗${Z} /dev/$nom : ${B}$valeur secteur(s) illisible(s)${Z} en attente.
|
||||
${R}Ce ne sont pas des secteurs usés mais des données que le disque
|
||||
n'arrive plus à relire : le disque est en train de lâcher.${Z}
|
||||
${D}Sauvegarder ce qui doit l'être avant toute autre chose, et
|
||||
ne rien installer dessus — l'installation ne tiendrait pas.${Z}" ;;
|
||||
Offline_Uncorrectable)
|
||||
note 2 " ${R}✗${Z} /dev/$nom : ${B}$valeur secteur(s) définitivement perdu(s)${Z}.
|
||||
${R}Le disque a renoncé à les relire. À remplacer.${Z}" ;;
|
||||
esac
|
||||
done
|
||||
heures="$(printf '%s' "$sortie" | awk '/Power_On_Hours/{print $10; exit}')"
|
||||
rotatif="$(cat "$chemin/queue/rotational" 2>/dev/null)"
|
||||
|
||||
# L'usure, recalculée ici : cette boucle est distincte de celle du
|
||||
# relevé et ne voit pas ses variables.
|
||||
usure="$(printf '%s' "$sortie" | awk '/Percentage Used:/{gsub(/[^0-9]/,"",$3); print $3; exit}')"
|
||||
if [ -z "$usure" ]; then
|
||||
usure="$(printf '%s' "$sortie" | awk '
|
||||
/Media_Wearout_Indicator|Wear_Leveling_Count|SSD_Life_Left|Percent_Lifetime_Remain/ {
|
||||
if ($4 ~ /^[0-9]+$/ && $4 <= 100) { print 100 - $4; exit }
|
||||
}')"
|
||||
fi
|
||||
# Un disque mécanique se signale toujours, et pas seulement quand il
|
||||
# est vieux. C'est le premier frein d'une machine par ailleurs
|
||||
# correcte : remplacer un plateau par un SSD fait plus pour elle que
|
||||
# n'importe quel réglage, et c'est le genre de conseil qu'on donne
|
||||
# pendant qu'on a la machine ouverte devant soi.
|
||||
# Les heures de marche, dites en heures et en années de fonctionnement.
|
||||
# « 477 j 15 h » se lit mal : on croit à un disque épuisé alors que
|
||||
# c'est une année et quelques mois de marche, ce qui est peu.
|
||||
marche=""
|
||||
case "$heures" in
|
||||
''|*[!0-9]*) ;;
|
||||
*) marche="$heures h"
|
||||
if [ "$heures" -ge 8760 ]; then
|
||||
marche="$marche, soit $(( heures / 8760 )),$(( (heures % 8760) * 10 / 8760 )) an de marche"
|
||||
fi ;;
|
||||
esac
|
||||
|
||||
if [ "$rotatif" = "1" ]; then
|
||||
# Un disque mécanique se fatigue en tournant. Les constructeurs
|
||||
# annoncent 300 000 à 600 000 heures de MTBF, mais le retour du
|
||||
# terrain est plus sobre : au-delà de 30 000 heures — trois ans et
|
||||
# demi de marche continue — les pannes deviennent sensiblement plus
|
||||
# fréquentes, et à 45 000 on est dans le sursis.
|
||||
gravite_disque=1
|
||||
supplement=""
|
||||
case "$heures" in
|
||||
''|*[!0-9]*) ;;
|
||||
*) if [ "$heures" -ge 45000 ]; then
|
||||
gravite_disque=2
|
||||
supplement="
|
||||
${R}Au-delà de 45 000 heures : sauvegarder avant toute chose.${Z}"
|
||||
elif [ "$heures" -ge 30000 ]; then
|
||||
supplement="
|
||||
${O}Plus de 30 000 heures de marche : il a fait son temps.${Z}"
|
||||
fi ;;
|
||||
esac
|
||||
note "$gravite_disque" " ${O}!${Z} /dev/$nom est un ${B}disque mécanique${Z}${marche:+ · $marche}.
|
||||
${D}Le remplacer par un SSD ferait plus pour cette machine que
|
||||
tout le reste réuni — démarrage, ouverture des programmes, réactivité.${Z}$supplement"
|
||||
else
|
||||
# Un SSD ne s'use pas en tournant mais en écrivant. Les heures de
|
||||
# marche ne disent rien de son état : c'est l'usure qu'on regarde.
|
||||
case "$usure" in
|
||||
''|*[!0-9]*)
|
||||
[ -n "$marche" ] && note 0 " ${V}·${Z} /dev/$nom est un SSD · $marche.
|
||||
${D}Usure non déclarée par ce modèle.${Z}" ;;
|
||||
*) if [ "$usure" -ge 90 ]; then
|
||||
note 2 " ${R}✗${Z} /dev/$nom : SSD usé à ${B}${usure} %${Z} — il approche de sa fin.
|
||||
${R}Sauvegarder, et prévoir son remplacement.${Z}"
|
||||
elif [ "$usure" -ge 70 ]; then
|
||||
note 1 " ${O}!${Z} /dev/$nom : SSD usé à ${usure} %${marche:+ · $marche}.
|
||||
${D}Encore utilisable, mais il faudra y penser.${Z}"
|
||||
else
|
||||
note 0 " ${V}·${Z} /dev/$nom : SSD usé à ${usure} % seulement${marche:+ · $marche}."
|
||||
fi ;;
|
||||
esac
|
||||
fi
|
||||
if [ "$taille" -lt 32000000000 ]; then
|
||||
note 1 " ${O}!${Z} /dev/$nom ne fait que $(( taille / 1000000000 )) Go — c'est juste."
|
||||
fi
|
||||
done
|
||||
|
||||
# La mémoire, le processeur.
|
||||
MEMOIRE_MO=$(( MEMOIRE_KO / 1024 ))
|
||||
if [ "$MEMOIRE_MO" -lt 2048 ]; then
|
||||
note 2 " ${R}✗${Z} ${B}${MEMOIRE_MO} Mo de mémoire${Z} — trop peu pour Mint.
|
||||
${D}Envisager une version légère, ou ajouter de la mémoire.${Z}"
|
||||
elif [ "$MEMOIRE_MO" -lt 4096 ]; then
|
||||
libres=$(( SLOTS_TOTAL - SLOTS_PRIS ))
|
||||
note 1 " ${O}!${Z} ${MEMOIRE_MO} Mo de mémoire — Mint tournera, mais sans aisance.$(
|
||||
[ "$libres" -gt 0 ] && printf '\n %s' "${D}$libres connecteur(s) ${TYPE_MEMOIRE} libre(s) : la machine est extensible.${Z}")"
|
||||
fi
|
||||
if [ "$ARCHITECTURE" != "x86_64" ] && [ "$ARCHITECTURE" != "aarch64" ]; then
|
||||
note 2 " ${R}✗${Z} processeur ${ARCHITECTURE} — les versions 64 bits ne s'installeront pas."
|
||||
fi
|
||||
|
||||
echo
|
||||
case "$GRAVITE" in
|
||||
0) printf " %s%s BON POUR L'INSTALLATION %s\n" "$B$V" "✓" "$Z" ;;
|
||||
1) printf " %s%s INSTALLATION POSSIBLE, AVEC DES RÉSERVES %s\n" "$B$O" "!" "$Z" ;;
|
||||
2) printf " %s%s NE PAS INSTALLER EN L'ÉTAT %s\n" "$B$R" "✗" "$Z" ;;
|
||||
esac
|
||||
echo
|
||||
if [ -n "$TABLE_DISQUES" ]; then
|
||||
printf ' %s' "$D"
|
||||
colonne "Disque" 7; printf ' '
|
||||
colonne "Modèle" 20; printf ' '
|
||||
colonne "Type" 10; printf ' '
|
||||
colonne "Taille" 10 droite; printf ' '
|
||||
colonne "SMART" 8; printf ' '
|
||||
colonne "Marche / usure" 16; printf ' '
|
||||
printf 'Secteurs R/P/I%s\n' "$Z"
|
||||
printf '%s' "$TABLE_DISQUES" | sed "s/^/ /"
|
||||
printf " %sR : remplacés · P : illisibles en attente · I : perdus%s\n" "$D" "$Z"
|
||||
echo
|
||||
fi
|
||||
[ -n "$REMARQUES" ] && printf "%s\n" "$REMARQUES"
|
||||
|
||||
# Une pause, sans quoi tout cela défile et personne ne le lit. Sa durée
|
||||
# suit la gravité, et l'on n'attend jamais indéfiniment : le script tourne
|
||||
# aussi sans personne devant l'écran, appelé par install.sh.
|
||||
if [ -t 0 ]; then
|
||||
case "$GRAVITE" in
|
||||
2) printf " %sEn parler au propriétaire AVANT de toucher à quoi que ce soit.%s\n" "$D" "$Z"
|
||||
printf " %sEntrée pour continuer malgré tout%s " "$B" "$Z"
|
||||
read -r -t "${ALPI_PAUSE_ALERTE:-120}" _ || echo ;;
|
||||
1) printf " %sEntrée pour continuer (reprise automatique dans %ss)%s " \
|
||||
"$D" "${ALPI_PAUSE:-20}" "$Z"
|
||||
read -r -t "${ALPI_PAUSE:-20}" _ || echo ;;
|
||||
*) sleep "${ALPI_PAUSE_OK:-3}" ;;
|
||||
esac
|
||||
echo
|
||||
fi
|
||||
fi
|
||||
|
||||
# Ce que l'on vient de dire à la personne part avec la fiche.
|
||||
#
|
||||
# Sans cela, alpicache rejugeait à partir des seuls champs reçus — et ne voyait
|
||||
# pas les secteurs en attente, qui ne lui étaient pas envoyés. Il affichait
|
||||
# « sain » un disque que ce script venait de déclarer à remplacer. Deux juges,
|
||||
# deux verdicts : il n'y en a plus qu'un, et c'est celui-ci.
|
||||
VERDICT="ok"
|
||||
case "${GRAVITE:-0}" in
|
||||
2) VERDICT="alerte" ;;
|
||||
1) VERDICT="attention" ;;
|
||||
esac
|
||||
MOTIFS_JSON="["
|
||||
premier=1
|
||||
while IFS= read -r ligne; do
|
||||
[ -n "$ligne" ] || continue
|
||||
[ "$premier" = 0 ] && MOTIFS_JSON="$MOTIFS_JSON,"
|
||||
premier=0
|
||||
MOTIFS_JSON="$MOTIFS_JSON$(printf '%s' "$ligne" \
|
||||
| sed -e 's/\\/\\\\/g' -e 's/"/\\"/g' -e 's/^/"/' -e 's/$/"/')"
|
||||
done <<< "${MOTIFS:-}"
|
||||
MOTIFS_JSON="$MOTIFS_JSON]"
|
||||
RAPPORT="${RAPPORT%\}},$(champ verdict "$VERDICT"),\"motifs\":$MOTIFS_JSON}"
|
||||
|
||||
if command -v curl >/dev/null 2>&1; then
|
||||
reponse="$(printf '%s' "$RAPPORT" | curl -s --max-time 15 \
|
||||
-H 'Content-Type: application/json' --data-binary @- "$SERVEUR/fiche")"
|
||||
elif command -v wget >/dev/null 2>&1; then
|
||||
reponse="$(printf '%s' "$RAPPORT" | wget -qO- --timeout=15 \
|
||||
--header='Content-Type: application/json' --post-file=- "$SERVEUR/fiche")"
|
||||
else
|
||||
echo "Ni curl ni wget : la fiche n'a pas pu être envoyée." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -n "$reponse" ]; then
|
||||
echo "$reponse"
|
||||
else
|
||||
echo "Le serveur n'a pas répondu — la fiche n'est pas enregistrée." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
|
@ -1,26 +1,4 @@
|
|||
#!/bin/bash
|
||||
|
||||
##################################################
|
||||
# Fiche matérielle pour le serveur de l'install party
|
||||
#
|
||||
# Placée au début, et non à la fin : si un disque faiblit, autant le savoir
|
||||
# avant d'avoir passé une heure à installer dessus — c'est le moment où l'on
|
||||
# peut encore en parler à son propriétaire. Et si l'installation s'arrête en
|
||||
# route, on a tout de même la fiche.
|
||||
#
|
||||
# Le relevé est le script voisin du dépôt, lu et versionné comme celui-ci :
|
||||
# rien n'est téléchargé ni exécuté depuis le réseau. S'il n'est pas là, on
|
||||
# passe — la machine d'un particulier qui rejoue ce script chez elle ne doit
|
||||
# rien avoir à faire de tout ceci.
|
||||
#
|
||||
# C'est la seconde passe, celle que « sudo » relance, qui l'exécute :
|
||||
# dmidecode et smartctl demandent les droits d'administration.
|
||||
##################################################
|
||||
|
||||
if [ "$(id -u)" = "0" ] && [ -x "$(dirname "$0")/alpi-fiche.sh" ]; then
|
||||
"$(dirname "$0")/alpi-fiche.sh" || true
|
||||
fi
|
||||
|
||||
|
||||
# Script de post-installation pour Linux Mint 22.3
|
||||
# testé le 25/03/2026
|
||||
|
|
@ -249,7 +227,7 @@ install_logiciels() {
|
|||
DEBIAN_FRONTEND=noninteractive apt install -y ttf-mscorefonts-installer || abort "problème lors de l'installation des polices"
|
||||
|
||||
# mise à jour du système
|
||||
echo -e "==> Mise à jour du système\n"
|
||||
echo "==> Mise à jour du système\n"
|
||||
apt update || abort "impossible de récupérer les informations des dépôts"
|
||||
apt full-upgrade -y || abort "erreur lors de la mise à jour des paquets"
|
||||
|
||||
|
|
@ -311,7 +289,7 @@ install_logiciels() {
|
|||
# Mises à jour #
|
||||
################
|
||||
mises_a_jour() {
|
||||
echo -e "==> Configuration de dconf\n"
|
||||
echo -e "Configuraiton de dconf\n"
|
||||
# Configuration de dconf pour permettre de modifier certaines configurations
|
||||
# par défaut
|
||||
mkdir -p /etc/dconf/profile
|
||||
|
|
@ -359,32 +337,11 @@ configuration_apt() {
|
|||
# GRUB : sélection automatique de la dernière entrée utilisée #
|
||||
###############################################################
|
||||
modif_grub() {
|
||||
# Rien à faire si c'est déjà en place.
|
||||
#
|
||||
# update-grub lance os-prober, qui part sonder toutes les partitions de la
|
||||
# machine à la recherche d'autres systèmes, puis régénère la configuration
|
||||
# entière : vingt à trente secondes qu'on ne rattrape pas, et qu'on payait
|
||||
# jusqu'ici à chaque exécution, y compris quand il n'y avait rien à
|
||||
# changer. Sur une install party de quinze machines, cela se voit.
|
||||
if grep -q '^GRUB_DEFAULT=saved' /etc/default/grub \
|
||||
&& grep -q '^GRUB_SAVEDEFAULT=true' /etc/default/grub; then
|
||||
echo -e "==> GRUB est déjà configuré, rien à changer\n"
|
||||
return 0
|
||||
fi
|
||||
|
||||
echo -e "==> Modification de GRUB\n"
|
||||
# On commente la ligne d'origine, puis on ajoute les nôtres si elles
|
||||
# manquent. Les ajouter plutôt que les insérer règle deux choses : le
|
||||
# fichier ne se retrouve plus avec des lignes indentées — GRUB les accepte,
|
||||
# mais elles trompent la lecture quand on vient déboguer —, et la fonction
|
||||
# fait toujours son travail lorsque « GRUB_DEFAULT=0 » a disparu, ce qui
|
||||
# arrive dès qu'un autre outil est passé avant nous.
|
||||
sed -i 's/^GRUB_DEFAULT=0/#&/' /etc/default/grub
|
||||
grep -q '^GRUB_DEFAULT=saved' /etc/default/grub \
|
||||
|| echo 'GRUB_DEFAULT=saved' >> /etc/default/grub
|
||||
grep -q '^GRUB_SAVEDEFAULT=true' /etc/default/grub \
|
||||
|| echo 'GRUB_SAVEDEFAULT=true' >> /etc/default/grub
|
||||
|
||||
# On comment la ligne "GRUB_DEFAULT=0" et on ajoute les "bonnes" options
|
||||
sed -i '/^GRUB_DEFAULT=0/ i#GRUB_DEFAULT=0\
|
||||
GRUB_DEFAULT=saved\
|
||||
GRUB_SAVEDEFAULT=true' /etc/default/grub
|
||||
# On met à jour GRUB
|
||||
update-grub
|
||||
}
|
||||
|
|
|
|||
|
|
@ -58,7 +58,6 @@ Lors de nos **Install Party**, les bénévoles d'**Alpinux** installent Linux av
|
|||
## 🧰 Après l'installation
|
||||
|
||||
- 🩹 [**Trousse de premiers secours Linux Mint**](../guides/linux-mint-trousse.md) — les réflexes utiles des premiers jours.
|
||||
- 🖧 [**Le serveur qu'on emporte**](../technique/serveur-install-party.md) — le réseau de la salle, le cache de paquets, et ce qu'un bénévole doit en savoir.
|
||||
- 🗣️ [**Ateliers et rencontres**](evenements.md) — pour progresser et échanger avec la communauté.
|
||||
|
||||
---
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ demandé.
|
|||
|
||||
Rendez-vous sur la page d'accueil de la messagerie de l'association.
|
||||
|
||||

|
||||
<!-- capture : page d'accueil publique, formulaire d'inscription vide -->
|
||||
|
||||
Indiquez votre adresse de courriel, choisissez la liste qui vous intéresse, puis
|
||||
**Continuer**.
|
||||
|
|
@ -30,7 +30,7 @@ faire une chose, une seule :
|
|||
Objet : **le code affiché**, recopié tel quel
|
||||
Corps du message : ce que vous voulez, il n'est pas lu
|
||||
|
||||

|
||||
<!-- capture : écran du code, avec le code et l'heure limite -->
|
||||
|
||||
Un bouton **Ouvrir mon logiciel de messagerie** prépare le message pour vous. Il ne
|
||||
l'envoie pas : c'est à vous de le faire.
|
||||
|
|
@ -41,7 +41,7 @@ s'efface d'elle-même — sans aucune conséquence, vous pouvez recommencer.
|
|||
Dans la minute qui suit votre envoi, vous recevez une réponse qui confirme
|
||||
l'inscription, rappelle la liste, et porte déjà le lien pour partir.
|
||||
|
||||

|
||||
<!-- capture : le message de confirmation reçu, adresse du destinataire masquée -->
|
||||
|
||||
### Pourquoi est-ce à moi d'écrire ?
|
||||
|
||||
|
|
@ -86,14 +86,14 @@ C'est ce second emplacement qui fait apparaître un bouton **Se désabonner** en
|
|||
du message dans les logiciels modernes — Gmail, Outlook, Thunderbird, Apple Mail. Un
|
||||
clic suffit.
|
||||
|
||||

|
||||
<!-- capture : un message reçu, bouton « Se désabonner » du client de messagerie -->
|
||||
|
||||
La page qui s'ouvre vous laisse choisir :
|
||||
|
||||
- quitter **cette liste seulement** ;
|
||||
- ou quitter **toutes les listes** de l'association d'un coup.
|
||||
|
||||

|
||||
<!-- capture : page de désabonnement, adresse masquée -->
|
||||
|
||||
Aucune justification n'est demandée. Le retrait est immédiat, et il n'y a personne à
|
||||
qui écrire.
|
||||
|
|
@ -109,17 +109,16 @@ qui écrire.
|
|||
Les listes ouvertes au public ont des **archives** consultables sans compte. C'est
|
||||
utile avant de s'abonner, pour voir à quoi on s'engage.
|
||||
|
||||

|
||||
<!-- capture : index des archives, liste des envois par date -->
|
||||
|
||||
Seuls y figurent les messages **réellement envoyés** : ni les brouillons, ni les
|
||||
envois annulés.
|
||||
|
||||
!!! info "Aucune adresse de courriel n'apparaît dans les archives"
|
||||
Les adresses citées dans le corps d'un message — signature, contact d'un
|
||||
événement, adresse d'un partenaire — y sont masquées : `s****@a****.xxx`. On voit
|
||||
qu'un contact existait, sans pouvoir le reconstituer ni même savoir chez quel
|
||||
fournisseur il est hébergé. Leurs titulaires n'ont pas consenti à une publication
|
||||
sur le web, où un robot les ramasserait pour en faire du spam.
|
||||
événement, adresse d'un partenaire — y sont remplacées par `[adresse masquée]`.
|
||||
Leurs titulaires n'ont pas consenti à une publication sur le web, où un robot les
|
||||
ramasserait pour en faire du spam.
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@ automate le distribue en lissant le débit pendant que vous faites autre chose.
|
|||
|
||||
Menu **Listes → Campagnes**, puis **Nouvelle campagne**.
|
||||
|
||||

|
||||
<!-- capture : formulaire de rédaction, aperçu à côté -->
|
||||
|
||||
Choisissez la liste destinataire, écrivez l'objet et le corps.
|
||||
|
||||
|
|
@ -66,7 +66,7 @@ Deux choses valent le coup d'œil :
|
|||
Bouton **Mettre en file d'envoi…**. Une confirmation vous est demandée, avec le
|
||||
nombre de destinataires.
|
||||
|
||||

|
||||
<!-- capture : écran de confirmation avant mise en file -->
|
||||
|
||||
L'envoi se fait ensuite tout seul, une minute sur l'autre, **sous un plafond horaire**
|
||||
fixé pour ne pas saturer le serveur. Une liste de quelques centaines de personnes
|
||||
|
|
@ -78,7 +78,7 @@ Vous pouvez fermer la page : l'envoi continue.
|
|||
|
||||
La fiche de la campagne affiche la progression : envoyés, en attente, échecs.
|
||||
|
||||

|
||||
<!-- capture : fiche de campagne en cours d'envoi, barre de progression -->
|
||||
|
||||
Si le compteur semble figé, c'est probablement le plafond horaire : l'envoi reprend
|
||||
de lui-même à l'heure suivante.
|
||||
|
|
@ -89,10 +89,6 @@ de lui-même à l'heure suivante.
|
|||
est déjà distribué ne revient pas.
|
||||
- **Dupliquer en brouillon** recrée une copie modifiable d'un envoi passé — pratique
|
||||
pour une lettre dont la structure ne change pas d'un mois sur l'autre.
|
||||
- **Supprimer ce brouillon…** efface un brouillon abandonné. Une confirmation est
|
||||
demandée, et il n'y a pas de corbeille. Seul un brouillon se supprime : une
|
||||
campagne partie reste, puisque des gens l'ont reçue et qu'elle figure dans les
|
||||
archives.
|
||||
|
||||
---
|
||||
|
||||
|
|
@ -100,7 +96,7 @@ de lui-même à l'heure suivante.
|
|||
|
||||
Menu **Listes → Listes de diffusion**, puis le formulaire de création.
|
||||
|
||||

|
||||
<!-- capture : formulaire de création d'une liste -->
|
||||
|
||||
Seuls **le nom** et **la description** sont demandés. Le reste est automatique :
|
||||
|
||||
|
|
@ -122,7 +118,7 @@ cela désoriente les destinataires.
|
|||
|
||||
Menu **Listes → Listes de diffusion**, puis la liste voulue.
|
||||
|
||||

|
||||
<!-- capture : fiche de liste, compteurs et tableau des abonnés, adresses masquées -->
|
||||
|
||||
Quatre compteurs résument l'état : destinataires joignables, inscrits au total,
|
||||
désabonnés, adresses mortes.
|
||||
|
|
@ -158,7 +154,7 @@ Deux moyens, dans le volet **Ajouter des abonnés** :
|
|||
|
||||
Sur la fiche de la liste, cochez **Liste publique** et enregistrez.
|
||||
|
||||

|
||||
<!-- capture : case « Liste publique » cochée -->
|
||||
|
||||
Trois conséquences, à peser avant de cocher :
|
||||
|
||||
|
|
@ -174,7 +170,7 @@ dans le journal de l'outil.
|
|||
Quand une liste est publique, la fiche affiche les **demandes d'inscription en
|
||||
attente de confirmation**, avec leur heure d'expiration.
|
||||
|
||||

|
||||
<!-- capture : tableau des demandes en attente, adresses masquées -->
|
||||
|
||||
Ces adresses **ne sont pas inscrites** et ne le seront que si leurs titulaires
|
||||
confirment depuis leur propre boîte. Il n'y a rien à faire : celles qui restent
|
||||
|
|
@ -193,7 +189,7 @@ L'écran comporte deux tableaux, et la différence entre les deux est importante
|
|||
Ces adresses ont été retirées de **toutes** les listes : le serveur d'en face a
|
||||
répondu que la boîte n'existait pas, ou la personne nous a signalés comme spam.
|
||||
|
||||

|
||||
<!-- capture : tableau des rejets définitifs, adresses masquées -->
|
||||
|
||||
La colonne de droite affiche **le texte exact du refus**, extrait du rapport reçu —
|
||||
« utilisateur inconnu », « boîte pleine », le nom d'une liste noire. Le rapport
|
||||
|
|
@ -210,7 +206,7 @@ Le message a été refusé non pas parce que la boîte a disparu, mais parce qu'
|
|||
opérateur refuse *notre* serveur — un grand fournisseur de messagerie qui nous a mis
|
||||
sur une liste d'attente, ou un serveur qui interroge une liste noire.
|
||||
|
||||

|
||||
<!-- capture : tableau des blocages d'opérateur -->
|
||||
|
||||
La distinction est vitale. Une part notable des abonnés d'une association tient ses
|
||||
adresses chez deux ou trois grands fournisseurs : les traiter comme mortes parce que
|
||||
|
|
@ -230,7 +226,7 @@ Les grands opérateurs de messagerie envoient chaque jour un rapport disant **qu
|
|||
adresses IP ont émis du courrier au nom du domaine de l'association**, et si ces
|
||||
envois étaient correctement signés. L'outil les dépouille tout seul.
|
||||
|
||||

|
||||
<!-- capture : tableau de bord postmaster, colonnes IP / messages / alignés -->
|
||||
|
||||
Deux lectures valent le détour :
|
||||
|
||||
|
|
@ -249,7 +245,7 @@ Le bouton **Marquer comme lu** le retire de la liste une fois traité.
|
|||
|
||||
*Réservé aux administrateurs.* Menu **Configuration → Droits**.
|
||||
|
||||

|
||||
<!-- capture : écran des droits, noms anonymisés -->
|
||||
|
||||
Trois rôles indépendants, cumulables :
|
||||
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ répond sans connaître la vôtre.
|
|||
|
||||
Menu **Messagerie → Mes messages**.
|
||||
|
||||

|
||||
<!-- capture : boîte de réception, noms des correspondants anonymisés -->
|
||||
|
||||
Le nombre de messages non lus apparaît à côté du mot **Messagerie** dans le menu :
|
||||
vous le voyez donc depuis n'importe quel écran, sans avoir à aller voir.
|
||||
|
|
@ -35,7 +35,7 @@ Un message s'ouvre d'un clic sur son objet. Il est marqué lu à ce moment-là.
|
|||
|
||||
Menu **Messagerie → Écrire**.
|
||||
|
||||

|
||||
<!-- capture : formulaire d'écriture, annuaire déroulé, noms anonymisés -->
|
||||
|
||||
Choisissez le destinataire dans la liste proposée : c'est l'annuaire des membres.
|
||||
**Vous n'avez pas besoin de son adresse** — vous ne la verrez pas, et il ne verra pas
|
||||
|
|
@ -58,7 +58,7 @@ inutile — autant s'écrire directement.
|
|||
|
||||
Menu **Configuration → Mon profil**.
|
||||
|
||||

|
||||
<!-- capture : préférences, adresse de l'utilisateur masquée -->
|
||||
|
||||
Vous y choisissez :
|
||||
|
||||
|
|
|
|||
|
|
@ -1,40 +0,0 @@
|
|||
---
|
||||
description: Apprendre Linux en jouant — le site de jeux et de cours d'Alpinux, ses fiches de référence, et des programmes prêts à l'emploi pour animer une initiation.
|
||||
---
|
||||
|
||||
# Apprendre Linux en jouant
|
||||
|
||||
Alpinux propose un site pour apprendre Linux par le jeu :
|
||||
**[dynamic.alpinux.org](https://dynamic.alpinux.org)**. On y trouve des cours courts avec un
|
||||
terminal d'essai intégré, des jeux (missions dans un terminal simulé, associations,
|
||||
permissions) et des quiz. Rien à installer, et rien ne peut casser.
|
||||
|
||||
Cette rubrique du wiki en est le complément : les **fiches de référence**, à garder sous la
|
||||
main ou à imprimer, et les **programmes** pour animer une initiation.
|
||||
|
||||
---
|
||||
|
||||
## Le parcours « Linux pour le DevOps »
|
||||
|
||||
| Étape | Cours | Jeu | Fiche |
|
||||
|---|---|---|---|
|
||||
| 1. L'arborescence | — | [Où range-t-on quoi ?](https://dynamic.alpinux.org/jeux/arborescence/) | — |
|
||||
| 2. Le terminal | [Se repérer et se déplacer](https://dynamic.alpinux.org/cours/terminal-premiers-pas/) | [Premier jour sur le serveur](https://dynamic.alpinux.org/jeux/terminal-premiers-pas/) | [Le terminal](terminal-se-reperer.md) |
|
||||
| 3. Les fichiers | — | [Préparer un déploiement](https://dynamic.alpinux.org/jeux/terminal-fichiers/) | — |
|
||||
| 4. Les permissions | — | [rwx : le jeu des permissions](https://dynamic.alpinux.org/jeux/permissions/) | — |
|
||||
| 5. Processus et système | — | [Sous le capot](https://dynamic.alpinux.org/jeux/noyau-processus/) | — |
|
||||
| 6. Diagnostiquer | — | [Incident à 3 h du matin](https://dynamic.alpinux.org/jeux/terminal-incident/) | — |
|
||||
|
||||
Les cours et fiches manquants sont en cours de rédaction.
|
||||
|
||||
## Animer une initiation
|
||||
|
||||
- [Une semaine pour découvrir Linux — 3e et terminale](semaine-college-lycee.md) : cinq
|
||||
journées sur Linux, le terminal, Bash, Python, Git et Forgejo, avec une enquête en fil rouge.
|
||||
|
||||
## Voir aussi
|
||||
|
||||
- [Apprendre à programmer en Python](../presentations/Python/README.md), le cours complet
|
||||
pour débutants.
|
||||
- [Le Git d'Alpinux](../guides/git-alpinux.md) : créer son compte sur la forge et y publier
|
||||
son travail.
|
||||
|
|
@ -1,300 +0,0 @@
|
|||
---
|
||||
description: Programme d'une semaine d'initiation (5 jours de 6 h) pour des élèves de 3e et de terminale — Linux, terminal, Bash, Python, Git et Forgejo, avec une enquête en fil rouge.
|
||||
---
|
||||
|
||||
# Une semaine pour découvrir Linux — 3e et terminale
|
||||
|
||||
Cinq journées de six heures pour faire découvrir à des élèves ce qui se cache derrière les
|
||||
serveurs, les sites web et le code : **Linux, le terminal, Bash, Python, Git et la forge
|
||||
Forgejo**. Le même déroulé sert pour les deux niveaux ; ce qui change, c'est la profondeur.
|
||||
|
||||
!!! warning "Brouillon à valider"
|
||||
Ce programme est une première proposition. Les points encore ouverts sont listés en fin
|
||||
de page, dans [À décider avant la semaine](#a-decider).
|
||||
|
||||
---
|
||||
|
||||
## Les principes
|
||||
|
||||
**Toujours dire pourquoi.** Chaque journée commence par la question à laquelle elle répond :
|
||||
à quoi sert ce qu'on va apprendre, et quel problème cela règle. Une commande dont on ne
|
||||
comprend pas l'utilité s'oublie dès le lendemain. Les encadrés **Pourquoi** de chaque journée
|
||||
donnent ces réponses, à reformuler devant la classe.
|
||||
|
||||
**Alterner toutes les 45 minutes.** Une journée de 6 h devant un écran ne tient pas sans
|
||||
changer de forme. Chaque demi-journée enchaîne un **cours court** (sur le site), un **jeu**,
|
||||
de la **pratique sur un vrai terminal**, et si possible une **activité débranchée**.
|
||||
|
||||
**Un fil rouge : l'enquête.** Lundi matin, on découvre que le site du club informatique d'un
|
||||
lycée imaginaire a été modifié pendant la nuit. Chaque après-midi, les élèves avancent dans
|
||||
l'enquête **sur les vrais postes Linux de la salle**, avec les commandes apprises le matin.
|
||||
Vendredi, une épreuve finale en équipes désigne le coupable et remet le site en état.
|
||||
|
||||
**Les outils :**
|
||||
|
||||
| Outil | Rôle |
|
||||
|---|---|
|
||||
| [dynamic.alpinux.org](https://dynamic.alpinux.org/jeux/) | Cours avec terminal d'essai intégré, jeux, quiz. Rien à installer. |
|
||||
| Les postes Linux de la salle | La pratique pour de vrai, et l'enquête. |
|
||||
| Ce wiki | Les fiches de référence, et ce programme. |
|
||||
| [La forge d'Alpinux](../guides/git-alpinux.md) | Vendredi : publier son travail et collaborer. |
|
||||
| Un carnet de bord papier | Une page par jour : ce que j'ai appris, une commande à retenir, une question. |
|
||||
|
||||
---
|
||||
|
||||
## Le déroulé type d'une journée
|
||||
|
||||
| Horaire | Durée | Activité |
|
||||
|---|---|---|
|
||||
| 9 h 00 | 15 min | Rappel de la veille : quiz éclair au tableau, ou une commande « mystère » à deviner |
|
||||
| 9 h 15 | 45 min | Le pourquoi du jour, puis le cours sur le site, avec le terminal d'essai |
|
||||
| 10 h 00 | 30 min | Jeu sur le site |
|
||||
| 10 h 30 | 15 min | Pause |
|
||||
| 10 h 45 | 75 min | Pratique sur le vrai terminal, en binômes |
|
||||
| 12 h 00 | | Repas |
|
||||
| 13 h 30 | 15 min | Activité débranchée, pour se remettre en route |
|
||||
| 13 h 45 | 90 min | Enquête : le chapitre du jour |
|
||||
| 15 h 15 | 15 min | Pause |
|
||||
| 15 h 30 | 45 min | Approfondissement, différent selon le niveau |
|
||||
| 16 h 15 | 15 min | Bilan et carnet de bord |
|
||||
|
||||
---
|
||||
|
||||
## Lundi — Linux et le terminal
|
||||
|
||||
**Objectif du jour :** savoir ce qu'est Linux, se repérer dans l'arborescence et s'y déplacer
|
||||
au clavier.
|
||||
|
||||
!!! question "Pourquoi le terminal, alors qu'on a une souris ?"
|
||||
- **Les serveurs n'ont pas d'écran.** Les machines qui font tourner les sites web, les
|
||||
jeux en ligne ou les réseaux sociaux sont presque toutes sous Linux, dans des salles
|
||||
sans écran ni souris. On les pilote à distance, en tapant des commandes.
|
||||
- **Une commande se note, se copie, se répète.** Un clic ne s'écrit pas dans un tuto ; une
|
||||
commande, si. On peut l'envoyer à quelqu'un, la relancer demain, ou la confier à un
|
||||
script mercredi.
|
||||
- **C'est la porte d'entrée de toute la semaine** : Bash, Python et Git s'utilisent depuis
|
||||
le terminal.
|
||||
|
||||
- **Accueil (30 min)** : qui est Alpinux, ce qu'est un logiciel libre, où se trouve Linux
|
||||
sans qu'on le voie : téléphones Android, box Internet, téléviseurs, serveurs, et les 500
|
||||
supercalculateurs les plus puissants du monde.
|
||||
- **Débranché — l'arbre humain** : chaque élève porte une étiquette de dossier (`/`, `home`,
|
||||
`alex`, `etc`…) et tient l'épaule de son « parent ». Un élève-curseur se déplace selon les
|
||||
commandes `cd` lancées par la classe. Chemins absolus et relatifs se comprennent dans
|
||||
l'espace avant de se comprendre à l'écran.
|
||||
- **Site** : jeu [Où range-t-on quoi ?](https://dynamic.alpinux.org/jeux/arborescence/), puis
|
||||
cours [Le terminal : se repérer et se déplacer](https://dynamic.alpinux.org/cours/terminal-premiers-pas/)
|
||||
et jeu [Premier jour sur le serveur](https://dynamic.alpinux.org/jeux/terminal-premiers-pas/).
|
||||
- **Vrai terminal** : ouvrir un terminal (Ctrl + Alt + T), les trois défis de fin de cours,
|
||||
explorer son dossier personnel. Fiche : [Le terminal](terminal-se-reperer.md).
|
||||
- **Enquête, chapitre 1 — L'alerte** : le dossier de l'enquête apparaît sur les postes. Le
|
||||
premier message est caché quelque part : `ls -a`, `cd`, `cat`.
|
||||
|
||||
| | 3e | Terminale |
|
||||
|---|---|---|
|
||||
| Approfondissement | Course d'orientation dans l'arborescence : trouver des fichiers à partir d'indices (« je suis un réglage du réseau… ») | Comment Linux démarre : noyau, `/boot`, `/proc`, PID 1 ; explorer `/proc/cpuinfo` et `/proc/meminfo` |
|
||||
|
||||
---
|
||||
|
||||
## Mardi — Fichiers, droits et recherche
|
||||
|
||||
**Objectif du jour :** créer, déplacer et supprimer des fichiers, comprendre les droits, et
|
||||
retrouver une information dans une montagne de texte.
|
||||
|
||||
!!! question "Pourquoi des droits sur les fichiers ? Pourquoi chercher avec des commandes ?"
|
||||
- **Linux est partagé.** Plusieurs personnes et plusieurs services utilisent la même
|
||||
machine. Les droits empêchent un utilisateur de lire le courrier d'un autre, un site web
|
||||
piraté de toucher au reste du système, et vous-même d'effacer par erreur un fichier
|
||||
important.
|
||||
- **On ne lit pas un journal de 50 000 lignes, on le filtre.** `grep` trouve en une
|
||||
seconde la ligne qui compte. Enchaînées avec `|`, de petites commandes répondent à des
|
||||
questions précises : combien d'erreurs ? quand ? venant d'où ?
|
||||
|
||||
- **Site** : jeu [Préparer un déploiement](https://dynamic.alpinux.org/jeux/terminal-fichiers/),
|
||||
puis [rwx : le jeu des permissions](https://dynamic.alpinux.org/jeux/permissions/).
|
||||
- **Vrai terminal** : `mkdir`, `cp`, `mv`, `rm`, les redirections `>` et `>>`, et un premier
|
||||
éditeur de texte dans le terminal, **nano**.
|
||||
- **Débranché — le pipe humain** : une file d'élèves se passe un paquet de cartes. Le premier
|
||||
ne garde que les cartes rouges (`grep`), le suivant les trie (`sort`), le dernier les compte
|
||||
(`wc -l`). C'est exactement ce que fait `|`.
|
||||
- **Enquête, chapitre 2 — Les morceaux** : le message du pirate est découpé en plusieurs
|
||||
fichiers à rassembler (`cat`, `>`), l'un d'eux est verrouillé (`chmod`), et un indice se
|
||||
cache dans un long journal (`grep`).
|
||||
|
||||
| | 3e | Terminale |
|
||||
|---|---|---|
|
||||
| Approfondissement | Défi « ménage » : ranger un dossier en désordre dans des sous-dossiers par type de fichier | `find`, et les enchaînements `grep … \| sort \| uniq -c \| sort -n` sur un vrai journal |
|
||||
|
||||
---
|
||||
|
||||
## Mercredi — Bash : faire travailler l'ordinateur à sa place
|
||||
|
||||
**Objectif du jour :** écrire un script, c'est-à-dire une suite de commandes que l'on peut
|
||||
relancer à volonté.
|
||||
|
||||
!!! question "Pourquoi écrire des scripts ?"
|
||||
- **Ce qu'on tape deux fois, on l'écrit une fois.** Un script refait le même travail, dans
|
||||
le même ordre, sans oubli ni faute de frappe, autant de fois qu'il le faut.
|
||||
- **L'ordinateur travaille sans vous** : une sauvegarde à 3 h du matin, la vérification de
|
||||
cent fichiers, la préparation de trente postes identiques.
|
||||
- **Un script est une procédure écrite.** Il se relit, se corrige, se partage, et il dit
|
||||
exactement ce qui a été fait.
|
||||
|
||||
- **Cours** : la ligne `#!/bin/bash`, `chmod +x`, les variables, `echo`, `read`, `if`, `for`.
|
||||
- **Site** : jeu [Sous le capot](https://dynamic.alpinux.org/jeux/noyau-processus/) (ce qui
|
||||
se passe quand on lance une commande) et, pour les terminales,
|
||||
[Incident à 3 h du matin](https://dynamic.alpinux.org/jeux/terminal-incident/).
|
||||
- **Débranché — le robot idiot** : un élève joue le robot qui exécute à la lettre un
|
||||
« script » écrit par un autre groupe pour, par exemple, faire un sandwich. Les bugs
|
||||
apparaissent tout seuls, et l'on comprend pourquoi un programme doit être précis.
|
||||
- **Enquête, chapitre 3 — Le script du pirate** : un script laissé sur le serveur. Il faut
|
||||
le lire sans le lancer, comprendre ce qu'il fait, puis décoder le message qu'il a chiffré.
|
||||
En 3e, le décodage tient en une commande donnée par étapes ; en terminale, les élèves
|
||||
écrivent le script de décodage eux-mêmes.
|
||||
|
||||
| | 3e | Terminale |
|
||||
|---|---|---|
|
||||
| Script du jour | Un quiz interactif en Bash avec `read` et `if`, à faire passer au voisin | Un script de sauvegarde qui prend des arguments (`$1`), vérifie les erreurs (`$?`) et date ses archives |
|
||||
| Approfondissement | Commandes « pour le plaisir » si elles sont installées : `figlet`, `cowsay`, `sl` | Processus et signaux : `ps`, `kill`, `top` ; lien avec le thème « processus » de NSI |
|
||||
|
||||
---
|
||||
|
||||
## Jeudi — Python
|
||||
|
||||
**Objectif du jour :** écrire et lancer un programme Python depuis le terminal, puis s'en
|
||||
servir comme outil.
|
||||
|
||||
!!! question "Pourquoi Python, puisqu'on a Bash ?"
|
||||
- **Chaque outil a son terrain.** Bash est imbattable pour enchaîner des commandes et
|
||||
manipuler des fichiers. Dès qu'il faut calculer, mémoriser des données, les trier
|
||||
finement ou écrire un vrai programme, il devient pénible : Python est fait pour ça.
|
||||
- **Python est partout** : l'analyse de données, l'intelligence artificielle, les sites
|
||||
web, l'automatisation, les cartes électroniques. Et c'est le langage de la spécialité
|
||||
NSI au lycée.
|
||||
- **Le même problème, deux outils** : l'après-midi, on compte les connexions d'un journal
|
||||
en Python, comme on l'a fait en Bash mardi. Comparer les deux, c'est apprendre à choisir.
|
||||
|
||||
Le wiki contient déjà un [cours complet de Python pour débutants](../presentations/Python/README.md) :
|
||||
la journée s'appuie sur ses chapitres plutôt que de tout réécrire. Ce cours tutoie son
|
||||
lecteur, à la différence du reste de ce programme.
|
||||
|
||||
- **Lancer Python** : l'interpréteur interactif `python3`, puis un fichier `.py` écrit avec
|
||||
nano et lancé avec `python3 mon_programme.py`.
|
||||
- **Enquête, chapitre 4 — Les traces** : un journal de connexions de plusieurs milliers de
|
||||
lignes. Écrire un programme Python qui compte les connexions par adresse et par heure,
|
||||
pour trouver quand le pirate est entré.
|
||||
|
||||
| | 3e | Terminale |
|
||||
|---|---|---|
|
||||
| Notions | Variables, `input`, conditions, boucles : chapitres [01](../presentations/Python/01-variables-types-operateurs.md), [02](../presentations/Python/02-conditions.md) et [03](../presentations/Python/03-boucles.md) | Fichiers, dictionnaires, CSV : chapitres [04](../presentations/Python/04-structures-de-donnees.md) et [07](../presentations/Python/07-fichiers-csv-json.md) |
|
||||
| Projet | Le jeu « devine le nombre », puis des dessins avec `turtle` | Le comptage de mardi, réécrit en Python : comparer les deux approches |
|
||||
|
||||
!!! tip "Pour les élèves de terminale NSI"
|
||||
Python est déjà leur langage. L'intérêt de la journée n'est pas d'apprendre la syntaxe,
|
||||
mais de l'utiliser **hors de l'éditeur de l'école** : depuis le terminal, sur de vraies
|
||||
données, avec la bibliothèque standard (`pathlib`, `csv`, `collections`).
|
||||
|
||||
---
|
||||
|
||||
## Vendredi — Git, Forgejo, et le dénouement
|
||||
|
||||
**Objectif du jour :** garder l'historique de son travail avec Git, le publier sur une forge,
|
||||
et travailler à plusieurs sur le même code.
|
||||
|
||||
!!! question "Pourquoi Git en local, sur sa propre machine ?"
|
||||
Git enregistre des **photos successives** d'un projet, appelées *commits*, chacune avec
|
||||
sa date, son auteur et un message qui dit ce qui a changé et pourquoi. Tout se passe sur
|
||||
votre ordinateur, sans réseau ni compte.
|
||||
|
||||
- **Fini `rapport_final_v3_vraiment_final.txt`.** Un seul fichier, et toutes ses versions
|
||||
rangées dans l'historique.
|
||||
- **On peut revenir en arrière.** Une modification a tout cassé ? On retrouve la dernière
|
||||
version qui marchait, en une commande.
|
||||
- **On sait ce qui a changé** entre deux versions (`git diff`), ligne par ligne, et
|
||||
**pourquoi** grâce au message du commit.
|
||||
- **On essaie sans risque.** Une idée hasardeuse se développe sur une *branche* à part ;
|
||||
si elle ne donne rien, on l'abandonne sans avoir abîmé le reste.
|
||||
|
||||
!!! question "Pourquoi Git à distance, sur une forge ?"
|
||||
Une forge comme Forgejo garde une copie du projet sur un serveur. On y **envoie** ses
|
||||
commits (`git push`) et on **récupère** ceux des autres (`git pull`).
|
||||
|
||||
- **Une sauvegarde hors de sa machine.** Un disque qui lâche, un ordinateur perdu, un
|
||||
poste de salle réinitialisé : le travail reste sur la forge.
|
||||
- **Travailler à plusieurs sur le même projet.** Chacun travaille sur sa copie, puis Git
|
||||
assemble les modifications, et signale quand deux personnes ont touché à la même ligne.
|
||||
- **Faire relire avant d'intégrer.** Une *pull request* propose une modification : les
|
||||
autres la lisent, la commentent, et ne l'acceptent qu'une fois convaincus. C'est ainsi
|
||||
que se fait ce wiki.
|
||||
- **Partager et publier.** Un dépôt public, c'est un projet que tout le monde peut lire,
|
||||
réutiliser et améliorer : c'est le fonctionnement même du logiciel libre.
|
||||
|
||||
**Dans quel ordre ?** D'abord en local : on travaille, on fait des commits, on se trompe
|
||||
et on corrige, sans rien montrer à personne. Ensuite seulement, on envoie sur la forge un
|
||||
travail propre. Le local, c'est le brouillon daté ; la forge, c'est le classeur partagé.
|
||||
|
||||
- **Débranché — la machine à remonter le temps** : un texte écrit à plusieurs sur une feuille,
|
||||
avec une photo prise à chaque étape. Revenir à la photo d'hier, c'est un `git checkout` ;
|
||||
la pile de photos, c'est `git log`. Puis deux groupes modifient chacun leur copie de la
|
||||
même phrase : c'est un conflit, qu'il faut régler en se parlant.
|
||||
- **Git en local** : `git init`, `git add`, `git commit`, `git log`, `git diff`. Chacun
|
||||
versionne les scripts et programmes écrits pendant la semaine.
|
||||
- **Forgejo** : déposer ce travail sur la [forge d'Alpinux](../guides/git-alpinux.md), en
|
||||
explorer l'interface web, et proposer une modification sur le dépôt d'un camarade.
|
||||
- **Enquête, chapitre 5 — Le dénouement** : épreuve en équipes, chronométrée. Le site du club
|
||||
est versionné avec Git, et c'est ce qui va trahir le coupable : chaque commit dit **qui** a
|
||||
modifié **quoi** et **quand**. Il faut identifier le coupable, croiser avec les indices des
|
||||
jours précédents, puis remettre le site en état en revenant à une version saine.
|
||||
- **Clôture (45 min, à la place de l'approfondissement)** : remise des diplômes, ce qu'on
|
||||
retient de la semaine, et la suite (réunions Alpinux, install parties, spécialité NSI).
|
||||
|
||||
| | 3e | Terminale |
|
||||
|---|---|---|
|
||||
| Forgejo | Modifier un fichier depuis l'interface web et ouvrir une pull request | Branches, pull request depuis le terminal, résolution d'un conflit provoqué exprès |
|
||||
|
||||
---
|
||||
|
||||
## Où en est la préparation
|
||||
|
||||
| Jour | Cours sur le site | Jeux sur le site | Enquête |
|
||||
|---|---|---|---|
|
||||
| Lundi | ✅ Le terminal | ✅ Où range-t-on quoi ?, Premier jour sur le serveur | à écrire |
|
||||
| Mardi | à écrire : fichiers et droits, chercher et filtrer | ✅ Préparer un déploiement, rwx | à écrire |
|
||||
| Mercredi | à écrire : Bash | ✅ Sous le capot, Incident à 3 h du matin | à écrire |
|
||||
| Jeudi | le cours Python du wiki | à prévoir | à écrire |
|
||||
| Vendredi | à écrire : Git local et Forgejo | à prévoir | à écrire |
|
||||
|
||||
L'enquête sera installée sur chaque poste par un script : un dossier par élève, avec les
|
||||
fichiers, les journaux et le dépôt Git du site du club.
|
||||
|
||||
---
|
||||
|
||||
## Ce qu'il faut préparer
|
||||
|
||||
**Sur les postes**, à vérifier en amont :
|
||||
|
||||
- [ ] un terminal accessible aux élèves, et les commandes `git`, `python3`, `nano`, `tree` ;
|
||||
- [ ] le paquet `python3-tk`, sans lequel le module `turtle` de Python ne fonctionne pas ;
|
||||
- [ ] Git configuré avec un nom et une adresse pour chaque session
|
||||
(`git config --global user.name` et `user.email`), sans quoi `git commit` refuse de
|
||||
fonctionner. Pour des mineurs, un pseudonyme et une adresse fictive suffisent en local ;
|
||||
- [ ] facultatif, pour le plaisir : `figlet`, `cowsay`, `sl` ;
|
||||
- [ ] l'accès à `dynamic.alpinux.org` et à `gitea.alpinux.org` depuis le réseau de
|
||||
l'établissement (certains filtres bloquent les forges) ;
|
||||
- [ ] le dossier de l'enquête, installé par un script à lancer sur chaque poste.
|
||||
|
||||
**Pour la salle** : un vidéoprojecteur, des étiquettes et des cartes pour les activités
|
||||
débranchées, un carnet de bord par élève, des diplômes à imprimer.
|
||||
|
||||
---
|
||||
|
||||
## À décider avant la semaine {#a-decider}
|
||||
|
||||
| Question | Pourquoi c'est important |
|
||||
|---|---|
|
||||
| **Les comptes Forgejo des élèves.** Comptes AlpID nominatifs, comptes anonymes de classe (`eleve01`, `eleve02`…), ou forge installée localement pour la semaine ? | Les élèves sont mineurs : la solution la plus simple côté données personnelles est celle des comptes anonymes, créés à l'avance et supprimés après la semaine. |
|
||||
| **Les sessions sont-elles conservées d'un jour à l'autre ?** | Beaucoup de postes d'établissement effacent tout à la déconnexion. L'enquête et le travail de la semaine doivent survivre jusqu'au vendredi : sinon, prévoir une clé USB par binôme, ou s'appuyer plus tôt sur la forge. |
|
||||
| **Le nombre d'élèves et de postes.** | Le travail en binômes demande un poste pour deux au minimum. |
|
||||
| **La distribution installée et les droits.** Peut-on installer des paquets ? Les élèves ont-ils `sudo` ? | Sans droits d'installation, il faut vérifier toute la liste ci-dessus avant le lundi. |
|
||||
| **Les horaires exacts** de l'établissement. | Le déroulé type se décale facilement, mais les pauses et le repas sont imposés. |
|
||||
| **Les scores sur le site.** | Ils ne s'enregistrent qu'avec un compte AlpID. Sans compte, on peut faire un classement par équipe à la main, à partir des écrans de fin de partie. |
|
||||
|
|
@ -1,110 +0,0 @@
|
|||
---
|
||||
description: Fiche de référence du terminal Linux — l'invite, la forme d'une commande, l'arborescence, les chemins, et les commandes pwd, ls, cd et cat.
|
||||
---
|
||||
|
||||
# Le terminal : se repérer et se déplacer
|
||||
|
||||
Fiche de référence. Pour apprendre pas à pas, avec un terminal d'essai intégré, suivre le
|
||||
**[cours interactif](https://dynamic.alpinux.org/cours/terminal-premiers-pas/)**, puis le jeu
|
||||
**[Premier jour sur le serveur](https://dynamic.alpinux.org/jeux/terminal-premiers-pas/)**.
|
||||
|
||||
---
|
||||
|
||||
## Ouvrir un terminal
|
||||
|
||||
| Système | Comment |
|
||||
|---|---|
|
||||
| Linux Mint, Ubuntu | **Ctrl + Alt + T**, ou « Terminal » dans le menu |
|
||||
| Debian (GNOME) | Touche **Super**, puis taper « Terminal » |
|
||||
|
||||
Dans le terminal, **Ctrl + C n'est pas « copier »** : cette combinaison interrompt la
|
||||
commande en cours. On copie avec **Ctrl + Maj + C** et on colle avec **Ctrl + Maj + V**.
|
||||
|
||||
## Lire l'invite
|
||||
|
||||
```
|
||||
alex@srv-web01:~/projets$
|
||||
```
|
||||
|
||||
| Morceau | Signification |
|
||||
|---|---|
|
||||
| `alex` | l'utilisateur connecté |
|
||||
| `srv-web01` | le nom de la machine |
|
||||
| `~/projets` | le dossier courant (`~` = dossier personnel) |
|
||||
| `$` | utilisateur ordinaire — `#` signale l'administrateur (*root*) |
|
||||
|
||||
## La forme d'une commande
|
||||
|
||||
```
|
||||
ls -l /etc
|
||||
```
|
||||
|
||||
**Commande** (`ls`), puis **options** (`-l`), puis **arguments** (`/etc`), séparés par des
|
||||
espaces. Les majuscules comptent. Les options courtes se combinent : `ls -l -a` = `ls -la`.
|
||||
|
||||
Une commande qui réussit n'affiche souvent rien. Une commande qui échoue affiche un message :
|
||||
il faut le lire, il indique presque toujours la cause.
|
||||
|
||||
## L'arborescence
|
||||
|
||||
Tout part de la racine `/`. Les dossiers à connaître :
|
||||
|
||||
| Dossier | Contenu |
|
||||
|---|---|
|
||||
| `/home/<nom>` | les dossiers personnels |
|
||||
| `/etc` | la configuration du système et des services |
|
||||
| `/var/log` | les journaux |
|
||||
| `/tmp` | les fichiers temporaires |
|
||||
| `/usr/bin` | les programmes |
|
||||
|
||||
## Les chemins
|
||||
|
||||
| Chemin | Type | Part de… |
|
||||
|---|---|---|
|
||||
| `/home/alex/projets` | absolu | la racine : fonctionne de partout |
|
||||
| `projets/site-web` | relatif | le dossier courant |
|
||||
|
||||
| Raccourci | Signification |
|
||||
|---|---|
|
||||
| `~` | dossier personnel |
|
||||
| `.` | dossier courant |
|
||||
| `..` | dossier parent |
|
||||
| `-` | (avec `cd`) dossier précédent |
|
||||
|
||||
## Les commandes
|
||||
|
||||
| Commande | Effet |
|
||||
|---|---|
|
||||
| `pwd` | affiche le dossier courant |
|
||||
| `ls` | liste le contenu du dossier courant |
|
||||
| `ls dossier` | liste le contenu d'un autre dossier |
|
||||
| `ls -a` | inclut les fichiers cachés (nom commençant par `.`) |
|
||||
| `ls -l` | format détaillé : droits, propriétaire, groupe, taille, date |
|
||||
| `cd dossier` | entre dans un dossier |
|
||||
| `cd ..` | remonte d'un niveau |
|
||||
| `cd` ou `cd ~` | revient au dossier personnel |
|
||||
| `cd -` | revient au dossier précédent |
|
||||
| `cat fichier` | affiche un fichier en entier |
|
||||
| `less fichier` | parcourt un fichier page par page (`q` pour quitter) |
|
||||
| `head fichier` / `tail fichier` | les 10 premières / dernières lignes |
|
||||
| `man commande` | le manuel d'une commande (`q` pour quitter) |
|
||||
| `history` | les commandes déjà tapées |
|
||||
|
||||
## Les raccourcis clavier
|
||||
|
||||
| Touche | Effet |
|
||||
|---|---|
|
||||
| **Tab** | complète un nom ; deux fois, liste les possibilités |
|
||||
| **↑** / **↓** | parcourent l'historique |
|
||||
| **Ctrl + C** | annule la commande ou la ligne en cours |
|
||||
| **Ctrl + L** | efface l'écran |
|
||||
| **Ctrl + R** | recherche dans l'historique |
|
||||
|
||||
## Les erreurs fréquentes
|
||||
|
||||
| Message | Cause probable | Réflexe |
|
||||
|---|---|---|
|
||||
| `Aucun fichier ou dossier de ce type` | ce nom n'existe pas ici : mauvais dossier courant, ou nom mal écrit | `pwd`, `ls`, puis **Tab** pour compléter |
|
||||
| `commande introuvable` | faute de frappe, majuscule, ou programme non installé | relire ; `type commande` dit si elle existe |
|
||||
| `Permission non accordée` | les droits ne le permettent pas | `ls -l` pour voir les droits |
|
||||
| un nom avec espace « coupé en deux » | l'espace sépare les arguments | entourer de guillemets : `cat "mon fichier.txt"` |
|
||||
|
Before Width: | Height: | Size: 56 KiB |
|
Before Width: | Height: | Size: 73 KiB |
|
Before Width: | Height: | Size: 88 KiB |
|
Before Width: | Height: | Size: 54 KiB |
|
Before Width: | Height: | Size: 44 KiB |
|
Before Width: | Height: | Size: 64 KiB |
|
Before Width: | Height: | Size: 104 KiB |
|
Before Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 55 KiB |
|
Before Width: | Height: | Size: 63 KiB |
|
Before Width: | Height: | Size: 92 KiB |
|
Before Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 59 KiB |
|
Before Width: | Height: | Size: 88 KiB |
|
Before Width: | Height: | Size: 88 KiB |
|
Before Width: | Height: | Size: 83 KiB |
|
Before Width: | Height: | Size: 48 KiB |
|
Before Width: | Height: | Size: 58 KiB |
|
Before Width: | Height: | Size: 65 KiB |
|
Before Width: | Height: | Size: 55 KiB |
|
|
@ -1,23 +0,0 @@
|
|||
# wiki.alpinux.org
|
||||
|
||||
Documentation publique Alpinux — MkDocs Material.
|
||||
|
||||
## Déploiement
|
||||
|
||||
```bash
|
||||
cd org.alpinux.owni/wiki
|
||||
mkdocs build --strict
|
||||
rsync -rlcz --delete site/ alpinux.org:/var/www/wiki.alpinux.org/web/
|
||||
```
|
||||
|
||||
## Développement local
|
||||
|
||||
```bash
|
||||
pip install mkdocs-material
|
||||
mkdocs serve # http://localhost:8000
|
||||
```
|
||||
|
||||
## Notes
|
||||
|
||||
- Pas de service systemd — site statique servi directement par Apache
|
||||
- Les docs publiques sont dans `wiki/docs/technique/`
|
||||
|
|
@ -104,6 +104,10 @@ Clic droit sur **Démarrer** → *Terminal (administrateur)*, puis :
|
|||
powercfg /hibernate off
|
||||
```
|
||||
|
||||
!!! tip "Le dernier arrêt de Windows"
|
||||
Au moment d'éteindre Windows pour insérer la clé USB, maintenez **Maj (Shift)**
|
||||
enfoncée en cliquant sur *Démarrer → Arrêter*. Cela force un arrêt complet.
|
||||
|
||||
### Gestion de l'alimentation de la carte Wi-Fi
|
||||
|
||||
Certaines cartes Wi-Fi (puces Realtek ou Broadcom notamment) restent dans l'état de basse
|
||||
|
|
@ -184,8 +188,6 @@ Linux. Il faut le basculer sur **AHCI**, dans la section *Storage*, *SATA Config
|
|||
conserver Windows, faites le changement avec un bénévole. Si Windows est de toute
|
||||
façon remplacé, la bascule est sans conséquence.
|
||||
|
||||
|
||||
|
||||
---
|
||||
|
||||
## 2. Préparer son support d'installation
|
||||
|
|
@ -244,11 +246,8 @@ Avec [Ventoy](ventoy.md), la préparation tient en un copier-coller :
|
|||
### Branchements
|
||||
|
||||
- Insérez la clé Ventoy dans un **port USB de la machine**, en évitant les hubs.
|
||||
- **Branchez un câble Ethernet.** Le script install.sh de Alpinux effectue des tests.
|
||||
|
||||
!!! tip "Le dernier arrêt de Windows - Comment arrêter Windows pour démarrer sur la clé USB"
|
||||
Au moment d'éteindre Windows pour insérer la clé USB, maintenez **Maj (Shift)**
|
||||
enfoncée en cliquant sur *Démarrer → Arrêter*. Cela force un arrêt complet.
|
||||
- **Branchez un câble Ethernet.** Mint pourra télécharger mises à jour, codecs et paquets
|
||||
de langue pendant l'installation — cela évite beaucoup de réglages ensuite.
|
||||
|
||||
### Accéder au menu de démarrage
|
||||
|
||||
|
|
@ -342,27 +341,18 @@ fatigué. On ne le découvre pas au milieu du partitionnement.
|
|||
En session live, taper les commandes une à une est fastidieux. Un script d'Alpinux fait
|
||||
l'inventaire et rend un verdict :
|
||||
|
||||
**Sur le réseau de l'install party**, où les scripts sont servis par
|
||||
[le serveur qu'Alpinux emporte](../technique/serveur-install-party.md) :
|
||||
|
||||
```bash
|
||||
wget http://alpicache.lan/verif-disque.sh && chmod +x verif-disque.sh && ./verif-disque.sh
|
||||
```
|
||||
|
||||
!!! tip "Si le nom ne répond pas"
|
||||
Le serveur répond aussi à `alpicache`, `apt-proxy` et `10.0.0.1` — cette
|
||||
dernière adresse fonctionne même quand la résolution de noms n'est pas encore
|
||||
en place :
|
||||
`wget http://10.0.0.1/verif-disque.sh`
|
||||
|
||||
**Ailleurs, depuis Internet :**
|
||||
|
||||
```bash
|
||||
wget https://gitea.alpinux.org/alpinux.cedrica5l/alpinux.scripts/raw/branch/stable/poste/verif-disque.sh
|
||||
wget https://gitea.alpinux.org/alpinux.cedrica5l/alpinux-wiki/raw/branch/main/code/linux/linux-mint/verif-disque.sh
|
||||
chmod +x verif-disque.sh
|
||||
./verif-disque.sh
|
||||
```
|
||||
|
||||
Sur le réseau de l'install party, plus court :
|
||||
|
||||
```bash
|
||||
wget http://10.0.0.1/verif-disque.sh && chmod +x verif-disque.sh && ./verif-disque.sh
|
||||
```
|
||||
|
||||
Il **ne modifie rien** — il lit, il affiche, il conseille. Il demande le mot de passe pour
|
||||
les vérifications qui le nécessitent, puis passe en revue :
|
||||
|
||||
|
|
@ -378,40 +368,6 @@ les vérifications qui le nécessitent, puis passe en revue :
|
|||
|
||||
Il finit par deux listes : *à régler avant d'installer*, et *à savoir*.
|
||||
|
||||
### Relever la fiche de la machine
|
||||
|
||||
En install party, un second script complète l'état des lieux : il relève la **fiche
|
||||
matérielle** — modèle, processeur, mémoire et ses connecteurs, disques et leur santé —
|
||||
et l'envoie au serveur de l'association.
|
||||
|
||||
```bash
|
||||
wget http://alpicache.lan/alpi-fiche.sh && chmod +x alpi-fiche.sh && sudo ./alpi-fiche.sh --check
|
||||
```
|
||||
|
||||
Hors réseau de l'install party, il se prend sur Internet :
|
||||
|
||||
```bash
|
||||
wget https://gitea.alpinux.org/alpinux.cedrica5l/alpinux.scripts/raw/branch/stable/poste/alpi-fiche.sh
|
||||
```
|
||||
|
||||
Il n'aura alors aucun serveur à qui remettre la fiche : il l'affiche, et c'est tout.
|
||||
|
||||
Lancé depuis la session live, il rend en plus un verdict en trois états : **bon pour
|
||||
l'installation**, **possible avec des réserves**, ou **ne pas installer en l'état** — un
|
||||
disque qui se déclare défaillant, des secteurs réalloués, moins de 2 Go de mémoire, un
|
||||
processeur 32 bits. C'est le dernier moment où l'on peut encore renoncer et en parler au
|
||||
propriétaire.
|
||||
|
||||
Le même script, relancé après l'installation (sans `--check`), enregistre ce qui a
|
||||
finalement été installé. Les deux relevés se comparent : un disque qui allait bien le
|
||||
matin et se plaint le soir, cela se voit.
|
||||
|
||||
!!! warning "Dites-le à la personne dont vous installez la machine"
|
||||
La fiche part sur le réseau local, vers le serveur de l'association, et n'en sort
|
||||
pas. Elle ne contient ni fichiers, ni historique, ni nom d'utilisateur — mais elle
|
||||
contient le **nom de la machine**, souvent un prénom, et l'**adresse matérielle** de
|
||||
la carte réseau. C'est son ordinateur : cela se demande, cela ne se suppose pas.
|
||||
|
||||
!!! danger "BitLocker : ne touchez à rien"
|
||||
Si le script annonce une partition chiffrée par BitLocker, **arrêtez-vous là**. Le
|
||||
chiffrement doit être suspendu depuis Windows — *Paramètres → Confidentialité et
|
||||
|
|
@ -612,34 +568,25 @@ Le système est installé ; quelques réglages le rendent réellement utilisable
|
|||
### Le script de post-installation Alpinux
|
||||
|
||||
Il automatise ce qui manque presque toujours après une installation standard. Ouvrez un
|
||||
terminal (`Ctrl + Alt + T`) et récupérez-le — **sur le réseau local de l'Install Party**,
|
||||
où [le serveur d'Alpinux](../technique/serveur-install-party.md) le sert et met en cache
|
||||
tout ce que la machine téléchargera ensuite :
|
||||
terminal (`Ctrl + Alt + T`) et récupérez-le — **sur le réseau local de l'Install Party** :
|
||||
|
||||
```bash
|
||||
wget http://alpicache.lan/install.sh http://alpicache.lan/alpi-fiche.sh
|
||||
wget http://10.0.0.1/install.sh
|
||||
```
|
||||
|
||||
**ou depuis Internet :**
|
||||
|
||||
```bash
|
||||
wget https://gitea.alpinux.org/alpinux.cedrica5l/alpinux.scripts/raw/branch/stable/poste/install.sh \
|
||||
https://gitea.alpinux.org/alpinux.cedrica5l/alpinux.scripts/raw/branch/stable/poste/alpi-fiche.sh
|
||||
wget https://gitea.alpinux.org/alpinux.cedrica5l/alpinux-wiki/raw/branch/main/code/linux/linux-mint/install.sh
|
||||
```
|
||||
|
||||
Puis, dans les deux cas :
|
||||
|
||||
```bash
|
||||
chmod +x install.sh alpi-fiche.sh
|
||||
chmod +x install.sh
|
||||
./install.sh
|
||||
```
|
||||
|
||||
!!! note "Pourquoi deux fichiers"
|
||||
`install.sh` commence par relever la fiche matérielle, et il ne le fait **que s'il
|
||||
trouve `alpi-fiche.sh` à côté de lui** — il ne va rien chercher sur le réseau de
|
||||
lui-même. Téléchargé seul, il s'installera très bien, simplement sans relevé. En
|
||||
install party, prenez les deux.
|
||||
|
||||
Le mot de passe est demandé au passage (`alpinux73` en Install Party) : les caractères ne
|
||||
s'affichent pas, c'est normal.
|
||||
|
||||
|
|
|
|||
|
|
@ -109,31 +109,16 @@ Les **Préférences** s'organisent en trois onglets :
|
|||
!!! tip "Le piège du `/boot` plein"
|
||||
Les anciens noyaux s'accumulent et finissent par saturer la partition de démarrage,
|
||||
ce qui bloque toute nouvelle mise à jour. L'onglet *Automatisation* permet de
|
||||
programmer leur suppression ; à défaut, passez de temps en temps par
|
||||
**Affichage → Noyaux Linux**, qui les liste et permet de retirer les plus anciens.
|
||||
|
||||
!!! warning "Changer de noyau n'est pas anodin"
|
||||
La même fenêtre *Noyaux Linux* s'ouvre sur un avertissement qu'il vaut la peine de
|
||||
lire : un noyau plus récent peut faire disparaître le Wi-Fi, l'accélération graphique,
|
||||
ou donner un écran noir au démarrage — surtout avec des pilotes propriétaires.
|
||||
|
||||
La sortie de secours tient en quatre gestes, à connaître **avant** d'en installer un :
|
||||
redémarrer, maintenir **Maj** pour afficher le menu GRUB, choisir *Advanced options*
|
||||
puis un noyau antérieur, et désinstaller le plus récent une fois revenu.
|
||||
programmer leur suppression ; à défaut, retirez-les de temps en temps depuis
|
||||
l'*Analyseur de noyaux* du gestionnaire.
|
||||
|
||||
### Activer le pare-feu
|
||||
|
||||
Le pare-feu est installé, mais **désactivé par défaut**. Pour un ordinateur portable qui
|
||||
se connecte à des réseaux publics, il vaut mieux l'allumer :
|
||||
|
||||
**Paramètres du système → Pare-feu** (famille *Administration*). L'ouverture demande votre
|
||||
mot de passe, puis il suffit de basculer **État** sur *Activé*.
|
||||
|
||||
Le profil proposé par défaut, **Domestique**, convient : les deux lignes en dessous
|
||||
annoncent la règle appliquée — *Entrant : Refuser*, *Sortant : Autoriser*. Autrement dit,
|
||||
rien ne rentre sans y avoir été invité, tout ce que vous lancez sort normalement. Les
|
||||
profils *Bureau* et *Public* servent à mémoriser d'autres jeux de règles ; sans besoin
|
||||
précis, n'y touchez pas.
|
||||
**Paramètres du système → Pare-feu** (famille *Administration*), puis basculez **État** sur *Activé*. Le profil *Public* convient :
|
||||
il bloque les connexions entrantes et laisse passer tout ce que vous initiez.
|
||||
|
||||
### Vérifier ses pilotes
|
||||
|
||||
|
|
|
|||
|
|
@ -1,110 +0,0 @@
|
|||
**Format** : Court (20 min)
|
||||
|
||||
**Objectif :** ne plus imprimer un formulaire pour le signer puis le scanner.
|
||||
|
||||
**Déroulé**
|
||||
|
||||
1. Le lecteur de Linux Mint (Xreader) : lire, chercher, surligner.
|
||||
2. Okular : annoter et remplir un formulaire.
|
||||
3. Xournal++ : apposer une signature manuscrite.
|
||||
4. PDF Arranger : fusionner, découper, réordonner des pages.
|
||||
5. Exporter en PDF depuis LibreOffice, réduire le poids pour un envoi par mail.
|
||||
|
||||
**Démo :** remplir et signer un vrai formulaire, le fusionner avec une pièce justificative.
|
||||
|
||||
--
|
||||
|
||||
Voilà ce que nous voulons faire : Un dossier d’inscription à envoyer par mail. C'est un formulaire à remplir et signer, une pièce justificative à joindre, le tout en un seul PDF léger. Chaque outil résout une étape.
|
||||
|
||||
### Avant la séance
|
||||
|
||||
**Fichiers à préparer**
|
||||
|
||||
- Un formulaire PDF avec champs modifiables (un CERFA convient).
|
||||
- Un formulaire sans champs, par exemple un document scanné.
|
||||
- Un justificatif en image (photo d’une facture fictive).
|
||||
- Une signature sur papier blanc, photographiée et enregistrée en PNG.
|
||||
|
||||
**Installation** (Xreader et LibreOffice sont déjà dans Linux Mint) :
|
||||
|
||||
```
|
||||
sudo apt install okular xournalpp pdfarranger
|
||||
```
|
||||
|
||||
Les trois sont aussi dans la Logithèque, à utiliser si vous ne vous sentez pas à l'aise avec le terminal.
|
||||
|
||||
### 1. Xreader, le lecteur déjà installé
|
||||
|
||||
- Ouvrir le formulaire par double-clic.
|
||||
- Le panneau latéral : vignettes des pages et sommaire.
|
||||
- Chercher un mot avec Ctrl+F.
|
||||
- Surligner un passage et ajouter une note depuis le panneau des annotations.
|
||||
- Remplir directement un champ du formulaire.
|
||||
|
||||
**À noter :** pour lire et pour un formulaire simple, il n’y a rien à installer.
|
||||
|
||||
**Piège :** utiliser « Enregistrer une copie », sinon les annotations et la saisie sont perdues à la fermeture.
|
||||
|
||||
### 2. Okular, pour annoter et remplir
|
||||
|
||||
- La barre d’annotations (F6) : surligneur, note, trait à main levée.
|
||||
- Le bouton « Afficher les formulaires », puis la saisie des champs et des cases à cocher.
|
||||
- L’outil « machine à écrire » : il permet d’écrire sur un PDF qui n’a pas de champs, cas très fréquent avec les documents scannés.
|
||||
- Enregistrer avec Ctrl+S, puis rouvrir le fichier dans Xreader pour prouver que le texte est bien dedans.
|
||||
|
||||
**À retenir :** Okular vient de l’environnement KDE mais fonctionne très bien sous Mint. C’est l’outil à retenir si l’on ne devait en installer qu’un.
|
||||
|
||||
**Piège :** un PDF protégé peut refuser la saisie. Dans ce cas, passer à Xournal++.
|
||||
|
||||
### 3. Xournal++, pour signer
|
||||
|
||||
- Fichier > Annoter un PDF, puis ouvrir le formulaire rempli.
|
||||
- Méthode 1 : signer au stylet ou à la souris avec l’outil stylo (résultat médiocre à la souris, le montrer avec humour).
|
||||
- Méthode 2, la bonne : insérer l’image de sa signature, la redimensionner et la placer.
|
||||
- Ajouter la date avec l’outil texte.
|
||||
- Fichier > Exporter en PDF.
|
||||
|
||||
**À noter :** une signature collée en image est acceptée pour beaucoup de démarches courantes, mais ce n’est pas une signature électronique qualifiée. Pour un acte important, l’organisme impose généralement son propre service.
|
||||
|
||||
**Piège :** « Enregistrer » produit un fichier .xopp, illisible pour le destinataire. Il faut exporter en PDF. C’est l’erreur numéro un.
|
||||
|
||||
**Conseil de sécurité :** ranger le PNG de sa signature dans un dossier discret, et ne pas le laisser traîner sur une clé USB.
|
||||
|
||||
### 4. PDF Arranger, pour assembler
|
||||
|
||||
- Glisser le formulaire signé et le justificatif dans la fenêtre.
|
||||
- Réordonner les pages à la souris.
|
||||
- Faire pivoter une page scannée de travers.
|
||||
- Supprimer une page blanche.
|
||||
- Extraire une seule page d’un long document : sélectionner, puis exporter la sélection.
|
||||
- Enregistrer sous un nouveau nom.
|
||||
|
||||
**À noter :** le logiciel accepte aussi les images, donc une photo de justificatif devient une page PDF sans étape intermédiaire.
|
||||
|
||||
**Piège :** enregistrer sous un nouveau nom pour ne pas écraser l’original.
|
||||
|
||||
### 5. Exporter et alléger
|
||||
|
||||
- Dans LibreOffice Writer : Fichier > Exporter vers PDF.
|
||||
- Dans les options : compression JPEG et réduction de la résolution des images à 150 DPI. Comparer le poids avant et après dans le gestionnaire de fichiers.
|
||||
- Mentionner l’option PDF hybride, qui embarque le fichier d’origine et permet de le remodifier plus tard.
|
||||
|
||||
**Pour un PDF déjà existant et trop lourd**, typiquement un scan, une commande suffit :
|
||||
|
||||
```
|
||||
gs -sDEVICE=pdfwrite -dPDFSETTINGS=/ebook -dNOPAUSE -dBATCH -sOutputFile=leger.pdf lourd.pdf
|
||||
```
|
||||
|
||||
**À noter :** les sites de compression en ligne fonctionnent, mais on y envoie sa pièce d’identité ou son avis d’imposition à un inconnu. Tout ce qui a été montré ce soir reste sur l’ordinateur.
|
||||
|
||||
### Conclusion
|
||||
|
||||
Rappeler le parcours : remplir (Okular), signer (Xournal++), assembler (PDF Arranger), alléger, envoyer. Pas d’imprimante, pas de scanner, pas de service en ligne.
|
||||
|
||||
|Je veux|J’utilise|
|
||||
|---|---|
|
||||
|Lire, chercher, surligner|Xreader|
|
||||
|Remplir un formulaire, écrire sur un PDF|Okular|
|
||||
|Signer|Xournal++|
|
||||
|Fusionner, découper, pivoter|PDF Arranger|
|
||||
|Créer un PDF léger|LibreOffice|
|
||||
|
|
@ -1,16 +0,0 @@
|
|||
**Format** : Court (20 min)
|
||||
|
||||
**Objectif :** savoir quoi sauvegarder et où, avant de parler d’outil.
|
||||
|
||||
**Déroulé**
|
||||
|
||||
1. Où sont mes fichiers : le dossier personnel, Documents, Images (rappel de la présentation existante).
|
||||
2. Ce qui est irremplaçable (photos, papiers) et ce qui ne l’est pas (logiciels, système).
|
||||
3. La règle 3-2-1 expliquée simplement : trois copies, deux supports, une ailleurs.
|
||||
4. Choisir son support : disque externe, clé USB, [[NAS]], [[Nextcloud]].
|
||||
5. Synchronisation et sauvegarde ne sont pas la même chose : une suppression par erreur se propage.
|
||||
|
||||
**Démo :** copier son dossier Documents sur un disque externe, puis vérifier que la copie s’ouvre.
|
||||
|
||||
**Remarque :** « Les sauvegardes » figure déjà dans les présentations passées et un guide existe sur le wiki. Cette séance peut en être la version actualisée, centrée sur les documents personnels.
|
||||
[sauvegardes](../guides/sauvegardes.md)
|
||||
|
|
@ -1,16 +0,0 @@
|
|||
**Format** : Long (45 min)
|
||||
|
||||
**Objectif :** que chacun reparte avec une sauvegarde configurée sur sa machine.
|
||||
|
||||
**Déroulé**
|
||||
|
||||
1. Deux outils, deux rôles : Timeshift pour le système, l’Outil de sauvegarde pour les fichiers personnels.
|
||||
2. Timeshift : choisir le disque, la fréquence, le nombre d’instantanés conservés, puis restaurer après une mise à jour ratée.
|
||||
3. Outil de sauvegarde : sauvegarder son dossier personnel, exclure des dossiers, restaurer.
|
||||
4. Sauvegarder la liste de ses logiciels, pratique pour une réinstallation.
|
||||
5. Pour aller plus loin : Déjà Dup ou Pika Backup, avec planification et chiffrement.
|
||||
6. Tester une restauration, l’étape que tout le monde oublie.
|
||||
|
||||
**Démo :** supprimer volontairement un fichier, puis le restaurer.
|
||||
|
||||
**À prévoir :** demander aux participants d’apporter leur portable et un disque externe.
|
||||
|
|
@ -1,18 +0,0 @@
|
|||
|
||||
**Format :** long, 45 min
|
||||
|
||||
**Objectif :** utiliser [[Nextcloud]] côté utilisateur, sans parler d’installation de serveur.
|
||||
|
||||
**Déroulé**
|
||||
|
||||
1. À quoi ça sert : ses fichiers accessibles partout, sans Google Drive ni OneDrive.
|
||||
2. L’interface web : déposer, ranger, retrouver une version précédente, corbeille.
|
||||
3. Le client de synchronisation sous Linux Mint : choisir les dossiers.
|
||||
4. L’application mobile : envoi automatique des photos.
|
||||
5. Partager : lien public, mot de passe, date d’expiration.
|
||||
6. Agenda et contacts, reliés à Thunderbird.
|
||||
7. Les limites : quota, et toujours pas une sauvegarde à lui seul.
|
||||
|
||||
**Démo :** partager un dossier avec la salle par un code QR, chacun y dépose une photo.
|
||||
|
||||
**Atout :** le portail membres d’Alpinux donne déjà accès à un Nextcloud, donc les adhérents peuvent pratiquer tout de suite, et c’est un argument d’adhésion. [alpinux](https://alpinux.org/)
|
||||
|
|
@ -1,44 +0,0 @@
|
|||
Le référentiel Pix (aligné sur le CRCN, le Cadre de référence des compétences numériques) compte 16 compétences rassemblées en 5 grands domaines, décliné du cadre commun de référence européen DIGCOMP 2.1. Les voici :
|
||||
|
||||
**1. Information et données**
|
||||
|
||||
- 1.1 [[Mener une recherche et une veille d'information]]
|
||||
- 1.2 [[Gérer des données]]
|
||||
- 1.3 [[Traiter des données]]
|
||||
|
||||
**2. Communication et collaboration**
|
||||
|
||||
- 2.1 [[Interagir]]
|
||||
- 2.2 [[Partager et publier]]
|
||||
- 2.3 [[Collaborer]]
|
||||
- 2.4 [[S'insérer dans le monde numérique]]
|
||||
|
||||
**3. Création de contenu**
|
||||
|
||||
- 3.1 [[Développer des documents textuels]]
|
||||
- 3.2 [[Développer des documents multimédia]]
|
||||
- 3.3 [[Adapter les documents à leur finalité]]
|
||||
- 3.4 [[Programmer]]
|
||||
|
||||
**4. Protection et sécurité**
|
||||
|
||||
- 4.1 [[Sécuriser l'environnement numérique]]
|
||||
- 4.2 [[Protéger les données personnelles et la vie privée]]
|
||||
- 4.3 [[Protéger la santé, le bien-être et l'environnement]]
|
||||
|
||||
**5. Environnement numérique**
|
||||
|
||||
- 5.1 [[Résoudre des problèmes techniques]]
|
||||
- 5.2 [[Construire un environnement numérique]]
|
||||
|
||||
Quelques repères utiles : le cadre prévoit 8 niveaux de maîtrise progressive, les niveaux 1 à 5 concernant les élèves de collège et de lycée. Chaque compétence est décomposée en sous-compétences, elles-mêmes déclinées en acquis par niveau, et côté score, une compétence validée au niveau le plus élevé « rapporte » 64 Pix (8 Pix par niveau). Enfin, la certification doit être renouvelée tous les 3 ans.
|
||||
|
||||
Le détail de chaque compétence est consultable sur pix.fr/competences.
|
||||
|
||||
Sources :
|
||||
|
||||
- [France Compétences – Certificat Pix](https://www.francecompetences.fr/recherche/rs/3807)
|
||||
- [France Compétences – fiche Pix](https://certifpro.francecompetences.fr/api/fiches/downloadAncFormat/18995)
|
||||
- [Collège Alfred Kastler – Parcours Pix 3e](https://alfred-kastler.college.ac-normandie.fr/IMG/pdf/parcours_de_formation_pix_3e.pdf)
|
||||
- [Collège Anna Marly – Pix et continuité pédagogique](https://www.college-anna-marly-brest.ac-rennes.fr/sites/college-anna-marly-brest.ac-rennes.fr/IMG/pdf/pix_et_continuite_pedagogique.pdf)
|
||||
|
||||
|
|
@ -1,74 +0,0 @@
|
|||
## 3.3 Adapter les documents à leur finalité
|
||||
|
||||
**Ce que recouvre la compétence** : transformer un document selon son usage (impression, mise en ligne, projection, mises à jour fréquentes, diffusion sur plusieurs supports) et maîtriser les licences qui encadrent sa réutilisation. Thématiques Pix : choix et conversion de formats, poids et qualité des fichiers, interopérabilité, accessibilité, licences.
|
||||
|
||||
### Progression par niveaux (résumé)
|
||||
|
||||
- **N1-N2** : enregistrer un document dans un autre format, exporter en PDF.
|
||||
- **N3** : choisir le format selon l'usage (modifiable ou figé), réduire le poids d'une image avant envoi.
|
||||
- **N4-N5** : préparer un document pour l'impression ou la projection, appliquer une licence à sa production, respecter celles des ressources réutilisées.
|
||||
- **N6+** : organiser une production multisupport à partir d'une source unique, automatiser les conversions, gérer la compatibilité des licences.
|
||||
|
||||
### Version Linux et libre
|
||||
|
||||
**Choisir le bon format selon l'usage**
|
||||
|
||||
- À modifier : ODT, ODS, ODP, Markdown
|
||||
- À diffuser figé ou imprimer : PDF ; à archiver : PDF/A
|
||||
- Pour le web : HTML ; pour une liseuse : EPUB
|
||||
- Images : PNG (schémas), JPEG ou WebP (photos), SVG (vectoriel)
|
||||
- Audio et vidéo : Opus, FLAC, WebM (formats ouverts) ; MP3 et MP4 pour la compatibilité
|
||||
|
||||
**Convertir**
|
||||
|
||||
- LibreOffice en ligne de commande : `soffice --headless --convert-to pdf *.odt` pour tout un dossier
|
||||
- **Pandoc** : une source Markdown, plusieurs sorties (principe de la diffusion multicanale)
|
||||
- Images : **ImageMagick**, Converseen (par lots), Switcheroo (GNOME)
|
||||
- Audio et vidéo : **FFmpeg**, HandBrake
|
||||
|
||||
**Alléger et optimiser**
|
||||
|
||||
- Compression avec ou sans perte : comprendre le compromis
|
||||
- Images : Curtail, ou `magick photo.jpg -resize 1200x photo-web.jpg`
|
||||
- PDF trop lourd : Ghostscript, réglages d'export de LibreOffice
|
||||
- Assembler, découper, réordonner des PDF : PDF Arranger, `qpdf`
|
||||
|
||||
**Préparer pour l'impression**
|
||||
|
||||
- Résolution (300 ppp), marges, fonds perdus
|
||||
- Couleurs CMJN avec Scribus
|
||||
- Impression en livret depuis LibreOffice, gestion des imprimantes avec CUPS
|
||||
|
||||
**Préparer pour la projection**
|
||||
|
||||
- Format 16:9, gros caractères, contrastes forts
|
||||
- PDF avec polices incorporées pour éviter les surprises sur un autre poste
|
||||
|
||||
**Documents mis à jour souvent**
|
||||
|
||||
- Garder la source modifiable, versionner (lien 2.3)
|
||||
- Champs automatiques (dates, numéros), modèles, publipostage
|
||||
|
||||
**Accessibilité**
|
||||
|
||||
- PDF balisé, texte alternatif
|
||||
- **OCRmyPDF** : rendre un PDF scanné lisible et cherchable
|
||||
|
||||
**Avant diffusion**
|
||||
|
||||
- Retirer métadonnées et traces de révisions : option de LibreOffice pour supprimer les informations personnelles à l'enregistrement, **mat2**
|
||||
|
||||
**Licences**
|
||||
|
||||
- Creative Commons : choisir, afficher la mention dans le document et ses propriétés
|
||||
- Compatibilité : on ne peut pas mélanger librement BY-SA et BY-NC dans une même œuvre
|
||||
- **CC0** pour le domaine public, **Licence Ouverte (Etalab)** pour les données publiques, **GPL** pour le code
|
||||
- Vérifier la licence de chaque ressource réutilisée et la créditer
|
||||
|
||||
### Idées d'activités
|
||||
|
||||
- Partir d'un même contenu et produire trois versions : une affiche imprimable, une page web légère, un diaporama à projeter
|
||||
- Convertir tout un dossier de documents en PDF en une seule commande
|
||||
- Défi poids : envoyer un document illustré de 25 Mo en moins de 2 Mo sans perte visible de qualité
|
||||
- Rendre un PDF scanné accessible avec OCRmyPDF, puis tester avec un lecteur d'écran (Orca)
|
||||
- Construire un document à partir de ressources sous différentes licences et vérifier si la combinaison est autorisée
|
||||
|
|
@ -1,65 +0,0 @@
|
|||
## 2.3 Collaborer
|
||||
|
||||
**Ce que recouvre la compétence** : travailler à plusieurs pour réaliser un projet, coproduire des documents, des données ou des connaissances, et apprendre ensemble. Thématiques Pix : outils d'édition partagée, suivi des modifications et gestion de versions, droits d'accès, organisation du travail en groupe, production de communs.
|
||||
|
||||
### Progression par niveaux (résumé)
|
||||
|
||||
- **N1-N2** : modifier un document partagé, laisser un commentaire.
|
||||
- **N3** : utiliser le suivi des modifications et l'historique des versions, respecter le travail des autres.
|
||||
- **N4-N5** : organiser un projet de groupe (répartition des tâches, échéances), gérer les droits d'accès d'un espace partagé.
|
||||
- **N6+** : choisir et mettre en place un environnement collaboratif adapté, gérer les versions et les conflits, coordonner une production à grande échelle.
|
||||
|
||||
### Version Linux et libre
|
||||
|
||||
**Édition simultanée**
|
||||
|
||||
- **CryptPad** : texte, tableur, présentation, kanban, formulaires, tableau blanc, le tout chiffré de bout en bout
|
||||
- **Etherpad** : texte en temps réel avec une couleur par auteur, très lisible pour voir qui a écrit quoi
|
||||
- **HedgeDoc** : Markdown collaboratif
|
||||
- Nextcloud avec **Collabora Online** ou **OnlyOffice** : bureautique complète dans le navigateur
|
||||
|
||||
**Travailler hors ligne, à plusieurs**
|
||||
|
||||
- LibreOffice : suivi des modifications (accepter/refuser), commentaires, comparaison de deux versions d'un document
|
||||
|
||||
**Gestion de versions**
|
||||
|
||||
- Historique des versions dans Nextcloud et CryptPad : revenir en arrière
|
||||
- **Git** : `clone`, `commit`, `pull`, `push`, branches, résolution de conflits
|
||||
- Forges libres : **Codeberg**, GitLab, Forgejo (auto-hébergeable)
|
||||
- Tickets (issues) et demandes de fusion : le modèle de collaboration du logiciel libre
|
||||
|
||||
**Organisation et suivi de projet**
|
||||
|
||||
- Kanban : Nextcloud Deck, Kanboard, Wekan, Vikunja
|
||||
- Gestion de projet plus poussée : OpenProject, Taiga
|
||||
- Tableaux blancs : Excalidraw, draw.io, tableau blanc de BigBlueButton
|
||||
|
||||
**Bases de connaissances**
|
||||
|
||||
- Wikis d'équipe : BookStack, Wiki.js, DokuWiki
|
||||
|
||||
**Espaces de travail complets**
|
||||
|
||||
- **Nextcloud** : fichiers, agenda, discussions, tâches au même endroit
|
||||
- Framaspace (Nextcloud pour associations et collectifs)
|
||||
- apps.education.fr pour les personnels de l'Éducation nationale
|
||||
- Discussions d'équipe : Matrix/Element, Mattermost
|
||||
|
||||
**Droits d'accès**
|
||||
|
||||
- Lecture, commentaire, édition, administration : qui peut faire quoi
|
||||
- Liens publics vs accès nominatif
|
||||
|
||||
**Méthodes de travail**
|
||||
|
||||
- Définir des rôles, des conventions de nommage, un calendrier
|
||||
- Décider ensemble des règles (gouvernance), comme dans les projets libres
|
||||
|
||||
### Idées d'activités
|
||||
|
||||
- Rédaction à plusieurs sur Etherpad, puis analyse des couleurs : la contribution est-elle équilibrée ?
|
||||
- Relecture croisée d'un texte dans LibreOffice avec suivi des modifications
|
||||
- Gérer un projet de groupe de bout en bout avec un tableau Deck ou Kanboard
|
||||
- Premier pas avec Git sur Codeberg : chacun modifie un fichier, on provoque puis on résout un conflit
|
||||
- Observer un vrai projet libre (tickets, discussions, contributions) pour comprendre comment des milliers de personnes collaborent sans se connaître
|
||||
|
|
@ -1,79 +0,0 @@
|
|||
## 5.2 Construire un environnement numérique
|
||||
|
||||
**Ce que recouvre la compétence** : installer, configurer et enrichir un environnement (matériel, système, logiciels, services) adapté à ses activités, à son contexte et à ses valeurs. C'est la compétence où le choix de Linux et du libre devient lui-même l'objet d'apprentissage. Thématiques Pix : composants matériels, systèmes d'exploitation, installation de logiciels, configuration et personnalisation, périphériques et réseau, choix de services.
|
||||
|
||||
### Progression par niveaux (résumé)
|
||||
|
||||
- **N1-N2** : allumer et prendre en main un appareil, connecter un périphérique, personnaliser le fond d'écran ou la langue.
|
||||
- **N3** : installer et désinstaller une application, connecter un appareil au réseau, choisir ses applications par défaut.
|
||||
- **N4-N5** : configurer un système (comptes, partage, périphériques), choisir des logiciels et services selon des critères explicites.
|
||||
- **N6+** : installer un système d'exploitation, concevoir un environnement complet pour un usage ou un groupe, auto-héberger des services.
|
||||
|
||||
### Version Linux et libre
|
||||
|
||||
**Comprendre les couches**
|
||||
|
||||
- Matériel (processeur, mémoire, stockage, carte graphique), micrologiciel UEFI
|
||||
- Noyau Linux, pilotes, système GNU, environnement de bureau, applications
|
||||
- Une même base, de nombreuses combinaisons : c'est ce qui rend les choix visibles et compréhensibles
|
||||
|
||||
**Choisir sa distribution et son bureau**
|
||||
|
||||
- Pour débuter : **Linux Mint**, Ubuntu, Zorin OS
|
||||
- Stables et communautaires : **Debian**, Fedora, openSUSE
|
||||
- Pour apprendre en profondeur : Arch Linux
|
||||
- Contextes particuliers : **PrimTux** (écoles primaires, projet français), Emmabuntüs (réemploi)
|
||||
- Environnements de bureau : GNOME, KDE Plasma, Xfce, Cinnamon, MATE, LXQt (du plus riche au plus léger)
|
||||
|
||||
**Installer le système**
|
||||
|
||||
- Tester sans rien modifier grâce au mode live
|
||||
- Créer une clé d'installation : Impression d'image disque (GNOME), balenaEtcher, Ventoy
|
||||
- Choix d'installation : remplacer l'ancien système ou cohabiter (double démarrage), partitionnement, chiffrement LUKS (lien 4.1), Secure Boot
|
||||
- S'entraîner d'abord en machine virtuelle avec GNOME Boxes
|
||||
|
||||
**Installer des logiciels**
|
||||
|
||||
- Gestionnaire de paquets : `apt`, `dnf`, `pacman`
|
||||
- Logithèques graphiques : Logiciels (GNOME), Discover (KDE)
|
||||
- **Flatpak et Flathub**, Snap, AppImage : comprendre leurs différences, avantages et limites
|
||||
- Règle d'or : privilégier les sources officielles plutôt que des fichiers téléchargés au hasard
|
||||
|
||||
**Configurer et personnaliser**
|
||||
|
||||
- Comptes utilisateurs et groupes, droits d'administration
|
||||
- Langue, disposition du clavier, raccourcis, applications par défaut, lancement au démarrage
|
||||
- Extensions GNOME, widgets KDE, thèmes
|
||||
- Les réglages sont stockés dans `~/.config` : sauvegarder et transporter son environnement (_dotfiles_)
|
||||
|
||||
**Périphériques et réseau**
|
||||
|
||||
- Imprimantes et scanners (lien 5.1)
|
||||
- Partage de dossiers en réseau local avec Samba
|
||||
- **KDE Connect** ou GSConnect (GNOME) : relier son téléphone à son ordinateur (fichiers, notifications, presse-papiers)
|
||||
|
||||
**Choisir ses services selon ses valeurs**
|
||||
|
||||
- Hébergeurs du collectif CHATONS, Framaspace, Nextcloud (lien 1.2 et 2.3)
|
||||
- Téléphone : F-Droid, /e/OS (lien 4.2)
|
||||
- Critères à expliciter : liberté du logiciel, formats ouverts, vie privée, localisation des données, sobriété, coût
|
||||
|
||||
**Auto-héberger**
|
||||
|
||||
- **YunoHost** (projet français) : installer Nextcloud, FreshRSS, Wallabag et d'autres en quelques clics sur un serveur ou un Raspberry Pi
|
||||
- Pour aller plus loin : conteneurs avec Podman ou Docker
|
||||
|
||||
**Penser l'environnement comme un tout**
|
||||
|
||||
- Mises à jour, sauvegardes, sécurité : un plan de maintenance (liens 1.2, 4.1, 5.1)
|
||||
- Interopérabilité avec les utilisateurs d'autres systèmes : formats ouverts, services web
|
||||
- Exemple de déploiement à grande échelle : la Gendarmerie nationale et ses dizaines de milliers de postes sous GendBuntu
|
||||
|
||||
### Idées d'activités
|
||||
|
||||
- Tester trois distributions en machine virtuelle et justifier son choix selon un profil d'utilisateur donné
|
||||
- Installer Linux sur un vrai ordinateur, de la création de la clé à la configuration finale
|
||||
- Concevoir un environnement « clé en main » pour un public précis (élève, association, personne âgée) et le documenter
|
||||
- Monter un petit serveur YunoHost sur un Raspberry Pi avec deux ou trois services utiles au groupe
|
||||
- Relier son téléphone à son PC avec KDE Connect
|
||||
- Rédiger une charte de choix numériques pour une classe ou une association, argumentée par des valeurs
|
||||
|
|
@ -1,81 +0,0 @@
|
|||
## 3.2 Développer des documents multimédia
|
||||
|
||||
**Ce que recouvre la compétence** : créer ses propres productions mêlant image, son, vidéo ou animation, enrichir un document textuel, ou réaliser une œuvre transformative (remix, détournement). Thématiques Pix : capture et édition d'images, de sons et de vidéos, image matricielle et vectorielle, formats et codecs, montage, droit d'auteur et droit à l'image.
|
||||
|
||||
### Progression par niveaux (résumé)
|
||||
|
||||
- **N1-N2** : faire une capture d'écran, recadrer une photo, enregistrer un son.
|
||||
- **N3** : retoucher une image, couper et assembler des séquences audio ou vidéo, distinguer image matricielle et vectorielle.
|
||||
- **N4-N5** : réaliser un montage complet (titres, transitions, musique, sous-titres), travailler avec des calques, choisir formats et réglages d'export.
|
||||
- **N6+** : mener une production multimédia de bout en bout, créer des animations, réaliser des remix en respectant les licences.
|
||||
|
||||
### Version Linux et libre
|
||||
|
||||
**Notions de base à faire comprendre**
|
||||
|
||||
- Pixels (matriciel) vs formes mathématiques (vectoriel) : effet d'un agrandissement
|
||||
- Calques, résolution, profondeur de couleur
|
||||
- Conteneur (MKV, WebM, MP4) vs codec (AV1, VP9, H.264 pour la vidéo ; Opus, AAC pour le son)
|
||||
- Débit, images par seconde, fréquence d'échantillonnage
|
||||
|
||||
**Captures**
|
||||
|
||||
- Captures d'écran : outil intégré de GNOME (touche Impr. écran), Spectacle (KDE), **Flameshot** pour annoter
|
||||
- Enregistrement d'écran : outil intégré de GNOME, Kooha, **OBS Studio** pour des tutoriels plus élaborés
|
||||
|
||||
**Image matricielle**
|
||||
|
||||
- **GIMP** : retouche, calques, masques
|
||||
- **Krita** : dessin et peinture numérique
|
||||
- Pinta : simple, pour débuter
|
||||
- darktable ou RawTherapee : développement de photos RAW
|
||||
|
||||
**Image vectorielle et schémas**
|
||||
|
||||
- **Inkscape** : logos, affiches, illustrations, format SVG
|
||||
- draw.io, Dia : schémas et organigrammes
|
||||
|
||||
**Son**
|
||||
|
||||
- **Audacity** : enregistrement, découpe, réduction de bruit, effets (idéal pour un podcast)
|
||||
- Ardour : enregistrement multipiste
|
||||
- LMMS : composition, MuseScore : partitions
|
||||
|
||||
**Vidéo**
|
||||
|
||||
- **Kdenlive** : montage complet, le plus abouti
|
||||
- Shotcut, OpenShot : plus simples pour démarrer
|
||||
- Sous-titres : Aegisub, Gaupol ; transcription automatique hors ligne avec des outils basés sur Whisper (par exemple Speech Note)
|
||||
|
||||
**Animation et 3D**
|
||||
|
||||
- Pencil2D : animation 2D image par image, accessible aux débutants
|
||||
- Synfig Studio : animation 2D vectorielle
|
||||
- **Blender** : 3D, animation, et même montage vidéo
|
||||
- Sweet Home 3D : aménagement intérieur
|
||||
|
||||
**Installation sous Linux**
|
||||
|
||||
- **Flathub** pour obtenir les versions récentes de ces logiciels
|
||||
- Codecs : certaines distributions demandent d'installer à part les codecs non libres (paquet « restricted extras » sur Ubuntu, par exemple)
|
||||
|
||||
**Ressources libres pour enrichir et remixer**
|
||||
|
||||
- **Wikimedia Commons**, **Openverse** (moteur de recherche de médias sous Creative Commons)
|
||||
- **Freesound** pour les sons, ccMixter et Free Music Archive pour la musique
|
||||
- Toujours vérifier la licence : une ressource en ND (pas de modification) ne peut pas être remixée
|
||||
|
||||
**Droits**
|
||||
|
||||
- Droit à l'image : autorisation des personnes filmées ou photographiées
|
||||
- Droit d'auteur, courte citation, exception pédagogique
|
||||
- Créditer les ressources utilisées dans le générique
|
||||
|
||||
### Idées d'activités
|
||||
|
||||
- Comparer l'agrandissement d'un logo en PNG dans GIMP et en SVG dans Inkscape
|
||||
- Réaliser un podcast de 3 minutes avec Audacity, avec un générique musical sous licence libre
|
||||
- Tourner et monter une courte vidéo dans Kdenlive, sous-titres et crédits compris
|
||||
- Enregistrer un tutoriel vidéo avec OBS pour expliquer une manipulation sous Linux
|
||||
- Créer un remix à partir de ressources trouvées sur Openverse, en documentant chaque licence
|
||||
- Animation image par image avec Pencil2D
|
||||
|
|
@ -1,73 +0,0 @@
|
|||
## 3.1 Développer des documents textuels
|
||||
|
||||
**Ce que recouvre la compétence** : produire des documents principalement textuels pour communiquer des idées, rendre compte d'un travail ou le valoriser (traitement de texte, présentation, page web, carte mentale). Thématiques Pix : structuration et séparation fond/forme, mise en page, intégration d'illustrations, formats et diffusion, accessibilité, droit d'auteur.
|
||||
|
||||
### Progression par niveaux (résumé)
|
||||
|
||||
- **N1-N2** : saisir et mettre en forme un texte simple (gras, taille, alignement), insérer une image.
|
||||
- **N3** : structurer un document avec des titres, insérer tableaux et listes, exporter en PDF.
|
||||
- **N4-N5** : utiliser les **styles**, générer une table des matières, gérer en-têtes, pieds de page et notes, créer un modèle.
|
||||
- **N6+** : séparer complètement fond et forme, automatiser (publipostage, conversion), produire des documents accessibles et interopérables.
|
||||
|
||||
### Version Linux et libre
|
||||
|
||||
**Traitement de texte : LibreOffice Writer**
|
||||
|
||||
- **Styles** de paragraphe, de caractère, de page : le cœur de la compétence
|
||||
- Numérotation automatique des titres, table des matières, index, notes de bas de page
|
||||
- Ancrage et habillage des images, tableaux, sections en colonnes
|
||||
- Modèles (`.ott`), publipostage
|
||||
- Export PDF, PDF/A pour l'archivage, PDF balisé pour l'accessibilité
|
||||
- **Vérificateur d'accessibilité** intégré
|
||||
|
||||
**Correction de la langue**
|
||||
|
||||
- **Grammalecte** : correcteur grammatical français libre, pour LibreOffice et Firefox
|
||||
|
||||
**Présentations**
|
||||
|
||||
- LibreOffice Impress : masques de diapositives, mode présentateur, export PDF
|
||||
|
||||
**Écrire en Markdown**
|
||||
|
||||
- Éditeurs : Apostrophe (GNOME), Ghostwriter (KDE), Zettlr, ou simplement Kate / Éditeur de texte
|
||||
- **Pandoc** : convertir un même texte en ODT, DOCX, PDF, HTML ou EPUB, démonstration parfaite de la séparation fond/forme
|
||||
|
||||
**Composition avancée**
|
||||
|
||||
- LaTeX avec TeXstudio, pour les documents scientifiques
|
||||
- **Typst** : alternative récente, libre, plus simple à apprendre
|
||||
- Scribus pour la mise en page de type affiche, journal ou brochure
|
||||
|
||||
**Cartes mentales et conceptuelles**
|
||||
|
||||
- Freeplane, VYM, Heimer
|
||||
|
||||
**Pages web et livres numériques**
|
||||
|
||||
- HTML et CSS avec un simple éditeur de texte et le navigateur
|
||||
- Sigil pour créer un EPUB, Calibre pour le convertir et le gérer
|
||||
|
||||
**Formats et interopérabilité**
|
||||
|
||||
- ODF (`.odt`) : format ouvert, normalisé ISO, recommandé par le Référentiel général d'interopérabilité de l'administration
|
||||
- Échanges avec des utilisateurs de Word : polices aux métriques compatibles (Carlito pour Calibri, Caladea pour Cambria) pour éviter les décalages de mise en page
|
||||
|
||||
**Typographie et polices libres**
|
||||
|
||||
- Liberation, DejaVu, Noto
|
||||
- **Luciole** : police libre conçue pour les personnes malvoyantes
|
||||
- Installer une police dans `~/.local/share/fonts`
|
||||
|
||||
**Accessibilité**
|
||||
|
||||
- Titres structurés par styles (et non par mise en forme manuelle)
|
||||
- Texte alternatif pour les images, contrastes suffisants, écriture FALC (Facile à lire et à comprendre)
|
||||
|
||||
### Idées d'activités
|
||||
|
||||
- Partir d'un document mis en forme « à la main » et le refaire entièrement avec les styles, puis changer tout son aspect en modifiant un seul style
|
||||
- Rédiger un compte rendu en Markdown, puis le convertir avec Pandoc en ODT, PDF et page web
|
||||
- Faire passer le vérificateur d'accessibilité sur un document et corriger toutes les alertes
|
||||
- Échanger un fichier ODT et DOCX avec un utilisateur de Word et analyser ce qui change
|
||||
- Créer un modèle de lettre réutilisable avec publipostage à partir d'un fichier Calc
|
||||
|
|
@ -1,75 +0,0 @@
|
|||
## 1.2 Gérer des données
|
||||
|
||||
**Ce que recouvre la compétence** : stocker et organiser ses fichiers pour les retrouver, les conserver et y accéder facilement, en local comme en ligne. Les thématiques Pix : fichiers et dossiers, stockage et compression, transfert et synchronisation, recherche et métadonnées, sauvegarde.
|
||||
|
||||
### Progression par niveaux (résumé)
|
||||
|
||||
- **N1-N2** : enregistrer un fichier, le retrouver, le nommer et le ranger dans un dossier.
|
||||
- **N3** : construire une arborescence cohérente, utiliser un espace de stockage en ligne, compresser/décompresser.
|
||||
- **N4-N5** : synchroniser plusieurs appareils, mettre en place des sauvegardes, choisir un format adapté, exploiter les métadonnées.
|
||||
- **N6+** : définir une stratégie de stockage et de sauvegarde pour un groupe, gérer les droits d'accès.
|
||||
|
||||
### Version Linux et libre
|
||||
|
||||
**Comprendre l'arborescence**
|
||||
|
||||
- Une seule racine `/`, le dossier personnel `/home/utilisateur`, les supports amovibles dans `/media`
|
||||
- Chemins absolus et relatifs, fichiers cachés (commençant par un point)
|
||||
- La casse compte : `Rapport.odt` ≠ `rapport.odt`
|
||||
- Le type d'un fichier ne dépend pas de son extension : la commande `file` le révèle
|
||||
|
||||
**Gestionnaires de fichiers**
|
||||
|
||||
- Graphiques : Fichiers (GNOME), Dolphin (KDE), Thunar (XFCE), Nemo
|
||||
- Terminal : `ls`, `cd`, `mkdir`, `cp`, `mv`, `rm`, `tree` ; Midnight Commander (`mc`) en intermédiaire
|
||||
- Bonnes pratiques de nommage : dates au format `AAAA-MM-JJ`, pas d'espaces ni d'accents si les fichiers circulent
|
||||
|
||||
**Retrouver ses fichiers**
|
||||
|
||||
- `find`, `locate`, `grep -r` pour chercher dans le contenu
|
||||
- Recherche intégrée au bureau : Tracker/LocalSearch (GNOME), Baloo (KDE)
|
||||
- Doublons : Czkawka (graphique), `fdupes`
|
||||
|
||||
**Métadonnées**
|
||||
|
||||
- Étiquettes dans Dolphin, gestion de photothèque avec digiKam
|
||||
- Lire : `exiftool` ; nettoyer avant partage : **mat2** (lien direct avec la compétence 4.2 sur la vie privée)
|
||||
|
||||
**Compression et archives**
|
||||
|
||||
- `tar`, `gzip`, `xz`, `zip`, `7z`
|
||||
- Graphiques : Archives (File Roller), Ark
|
||||
|
||||
**Supports et systèmes de fichiers**
|
||||
|
||||
- Voir l'espace : `df -h`, `du`, `ncdu`, `lsblk`
|
||||
- GNOME Disques, GParted pour formater
|
||||
- Choisir le bon format : ext4 pour Linux, exFAT pour une clé partagée avec Windows/macOS
|
||||
|
||||
**Stockage en ligne et synchronisation**
|
||||
|
||||
- **Nextcloud** (auto-hébergé ou chez un CHATON), Seafile
|
||||
- **Syncthing** : synchronisation pair à pair, sans serveur central
|
||||
- `rsync` en ligne de commande
|
||||
- Transfert ponctuel : LocalSend (réseau local), Lufi (partage chiffré temporaire, Framasoft), `scp`/`sftp`, FileZilla
|
||||
|
||||
**Sauvegarde**
|
||||
|
||||
- Règle 3-2-1 : 3 copies, 2 supports différents, 1 hors site
|
||||
- Déjà Dup (simple, intégré à GNOME), Back In Time, BorgBackup avec son interface Vorta, restic
|
||||
- Timeshift pour des instantanés du système (à distinguer de la sauvegarde des données personnelles)
|
||||
|
||||
**Droits et partage**
|
||||
|
||||
- `ls -l`, `chmod`, `chown` : lire et modifier les permissions, comprendre propriétaire/groupe/autres
|
||||
|
||||
**Formats ouverts** (pour la conservation à long terme)
|
||||
|
||||
- ODF (LibreOffice), CSV, Markdown, PNG, FLAC, PDF/A
|
||||
|
||||
### Idées d'activités
|
||||
|
||||
- Ranger un dossier « fourre-tout » en arborescence logique, d'abord graphiquement puis en ligne de commande
|
||||
- Mettre en place une synchronisation Syncthing entre un PC et un téléphone
|
||||
- Retirer les métadonnées GPS d'une photo avec mat2 et vérifier avec exiftool
|
||||
- Simuler une panne : sauvegarder avec Déjà Dup, supprimer un fichier, le restaurer
|
||||
|
|
@ -1,55 +0,0 @@
|
|||
## 2.1 Interagir
|
||||
|
||||
**Ce que recouvre la compétence** : échanger avec des personnes ou de petits groupes, de façon ponctuelle ou régulière, dans un cadre privé ou professionnel, par courriel, messagerie instantanée ou visioconférence. Thématiques Pix : protocoles et services de communication, usages adaptés au contexte, savoir-vivre en ligne (nétiquette), confidentialité, prévention du cyberharcèlement.
|
||||
|
||||
### Progression par niveaux (résumé)
|
||||
|
||||
- **N1-N2** : envoyer et recevoir un message, répondre, joindre un fichier.
|
||||
- **N3** : choisir l'outil adapté à la situation, utiliser À / Cc / Cci à bon escient, adopter un ton approprié.
|
||||
- **N4-N5** : organiser des échanges de groupe, animer une visioconférence, gérer plusieurs comptes et identités.
|
||||
- **N6+** : comprendre les protocoles et le chiffrement, choisir des services selon des critères de confidentialité, réagir face à des comportements inappropriés.
|
||||
|
||||
### Version Linux et libre
|
||||
|
||||
**Courriel**
|
||||
|
||||
- **Thunderbird** (avec chiffrement OpenPGP intégré), Evolution, KMail, Geary
|
||||
- En terminal : NeoMutt, aerc
|
||||
- Webmails libres : Roundcube, SnappyMail
|
||||
- Notions à faire comprendre : IMAP vs POP, SMTP, Cci pour protéger les adresses d'un groupe, taille des pièces jointes
|
||||
- Fournisseurs soucieux de la vie privée : Disroot, Posteo, mailbox.org, Tuta et Proton (applications open source)
|
||||
|
||||
**Messagerie instantanée**
|
||||
|
||||
- **Matrix** avec le client Element : décentralisé, fédéré, chiffré de bout en bout
|
||||
- **XMPP** : Gajim, Dino (bureau), Conversations (Android), Movim (web)
|
||||
- Signal : application libre et chiffrée, mais serveur centralisé
|
||||
- Delta Chat : messagerie instantanée qui s'appuie sur le courriel
|
||||
- IRC (HexChat, WeeChat) pour découvrir l'historique des communautés libres
|
||||
- Notion clé à travailler : centralisé, fédéré, pair à pair
|
||||
|
||||
**Visioconférence et audio**
|
||||
|
||||
- **Jitsi Meet** : sans compte, dans le navigateur
|
||||
- **BigBlueButton** : classes virtuelles (proposé sur apps.education.fr pour les personnels de l'Éducation nationale)
|
||||
- Nextcloud Talk, Mumble pour l'audio de groupe
|
||||
- Côté Linux : tester webcam et micro (Snapshot, `pavucontrol`), comprendre le partage d'écran sous Wayland
|
||||
|
||||
**Planifier les échanges**
|
||||
|
||||
- Framadate pour trouver une date commune
|
||||
- Agendas partagés via CalDAV : Nextcloud, agenda de Thunderbird
|
||||
|
||||
**Savoir-vivre et sécurité**
|
||||
|
||||
- Nétiquette : objet clair, pas de « répondre à tous » inutile, majuscules perçues comme des cris
|
||||
- Cyberharcèlement : repérer, conserver des preuves, signaler (numéro 3018 pour les jeunes)
|
||||
- Hameçonnage : vérifier l'expéditeur réel (lien avec le domaine 4)
|
||||
|
||||
### Idées d'activités
|
||||
|
||||
- Configurer un compte dans Thunderbird en IMAP, puis envoyer un message à un groupe en Cci
|
||||
- Créer un salon Matrix pour la classe ou le groupe, et comparer avec un groupe WhatsApp (qui détient les données, qui peut lire)
|
||||
- Organiser une réunion : sondage Framadate, puis séance sur Jitsi ou BigBlueButton avec partage d'écran
|
||||
- Échanger un message chiffré OpenPGP entre deux participants dans Thunderbird
|
||||
- Analyser des cas de messages problématiques (ton, destinataires, harcèlement) et proposer une réaction adaptée
|
||||
|
|
@ -1,66 +0,0 @@
|
|||
## 1.1 Mener une recherche et une veille d'information
|
||||
|
||||
**Ce que recouvre la compétence** : trouver une information pour répondre à un besoin (moteur de recherche, sites, bases documentaires), évaluer sa fiabilité, et se tenir au courant d'un sujet dans la durée (abonnements, flux, réseaux).
|
||||
|
||||
Pix la découpe en grandes thématiques : navigation web, moteurs de recherche, évaluation de l'information, source et citation, veille et curation, filtrage/personnalisation (bulles de filtre), gouvernance et ouverture du web.
|
||||
|
||||
### Progression par niveaux (résumé)
|
||||
|
||||
- **N1-N2** : faire une recherche simple, reformuler ses mots-clés, repérer l'auteur et la date d'une page.
|
||||
- **N3** : utiliser les fonctions avancées des moteurs, croiser les sources, distinguer information, opinion et publicité.
|
||||
- **N4-N5** : construire une stratégie de recherche, mettre en place une veille outillée (flux, alertes).
|
||||
- **N6+** : organiser, trier et partager une veille (curation), comprendre les mécanismes des algorithmes de recommandation.
|
||||
|
||||
### Version Linux et libre
|
||||
|
||||
**Navigation**
|
||||
|
||||
- Firefox (ou LibreWolf, sa variante orientée vie privée), Chromium
|
||||
- Extensions : uBlock Origin (bloqueur), Privacy Badger
|
||||
- En terminal : `lynx` ou `w3m` pour naviguer en texte, `curl`/`wget` pour récupérer une page
|
||||
|
||||
**Moteurs de recherche**
|
||||
|
||||
- **SearXNG** : métamoteur libre, auto-hébergeable, sans pistage (instances publiques disponibles)
|
||||
- Alternatives respectueuses mais non libres : DuckDuckGo, Qwant, Mojeek, Startpage
|
||||
- Bases ouvertes : Wikipédia, Wikidata, OpenStreetMap, Internet Archive, HAL (archive ouverte de la recherche française)
|
||||
- Opérateurs à maîtriser : `"expression exacte"`, `-exclure`, `site:debian.org`, `filetype:pdf`, `OR`
|
||||
|
||||
**Chercher dans la documentation Linux** (spécifique et très formateur)
|
||||
|
||||
- `man`, `apropos`, `--help`, `tldr`
|
||||
- Wikis communautaires : doc.ubuntu-fr.org, wiki Arch Linux, wiki Debian
|
||||
- Forums et suivis de bugs comme sources de solutions (et leur fiabilité variable)
|
||||
|
||||
**Veille par flux RSS/Atom**
|
||||
|
||||
- Lecteurs locaux : Thunderbird, Liferea, Akregator (KDE), NewsFlash (GNOME), Newsboat (terminal)
|
||||
- Auto-hébergés : **FreshRSS** (projet français), Miniflux, Tiny Tiny RSS
|
||||
- Surveillance de pages sans flux : changedetection.io
|
||||
- Réseaux décentralisés : Mastodon (fédivers), Lemmy, PeerTube, avec abonnement par hashtags
|
||||
|
||||
**Curation et conservation**
|
||||
|
||||
- **Wallabag** (lire plus tard, français), **Shaarli** (partage de liens, français), Linkding
|
||||
- **Zotero** : collecte de références et génération de citations, idéal pour le volet « source et citation »
|
||||
- **Joplin** (libre, AGPL) : notes Markdown, Web Clipper pour Firefox (page entière, sélection ou URL avec sa source), synchronisation Nextcloud/WebDAV chiffrée de bout en bout
|
||||
- **Obsidian** : gratuit mais **pas libre** ; stocke tout en fichiers Markdown ordinaires, donc les données restent dans un format ouvert. Bon support pour distinguer _logiciel libre_ et _format ouvert_. Web Clipper pour Firefox, synchronisation possible avec Syncthing
|
||||
- Alternatives 100 % libres à Obsidian (notes liées, graphe) : **Logseq** (AGPL), **Zettlr** (GPL, intégré à Zotero), **Trilium Notes** (auto-hébergeable)
|
||||
- Côté pédagogie : ces outils couvrent les niveaux 5 et plus (organiser sa veille avec étiquettes et liens entre notes, garder la trace des sources)
|
||||
|
||||
**Évaluer l'information**
|
||||
|
||||
- Wayback Machine pour vérifier l'historique d'une page
|
||||
- `whois` et `dig` pour savoir qui est derrière un domaine
|
||||
- Métadonnées d'images : `exiftool`
|
||||
|
||||
**Droit et ouverture du web**
|
||||
|
||||
- Licences Creative Commons, GPL, et Wikimedia Commons pour des ressources réutilisables
|
||||
- Repères militants et pédagogiques : Framasoft (et le collectif CHATONS d'hébergeurs alternatifs), La Quadrature du Net, l'April
|
||||
|
||||
### Idées d'activités
|
||||
|
||||
- Comparer les résultats d'une même requête sur SearXNG, DuckDuckGo et Google pour illustrer la bulle de filtre
|
||||
- Résoudre un problème Linux réel uniquement avec `man` et le wiki ubuntu-fr
|
||||
- Monter une veille sur un sujet avec FreshRSS ou Newsboat, puis en publier une sélection via Shaarli
|
||||
|
|
@ -1,63 +0,0 @@
|
|||
## 2.2 Partager et publier
|
||||
|
||||
**Ce que recouvre la compétence** : diffuser ses productions ou ses opinions et relayer celles des autres dans un espace public (réseaux sociaux, blogs, forums, plateformes de partage). Thématiques Pix : règles de visibilité, identité numérique et e-réputation, droit d'auteur et licences, liberté d'expression et ses limites, écriture pour le web, participation citoyenne.
|
||||
|
||||
### Progression par niveaux (résumé)
|
||||
|
||||
- **N1-N2** : partager un fichier ou un lien, publier un message simple.
|
||||
- **N3** : régler la visibilité d'une publication (public, restreint, privé), respecter le droit à l'image et le droit d'auteur.
|
||||
- **N4-N5** : publier sur un blog ou un site, choisir une licence pour ses productions, maîtriser son identité numérique.
|
||||
- **N6+** : animer un espace de publication, comprendre les mécanismes de diffusion et d'influence, contribuer à des communs.
|
||||
|
||||
### Version Linux et libre
|
||||
|
||||
**Le fédivers** (réseaux sociaux décentralisés, notion centrale à faire comprendre)
|
||||
|
||||
- **Mastodon** : microblog, avec visibilité réglable (publique, non listée, abonnés, mention privée)
|
||||
- **PeerTube** (vidéo, développé par Framasoft), **Pixelfed** (photo), **Lemmy** (forums thématiques), Funkwhale (audio)
|
||||
- **WriteFreely** : blog minimaliste qui se suit depuis Mastodon
|
||||
- Principe clé : choisir son instance, ses règles de modération, pouvoir déménager son compte
|
||||
|
||||
**Blogs et sites**
|
||||
|
||||
- **WordPress** (libre), Dotclear, PluXml (français, sans base de données)
|
||||
- Sites statiques : Hugo, Jekyll, Zola, hébergés gratuitement via Codeberg Pages ou GitLab Pages
|
||||
- Wikis : DokuWiki, MediaWiki
|
||||
- Forums : Discourse, Flarum
|
||||
|
||||
**Partage de fichiers et de contenus**
|
||||
|
||||
- Liens de partage **Nextcloud** avec mot de passe et date d'expiration
|
||||
- **CryptPad** : documents partagés chiffrés de bout en bout
|
||||
- PrivateBin pour partager un texte de façon chiffrée et éphémère, Lufi pour les fichiers
|
||||
|
||||
**Contribuer aux communs** (participation citoyenne)
|
||||
|
||||
- Wikipédia, Wikimedia Commons, OpenStreetMap
|
||||
- Signaler un bug ou traduire un logiciel libre
|
||||
|
||||
**Droit et licences**
|
||||
|
||||
- Droit d'auteur et droit à l'image : ce qu'on peut publier, ce qu'il faut demander
|
||||
- Licences **Creative Commons** (BY, SA, NC, ND) : comprendre et choisir celle de sa propre production
|
||||
- Citer correctement ce qu'on relaie
|
||||
- Limites de la liberté d'expression : diffamation, injure, incitation à la haine
|
||||
|
||||
**Identité numérique et e-réputation**
|
||||
|
||||
- Faire sa « recherche de soi-même » sur plusieurs moteurs (lien avec 1.1)
|
||||
- Droit au déréférencement et droit à l'effacement (RGPD, CNIL)
|
||||
- Séparer identités personnelle et professionnelle
|
||||
|
||||
**Écrire pour le web**
|
||||
|
||||
- Markdown, titres clairs, liens explicites
|
||||
- Accessibilité : texte alternatif pour les images (pratique très ancrée sur Mastodon), hashtags en `#CamelCase` pour les lecteurs d'écran
|
||||
|
||||
### Idées d'activités
|
||||
|
||||
- Créer un compte Mastodon, régler la visibilité de trois publications différentes et comparer qui peut les voir
|
||||
- Publier un mini-site avec Hugo sur Codeberg Pages, sous licence Creative Commons choisie et justifiée
|
||||
- Ajouter une photo personnelle à Wikimedia Commons ou corriger une rue dans OpenStreetMap
|
||||
- Audit d'identité numérique : chercher son nom, repérer ce qui est public, faire le ménage
|
||||
- Comparer les conditions d'utilisation d'Instagram et d'une instance Pixelfed : à qui appartiennent les contenus publiés ?
|
||||
|
|
@ -1,74 +0,0 @@
|
|||
## 3.4 Programmer
|
||||
|
||||
**Ce que recouvre la compétence** : écrire des programmes et des algorithmes pour répondre à un besoin (automatiser une tâche répétitive, résoudre un problème, traiter un volume important) ou pour créer un contenu riche comme un jeu ou un site. Thématiques Pix : algorithmique (séquences, boucles, conditions, variables, fonctions), langages, automatisation, débogage, programmation web.
|
||||
|
||||
### Progression par niveaux (résumé)
|
||||
|
||||
- **N1-N2** : lire et comprendre un algorithme simple, programmer des séquences d'instructions par blocs.
|
||||
- **N3** : utiliser boucles, conditions et variables, corriger un programme qui ne fonctionne pas.
|
||||
- **N4-N5** : passer à un langage textuel, structurer avec des fonctions, automatiser une tâche réelle.
|
||||
- **N6+** : concevoir un programme complet, gérer les erreurs, réutiliser des bibliothèques, planifier l'exécution automatique de tâches.
|
||||
|
||||
### Version Linux et libre
|
||||
|
||||
**Programmation par blocs**
|
||||
|
||||
- **Snap!** : libre, dans le navigateur, plus puissant que Scratch
|
||||
- **TurboWarp** : version libre et rapide compatible Scratch, avec application de bureau Linux
|
||||
- Blockly Games : progression ludique vers la logique de programmation
|
||||
|
||||
**Python, le passage naturel au code textuel**
|
||||
|
||||
- **Thonny** : conçu pour débuter, avec exécution pas à pas pour visualiser les variables
|
||||
- **Basthon** : Python et notebooks dans le navigateur, pensé pour l'enseignement en France
|
||||
- JupyterLab pour mêler code, texte et graphiques
|
||||
- Module `turtle` pour dessiner, Pyxel ou Pygame pour créer des jeux
|
||||
|
||||
**Automatiser sous Linux** (l'atout majeur de l'environnement)
|
||||
|
||||
- Scripts **Bash** : boucles sur des fichiers, renommage par lots, sauvegardes
|
||||
- Exemple parlant : `for f in *.jpg; do magick "$f" -resize 800x "petit-$f"; done`
|
||||
- Planifier des tâches : **cron** ou les minuteurs systemd, ce qui répond directement à la mention des « logiciels de planification de tâches » dans le référentiel
|
||||
- Alias et petits scripts dans `~/bin` pour se créer ses propres commandes
|
||||
- Macros LibreOffice en Basic ou en Python
|
||||
|
||||
**Éditeurs et environnements**
|
||||
|
||||
- Geany, Kate : simples et légers
|
||||
- **VSCodium** : version libre de VS Code, sans télémétrie
|
||||
- nano pour débuter en terminal, Vim ou Emacs pour aller loin
|
||||
|
||||
**Web**
|
||||
|
||||
- HTML, CSS, JavaScript avec un éditeur et Firefox
|
||||
- Outils de développement de Firefox (F12) : inspecter, modifier une page en direct, lire les erreurs
|
||||
- **p5.js** : programmation créative et visuelle
|
||||
|
||||
**Jeux**
|
||||
|
||||
- **Godot** : moteur de jeu libre complet, 2D et 3D
|
||||
- GDevelop : création de jeux sans coder ou presque
|
||||
|
||||
**Robotique et électronique**
|
||||
|
||||
- **Raspberry Pi** : ordinateur sous Linux pour piloter capteurs et moteurs
|
||||
- Arduino IDE, MicroPython, micro:bit
|
||||
- Thymio : petit robot éducatif avec environnement libre
|
||||
|
||||
**La culture du libre**
|
||||
|
||||
- Lire le code source d'un logiciel qu'on utilise
|
||||
- Versionner son travail avec Git et le publier sur Codeberg (lien 2.3)
|
||||
|
||||
**Débogage**
|
||||
|
||||
- Lire un message d'erreur, afficher des valeurs intermédiaires, exécuter pas à pas, tester avec des cas limites
|
||||
|
||||
### Idées d'activités
|
||||
|
||||
- Débuter avec Snap!, puis réécrire le même programme en Python dans Thonny
|
||||
- Écrire un script Bash qui trie un dossier de téléchargements par type de fichier, puis le planifier chaque soir avec cron
|
||||
- Programmer un petit jeu avec Pyxel ou Godot
|
||||
- Modifier une page web en direct avec les outils de développement de Firefox, puis créer la sienne
|
||||
- Piloter une LED ou un capteur avec un Raspberry Pi
|
||||
- Modifier un petit logiciel libre existant (changer un texte, une couleur) pour comprendre ce que signifie avoir accès au code
|
||||
|
|
@ -1,57 +0,0 @@
|
|||
## 4.3 Protéger la santé, le bien-être et l'environnement
|
||||
|
||||
**Ce que recouvre la compétence** : prévenir les effets négatifs du numérique sur la santé physique et psychique et sur l'environnement, mais aussi tirer parti du numérique pour le bien-être, l'inclusion et l'accessibilité. Thématiques Pix : ergonomie et santé physique, sommeil et attention, dépendance et harcèlement, impact environnemental, accessibilité.
|
||||
|
||||
### Progression par niveaux (résumé)
|
||||
|
||||
- **N1-N2** : adopter une bonne posture, faire des pauses, limiter les écrans le soir.
|
||||
- **N3** : régler son poste pour son confort, gérer ses notifications, connaître les gestes de base pour l'environnement (recyclage).
|
||||
- **N4-N5** : maîtriser son temps d'écran, utiliser les outils d'accessibilité, comprendre que l'essentiel de l'impact environnemental vient de la fabrication des appareils.
|
||||
- **N6+** : adopter une démarche de sobriété numérique argumentée, concevoir des contenus accessibles et peu gourmands, accompagner les autres.
|
||||
|
||||
### Version Linux et libre
|
||||
|
||||
**Santé physique et ergonomie**
|
||||
|
||||
- Éclairage nocturne intégré à GNOME et KDE (réduction de la lumière bleue le soir)
|
||||
- Rappels de pause : **Safe Eyes**, Workrave, Stretchly ; règle 20-20-20 pour les yeux
|
||||
- Raccourcis clavier pour limiter l'usage de la souris et les troubles musculo-squelettiques
|
||||
- Réglages de la taille du texte, du zoom, de la vitesse du pointeur
|
||||
|
||||
**Attention et bien-être psychique**
|
||||
|
||||
- Mode « Ne pas déranger » et réglage fin des notifications
|
||||
- Les versions récentes de GNOME intègrent un suivi du temps d'écran, des limites et des rappels de pause
|
||||
- **LeechBlock NG** (Firefox) : bloquer les sites chronophages à certaines heures
|
||||
- **FreeTube** (bureau) et NewPipe (Android) : regarder des vidéos sans recommandations algorithmiques ni publicité
|
||||
- Fils chronologiques sans algorithme (Mastodon) vs fils conçus pour retenir l'attention
|
||||
- Contrôle parental : Malcontent (GNOME), **CTparental** (libre, français)
|
||||
- Cyberharcèlement et mal-être : 3018, Fil Santé Jeunes (lien 2.1)
|
||||
|
||||
**Impact environnemental**
|
||||
|
||||
- Ordre de grandeur essentiel : la fabrication des appareils pèse bien plus que leur usage, d'où l'enjeu de les garder longtemps
|
||||
- **Linux pour prolonger la vie du matériel** : distributions légères (Xubuntu, Lubuntu, Linux Mint XFCE, antiX), Emmabuntüs pour le réemploi, campagne _End of 10_
|
||||
- Réparabilité : indice de réparabilité/durabilité, appareils reconditionnés, recyclage des équipements électriques (DEEE)
|
||||
- Consommation : TLP et les profils d'énergie pour l'autonomie des portables, `powertop` pour repérer ce qui consomme
|
||||
- Mesurer l'empreinte d'une page web : extension **GreenIT-Analysis**, EcoIndex (outils libres français)
|
||||
- Sobriété des usages : résolution vidéo adaptée, téléchargement plutôt que streaming répété, en gardant le sens des proportions (trier ses courriels a un effet très faible comparé au fait de garder son ordinateur deux ans de plus)
|
||||
- Référentiel général d'écoconception de services numériques (RGESN)
|
||||
|
||||
**Accessibilité et inclusion**
|
||||
|
||||
- **Orca** : lecteur d'écran
|
||||
- Loupe, contraste élevé, grands caractères, curseur agrandi dans les paramètres d'accessibilité
|
||||
- Clavier visuel (Onboard), Dasher pour écrire sans clavier
|
||||
- Synthèse vocale : espeak-ng, Piper (voix plus naturelles)
|
||||
- Dictée vocale hors ligne avec des outils basés sur Whisper (Speech Note)
|
||||
- Police Luciole, écriture FALC, documents accessibles (lien 3.1)
|
||||
- RGAA : référentiel d'accessibilité des services publics en ligne
|
||||
|
||||
### Idées d'activités
|
||||
|
||||
- Installer une distribution légère sur un vieil ordinateur et comparer son usage avant et après
|
||||
- Mesurer avec GreenIT-Analysis plusieurs sites d'information et classer leur sobriété
|
||||
- Tenir pendant une semaine un journal de son temps d'écran, puis mettre en place une règle avec LeechBlock ou les outils de GNOME
|
||||
- Utiliser l'ordinateur pendant 15 minutes uniquement avec Orca, écran éteint, pour comprendre les enjeux de l'accessibilité
|
||||
- Calculer l'empreinte de son équipement avec le simulateur Impact CO2 de l'ADEME et discuter des leviers réels
|
||||
|
|
@ -1,75 +0,0 @@
|
|||
## 4.2 Protéger les données personnelles et la vie privée
|
||||
|
||||
**Ce que recouvre la compétence** : maîtriser ses traces numériques, gérer ses données personnelles et respecter celles des autres, en adoptant des pratiques éclairées. Là où la 4.1 protège contre les attaques, la 4.2 protège contre la collecte et l'exploitation des données, souvent parfaitement légales. Thématiques Pix : données personnelles et sensibles, traces (cookies, historique, métadonnées, géolocalisation), pistage et profilage, paramètres de confidentialité, RGPD, respect de la vie privée d'autrui.
|
||||
|
||||
### Progression par niveaux (résumé)
|
||||
|
||||
- **N1-N2** : savoir ce qu'est une donnée personnelle, ne pas diffuser d'informations sur les autres sans accord.
|
||||
- **N3** : effacer son historique, régler les paramètres de confidentialité d'un service, comprendre les cookies.
|
||||
- **N4-N5** : limiter le pistage, contrôler ses traces (métadonnées, géolocalisation), exercer ses droits RGPD.
|
||||
- **N6+** : comprendre le profilage et l'économie des données, choisir des services selon leurs pratiques, conseiller les autres.
|
||||
|
||||
### Version Linux et libre
|
||||
|
||||
**Comprendre les traces**
|
||||
|
||||
- Cookies, pixels espions, empreinte du navigateur (_fingerprinting_)
|
||||
- **CookieViz** : outil libre de la CNIL qui montre en direct les échanges avec les pisteurs pendant la navigation
|
||||
- Firefox : page `about:protections` qui récapitule les pisteurs bloqués
|
||||
- Navigation privée : ce qu'elle efface localement, et ce qu'elle ne cache pas (fournisseur d'accès, sites visités)
|
||||
|
||||
**Navigateur protecteur**
|
||||
|
||||
- Firefox en protection renforcée (mode strict)
|
||||
- **Conteneurs** (Firefox Multi-Account Containers) : isoler ses comptes les uns des autres
|
||||
- uBlock Origin, Privacy Badger
|
||||
- LibreWolf, Mullvad Browser, Tor Browser selon le niveau de protection voulu
|
||||
- Moteurs de recherche sans profilage (lien 1.1)
|
||||
|
||||
**Les traces sur son propre poste**
|
||||
|
||||
- Paramètres de confidentialité de GNOME ou KDE : localisation, historique des fichiers récents, accès caméra et micro
|
||||
- Historique du terminal (`~/.bash_history`)
|
||||
- Télémétrie : la plupart des distributions n'en ont pas ou la proposent en option, un point de comparaison intéressant avec les systèmes commerciaux
|
||||
|
||||
**Métadonnées**
|
||||
|
||||
- Coordonnées GPS dans les photos, auteur dans les documents
|
||||
- `exiftool` pour les voir, **mat2** pour les nettoyer (lien 1.2 et 3.3)
|
||||
|
||||
**Téléphone**
|
||||
|
||||
- **Exodus Privacy** (association française) : liste les pisteurs présents dans les applications Android
|
||||
- **F-Droid** : magasin d'applications libres
|
||||
- Systèmes alternatifs : /e/OS, LineageOS, GrapheneOS
|
||||
- Revoir les permissions des applications (localisation, contacts, micro)
|
||||
|
||||
**Limiter les données transmises**
|
||||
|
||||
- Principe de minimisation : ne donner que le nécessaire
|
||||
- Alias de courriel pour les inscriptions : addy.io, SimpleLogin
|
||||
- Fermer les comptes inutilisés
|
||||
- Préférer des services hébergés chez un CHATON ou auto-hébergés
|
||||
|
||||
**RGPD et droits**
|
||||
|
||||
- Droits d'accès, de rectification, d'effacement, d'opposition, de portabilité
|
||||
- Modèles de courriers sur le site de la **CNIL**, plainte en cas de refus
|
||||
- Exporter ses données (par exemple Google Takeout) pour constater ce qui est conservé
|
||||
- Données sensibles : santé, opinions, religion, orientation sexuelle
|
||||
|
||||
**Respecter la vie privée des autres**
|
||||
|
||||
- Droit à l'image, ne pas publier d'informations sur un tiers
|
||||
- Ne pas diffuser de captures de conversations privées
|
||||
- Applications qui aspirent tout le carnet d'adresses
|
||||
- Cci pour les envois groupés (lien 2.1)
|
||||
|
||||
### Idées d'activités
|
||||
|
||||
- Naviguer 10 minutes sur des sites d'actualité avec CookieViz et analyser vers où partent les données
|
||||
- Passer ses applications Android dans Exodus Privacy et en remplacer une par une alternative de F-Droid
|
||||
- Exercer réellement son droit d'accès auprès d'un service et analyser la réponse
|
||||
- Télécharger son export Google ou Facebook et découvrir ce qui est conservé
|
||||
- Configurer Firefox avec des conteneurs séparés pour les réseaux sociaux, les achats et le reste
|
||||
- Retirer la localisation de photos avant de les publier
|
||||
|
|
@ -1,91 +0,0 @@
|
|||
## 5.1 Résoudre des problèmes techniques
|
||||
|
||||
**Ce que recouvre la compétence** : diagnostiquer et résoudre des problèmes pour garantir ou rétablir le bon fonctionnement d'un environnement informatique, en utilisant les outils de configuration et de maintenance, et en sachant mobiliser de l'aide. Thématiques Pix : composants matériels et logiciels, diagnostic, maintenance, configuration, réseau, assistance.
|
||||
|
||||
### Progression par niveaux (résumé)
|
||||
|
||||
- **N1-N2** : redémarrer un appareil ou une application, vérifier les branchements et la connexion.
|
||||
- **N3** : identifier l'origine probable d'une panne (matériel, logiciel, réseau), consulter une aide en ligne, faire les mises à jour.
|
||||
- **N4-N5** : diagnostiquer avec les outils du système, installer ou réinstaller un logiciel ou un pilote, décrire précisément un problème pour obtenir de l'aide.
|
||||
- **N6+** : analyser des journaux système, dépanner un système qui ne démarre plus, récupérer des données, assister d'autres personnes.
|
||||
|
||||
### Version Linux et libre
|
||||
|
||||
**Une méthode avant les outils**
|
||||
|
||||
- Décrire précisément le symptôme, le reproduire
|
||||
- Noter ce qui a changé récemment (mise à jour, installation, nouveau matériel)
|
||||
- Isoler la cause, ne modifier qu'une chose à la fois, garder trace de ce qu'on a essayé
|
||||
- Chercher le message d'erreur exact (lien 1.1)
|
||||
|
||||
**Connaître sa machine**
|
||||
|
||||
- `inxi -Fxz` : résumé complet du matériel, idéal à coller dans un forum
|
||||
- `cat /etc/os-release`, `uname -r` : distribution et noyau
|
||||
- `lspci`, `lsusb`, `lsblk`, `free -h`, `df -h`
|
||||
- Interfaces graphiques : À propos (GNOME), Centre d'informations (KDE), Hardinfo2
|
||||
|
||||
**Programmes et ressources**
|
||||
|
||||
- Moniteur système, `htop` ou `btop` : qui consomme le processeur ou la mémoire
|
||||
- Arrêter un programme bloqué : `kill`, `xkill`
|
||||
- Interface graphique figée : basculer vers une console avec Ctrl+Alt+F3
|
||||
|
||||
**Lire les journaux**
|
||||
|
||||
- `journalctl -b -p err` : erreurs depuis le dernier démarrage
|
||||
- `dmesg` : messages du noyau (matériel, pilotes)
|
||||
- Application Journaux (GNOME) pour une lecture graphique
|
||||
|
||||
**Réseau**
|
||||
|
||||
- `ping`, `ip a`, `nmcli`, `mtr` : distinguer un problème de câble, de Wi-Fi, de box ou de DNS
|
||||
- Pilotes Wi-Fi propriétaires (outil « Pilotes additionnels » sur Ubuntu)
|
||||
|
||||
**Logiciels et mises à jour**
|
||||
|
||||
- `sudo apt update && sudo apt upgrade`, ou `dnf upgrade`
|
||||
- Réparer une installation interrompue : `sudo dpkg --configure -a`, `sudo apt --fix-broken install`
|
||||
- Disque plein : `ncdu`, nettoyage du cache des paquets, `flatpak uninstall --unused`
|
||||
|
||||
**Périphériques**
|
||||
|
||||
- Imprimantes : CUPS (interface sur `localhost:631`)
|
||||
- Scanner : Numériseur de documents (Simple Scan), SANE
|
||||
- Son : `pavucontrol`, `wpctl status` (PipeWire)
|
||||
- Bluetooth : `bluetoothctl`
|
||||
- Vérifier la compatibilité d'un matériel avant achat : base linux-hardware.org
|
||||
|
||||
**Quand le système ne démarre plus**
|
||||
|
||||
- Menu GRUB : démarrer sur un ancien noyau ou en mode de récupération
|
||||
- **Clé USB live** (Ventoy pour en avoir plusieurs sur une seule clé) pour accéder aux fichiers et réparer
|
||||
- Boot-Repair pour réparer le chargeur de démarrage
|
||||
- Timeshift pour revenir à un état antérieur du système
|
||||
|
||||
**Matériel et données**
|
||||
|
||||
- Santé des disques : GNOME Disques (SMART), `smartctl`
|
||||
- Test de la mémoire vive : Memtest86+
|
||||
- **TestDisk** et **PhotoRec** : récupérer des partitions ou des fichiers supprimés
|
||||
|
||||
**Applications Windows indispensables**
|
||||
|
||||
- Wine et Bottles pour certaines applications
|
||||
- Machine virtuelle avec GNOME Boxes ou virt-manager
|
||||
|
||||
**Demander et donner de l'aide**
|
||||
|
||||
- Forums : ubuntu-fr, forums de sa distribution, LinuxFr.org, salons Matrix ou IRC, groupes d'utilisateurs locaux
|
||||
- Bien poser une question : distribution et version, matériel, message d'erreur exact, ce qui a déjà été tenté
|
||||
- Prudence avec les commandes copiées sans les comprendre (lien 4.1)
|
||||
- Assistance à distance : **RustDesk**, SSH
|
||||
- Signaler un bug au projet concerné
|
||||
|
||||
### Idées d'activités
|
||||
|
||||
- Pannes simulées : imprimante en pause, Wi-Fi désactivé, DNS mal configuré, disque plein ; chacun diagnostique et documente
|
||||
- Rédiger une demande d'aide modèle sur un forum à partir d'un problème réel, avec la sortie d'`inxi`
|
||||
- Récupérer des photos « effacées » d'une clé USB avec PhotoRec
|
||||
- Démarrer un ordinateur depuis une clé live et sauver des fichiers d'un système qui ne démarre plus
|
||||
- Lire `journalctl` après avoir débranché un périphérique pour apprendre à repérer l'information utile
|
||||
|
|
@ -1,63 +0,0 @@
|
|||
## 2.4 S'insérer dans le monde numérique
|
||||
|
||||
**Ce que recouvre la compétence** : comprendre les enjeux de sa présence en ligne et choisir ses pratiques pour agir en tant que citoyen, acteur économique et professionnel dans le monde numérique. C'est la compétence la plus « culture générale » du référentiel. Thématiques Pix : identité et présence en ligne, modèles économiques du numérique, démarches administratives, vie professionnelle, participation citoyenne, questions éthiques et sociétales.
|
||||
|
||||
### Progression par niveaux (résumé)
|
||||
|
||||
- **N1-N2** : réaliser une démarche en ligne simple, savoir que ses actions laissent des traces.
|
||||
- **N3** : comprendre qu'un service gratuit a un modèle économique, gérer sa présence sur quelques services.
|
||||
- **N4-N5** : construire une présence en ligne cohérente avec ses objectifs (emploi, engagement), effectuer des démarches administratives complexes.
|
||||
- **N6+** : analyser les enjeux économiques, politiques et éthiques du numérique, faire des choix argumentés et s'engager.
|
||||
|
||||
### Version Linux et libre
|
||||
|
||||
**Comprendre les modèles économiques**
|
||||
|
||||
- « Si c'est gratuit, c'est vous le produit » : publicité ciblée, revente de données, économie de l'attention
|
||||
- Freemium, abonnement, achats intégrés
|
||||
- Le modèle du libre : dons, services, contributions d'entreprises, financements publics
|
||||
- Les **4 libertés** du logiciel libre : utiliser, étudier, modifier, redistribuer
|
||||
|
||||
**Enjeux de société**
|
||||
|
||||
- Dépendance aux grandes plateformes, souveraineté numérique, interopérabilité
|
||||
- Les communs numériques : Wikipédia, OpenStreetMap, logiciels libres
|
||||
- Algorithmes de recommandation vs fils chronologiques (comme sur Mastodon)
|
||||
- Interfaces trompeuses (_dark patterns_), notifications et captation de l'attention
|
||||
|
||||
**Démarches en ligne depuis Linux**
|
||||
|
||||
- FranceConnect, impots.gouv, ameli, ANTS fonctionnent dans Firefox
|
||||
- Repérer les rares cas où un service impose un logiciel ou un système propriétaire, et savoir le signaler
|
||||
|
||||
**Obsolescence et inclusion**
|
||||
|
||||
- Redonner vie à un ancien ordinateur sous Linux (distributions légères, Emmabuntüs conçue pour le réemploi)
|
||||
- Fin de support de Windows 10 en 2025 : la campagne _End of 10_ propose de passer à Linux plutôt que de jeter son PC
|
||||
- Illectronisme : lieux de médiation numérique, conseillers numériques
|
||||
|
||||
**Vie professionnelle**
|
||||
|
||||
- CV et lettres avec LibreOffice, export PDF
|
||||
- Contributions à des projets libres (code, traduction, documentation) comme vitrine de compétences
|
||||
- Séparer présence professionnelle et vie privée
|
||||
|
||||
**Participation citoyenne**
|
||||
|
||||
- Plateformes participatives libres comme **Decidim**, utilisées par des collectivités pour les budgets participatifs et consultations
|
||||
- Consultations publiques en ligne, pétitions
|
||||
- Contributions aux communs (lien avec 2.2)
|
||||
|
||||
**S'engager dans le libre**
|
||||
|
||||
- Associations : **April**, **Framasoft**, **La Quadrature du Net**, FSFE, Wikimédia France, OpenStreetMap France
|
||||
- Collectif **CHATONS** : hébergeurs alternatifs, éthiques et locaux
|
||||
- Groupes d'utilisateurs Linux (GUL), _install parties_, événements comme les JDLL ou le Capitole du Libre
|
||||
|
||||
### Idées d'activités
|
||||
|
||||
- Lire ensemble les conditions d'utilisation d'un réseau social et identifier comment il gagne de l'argent
|
||||
- Débat argumenté : « Une administration devrait-elle utiliser exclusivement des logiciels libres ? »
|
||||
- Organiser une mini _install party_ : installer Linux sur un ordinateur destiné à être jeté
|
||||
- Réaliser une démarche administrative complète sous Linux et noter les éventuels obstacles
|
||||
- Explorer une consultation Decidim d'une collectivité et y analyser la participation
|
||||
|
|
@ -1,73 +0,0 @@
|
|||
## 4.1 Sécuriser l'environnement numérique
|
||||
|
||||
**Ce que recouvre la compétence** : protéger ses équipements, ses communications et ses données contre les attaques, pièges et incidents (logiciels malveillants, hameçonnage, vol de compte, perte de données). Thématiques Pix : menaces et ingénierie sociale, authentification, chiffrement, mises à jour et logiciels de protection, sécurité des réseaux, paiements en ligne.
|
||||
|
||||
### Progression par niveaux (résumé)
|
||||
|
||||
- **N1-N2** : verrouiller son poste, ne pas partager ses mots de passe, reconnaître un message suspect évident.
|
||||
- **N3** : créer des mots de passe robustes, faire les mises à jour, repérer une connexion sécurisée (HTTPS).
|
||||
- **N4-N5** : utiliser un gestionnaire de mots de passe et la double authentification, chiffrer des données, sécuriser son réseau.
|
||||
- **N6+** : comprendre les mécanismes d'attaque et de chiffrement, appliquer une politique de sécurité pour un groupe, réagir à un incident.
|
||||
|
||||
### Version Linux et libre
|
||||
|
||||
**Le modèle de sécurité de Linux**
|
||||
|
||||
- Compte utilisateur sans privilèges, `sudo` pour les actions d'administration
|
||||
- Logiciels installés depuis des dépôts officiels signés plutôt que téléchargés au hasard
|
||||
- Mises à jour centralisées pour tout le système (gestionnaire de logiciels, `apt`, `dnf`), automatisables
|
||||
- Flatpak : applications isolées, permissions réglables avec **Flatseal**
|
||||
- AppArmor ou SELinux en arrière-plan
|
||||
- À démystifier : Linux n'est pas invulnérable. L'hameçonnage, les extensions de navigateur malveillantes, un `curl … | bash` aveugle ou un dépôt tiers douteux restent des risques réels
|
||||
|
||||
**Mots de passe et authentification**
|
||||
|
||||
- **KeePassXC** : gestionnaire libre, certifié par l'ANSSI
|
||||
- Bitwarden (serveur auto-hébergeable avec Vaultwarden)
|
||||
- Phrases de passe (méthode Diceware) plutôt que mots de passe complexes impossibles à retenir
|
||||
- Vérifier si ses comptes ont fuité : Have I Been Pwned, Mozilla Monitor
|
||||
- Double authentification (TOTP) : KeePassXC lui-même, **Aegis** (Android), Authenticator (GNOME)
|
||||
- Clés de sécurité physiques FIDO2, dont **Nitrokey** au matériel ouvert ; passkeys
|
||||
|
||||
**Chiffrement**
|
||||
|
||||
- **LUKS** : chiffrement complet du disque proposé à l'installation de la plupart des distributions
|
||||
- VeraCrypt : conteneurs chiffrés, lisibles aussi sous Windows et macOS
|
||||
- **Cryptomator** : chiffrer ses fichiers avant de les mettre dans le nuage
|
||||
- GnuPG pour les fichiers et courriels (Kleopatra, ou Mots de passe et clés sous GNOME)
|
||||
- Clés SSH pour se connecter à un serveur
|
||||
- HTTPS et certificats : ce que garantit vraiment le cadenas, et ce qu'il ne garantit pas
|
||||
|
||||
**Réseau**
|
||||
|
||||
- Pare-feu : `ufw` et son interface **Gufw**, ou firewalld
|
||||
- Wi-Fi : WPA2/WPA3, prudence sur les réseaux publics
|
||||
- VPN : **WireGuard**, OpenVPN ; ce qu'un VPN protège et ses limites
|
||||
- **Tor Browser** pour l'anonymat
|
||||
- Firefox : mode HTTPS uniquement, DNS chiffré
|
||||
|
||||
**Logiciels de protection**
|
||||
|
||||
- ClamAV avec l'interface ClamTk : utile surtout pour analyser des fichiers destinés à des postes Windows ou des clés USB partagées
|
||||
- uBlock Origin contre les publicités piégées
|
||||
|
||||
**Hameçonnage et ingénierie sociale**
|
||||
|
||||
- Vérifier l'adresse réelle d'un lien et l'expéditeur réel (en-têtes dans Thunderbird)
|
||||
- Signaler : Signal Spam, **cybermalveillance.gouv.fr**, 17Cyber pour les victimes
|
||||
- Rançongiciels : la meilleure protection reste la sauvegarde hors ligne (lien 1.2)
|
||||
|
||||
**Bonnes pratiques matérielles**
|
||||
|
||||
- Verrouiller sa session (Super + L), mot de passe du BIOS/UEFI
|
||||
- Ne pas brancher une clé USB inconnue
|
||||
- Référence : guide d'hygiène informatique de l'ANSSI
|
||||
|
||||
### Idées d'activités
|
||||
|
||||
- Migrer tous ses mots de passe vers KeePassXC et activer la double authentification sur un compte important
|
||||
- Créer un conteneur VeraCrypt sur une clé USB et l'ouvrir sous un autre système
|
||||
- Atelier hameçonnage : trier une série de vrais et faux messages en justifiant chaque choix
|
||||
- Configurer Gufw et vérifier les ports ouverts avec `ss -tulpn`
|
||||
- Examiner les permissions de ses applications Flatpak avec Flatseal et en restreindre une
|
||||
- Échanger des fichiers chiffrés avec GnuPG entre deux participants
|
||||
|
|
@ -1,66 +0,0 @@
|
|||
## 1.3 Traiter des données
|
||||
|
||||
**Ce que recouvre la compétence** : appliquer des traitements à des données pour les analyser et les interpréter, avec un tableur, une base de données, un programme ou un outil d'enquête. Thématiques Pix : structure des données, formules et calculs, tri et filtrage, représentation graphique, interprétation critique, formats de données.
|
||||
|
||||
### Progression par niveaux (résumé)
|
||||
|
||||
- **N1-N2** : saisir des données dans un tableau, faire une somme ou une moyenne simple, trier une colonne.
|
||||
- **N3** : écrire des formules, utiliser références relatives et absolues, filtrer, produire un graphique adapté.
|
||||
- **N4-N5** : croiser des données (tableaux croisés dynamiques), importer/exporter des formats comme le CSV, mener une enquête et en analyser les résultats.
|
||||
- **N6+** : interroger une base de données, automatiser un traitement, détecter un biais ou une représentation trompeuse.
|
||||
|
||||
### Version Linux et libre
|
||||
|
||||
**Tableur**
|
||||
|
||||
- **LibreOffice Calc** : formules, `$A$1` vs `A1`, tri, filtre automatique, validation de données, tableaux croisés dynamiques, graphiques
|
||||
- Gnumeric : plus léger, réputé pour la justesse de ses fonctions statistiques
|
||||
- **Grist** : entre tableur et base de données, libre, utilisé par l'administration française (auto-hébergeable)
|
||||
|
||||
**Formats de données**
|
||||
|
||||
- CSV : le piège classique de l'encodage (UTF-8) et du séparateur (`;` en France à cause de la virgule décimale)
|
||||
- JSON, XML, ODS ; comprendre qu'un même jeu de données peut circuler sous plusieurs formes
|
||||
|
||||
**Bases de données**
|
||||
|
||||
- **LibreOffice Base** : tables, relations, formulaires, requêtes
|
||||
- **SQLite** avec DB Browser for SQLite : idéal pour découvrir le SQL (`SELECT`, `WHERE`, `GROUP BY`)
|
||||
- PostgreSQL ou MariaDB pour aller plus loin
|
||||
|
||||
**Nettoyage de données**
|
||||
|
||||
- **OpenRefine** : dédoublonner, harmoniser des valeurs, corriger des incohérences
|
||||
|
||||
**En ligne de commande** (spécificité Linux très parlante)
|
||||
|
||||
- `wc`, `sort`, `uniq -c`, `cut`, `grep`, `awk` : compter et agréger un fichier texte en une ligne
|
||||
- `jq` pour le JSON, csvkit ou Miller (`mlr`) pour le CSV
|
||||
|
||||
**Programmation et analyse**
|
||||
|
||||
- Python avec pandas et matplotlib, dans **JupyterLab**
|
||||
- R pour les statistiques
|
||||
- gnuplot pour des graphiques scriptés
|
||||
|
||||
**Enquêtes**
|
||||
|
||||
- **LimeSurvey** : questionnaires et export des résultats vers Calc ou CSV
|
||||
|
||||
**Données ouvertes et cartographie**
|
||||
|
||||
- data.gouv.fr, INSEE, OpenStreetMap comme sources réelles
|
||||
- **QGIS** pour traiter des données géographiques
|
||||
|
||||
**Interprétation critique**
|
||||
|
||||
- Moyenne vs médiane, corrélation vs causalité
|
||||
- Repérer un graphique trompeur : axe tronqué, échelle inadaptée, camembert surchargé
|
||||
|
||||
### Idées d'activités
|
||||
|
||||
- Télécharger un jeu de données sur data.gouv.fr, résoudre le problème d'import CSV dans Calc, puis produire un graphique
|
||||
- Comparer le même calcul fait dans Calc, en SQL sur SQLite et en une ligne de shell
|
||||
- Nettoyer un fichier volontairement « sale » avec OpenRefine
|
||||
- Créer un questionnaire LimeSurvey dans le groupe, puis analyser les réponses avec un tableau croisé dynamique
|
||||
- Corriger un graphique trompeur trouvé dans la presse
|
||||
|
|
@ -1,932 +0,0 @@
|
|||
# Chapitre 00 — Installer Python et son environnement de travail
|
||||
|
||||
> **⏱️ Durée estimée :** 2 à 3 heures (installation comprise)
|
||||
>
|
||||
> **📋 Prérequis :** aucun ! Savoir allumer un ordinateur, télécharger un fichier et taper au clavier suffit. Pense à jeter un œil au [sommaire](README.md) pour avoir une vue d'ensemble du cours.
|
||||
>
|
||||
> **🎯 Objectifs — À la fin de ce chapitre, tu sauras :**
|
||||
> - installer la dernière version stable de Python 3 sur Windows, macOS ou Linux, et vérifier qu'elle fonctionne ;
|
||||
> - installer et configurer VS Code avec l'extension Python ;
|
||||
> - te déplacer dans tes dossiers avec le terminal (`cd`, `ls`, `dir`) ;
|
||||
> - utiliser l'interpréteur interactif de Python comme une calculatrice améliorée ;
|
||||
> - écrire, enregistrer et exécuter ton premier script, avec des commentaires ;
|
||||
> - lire un message d'erreur de Python sans paniquer et trouver la ligne fautive.
|
||||
|
||||
---
|
||||
|
||||
## Cours
|
||||
|
||||
### 1. Python, c'est quoi exactement ?
|
||||
|
||||
Un ordinateur est très rapide mais complètement bête : il ne fait que ce qu'on lui dit, à la lettre. Pour lui donner des ordres, on écrit des **programmes** dans un **langage de programmation**. Python est l'un de ces langages, et c'est sans doute le plus apprécié des débutants, parce qu'il se lit presque comme de l'anglais simplifié.
|
||||
|
||||
Voici un programme Python complet :
|
||||
|
||||
```python
|
||||
print("Bonjour, le monde !")
|
||||
```
|
||||
|
||||
Sortie :
|
||||
|
||||
```text
|
||||
Bonjour, le monde !
|
||||
```
|
||||
|
||||
Une seule ligne, et c'est tout. Dans d'autres langages, il faudrait plusieurs lignes de « cérémonie » pour obtenir le même résultat.
|
||||
|
||||
Python est utilisé partout : automatisation de tâches répétitives, sites web, analyse de données, intelligence artificielle, jeux, robotique… Tu découvriras ces domaines au [chapitre 14](14-specialisations.md).
|
||||
|
||||
**Comment ça marche ?** Le texte que tu écris (le **code source**) est lu par un programme appelé **l'interpréteur Python**. L'interpréteur lit ton code ligne par ligne, de haut en bas, et exécute chaque instruction. Pense à un cuisinier (l'interpréteur) qui lit une recette (ton code) : il suit les étapes dans l'ordre, et s'il tombe sur une phrase incompréhensible, il s'arrête et te le dit.
|
||||
|
||||
Installer Python, c'est donc installer cet interpréteur sur ton ordinateur.
|
||||
|
||||
### 2. Installer Python
|
||||
|
||||
> 💡 Installe toujours **la dernière version stable de Python 3**, disponible sur le site officiel [python.org](https://www.python.org/downloads/). Ce cours demande au minimum Python 3.12. N'installe jamais « Python 2 » : il est abandonné depuis 2020.
|
||||
|
||||
Choisis la section qui correspond à ton système.
|
||||
|
||||
#### 2.1. Sous Windows
|
||||
|
||||
Il existe aujourd'hui deux façons officielles d'installer Python sous Windows. Les deux fonctionnent ; choisis-en **une seule**.
|
||||
|
||||
**Méthode A — L'installateur classique (le plus courant dans les tutoriels)**
|
||||
|
||||
1. Va sur [python.org/downloads](https://www.python.org/downloads/) et clique sur le gros bouton jaune *Download Python 3.x.x*. Si le site te propose plutôt le « Python install manager », regarde la méthode B.
|
||||
2. Lance le fichier `.exe` téléchargé.
|
||||
3. ⚠️ **ÉTAPE CRUCIALE** : tout en bas de la première fenêtre, **coche la case « Add python.exe to PATH »**. Si tu l'oublies, la commande `python` ne sera pas reconnue dans le terminal.
|
||||
4. Clique sur *Install Now* et attends la fin de l'installation.
|
||||
5. Si un message *Disable path length limit* apparaît à la fin, clique dessus (c'est sans risque et ça évite des soucis plus tard).
|
||||
|
||||
> 🤔 **Le PATH, c'est quoi ?** C'est une liste de dossiers dans lesquels Windows cherche les programmes quand tu tapes une commande. Cocher la case ajoute le dossier de Python à cette liste. Sans ça, Windows te répond qu'il ne connaît pas `python`, un peu comme si tu cherchais un livre dans une bibliothèque qui n'a pas de fiche à son nom.
|
||||
|
||||
**Méthode B — Le « Python install manager »**
|
||||
|
||||
Les versions récentes de Python proposent sous Windows un **gestionnaire d'installation** (Python install manager). Il est disponible dans le **Microsoft Store** (cherche « Python install manager ») ou sur python.org. Une fois installé, il fournit les commandes `python` et `py` : la première fois que tu tapes `python` dans un terminal, il télécharge et installe automatiquement la dernière version stable. Si on te propose d'ajouter un dossier au PATH pendant la configuration, accepte.
|
||||
|
||||
> ⚠️ Ne mélange pas les deux méthodes, et si tu tapes `python` et que **le Microsoft Store s'ouvre** tout seul, c'est que Python n'est pas (bien) installé : Windows te propose de l'installer. Dans ce cas, reprends l'une des deux méthodes ci-dessus.
|
||||
|
||||
**La commande `py` sous Windows.** Windows propose aussi un petit programme appelé `py` (le « lanceur Python »). Il fonctionne même quand le PATH est mal configuré. Si `python` ne marche pas, essaie `py` :
|
||||
|
||||
```text
|
||||
C:\Users\camille> py --version
|
||||
Python 3.x.y
|
||||
```
|
||||
|
||||
#### 2.2. Sous macOS
|
||||
|
||||
macOS contient parfois un vieux Python, ou un Python installé par les outils de développement d'Apple. Ne t'en sers pas et installe la version officielle :
|
||||
|
||||
1. Va sur [python.org/downloads](https://www.python.org/downloads/) et télécharge l'installateur macOS (fichier `.pkg`).
|
||||
2. Lance-le et clique sur *Continuer* jusqu'à la fin.
|
||||
3. À la fin, une fenêtre du Finder s'ouvre : double-clique sur **`Install Certificates.command`**. Cela permettra à Python de télécharger des choses sur Internet de façon sécurisée (utile au [chapitre 12](12-outils-venv-pip-git.md)).
|
||||
|
||||
> 💡 Si tu connais déjà **Homebrew**, `brew install python` fonctionne aussi très bien.
|
||||
|
||||
Sous macOS, la commande s'appelle **`python3`** (et pas `python`).
|
||||
|
||||
#### 2.3. Sous Linux
|
||||
|
||||
La plupart des distributions Linux (Ubuntu, Debian, Fedora…) ont **déjà Python 3** installé, car le système lui-même s'en sert. Vérifie la version (voir section suivante). Si elle est trop ancienne ou absente, utilise le gestionnaire de paquets :
|
||||
|
||||
```text
|
||||
# Ubuntu / Debian
|
||||
sudo apt update
|
||||
sudo apt install python3 python3-venv python3-pip
|
||||
|
||||
# Fedora
|
||||
sudo dnf install python3
|
||||
```
|
||||
|
||||
> ⚠️ Ne désinstalle **jamais** le Python fourni avec Linux : ton système en a besoin pour fonctionner.
|
||||
|
||||
Sous Linux aussi, la commande s'appelle **`python3`**.
|
||||
|
||||
#### 2.4. `python`, `python3` ou `py` : qui fait quoi ?
|
||||
|
||||
| Système | Commande à utiliser | Remarque |
|
||||
|---|---|---|
|
||||
| Windows | `python` (ou `py`) | `python3` peut ouvrir le Microsoft Store : évite-la |
|
||||
| macOS | `python3` | `python` n'existe souvent pas |
|
||||
| Linux | `python3` | `python` peut ne pas exister, ou pointer vers autre chose |
|
||||
|
||||
Dans la suite du cours, on écrira `python` dans les exemples de terminal. **Si tu es sous macOS ou Linux, remplace mentalement `python` par `python3`.**
|
||||
|
||||
### 3. Le terminal : parler à l'ordinateur en texte
|
||||
|
||||
Le **terminal** (on dit aussi « console » ou « ligne de commande ») est une fenêtre où tu tapes des commandes au lieu de cliquer. Ça fait un peu « film de hackers », mais tu n'as besoin que de trois ou quatre commandes.
|
||||
|
||||
**Ouvrir un terminal :**
|
||||
|
||||
- **Windows** : touche Windows, tape « Terminal » (ou « PowerShell »), puis Entrée.
|
||||
- **macOS** : `Cmd` + `Espace`, tape « Terminal », puis Entrée.
|
||||
- **Linux** : souvent `Ctrl` + `Alt` + `T`.
|
||||
|
||||
Tu vois alors une ligne qui se termine par `>` (Windows) ou `$` / `%` (macOS, Linux) : c'est l'**invite de commande** (le *prompt*). Elle t'indique aussi **le dossier dans lequel tu te trouves**, appelé **dossier courant**.
|
||||
|
||||
#### 3.1. Vérifier que Python est installé
|
||||
|
||||
Tape la commande suivante, puis Entrée :
|
||||
|
||||
```text
|
||||
python --version
|
||||
```
|
||||
|
||||
(ou `python3 --version` sous macOS/Linux, ou `py --version` sous Windows)
|
||||
|
||||
Tu dois voir quelque chose comme `Python 3.x.y`, avec un numéro au moins égal à 3.12. 🎉 Si tu obtiens une erreur, va voir la section [Pièges fréquents](#pièges-fréquents).
|
||||
|
||||
#### 3.2. Les commandes indispensables
|
||||
|
||||
| Action | Windows (PowerShell) | macOS / Linux |
|
||||
|---|---|---|
|
||||
| Afficher le dossier courant | `pwd` (ou `cd` seul dans l'ancien `cmd`) | `pwd` |
|
||||
| Lister le contenu du dossier | `dir` (ou `ls` dans PowerShell) | `ls` |
|
||||
| Entrer dans un dossier | `cd nom_du_dossier` | `cd nom_du_dossier` |
|
||||
| Remonter d'un niveau | `cd ..` | `cd ..` |
|
||||
| Revenir au dossier personnel | `cd ~` | `cd ~` |
|
||||
| Créer un dossier | `mkdir nom_du_dossier` | `mkdir nom_du_dossier` |
|
||||
| Effacer l'écran | `cls` (ou `clear`) | `clear` |
|
||||
|
||||
Imagine que tes dossiers sont des pièces d'une maison. `ls`/`dir` revient à regarder autour de toi, `cd cuisine` à entrer dans la cuisine, `cd ..` à revenir dans le couloir.
|
||||
|
||||
Exemple de session (macOS/Linux) :
|
||||
|
||||
```text
|
||||
$ pwd
|
||||
/home/camille
|
||||
$ mkdir cours-python
|
||||
$ cd cours-python
|
||||
$ pwd
|
||||
/home/camille/cours-python
|
||||
$ ls
|
||||
$ cd ..
|
||||
$ pwd
|
||||
/home/camille
|
||||
```
|
||||
|
||||
> 💡 **Astuces qui font gagner un temps fou :**
|
||||
> - La touche **Tab** complète automatiquement les noms de dossiers et de fichiers : tape `cd cou` puis Tab.
|
||||
> - La **flèche du haut** rappelle les commandes précédentes.
|
||||
> - Si un nom de dossier contient des espaces, mets-le entre guillemets : `cd "Mes documents"`. Mieux encore : évite les espaces et les accents dans les noms de dossiers de programmation (`cours-python` plutôt que `Cours Python élémentaire`).
|
||||
|
||||
**Crée maintenant ton dossier de travail** pour tout le cours, par exemple `cours-python` dans ton dossier personnel, avec `mkdir cours-python`.
|
||||
|
||||
### 4. L'interpréteur interactif : Python en direct
|
||||
|
||||
Tape simplement `python` (ou `python3`) dans le terminal, sans rien d'autre :
|
||||
|
||||
```text
|
||||
$ python3
|
||||
Python 3.x.y (...)
|
||||
Type "help", "copyright", "credits" or "license" for more information.
|
||||
>>>
|
||||
```
|
||||
|
||||
Les trois chevrons `>>>` signifient : « Python t'écoute ». Tu es dans l'**interpréteur interactif** (on dit aussi **REPL** : *Read, Evaluate, Print, Loop* — lire, évaluer, afficher, recommencer). Chaque ligne que tu tapes est exécutée immédiatement.
|
||||
|
||||
Essaie-le comme une calculatrice :
|
||||
|
||||
```pycon
|
||||
>>> 2 + 3
|
||||
5
|
||||
>>> 10 - 4 * 2
|
||||
2
|
||||
>>> (10 - 4) * 2
|
||||
12
|
||||
>>> 7 / 2
|
||||
3.5
|
||||
>>> 2 ** 10
|
||||
1024
|
||||
```
|
||||
|
||||
Remarques :
|
||||
|
||||
- `*` est la multiplication, `/` la division, `**` la puissance (`2 ** 10` = 2 à la puissance 10).
|
||||
- Les priorités sont celles des maths : la multiplication passe avant l'addition, sauf si tu mets des parenthèses.
|
||||
- Les nombres à virgule s'écrivent avec un **point** : `3.5`, pas `3,5`.
|
||||
|
||||
Tu peux aussi manipuler du texte, à condition de le mettre entre guillemets :
|
||||
|
||||
```pycon
|
||||
>>> "Bonjour"
|
||||
'Bonjour'
|
||||
>>> "Bon" + "jour"
|
||||
'Bonjour'
|
||||
>>> "Ha" * 3
|
||||
'HaHaHa'
|
||||
>>> print("Salut !")
|
||||
Salut !
|
||||
```
|
||||
|
||||
Tous ces détails (types de valeurs, opérateurs) seront approfondis au [chapitre 01](01-variables-types-operateurs.md).
|
||||
|
||||
**Pour quitter l'interpréteur**, tape `exit()` puis Entrée (ou `Ctrl` + `D` sous macOS/Linux, `Ctrl` + `Z` puis Entrée sous Windows). Tu reviens alors au terminal normal.
|
||||
|
||||
> ⚠️ **Ne confonds pas les deux mondes !**
|
||||
> - Après `$` ou `>` : tu parles au **terminal** (commandes `cd`, `ls`, `python`…).
|
||||
> - Après `>>>` : tu parles à **Python** (code Python).
|
||||
>
|
||||
> Taper `cd Documents` après `>>>`, ou `print("Bonjour")` dans le terminal, provoque une erreur.
|
||||
|
||||
L'interpréteur interactif est parfait pour tester une petite idée, mais tout ce que tu y tapes disparaît quand tu le fermes. Pour écrire de vrais programmes, on utilise des **scripts** enregistrés dans des fichiers, et un éditeur de code.
|
||||
|
||||
### 5. Installer VS Code, ton éditeur de code
|
||||
|
||||
Tu pourrais écrire du Python dans le Bloc-notes, mais ce serait comme écrire un roman sans correcteur d'orthographe. Un **éditeur de code** colore ton code, détecte des erreurs à la volée, complète automatiquement ce que tu tapes, et permet d'exécuter ton programme en un clic.
|
||||
|
||||
Nous utiliserons **Visual Studio Code** (VS Code), gratuit et disponible sur les trois systèmes.
|
||||
|
||||
1. Télécharge-le sur [code.visualstudio.com](https://code.visualstudio.com/) et installe-le.
|
||||
- **Windows** : pendant l'installation, coche « Ajouter à PATH » et « Ajouter l'action *Ouvrir avec Code* », c'est pratique.
|
||||
- **macOS** : glisse l'application dans le dossier *Applications*.
|
||||
- **Linux** : utilise le paquet `.deb` / `.rpm` proposé, ou la logithèque de ta distribution.
|
||||
2. Lance VS Code.
|
||||
3. Clique sur l'icône **Extensions** dans la barre de gauche (quatre petits carrés), ou fais `Ctrl` + `Shift` + `X` (`Cmd` + `Shift` + `X` sur macOS).
|
||||
4. Cherche **« Python »** et installe l'extension publiée par **Microsoft** (c'est la première, avec des millions de téléchargements). Elle installe automatiquement ses compagnons (Pylance, le débogueur…).
|
||||
5. (Facultatif) Si tu préfères l'interface en français, installe aussi l'extension **« French Language Pack for Visual Studio Code »** puis redémarre VS Code.
|
||||
|
||||
**Ouvrir ton dossier de travail.** Dans VS Code : *Fichier* → *Ouvrir le dossier…* (*File* → *Open Folder…*), puis choisis ton dossier `cours-python`. VS Code peut te demander si tu fais confiance aux auteurs des fichiers : réponds oui, c'est ton dossier.
|
||||
|
||||
**Choisir l'interpréteur.** Ouvre la palette de commandes avec `Ctrl` + `Shift` + `P` (`Cmd` + `Shift` + `P` sur macOS), tape « Python: Select Interpreter » et choisis la version de Python que tu viens d'installer. En général VS Code la trouve tout seul.
|
||||
|
||||
**Le terminal intégré.** VS Code contient son propre terminal : menu *Terminal* → *Nouveau terminal* (ou ``Ctrl`` + ``ù`` sur un clavier français, ``Ctrl`` + `` ` `` sur un clavier anglais). Il s'ouvre directement dans ton dossier de travail. C'est celui-là que tu utiliseras le plus souvent.
|
||||
|
||||
### 6. Ton premier script
|
||||
|
||||
Un **script** est simplement un fichier texte qui contient du code Python et dont le nom se termine par **`.py`**.
|
||||
|
||||
1. Dans VS Code, crée un nouveau fichier (*Fichier* → *Nouveau fichier*, ou l'icône 📄+ à côté du nom du dossier) et nomme-le **`bonjour.py`**.
|
||||
2. Tape ce code :
|
||||
|
||||
```python
|
||||
print("Bonjour !")
|
||||
print("Je m'appelle Python.")
|
||||
print("Je sais calculer : 6 x 7 =", 6 * 7)
|
||||
```
|
||||
|
||||
3. **Enregistre** (`Ctrl` + `S` / `Cmd` + `S`). Un rond blanc à côté du nom de l'onglet signifie « fichier non enregistré » : Python exécute ce qui est **sur le disque**, pas ce qui est à l'écran !
|
||||
4. Exécute-le, au choix :
|
||||
- clique sur le bouton ▶ (*Run Python File*) en haut à droite de l'éditeur ;
|
||||
- ou, dans le terminal intégré, tape `python bonjour.py` (ou `python3 bonjour.py`).
|
||||
|
||||
Sortie :
|
||||
|
||||
```text
|
||||
Bonjour !
|
||||
Je m'appelle Python.
|
||||
Je sais calculer : 6 x 7 = 42
|
||||
```
|
||||
|
||||
Félicitations, tu es officiellement programmeur ou programmeuse ! 🎉
|
||||
|
||||
**Ce qu'il faut remarquer :**
|
||||
|
||||
- `print(...)` affiche ce qu'on lui donne entre parenthèses. C'est une **fonction** : un outil prêt à l'emploi fourni par Python. (Tu apprendras à créer tes propres fonctions au [chapitre 05](05-fonctions.md).)
|
||||
- Le texte est entre guillemets : `"Bonjour !"`. On appelle ça une **chaîne de caractères**. Sans guillemets, Python croirait que c'est du code.
|
||||
- On peut donner plusieurs choses à `print`, séparées par des virgules : Python les affiche séparées par une espace.
|
||||
- `6 * 7` n'est pas entre guillemets : Python le calcule et affiche `42`.
|
||||
- Les lignes sont exécutées **dans l'ordre**, de haut en bas.
|
||||
|
||||
Encore un exemple, pour voir que `print()` sans rien affiche une ligne vide :
|
||||
|
||||
```python
|
||||
print("Ligne 1")
|
||||
print()
|
||||
print("Ligne 3, après une ligne vide")
|
||||
print("Le résultat de 100 / 8 est", 100 / 8)
|
||||
```
|
||||
|
||||
Sortie :
|
||||
|
||||
```text
|
||||
Ligne 1
|
||||
|
||||
Ligne 3, après une ligne vide
|
||||
Le résultat de 100 / 8 est 12.5
|
||||
```
|
||||
|
||||
> 💡 **Guillemets simples ou doubles ?** Les deux marchent : `'Bonjour'` et `"Bonjour"` sont identiques. Mais si ton texte contient une apostrophe (très fréquent en français !), utilise des guillemets doubles : `"J'adore Python"`.
|
||||
|
||||
### 7. Les commentaires
|
||||
|
||||
Un **commentaire** est une note pour les humains, que Python ignore complètement. Il commence par le caractère `#` et s'étend jusqu'à la fin de la ligne.
|
||||
|
||||
```python
|
||||
# Ce programme affiche un message de bienvenue.
|
||||
# Auteur : Camille
|
||||
|
||||
print("Bienvenue !") # un commentaire peut aussi suivre du code
|
||||
|
||||
# print("Cette ligne ne sera pas exécutée")
|
||||
print("Fin du programme")
|
||||
```
|
||||
|
||||
Sortie :
|
||||
|
||||
```text
|
||||
Bienvenue !
|
||||
Fin du programme
|
||||
```
|
||||
|
||||
**À quoi servent les commentaires ?**
|
||||
|
||||
- **Expliquer le pourquoi** d'un morceau de code (« on arrondit ici parce que la banque n'accepte pas les centimes de centimes »).
|
||||
- **Désactiver temporairement** une ligne sans l'effacer, pour tester quelque chose. Dans VS Code, `Ctrl` + `/` (`Cmd` + `/`) commente ou décommente les lignes sélectionnées.
|
||||
- **Structurer** un long script en sections.
|
||||
|
||||
> 💡 Un bon commentaire explique **pourquoi**, pas **quoi**. `print("Bonjour") # affiche Bonjour` n'apporte rien : le code le dit déjà.
|
||||
|
||||
### 8. Lire ta première erreur
|
||||
|
||||
Tu vas faire des erreurs. Beaucoup. Tout le monde en fait, même les experts avec 20 ans d'expérience. La différence, c'est qu'ils savent **lire les messages d'erreur**. Bonne nouvelle : les messages de Python sont parmi les plus clairs qui existent.
|
||||
|
||||
Crée un fichier `erreur.py` avec ce code (il y a une faute volontaire à la ligne 2) :
|
||||
|
||||
```python
|
||||
print("Bonjour")
|
||||
print(Bonjour)
|
||||
```
|
||||
|
||||
En l'exécutant, tu obtiens :
|
||||
|
||||
```text
|
||||
Bonjour
|
||||
Traceback (most recent call last):
|
||||
File "C:\Users\camille\cours-python\erreur.py", line 2, in <module>
|
||||
print(Bonjour)
|
||||
^^^^^^^
|
||||
NameError: name 'Bonjour' is not defined
|
||||
```
|
||||
|
||||
Comment lire ce message (on l'appelle un **traceback**) :
|
||||
|
||||
1. **Commence par la dernière ligne** : c'est la plus importante. Elle donne le **type d'erreur** (`NameError`) et une explication (`name 'Bonjour' is not defined` : « le nom 'Bonjour' n'est pas défini »).
|
||||
2. **Remonte d'une ou deux lignes** pour trouver **où** : le fichier (`erreur.py`) et le numéro de ligne (`line 2`). Python recopie même la ligne fautive et met des `^^^^` sous le morceau problématique.
|
||||
3. **Remarque** que la ligne 1 a bien été exécutée (`Bonjour` s'est affiché) : Python s'arrête **à la première erreur rencontrée**.
|
||||
|
||||
Ici, on a oublié les guillemets : Python croit que `Bonjour` est un nom de quelque chose qu'il devrait connaître. La correction : `print("Bonjour")`.
|
||||
|
||||
Il existe aussi des erreurs détectées **avant même l'exécution**, quand Python relit ton code : les **erreurs de syntaxe** (`SyntaxError`). C'est l'équivalent d'une faute de grammaire.
|
||||
|
||||
```python
|
||||
print("Bonjour"
|
||||
```
|
||||
|
||||
```text
|
||||
File "C:\Users\camille\cours-python\erreur.py", line 1
|
||||
print("Bonjour"
|
||||
^
|
||||
SyntaxError: '(' was never closed
|
||||
```
|
||||
|
||||
Traduction : « la parenthèse ouverte n'a jamais été fermée ». Dans ce cas, **rien** n'est exécuté, même pas les lignes correctes situées avant.
|
||||
|
||||
**Petit dictionnaire des erreurs que tu croiseras au début :**
|
||||
|
||||
| Message | Signification | Cause probable |
|
||||
|---|---|---|
|
||||
| `SyntaxError: invalid syntax` | Syntaxe invalide | Faute de frappe, symbole manquant ou en trop |
|
||||
| `SyntaxError: '(' was never closed` | Parenthèse jamais fermée | Il manque `)` |
|
||||
| `SyntaxError: unterminated string literal` | Chaîne non terminée | Il manque un guillemet fermant |
|
||||
| `IndentationError: unexpected indent` | Décalage inattendu | Espaces en trop en début de ligne |
|
||||
| `NameError: name '...' is not defined` | Nom inconnu | Faute de frappe, ou guillemets oubliés |
|
||||
| `ZeroDivisionError: division by zero` | Division par zéro | On a divisé par 0 |
|
||||
|
||||
> 💡 **Le réflexe à prendre :** dernière ligne → numéro de ligne → regarder la ligne en question **et celle d'avant** (une parenthèse oubliée à la ligne 3 est parfois signalée à la ligne 4). Et si tu ne comprends pas, copie la dernière ligne du message dans un moteur de recherche : quelqu'un a déjà eu le même problème. Les erreurs et le débogage seront approfondis au [chapitre 08](08-erreurs-et-debogage.md).
|
||||
|
||||
---
|
||||
|
||||
## Pièges fréquents
|
||||
|
||||
### Piège 1 — « python n'est pas reconnu » (Windows)
|
||||
|
||||
```text
|
||||
PS C:\Users\camille> python --version
|
||||
python : Le terme «python» n'est pas reconnu comme nom d'applet de commande, fonction, fichier de script ou programme exécutable.
|
||||
```
|
||||
|
||||
**Cause :** la case « Add python.exe to PATH » n'a pas été cochée pendant l'installation.
|
||||
|
||||
**Correction :** essaie d'abord `py --version`. Si ça marche, tu peux utiliser `py` à la place de `python`. Sinon, relance l'installateur de Python, choisis *Modify* (ou désinstalle puis réinstalle) et coche bien la case. **Ferme et rouvre ensuite le terminal (et VS Code)** : un terminal déjà ouvert ne voit pas les changements du PATH.
|
||||
|
||||
### Piège 2 — « command not found: python » (macOS / Linux)
|
||||
|
||||
```text
|
||||
$ python --version
|
||||
zsh: command not found: python
|
||||
```
|
||||
|
||||
**Cause :** sur macOS et Linux, la commande s'appelle `python3`.
|
||||
|
||||
**Correction :**
|
||||
|
||||
```text
|
||||
$ python3 --version
|
||||
Python 3.x.y
|
||||
```
|
||||
|
||||
### Piège 3 — Taper du Python dans le terminal, ou une commande de terminal dans Python
|
||||
|
||||
Dans le terminal (pas dans Python) :
|
||||
|
||||
```text
|
||||
$ print("Bonjour")
|
||||
bash: syntax error near unexpected token `"Bonjour"'
|
||||
```
|
||||
|
||||
Dans l'interpréteur Python :
|
||||
|
||||
```text
|
||||
>>> python bonjour.py
|
||||
File "<stdin>", line 1
|
||||
python bonjour.py
|
||||
^^^^^^^
|
||||
SyntaxError: invalid syntax
|
||||
```
|
||||
|
||||
**Correction :** regarde l'invite. `>>>` = Python ; `$`, `%` ou `>` = terminal. Pour lancer un script, quitte d'abord l'interpréteur avec `exit()`, puis tape `python bonjour.py` dans le terminal.
|
||||
|
||||
### Piège 4 — « No such file or directory »
|
||||
|
||||
```text
|
||||
$ python3 bonjour.py
|
||||
python3: can't open file '/home/camille/bonjour.py': [Errno 2] No such file or directory
|
||||
```
|
||||
|
||||
**Cause :** tu n'es pas dans le dossier qui contient le fichier (ici, on est dans `/home/camille` alors que le fichier est dans `/home/camille/cours-python`), ou le fichier n'a pas le nom que tu crois (par exemple `bonjour.py.txt` sous Windows).
|
||||
|
||||
**Correction :** vérifie où tu es (`pwd`) et ce qu'il y a dans le dossier (`ls` ou `dir`), puis déplace-toi avec `cd cours-python`. Utiliser le terminal intégré de VS Code, qui s'ouvre directement dans le bon dossier, évite souvent ce problème.
|
||||
|
||||
### Piège 5 — Oublier d'enregistrer
|
||||
|
||||
Tu modifies ton code, tu l'exécutes… et rien ne change. Le rond blanc sur l'onglet de VS Code te dit que le fichier n'est **pas enregistré**.
|
||||
|
||||
**Correction :** `Ctrl` + `S` (`Cmd` + `S`) avant chaque exécution. Mieux : active *Fichier* → *Enregistrement automatique* (*Auto Save*).
|
||||
|
||||
### Piège 6 — Les guillemets « typographiques »
|
||||
|
||||
Si tu copies du code depuis un traitement de texte (Word, un PDF…), les guillemets droits `"` sont parfois remplacés par des guillemets courbes `“ ”` :
|
||||
|
||||
```python
|
||||
print(“Bonjour”)
|
||||
```
|
||||
|
||||
```text
|
||||
File "bonjour.py", line 1
|
||||
print(“Bonjour”)
|
||||
^
|
||||
SyntaxError: invalid character '“' (U+201C)
|
||||
```
|
||||
|
||||
**Correction :** retape les guillemets directement dans VS Code : `print("Bonjour")`. Les guillemets français `« »` provoquent la même erreur.
|
||||
|
||||
### Piège 7 — Les majuscules comptent
|
||||
|
||||
```python
|
||||
Print("Bonjour")
|
||||
```
|
||||
|
||||
```text
|
||||
Traceback (most recent call last):
|
||||
File "bonjour.py", line 1, in <module>
|
||||
Print("Bonjour")
|
||||
^^^^^
|
||||
NameError: name 'Print' is not defined. Did you mean: 'print'?
|
||||
```
|
||||
|
||||
**Correction :** Python est **sensible à la casse** : `print`, `Print` et `PRINT` sont trois noms différents. Remarque que Python te suggère même la bonne réponse : *Did you mean: 'print'?*
|
||||
|
||||
### Piège 8 — Des espaces en trop en début de ligne
|
||||
|
||||
```python
|
||||
print("Bonjour")
|
||||
print("Au revoir")
|
||||
```
|
||||
|
||||
```text
|
||||
File "bonjour.py", line 2
|
||||
print("Au revoir")
|
||||
IndentationError: unexpected indent
|
||||
```
|
||||
|
||||
**Correction :** en Python, les espaces en **début** de ligne (l'**indentation**) ont un sens précis, que tu découvriras au [chapitre 02](02-conditions.md). Pour l'instant, toutes tes lignes doivent commencer tout à gauche.
|
||||
|
||||
---
|
||||
|
||||
## Exercices
|
||||
|
||||
### Exercice 1 ⭐ — Vérification de l'installation
|
||||
|
||||
Ouvre un terminal et :
|
||||
|
||||
1. affiche la version de Python installée ;
|
||||
2. crée un dossier `chapitre00` dans ton dossier de travail et entre dedans ;
|
||||
3. affiche le chemin du dossier courant pour vérifier que tu es au bon endroit ;
|
||||
4. lance l'interpréteur interactif, calcule `2 ** 100`, puis quitte-le.
|
||||
|
||||
Résultat attendu pour le calcul : `1267650600228229401496703205376`.
|
||||
|
||||
### Exercice 2 ⭐ — Calculatrice interactive
|
||||
|
||||
Dans l'interpréteur interactif, calcule :
|
||||
|
||||
1. le nombre de secondes dans une journée ;
|
||||
2. le nombre de minutes dans une année de 365 jours ;
|
||||
3. le prix de 3 croissants à 1,20 € et 2 baguettes à 1,10 € ;
|
||||
4. la moyenne de 12, 15 et 17.
|
||||
|
||||
Attention aux priorités de calcul et à la virgule !
|
||||
|
||||
### Exercice 3 ⭐ — Présente-toi
|
||||
|
||||
Écris un script `presentation.py` qui affiche exactement (en mettant tes propres informations) :
|
||||
|
||||
```text
|
||||
Bonjour !
|
||||
Je m'appelle Camille.
|
||||
J'apprends Python.
|
||||
|
||||
À bientôt !
|
||||
```
|
||||
|
||||
Note la ligne vide avant la dernière ligne.
|
||||
|
||||
### Exercice 4 ⭐⭐ — Chasse aux erreurs
|
||||
|
||||
Le script suivant contient **quatre** erreurs. Exécute-le, lis chaque message d'erreur, corrige la ligne fautive et recommence jusqu'à ce que tout fonctionne.
|
||||
|
||||
```text
|
||||
print("Début du programme")
|
||||
print("Le double de 21 est", 21 * 2
|
||||
Print("Python est sensible à la casse")
|
||||
print("Il manque un guillemet)
|
||||
print(Fin du programme)
|
||||
```
|
||||
|
||||
Sortie attendue une fois corrigé :
|
||||
|
||||
```text
|
||||
Début du programme
|
||||
Le double de 21 est 42
|
||||
Python est sensible à la casse
|
||||
Il manque un guillemet
|
||||
Fin du programme
|
||||
```
|
||||
|
||||
### Exercice 5 ⭐⭐ — Le commentateur
|
||||
|
||||
Écris un script `recette.py` qui affiche une petite recette de crêpes (titre, ingrédients, étapes) sur une dizaine de lignes. Ajoute :
|
||||
|
||||
- un commentaire en tête avec ton nom et la date ;
|
||||
- un commentaire avant chaque section (titre, ingrédients, étapes) ;
|
||||
- une ligne d'étape « désactivée » par un commentaire, qui ne doit pas s'afficher.
|
||||
|
||||
### Exercice 6 ⭐⭐ — Facture rapide
|
||||
|
||||
Écris un script `facture.py` qui affiche une facture et laisse Python faire **tous** les calculs (n'écris pas les résultats toi-même). Un client achète 4 cahiers à 2.5 € et 3 stylos à 1.2 €.
|
||||
|
||||
Sortie attendue :
|
||||
|
||||
```text
|
||||
=== FACTURE ===
|
||||
Cahiers : 4 x 2.5 = 10.0 €
|
||||
Stylos : 3 x 1.2 = 3.5999999999999996 €
|
||||
TOTAL : 13.6 €
|
||||
```
|
||||
|
||||
Ne t'inquiète pas du `3.5999999999999996` : c'est normal, et tu sauras pourquoi (et comment l'arrondir) au chapitre 01.
|
||||
|
||||
### Exercice 7 ⭐⭐⭐ — Art ASCII
|
||||
|
||||
Écris un script `chat.py` qui dessine ce chat (attention : la barre oblique inversée `\` est un caractère spécial en Python ; pour l'afficher, il faut l'écrire en double `\\` dans une chaîne).
|
||||
|
||||
```text
|
||||
/\_/\
|
||||
( o.o )
|
||||
> ^ <
|
||||
```
|
||||
|
||||
Puis ajoute un cadre de 20 étoiles au-dessus et au-dessous, **sans taper les 20 étoiles à la main** (indice : tu as vu ce que fait `"Ha" * 3`).
|
||||
|
||||
---
|
||||
|
||||
## Mini-projet
|
||||
|
||||
### Ma carte de visite dans le terminal
|
||||
|
||||
**Objectif :** créer un script `carte_visite.py` qui affiche une jolie carte de visite à ton nom, encadrée, et qui calcule une ou deux informations « amusantes ».
|
||||
|
||||
**Cahier des charges :**
|
||||
|
||||
1. Le fichier commence par un commentaire d'en-tête : nom du programme, auteur, date, description en une phrase.
|
||||
2. La carte est encadrée par une ligne de 40 caractères `=` en haut et en bas, générée avec l'opérateur `*` sur une chaîne.
|
||||
3. Elle contient au moins : ton prénom, ta ville, un loisir, et la phrase « Apprenti·e Pythoniste ».
|
||||
4. Une section « Le saviez-vous ? » affiche au moins deux calculs faits par Python, par exemple ton âge approximatif en jours (âge × 365) et le nombre d'heures de sommeil par an (8 × 365).
|
||||
5. Les sections sont séparées par des lignes vides et commentées dans le code.
|
||||
6. Le script s'exécute sans aucune erreur depuis le terminal **et** depuis le bouton ▶ de VS Code.
|
||||
|
||||
**Étapes suggérées :**
|
||||
|
||||
1. Crée le fichier dans ton dossier de travail et écris le commentaire d'en-tête.
|
||||
2. Affiche le cadre du haut, puis teste.
|
||||
3. Ajoute les lignes d'information une par une, en testant à chaque fois.
|
||||
4. Ajoute la section des calculs.
|
||||
5. Termine par le cadre du bas et relis les commentaires.
|
||||
|
||||
**Pistes d'amélioration :**
|
||||
|
||||
- Ajoute un petit dessin ASCII (un chat, une tasse de café…).
|
||||
- Centre visuellement les textes en ajoutant des espaces.
|
||||
- Ajoute le nombre de battements de cœur approximatif depuis ta naissance (environ 70 par minute).
|
||||
- Quand tu auras lu le chapitre 01, reviens améliorer ce script avec des variables et une saisie au clavier !
|
||||
|
||||
---
|
||||
|
||||
## Corrigés
|
||||
|
||||
<details>
|
||||
<summary>Corrigé de l'exercice 1</summary>
|
||||
|
||||
Sous macOS / Linux (sous Windows, remplace `python3` par `python` ou `py`, et `pwd` fonctionne dans PowerShell) :
|
||||
|
||||
```text
|
||||
$ python3 --version
|
||||
Python 3.x.y
|
||||
$ mkdir chapitre00
|
||||
$ cd chapitre00
|
||||
$ pwd
|
||||
/home/camille/cours-python/chapitre00
|
||||
$ python3
|
||||
>>> 2 ** 100
|
||||
1267650600228229401496703205376
|
||||
>>> exit()
|
||||
$
|
||||
```
|
||||
|
||||
Remarque : Python calcule sans problème des nombres entiers gigantesques, contrairement à une calculatrice de poche qui afficherait `1.2676506e+30`.
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>Corrigé de l'exercice 2</summary>
|
||||
|
||||
```pycon
|
||||
>>> 24 * 60 * 60
|
||||
86400
|
||||
>>> 365 * 24 * 60
|
||||
525600
|
||||
>>> 3 * 1.20 + 2 * 1.10
|
||||
5.8
|
||||
>>> (12 + 15 + 17) / 3
|
||||
14.666666666666666
|
||||
```
|
||||
|
||||
- Pour les prix, on écrit `1.20` avec un point, jamais une virgule. (Parfois, un calcul avec des nombres à virgule donne un résultat comme `3.5999999999999996` au lieu de `3.6` : c'est une petite imprécision normale en informatique, expliquée au chapitre 01.)
|
||||
- Pour la moyenne, les **parenthèses sont indispensables** : `12 + 15 + 17 / 3` calculerait d'abord `17 / 3` et donnerait `32.666666666666664`.
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>Corrigé de l'exercice 3</summary>
|
||||
|
||||
```python
|
||||
print("Bonjour !")
|
||||
print("Je m'appelle Camille.")
|
||||
print("J'apprends Python.")
|
||||
print()
|
||||
print("À bientôt !")
|
||||
```
|
||||
|
||||
Sortie :
|
||||
|
||||
```text
|
||||
Bonjour !
|
||||
Je m'appelle Camille.
|
||||
J'apprends Python.
|
||||
|
||||
À bientôt !
|
||||
```
|
||||
|
||||
On utilise des guillemets doubles car le texte contient des apostrophes. `print()` sans argument affiche une ligne vide.
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>Corrigé de l'exercice 4</summary>
|
||||
|
||||
Les quatre erreurs, dans l'ordre où Python les signale :
|
||||
|
||||
1. Ligne 4 : `SyntaxError: unterminated string literal (detected at line 4)` → il manque le guillemet fermant. Surprise : ce n'est pas la ligne 2 qui est signalée en premier ! Python découpe d'abord tout le fichier en « mots », et une chaîne non terminée bloque ce découpage dès le départ.
|
||||
2. Ligne 2 : `SyntaxError: '(' was never closed` → il manque la parenthèse fermante.
|
||||
3. Ligne 5 : `SyntaxError: invalid syntax. Perhaps you forgot a comma?` → Python lit `Fin du programme` comme trois noms de code à la suite, ce qui n'a pas de sens. La vraie cause : les guillemets oubliés.
|
||||
4. Ligne 3 : `NameError: name 'Print' is not defined. Did you mean: 'print'?` → majuscule en trop. Cette erreur n'apparaît qu'en dernier, **pendant l'exécution** : les deux premières lignes s'affichent avant que Python ne plante.
|
||||
|
||||
À retenir : tant qu'il reste une erreur de syntaxe (`SyntaxError`), **rien** ne s'exécute. Les autres erreurs (`NameError`…) n'apparaissent qu'au moment où Python atteint la ligne fautive.
|
||||
|
||||
Version corrigée :
|
||||
|
||||
```python
|
||||
print("Début du programme")
|
||||
print("Le double de 21 est", 21 * 2)
|
||||
print("Python est sensible à la casse")
|
||||
print("Il manque un guillemet")
|
||||
print("Fin du programme")
|
||||
```
|
||||
|
||||
Sortie :
|
||||
|
||||
```text
|
||||
Début du programme
|
||||
Le double de 21 est 42
|
||||
Python est sensible à la casse
|
||||
Il manque un guillemet
|
||||
Fin du programme
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>Corrigé de l'exercice 5</summary>
|
||||
|
||||
```python
|
||||
# Recette de crêpes
|
||||
# Auteur : Camille — 14 octobre
|
||||
|
||||
# --- Titre ---
|
||||
print("=== Crêpes pour 4 personnes ===")
|
||||
print()
|
||||
|
||||
# --- Ingrédients ---
|
||||
print("Ingrédients :")
|
||||
print("- 250 g de farine")
|
||||
print("- 4 œufs")
|
||||
print("- 50 cl de lait")
|
||||
print("- 1 pincée de sel")
|
||||
print()
|
||||
|
||||
# --- Étapes ---
|
||||
print("Étapes :")
|
||||
print("1. Mélanger la farine et les œufs.")
|
||||
print("2. Ajouter le lait petit à petit.")
|
||||
# print("2bis. Ajouter un verre de rhum.") # étape désactivée
|
||||
print("3. Laisser reposer 1 heure.")
|
||||
print("4. Cuire dans une poêle chaude.")
|
||||
```
|
||||
|
||||
Sortie :
|
||||
|
||||
```text
|
||||
=== Crêpes pour 4 personnes ===
|
||||
|
||||
Ingrédients :
|
||||
- 250 g de farine
|
||||
- 4 œufs
|
||||
- 50 cl de lait
|
||||
- 1 pincée de sel
|
||||
|
||||
Étapes :
|
||||
1. Mélanger la farine et les œufs.
|
||||
2. Ajouter le lait petit à petit.
|
||||
3. Laisser reposer 1 heure.
|
||||
4. Cuire dans une poêle chaude.
|
||||
```
|
||||
|
||||
La ligne « 2bis » est commentée : Python l'ignore.
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>Corrigé de l'exercice 6</summary>
|
||||
|
||||
```python
|
||||
# Facture : Python fait tous les calculs
|
||||
print("=== FACTURE ===")
|
||||
print("Cahiers : 4 x 2.5 =", 4 * 2.5, "€")
|
||||
print("Stylos : 3 x 1.2 =", 3 * 1.2, "€")
|
||||
print("TOTAL :", 4 * 2.5 + 3 * 1.2, "€")
|
||||
```
|
||||
|
||||
Sortie :
|
||||
|
||||
```text
|
||||
=== FACTURE ===
|
||||
Cahiers : 4 x 2.5 = 10.0 €
|
||||
Stylos : 3 x 1.2 = 3.5999999999999996 €
|
||||
TOTAL : 13.6 €
|
||||
```
|
||||
|
||||
Dans `"4 x 2.5 ="`, le calcul est entre guillemets : c'est du texte, affiché tel quel. Juste après, `4 * 2.5` est hors guillemets : Python le calcule. Remarque qu'on recopie les mêmes nombres plusieurs fois : au chapitre 01, les **variables** permettront d'éviter ça.
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>Corrigé de l'exercice 7</summary>
|
||||
|
||||
```python
|
||||
# Un chat en art ASCII, encadré d'étoiles
|
||||
print("*" * 20)
|
||||
print(" /\\_/\\")
|
||||
print("( o.o )")
|
||||
print(" > ^ <")
|
||||
print("*" * 20)
|
||||
```
|
||||
|
||||
Sortie :
|
||||
|
||||
```text
|
||||
********************
|
||||
/\_/\
|
||||
( o.o )
|
||||
> ^ <
|
||||
********************
|
||||
```
|
||||
|
||||
Chaque `\\` dans le code produit **un seul** `\` à l'écran. `"*" * 20` répète la chaîne `"*"` vingt fois.
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>Corrigé du mini-projet</summary>
|
||||
|
||||
```python
|
||||
# ------------------------------------------------------------
|
||||
# carte_visite.py
|
||||
# Auteur : Camille
|
||||
# Date : 14 octobre
|
||||
# Description : affiche ma carte de visite dans le terminal.
|
||||
# ------------------------------------------------------------
|
||||
|
||||
# --- Cadre du haut ---
|
||||
print("=" * 40)
|
||||
|
||||
# --- Identité ---
|
||||
print(" Camille")
|
||||
print(" Apprentie Pythoniste")
|
||||
print()
|
||||
|
||||
# --- Informations ---
|
||||
print(" Ville : Lyon")
|
||||
print(" Loisir : l'escalade")
|
||||
print()
|
||||
|
||||
# --- Le saviez-vous ? (calculs faits par Python) ---
|
||||
print(" Le saviez-vous ?")
|
||||
print(" J'ai vécu environ", 28 * 365, "jours.")
|
||||
print(" Je dors environ", 8 * 365, "heures par an.")
|
||||
print(" Mon cœur a battu environ", 70 * 60 * 24 * 365 * 28, "fois.")
|
||||
|
||||
# --- Cadre du bas ---
|
||||
print("=" * 40)
|
||||
```
|
||||
|
||||
Sortie :
|
||||
|
||||
```text
|
||||
========================================
|
||||
Camille
|
||||
Apprentie Pythoniste
|
||||
|
||||
Ville : Lyon
|
||||
Loisir : l'escalade
|
||||
|
||||
Le saviez-vous ?
|
||||
J'ai vécu environ 10220 jours.
|
||||
Je dors environ 2920 heures par an.
|
||||
Mon cœur a battu environ 1030176000 fois.
|
||||
========================================
|
||||
```
|
||||
|
||||
Points à vérifier : le commentaire d'en-tête est présent, chaque section est commentée, les cadres sont générés avec `"=" * 40`, et tous les nombres sont calculés par Python. Le nombre de battements de cœur correspond à l'une des pistes d'amélioration.
|
||||
|
||||
</details>
|
||||
|
||||
---
|
||||
|
||||
## Récapitulatif
|
||||
|
||||
**Points clés :**
|
||||
|
||||
- Python est un langage **interprété** : l'interpréteur lit ton code de haut en bas et l'exécute ligne par ligne.
|
||||
- Installe **la dernière version stable de Python 3** depuis python.org. Sous Windows, **coche « Add python.exe to PATH »** (ou utilise le Python install manager).
|
||||
- La commande est `python` (ou `py`) sous Windows, `python3` sous macOS et Linux.
|
||||
- Dans le terminal : `cd` pour te déplacer, `cd ..` pour remonter, `ls` / `dir` pour lister, `pwd` pour savoir où tu es, `mkdir` pour créer un dossier.
|
||||
- `>>>` = interpréteur interactif (tests rapides) ; un fichier `.py` = script (programme durable). On lance un script avec `python nom_du_fichier.py`.
|
||||
- VS Code + l'extension Python de Microsoft : ton atelier de travail. N'oublie pas d'enregistrer avant d'exécuter.
|
||||
- `print(...)` affiche des valeurs ; le texte se met entre guillemets.
|
||||
- `#` commence un commentaire, ignoré par Python.
|
||||
- Un message d'erreur se lit **de bas en haut** : type d'erreur, explication, puis numéro de ligne.
|
||||
|
||||
**Checklist de validation :**
|
||||
|
||||
- [ ] `python --version` (ou `python3 --version`) affiche une version 3.12 ou plus récente.
|
||||
- [ ] Je sais ouvrir un terminal, savoir où je suis et me déplacer dans mes dossiers.
|
||||
- [ ] Je sais lancer l'interpréteur interactif, y faire un calcul et le quitter.
|
||||
- [ ] VS Code est installé avec l'extension Python, et mon dossier de travail est ouvert dedans.
|
||||
- [ ] J'ai écrit, enregistré et exécuté un script `.py` de deux façons (bouton ▶ et terminal).
|
||||
- [ ] Je sais écrire un commentaire et désactiver une ligne.
|
||||
- [ ] Face à une erreur, je sais trouver son type et le numéro de la ligne fautive.
|
||||
|
||||
---
|
||||
|
||||
[← Chapitre précédent (sommaire)](README.md) | [Sommaire](README.md) | [Chapitre suivant →](01-variables-types-operateurs.md)
|
||||
|
|
@ -1,130 +0,0 @@
|
|||
# Apprendre à programmer en Python
|
||||
|
||||
Un parcours complet, du tout premier `print()` jusqu'à un projet personnel publié sur GitHub.
|
||||
|
||||
Ce dossier s'adresse aux **grands débutants** : aucune connaissance préalable en programmation n'est nécessaire. Chaque chapitre explique les notions pas à pas, avec des exemples que tu peux exécuter, les erreurs que tout le monde fait au début, des exercices corrigés et un mini-projet.
|
||||
|
||||
---
|
||||
|
||||
## Comment utiliser ce cours
|
||||
|
||||
1. **Suis les chapitres dans l'ordre.** Chacun s'appuie sur les précédents.
|
||||
2. **Tape les exemples toi-même** au lieu de les copier-coller. C'est en tapant (et en se trompant) qu'on retient.
|
||||
3. **Fais les exercices avant de regarder les corrigés.** Les corrigés sont repliés : clique sur « Corrigé de l'exercice N » seulement après avoir vraiment cherché (au moins 15 à 20 minutes).
|
||||
4. **Ne saute pas les mini-projets.** Ce sont eux qui transforment des notions isolées en vraie compétence.
|
||||
5. **Coche la checklist** à la fin de chaque chapitre. Si une case reste vide, relis la partie concernée avant d'avancer.
|
||||
6. **Garde l'[aide-mémoire](aide-memoire.md) ouvert** pendant que tu codes.
|
||||
|
||||
> **Conseil de rythme** : 30 à 60 minutes par jour valent mieux qu'une seule longue séance par semaine. Le cerveau consolide pendant les pauses.
|
||||
|
||||
---
|
||||
|
||||
## Sommaire
|
||||
|
||||
### Partie 1 — Les fondamentaux
|
||||
|
||||
| # | Chapitre | Ce que tu apprends | Travail |
|
||||
|---|---|---|---|
|
||||
| 00 | [Installation et environnement](00-installation-environnement.md) | Installer Python et VS Code, utiliser le terminal, écrire et lancer ton premier script | 2-3 h |
|
||||
| 01 | [Variables, types et opérateurs](01-variables-types-operateurs.md) | Stocker des données, nombres et textes, calculs, `input()` / `print()`, f-strings | 4-5 h |
|
||||
| 02 | [Conditions](02-conditions.md) | Prendre des décisions avec `if` / `elif` / `else`, opérateurs logiques, `match` | 4 h |
|
||||
| 03 | [Boucles](03-boucles.md) | Répéter des actions avec `for` et `while`, `range()`, `break`, `continue` | 5 h |
|
||||
|
||||
### Partie 2 — Organiser ses données et son code
|
||||
|
||||
| # | Chapitre | Ce que tu apprends | Travail |
|
||||
|---|---|---|---|
|
||||
| 04 | [Structures de données](04-structures-de-donnees.md) | Listes, tuples, dictionnaires, ensembles | 5-6 h |
|
||||
| 05 | [Fonctions](05-fonctions.md) | Découper son code en blocs réutilisables, paramètres, retour, portée | 5-6 h |
|
||||
| 06 | [Chaînes et compréhensions](06-chaines-et-comprehensions.md) | Manipuler du texte, slicing, compréhensions, `enumerate`, `zip`, `sorted` | 5-6 h |
|
||||
| 07 | [Fichiers, CSV et JSON](07-fichiers-csv-json.md) | Lire et écrire des fichiers, sauvegarder des données durablement | 5-6 h |
|
||||
|
||||
### Partie 3 — Écrire du code solide
|
||||
|
||||
| # | Chapitre | Ce que tu apprends | Travail |
|
||||
|---|---|---|---|
|
||||
| 08 | [Erreurs et débogage](08-erreurs-et-debogage.md) | Lire un traceback, gérer les exceptions, utiliser le débogueur | 4-5 h |
|
||||
| 09 | [Modules et bibliothèque standard](09-modules-bibliotheque-standard.md) | Importer, créer ses propres modules, `random`, `datetime`, `collections`… | 4-5 h |
|
||||
|
||||
### Partie 4 — Programmation orientée objet
|
||||
|
||||
| # | Chapitre | Ce que tu apprends | Travail |
|
||||
|---|---|---|---|
|
||||
| 10 | [Classes et objets](10-poo-classes-objets.md) | Créer ses propres types, attributs, méthodes, `self` | 5-6 h |
|
||||
| 11 | [POO avancée et typage](11-poo-avancee-heritage-typage.md) | Héritage, composition, `@property`, dataclasses, annotations de type | 6-7 h |
|
||||
|
||||
### Partie 5 — Travailler comme un développeur
|
||||
|
||||
| # | Chapitre | Ce que tu apprends | Travail |
|
||||
|---|---|---|---|
|
||||
| 12 | [Outils : venv, pip, Git](12-outils-venv-pip-git.md) | Environnements virtuels, installer des paquets, versionner et publier son code | 5-7 h |
|
||||
| 13 | [Tests et bonnes pratiques](13-tests-pytest-bonnes-pratiques.md) | Tester avec `pytest`, PEP 8, `ruff`, structurer un projet | 5-7 h |
|
||||
|
||||
### Partie 6 — Aller plus loin
|
||||
|
||||
| # | Chapitre | Ce que tu apprends | Travail |
|
||||
|---|---|---|---|
|
||||
| 14 | [Spécialisations](14-specialisations.md) | Automatisation, web, data, IA, jeux : un aperçu concret de chaque voie | 8-12 h |
|
||||
| 15 | [Projet final](15-projet-final.md) | Mener un projet de A à Z, idées de projets, projet fil rouge guidé | 15-30 h |
|
||||
|
||||
### Annexes
|
||||
|
||||
- [Aide-mémoire Python](aide-memoire.md) — toute la syntaxe essentielle sur une page
|
||||
- [Ressources](ressources.md) — livres, sites, plateformes d'exercices, communautés
|
||||
|
||||
---
|
||||
|
||||
## Planning type
|
||||
|
||||
La colonne « Travail » du sommaire indique le temps pour le cours, les exercices et le mini-projet d'un chapitre. Ajoute-y de la pratique libre (exercices sur France-IOI ou Codewars, petits scripts personnels, révisions) : c'est elle qui ancre les notions. En pratique, compte **environ une semaine par chapitre**.
|
||||
|
||||
Avec **5 à 7 heures par semaine**, compte environ **6 mois** pour le parcours complet :
|
||||
|
||||
```
|
||||
Mois 1 ██████████ Ch. 00 → 03 Fondamentaux
|
||||
Mois 2 ██████████ Ch. 04 → 07 Données, fonctions, fichiers
|
||||
Mois 3 ██████████ Ch. 08 → 09 Code solide + révisions
|
||||
Mois 4 ██████████ Ch. 10 → 13 POO et outils du développeur
|
||||
Mois 5 ██████████ Ch. 14 Spécialisation choisie
|
||||
Mois 6 ██████████ Ch. 15 Projet personnel
|
||||
```
|
||||
|
||||
Avec **10 à 15 heures par semaine**, le parcours se fait en 3 mois environ. Avec moins de temps, étale-le : la régularité compte plus que la vitesse.
|
||||
|
||||
---
|
||||
|
||||
## Suivi de progression
|
||||
|
||||
Coche au fur et à mesure :
|
||||
|
||||
- [ ] 00 — Installation et environnement
|
||||
- [ ] 01 — Variables, types et opérateurs
|
||||
- [ ] 02 — Conditions
|
||||
- [ ] 03 — Boucles
|
||||
- [ ] 04 — Structures de données
|
||||
- [ ] 05 — Fonctions
|
||||
- [ ] 06 — Chaînes et compréhensions
|
||||
- [ ] 07 — Fichiers, CSV et JSON
|
||||
- [ ] 08 — Erreurs et débogage
|
||||
- [ ] 09 — Modules et bibliothèque standard
|
||||
- [ ] 10 — Classes et objets
|
||||
- [ ] 11 — POO avancée et typage
|
||||
- [ ] 12 — Outils : venv, pip, Git
|
||||
- [ ] 13 — Tests et bonnes pratiques
|
||||
- [ ] 14 — Spécialisation choisie : ____________
|
||||
- [ ] 15 — Projet final publié sur GitHub
|
||||
|
||||
---
|
||||
|
||||
## Quand tu es bloqué
|
||||
|
||||
1. **Relis le message d'erreur**, en partant de la dernière ligne (le chapitre 08 t'apprend à le faire méthodiquement).
|
||||
2. **Ajoute des `print()`** pour voir ce que contiennent tes variables à chaque étape.
|
||||
3. **Réduis le problème** : isole les quelques lignes qui posent souci dans un petit fichier à part.
|
||||
4. **Cherche le message d'erreur** sur un moteur de recherche (souvent en anglais).
|
||||
5. **Fais une pause.** Beaucoup de bugs se résolvent tout seuls après dix minutes loin de l'écran.
|
||||
6. **Demande de l'aide** en expliquant ce que tu voulais faire, ce que tu as essayé et le message d'erreur complet (voir [Ressources](ressources.md) pour les communautés).
|
||||
|
||||
Bon apprentissage !
|
||||
|
||||
[Commencer le chapitre 00 →](00-installation-environnement.md)
|
||||
|
|
@ -1,526 +0,0 @@
|
|||
# Aide-mémoire Python
|
||||
|
||||
Toute la syntaxe essentielle du cours, regroupée pour la retrouver vite. Les numéros entre parenthèses renvoient au chapitre où la notion est expliquée en détail.
|
||||
|
||||
---
|
||||
|
||||
## Sommaire
|
||||
|
||||
1. [Bases](#1-bases-ch-01)
|
||||
2. [Conditions](#2-conditions-ch-02)
|
||||
3. [Boucles](#3-boucles-ch-03)
|
||||
4. [Listes](#4-listes-ch-04)
|
||||
5. [Tuples et ensembles](#5-tuples-et-ensembles-ch-04)
|
||||
6. [Dictionnaires](#6-dictionnaires-ch-04)
|
||||
7. [Fonctions](#7-fonctions-ch-05)
|
||||
8. [Chaînes de caractères](#8-chaînes-de-caractères-ch-06)
|
||||
9. [Compréhensions et outils d'itération](#9-compréhensions-et-outils-ditération-ch-06)
|
||||
10. [Fichiers, CSV, JSON](#10-fichiers-csv-json-ch-07)
|
||||
11. [Exceptions](#11-exceptions-ch-08)
|
||||
12. [Modules utiles](#12-modules-utiles-ch-09)
|
||||
13. [Classes](#13-classes-ch-10-et-11)
|
||||
14. [Annotations de type](#14-annotations-de-type-ch-11)
|
||||
15. [Commandes du terminal](#15-commandes-du-terminal-ch-00-12-13)
|
||||
16. [Erreurs courantes et leur sens](#16-erreurs-courantes-et-leur-sens)
|
||||
|
||||
---
|
||||
|
||||
## 1. Bases (ch. 01)
|
||||
|
||||
```python
|
||||
# Commentaire sur une ligne
|
||||
|
||||
nom = "Alice" # str : texte
|
||||
age = 30 # int : entier
|
||||
taille = 1.68 # float: nombre à virgule
|
||||
majeur = True # bool : True / False
|
||||
rien = None # absence de valeur
|
||||
|
||||
type(age) # <class 'int'>
|
||||
```
|
||||
|
||||
**Conversions**
|
||||
|
||||
```python
|
||||
int("42") # 42
|
||||
float("3.5") # 3.5
|
||||
str(42) # "42"
|
||||
bool(0) # False (0, "", [], {}, None sont « faux »)
|
||||
int(3.9) # 3 (tronque, n'arrondit pas)
|
||||
round(3.9) # 4
|
||||
```
|
||||
|
||||
**Opérateurs**
|
||||
|
||||
| Opérateur | Sens | Exemple | Résultat |
|
||||
|---|---|---|---|
|
||||
| `+ - *` | addition, soustraction, multiplication | `7 * 2` | `14` |
|
||||
| `/` | division (toujours un float) | `7 / 2` | `3.5` |
|
||||
| `//` | division entière | `7 // 2` | `3` |
|
||||
| `%` | reste (modulo) | `7 % 2` | `1` |
|
||||
| `**` | puissance | `2 ** 10` | `1024` |
|
||||
| `+=`, `-=`… | raccourcis | `x += 1` | `x = x + 1` |
|
||||
|
||||
**Entrées / sorties**
|
||||
|
||||
```python
|
||||
prenom = input("Ton prénom ? ") # renvoie toujours un str
|
||||
age = int(input("Ton âge ? ")) # convertir pour calculer
|
||||
|
||||
print("Bonjour", prenom) # Bonjour Alice
|
||||
print(f"{prenom} a {age} ans") # f-string
|
||||
print(f"Prix : {12.5:.2f} €") # Prix : 12.50 €
|
||||
print(f"{42:>6}") # ' 42' (aligné à droite sur 6)
|
||||
print("a", "b", sep="-", end="!\n") # a-b!
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 2. Conditions (ch. 02)
|
||||
|
||||
```python
|
||||
if note >= 16:
|
||||
print("Très bien")
|
||||
elif note >= 10:
|
||||
print("Admis")
|
||||
else:
|
||||
print("Recalé")
|
||||
```
|
||||
|
||||
| Comparaison | Logique |
|
||||
|---|---|
|
||||
| `==` égal, `!=` différent | `and` : les deux vrais |
|
||||
| `<`, `<=`, `>`, `>=` | `or` : au moins un vrai |
|
||||
| `in`, `not in` (appartenance) | `not` : inverse |
|
||||
| `is None`, `is not None` | |
|
||||
|
||||
```python
|
||||
if 0 <= age < 18: # comparaisons enchaînées
|
||||
...
|
||||
statut = "majeur" if age >= 18 else "mineur" # condition sur une ligne
|
||||
|
||||
match commande: # Python 3.10+
|
||||
case "q" | "quitter":
|
||||
print("Au revoir")
|
||||
case "aide":
|
||||
print("Commandes : ...")
|
||||
case _:
|
||||
print("Commande inconnue")
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. Boucles (ch. 03)
|
||||
|
||||
```python
|
||||
for i in range(5): # 0, 1, 2, 3, 4
|
||||
print(i)
|
||||
|
||||
range(2, 10) # 2 à 9
|
||||
range(10, 0, -2) # 10, 8, 6, 4, 2
|
||||
|
||||
for lettre in "abc": # parcourt n'importe quel itérable
|
||||
print(lettre)
|
||||
|
||||
compteur = 0
|
||||
while compteur < 3:
|
||||
compteur += 1
|
||||
|
||||
while True: # boucle infinie + sortie contrôlée
|
||||
reponse = input("> ")
|
||||
if reponse == "q":
|
||||
break # sort de la boucle
|
||||
if reponse == "":
|
||||
continue # passe au tour suivant
|
||||
print(reponse)
|
||||
```
|
||||
|
||||
> `Ctrl + C` dans le terminal arrête un programme coincé dans une boucle infinie.
|
||||
|
||||
---
|
||||
|
||||
## 4. Listes (ch. 04)
|
||||
|
||||
```python
|
||||
fruits = ["pomme", "banane", "kiwi"]
|
||||
|
||||
fruits[0] # "pomme" (premier)
|
||||
fruits[-1] # "kiwi" (dernier)
|
||||
fruits[1:3] # ["banane", "kiwi"]
|
||||
len(fruits) # 3
|
||||
"kiwi" in fruits # True
|
||||
|
||||
fruits.append("poire") # ajoute à la fin
|
||||
fruits.insert(0, "fraise") # insère à l'indice 0
|
||||
fruits.remove("banane") # retire la première occurrence
|
||||
dernier = fruits.pop() # retire et renvoie le dernier
|
||||
fruits.sort() # trie sur place
|
||||
fruits.reverse() # inverse sur place
|
||||
fruits.index("kiwi") # position d'un élément
|
||||
fruits.count("pomme") # nombre d'occurrences
|
||||
|
||||
copie = fruits.copy() # vraie copie (ou fruits[:])
|
||||
sum([1, 2, 3]), min([4, 2]), max([4, 2]) # 6, 2, 4
|
||||
```
|
||||
|
||||
> **Attention** : `b = a` ne copie pas la liste, les deux noms désignent la même liste.
|
||||
|
||||
---
|
||||
|
||||
## 5. Tuples et ensembles (ch. 04)
|
||||
|
||||
```python
|
||||
point = (3, 4) # tuple : non modifiable
|
||||
x, y = point # déballage
|
||||
a, b = b, a # échanger deux variables
|
||||
|
||||
couleurs = {"rouge", "vert"} # set : pas de doublons, pas d'ordre
|
||||
couleurs.add("bleu")
|
||||
couleurs.discard("vert")
|
||||
set([1, 1, 2]) # {1, 2}
|
||||
|
||||
a, b = {1, 2, 3}, {2, 3, 4}
|
||||
a | b # {1, 2, 3, 4} union
|
||||
a & b # {2, 3} intersection
|
||||
a - b # {1} différence
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 6. Dictionnaires (ch. 04)
|
||||
|
||||
```python
|
||||
eleve = {"nom": "Alice", "age": 17}
|
||||
|
||||
eleve["nom"] # "Alice" (KeyError si absent)
|
||||
eleve.get("ville") # None (pas d'erreur)
|
||||
eleve.get("ville", "?") # "?" (valeur par défaut)
|
||||
eleve["ville"] = "Lyon" # ajoute ou modifie
|
||||
del eleve["age"] # supprime
|
||||
"nom" in eleve # True (teste les clés)
|
||||
|
||||
for cle, valeur in eleve.items():
|
||||
print(cle, valeur)
|
||||
|
||||
eleve.keys(), eleve.values()
|
||||
|
||||
compte = {}
|
||||
compte["a"] = compte.get("a", 0) + 1 # compter des occurrences
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 7. Fonctions (ch. 05)
|
||||
|
||||
```python
|
||||
def aire_rectangle(largeur, hauteur=1):
|
||||
"""Renvoie l'aire d'un rectangle."""
|
||||
return largeur * hauteur
|
||||
|
||||
aire_rectangle(3, 4) # 12
|
||||
aire_rectangle(3) # 3 (hauteur par défaut)
|
||||
aire_rectangle(hauteur=2, largeur=5) # 10 (arguments nommés)
|
||||
|
||||
def stats(*nombres, **options): # nombre variable d'arguments
|
||||
print(nombres, options) # tuple, dict
|
||||
|
||||
stats(1, 2, 3, arrondi=2) # (1, 2, 3) {'arrondi': 2}
|
||||
|
||||
def min_max(valeurs):
|
||||
return min(valeurs), max(valeurs) # renvoie un tuple
|
||||
|
||||
petit, grand = min_max([4, 1, 9])
|
||||
```
|
||||
|
||||
> **Piège** : ne jamais mettre une liste ou un dict comme valeur par défaut (`def f(x=[])`). Utilise `None` puis crée la liste dans la fonction.
|
||||
|
||||
---
|
||||
|
||||
## 8. Chaînes de caractères (ch. 06)
|
||||
|
||||
```python
|
||||
s = " Bonjour le Monde "
|
||||
|
||||
s.strip() # "Bonjour le Monde"
|
||||
s.lower(), s.upper() # minuscules, majuscules
|
||||
s.title() # " Bonjour Le Monde "
|
||||
s.replace("Monde", "monde")
|
||||
s.split() # ["Bonjour", "le", "Monde"]
|
||||
"a,b,c".split(",") # ["a", "b", "c"]
|
||||
"-".join(["a", "b", "c"]) # "a-b-c"
|
||||
s.strip().startswith("Bon") # True
|
||||
"monde" in s.lower() # True
|
||||
s.count("o") # 3
|
||||
s.find("le") # indice, ou -1 si absent
|
||||
"42".isdigit() # True
|
||||
|
||||
mot = "Python"
|
||||
mot[0], mot[-1] # "P", "n"
|
||||
mot[1:4] # "yth"
|
||||
mot[::-1] # "nohtyP" (inversé)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 9. Compréhensions et outils d'itération (ch. 06)
|
||||
|
||||
```python
|
||||
carres = [x ** 2 for x in range(5)] # [0, 1, 4, 9, 16]
|
||||
pairs = [x for x in range(10) if x % 2 == 0] # [0, 2, 4, 6, 8]
|
||||
longueurs = {mot: len(mot) for mot in ["a", "abc"]} # {'a': 1, 'abc': 3}
|
||||
uniques = {x % 3 for x in range(10)} # {0, 1, 2}
|
||||
|
||||
for i, fruit in enumerate(["a", "b"], start=1): # 1 a / 2 b
|
||||
print(i, fruit)
|
||||
|
||||
for nom, note in zip(["Ana", "Léo"], [14, 12]): # parcourt en parallèle
|
||||
print(nom, note)
|
||||
|
||||
sorted([3, 1, 2]) # [1, 2, 3] (nouvelle liste)
|
||||
sorted(mots, key=len, reverse=True) # trié par longueur décroissante
|
||||
sorted(eleves, key=lambda e: e["note"]) # trié selon une clé
|
||||
any(x > 5 for x in valeurs) # au moins un ?
|
||||
all(x > 0 for x in valeurs) # tous ?
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 10. Fichiers, CSV, JSON (ch. 07)
|
||||
|
||||
```python
|
||||
from pathlib import Path
|
||||
|
||||
# Texte
|
||||
with open("notes.txt", "w", encoding="utf-8") as f: # w = écrase
|
||||
f.write("Première ligne\n")
|
||||
with open("notes.txt", "a", encoding="utf-8") as f: # a = ajoute
|
||||
f.write("Suite\n")
|
||||
with open("notes.txt", encoding="utf-8") as f: # r par défaut
|
||||
for ligne in f:
|
||||
print(ligne.strip())
|
||||
|
||||
chemin = Path("donnees") / "fichier.txt"
|
||||
chemin.parent.mkdir(exist_ok=True)
|
||||
chemin.write_text("bonjour", encoding="utf-8")
|
||||
chemin.read_text(encoding="utf-8")
|
||||
chemin.exists(), chemin.suffix, chemin.stem # True, ".txt", "fichier"
|
||||
|
||||
# CSV
|
||||
import csv
|
||||
with open("eleves.csv", "w", newline="", encoding="utf-8") as f:
|
||||
ecrivain = csv.DictWriter(f, fieldnames=["nom", "note"])
|
||||
ecrivain.writeheader()
|
||||
ecrivain.writerow({"nom": "Ana", "note": 15})
|
||||
with open("eleves.csv", newline="", encoding="utf-8") as f:
|
||||
for ligne in csv.DictReader(f):
|
||||
print(ligne["nom"], int(ligne["note"]))
|
||||
|
||||
# JSON
|
||||
import json
|
||||
donnees = {"nom": "Ana", "notes": [15, 12]}
|
||||
with open("data.json", "w", encoding="utf-8") as f:
|
||||
json.dump(donnees, f, ensure_ascii=False, indent=2)
|
||||
with open("data.json", encoding="utf-8") as f:
|
||||
donnees = json.load(f)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 11. Exceptions (ch. 08)
|
||||
|
||||
```python
|
||||
try:
|
||||
nombre = int(input("Nombre : "))
|
||||
resultat = 100 / nombre
|
||||
except ValueError:
|
||||
print("Ce n'est pas un nombre.")
|
||||
except ZeroDivisionError:
|
||||
print("Division par zéro impossible.")
|
||||
else:
|
||||
print(f"Résultat : {resultat}") # si aucune erreur
|
||||
finally:
|
||||
print("Toujours exécuté")
|
||||
|
||||
if age < 0:
|
||||
raise ValueError("L'âge ne peut pas être négatif")
|
||||
|
||||
class SoldeInsuffisant(Exception): # exception personnalisée
|
||||
pass
|
||||
|
||||
breakpoint() # met le programme en pause (débogueur)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 12. Modules utiles (ch. 09)
|
||||
|
||||
```python
|
||||
import random
|
||||
random.randint(1, 6) # entier entre 1 et 6 inclus
|
||||
random.choice(["a", "b"]) # élément au hasard
|
||||
random.shuffle(liste) # mélange sur place
|
||||
|
||||
import math
|
||||
math.sqrt(16), math.pi, math.ceil(2.1), math.floor(2.9) # 4.0, 3.14…, 3, 2
|
||||
|
||||
from datetime import date, datetime, timedelta
|
||||
date.today()
|
||||
datetime.now().strftime("%d/%m/%Y %H:%M")
|
||||
date(2026, 12, 25) - date.today() # timedelta
|
||||
date.today() + timedelta(days=7)
|
||||
|
||||
from collections import Counter, defaultdict
|
||||
Counter("abracadabra").most_common(2) # [('a', 5), ('b', 2)]
|
||||
groupes = defaultdict(list)
|
||||
|
||||
import os, sys
|
||||
os.getcwd() # dossier courant
|
||||
sys.argv # arguments de la ligne de commande
|
||||
|
||||
# Dans ses propres modules :
|
||||
if __name__ == "__main__":
|
||||
main() # exécuté seulement si on lance ce fichier directement
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 13. Classes (ch. 10 et 11)
|
||||
|
||||
```python
|
||||
class Compte:
|
||||
taux = 0.02 # attribut de classe (partagé)
|
||||
|
||||
def __init__(self, titulaire, solde=0):
|
||||
self.titulaire = titulaire # attributs d'instance
|
||||
self.solde = solde
|
||||
|
||||
def deposer(self, montant):
|
||||
if montant <= 0:
|
||||
raise ValueError("Montant invalide")
|
||||
self.solde += montant
|
||||
|
||||
def __str__(self): # affichage pour l'utilisateur
|
||||
return f"{self.titulaire} : {self.solde} €"
|
||||
|
||||
def __repr__(self): # affichage pour le développeur
|
||||
return f"Compte({self.titulaire!r}, {self.solde})"
|
||||
|
||||
|
||||
class CompteEpargne(Compte): # héritage
|
||||
def __init__(self, titulaire, solde=0, plafond=10_000):
|
||||
super().__init__(titulaire, solde)
|
||||
self.plafond = plafond
|
||||
|
||||
|
||||
c = CompteEpargne("Ana", 100)
|
||||
c.deposer(50)
|
||||
print(c) # Ana : 150 €
|
||||
isinstance(c, Compte) # True
|
||||
```
|
||||
|
||||
**Dataclass et propriété**
|
||||
|
||||
```python
|
||||
from dataclasses import dataclass, field
|
||||
|
||||
@dataclass
|
||||
class Produit:
|
||||
nom: str
|
||||
prix: float
|
||||
tags: list[str] = field(default_factory=list)
|
||||
|
||||
@property
|
||||
def prix_ttc(self) -> float: # s'utilise comme un attribut
|
||||
return round(self.prix * 1.2, 2)
|
||||
|
||||
p = Produit("Stylo", 2.5)
|
||||
p.prix_ttc # 3.0
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 14. Annotations de type (ch. 11)
|
||||
|
||||
```python
|
||||
def moyenne(notes: list[float]) -> float:
|
||||
return sum(notes) / len(notes)
|
||||
|
||||
def trouver(nom: str, annuaire: dict[str, str]) -> str | None:
|
||||
return annuaire.get(nom)
|
||||
|
||||
age: int = 30
|
||||
coordonnees: tuple[float, float] = (45.19, 5.72)
|
||||
```
|
||||
|
||||
> Les annotations ne changent pas l'exécution : elles documentent le code et permettent à l'éditeur et à `mypy` de détecter des erreurs.
|
||||
|
||||
---
|
||||
|
||||
## 15. Commandes du terminal (ch. 00, 12, 13)
|
||||
|
||||
**Python et paquets**
|
||||
|
||||
| Action | macOS / Linux | Windows |
|
||||
|---|---|---|
|
||||
| Lancer un script | `python3 script.py` | `py script.py` ou `python script.py` |
|
||||
| Version | `python3 --version` | `py --version` |
|
||||
| Créer un venv | `python3 -m venv .venv` | `py -m venv .venv` |
|
||||
| Activer le venv | `source .venv/bin/activate` | `.venv\Scripts\Activate.ps1` |
|
||||
| Désactiver | `deactivate` | `deactivate` |
|
||||
| Installer un paquet | `pip install requests` | `pip install requests` |
|
||||
| Figer les dépendances | `pip freeze > requirements.txt` | idem |
|
||||
| Réinstaller | `pip install -r requirements.txt` | idem |
|
||||
| Lancer les tests | `pytest` | `pytest` |
|
||||
| Vérifier / formater | `ruff check .` / `ruff format .` | idem |
|
||||
|
||||
**Navigation**
|
||||
|
||||
| Action | macOS / Linux | Windows (PowerShell) |
|
||||
|---|---|---|
|
||||
| Où suis-je ? | `pwd` | `pwd` |
|
||||
| Lister | `ls` | `ls` ou `dir` |
|
||||
| Changer de dossier | `cd dossier` / `cd ..` | idem |
|
||||
| Créer un dossier | `mkdir nom` | idem |
|
||||
|
||||
**Git**
|
||||
|
||||
```bash
|
||||
git init # créer un dépôt
|
||||
git status # état des fichiers
|
||||
git add fichier.py # préparer (ou git add .)
|
||||
git commit -m "Message clair" # enregistrer une version
|
||||
git log --oneline # historique
|
||||
git diff # voir les modifications
|
||||
git switch -c nouvelle-branche # créer une branche et y aller
|
||||
git switch main # revenir sur main
|
||||
git merge nouvelle-branche # fusionner
|
||||
git remote add origin URL # lier à GitHub
|
||||
git push -u origin main # envoyer
|
||||
git pull # récupérer
|
||||
git clone URL # copier un dépôt existant
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 16. Erreurs courantes et leur sens
|
||||
|
||||
| Erreur | Signification | Cause typique |
|
||||
|---|---|---|
|
||||
| `SyntaxError` | Python ne comprend pas la ligne | `:` oublié, parenthèse non fermée, guillemet manquant |
|
||||
| `IndentationError` | Indentation incorrecte | Mélange tabulations/espaces, bloc mal aligné |
|
||||
| `NameError: name 'x' is not defined` | Nom inconnu | Faute de frappe, variable utilisée avant d'être créée |
|
||||
| `TypeError` | Opération impossible sur ce type | `"âge : " + 30`, mauvais nombre d'arguments |
|
||||
| `ValueError` | Bon type, mauvaise valeur | `int("abc")` |
|
||||
| `IndexError: list index out of range` | Indice trop grand | `liste[len(liste)]` |
|
||||
| `KeyError` | Clé absente du dictionnaire | `d["cle"]` au lieu de `d.get("cle")` |
|
||||
| `AttributeError` | Attribut ou méthode inexistant | `liste.push()` au lieu de `append()`, variable à `None` |
|
||||
| `ZeroDivisionError` | Division par zéro | Diviseur non vérifié |
|
||||
| `FileNotFoundError` | Fichier introuvable | Mauvais chemin, script lancé depuis un autre dossier |
|
||||
| `ModuleNotFoundError` | Module introuvable | Paquet non installé, venv non activé |
|
||||
| `RecursionError` | Trop d'appels récursifs | Cas de base manquant |
|
||||
|
||||
> **Règle d'or** : lis toujours un traceback **de bas en haut**. La dernière ligne dit *quoi*, les lignes au-dessus disent *où*.
|
||||
|
||||
---
|
||||
|
||||
[← Projet final](15-projet-final.md) | [Sommaire](README.md) | [Ressources →](ressources.md)
|
||||
|
|
@ -1,104 +0,0 @@
|
|||
# Ressources pour continuer à apprendre
|
||||
|
||||
Une sélection de ressources fiables, classées par usage. Les ressources en français sont signalées par 🇫🇷 ; les autres sont en anglais, mais souvent faciles à suivre avec un traducteur.
|
||||
|
||||
> **Conseil** : ne cherche pas à tout consulter. Choisis **une** ressource principale par étape et complète avec de la pratique. Accumuler les tutoriels sans coder est le piège le plus courant.
|
||||
|
||||
---
|
||||
|
||||
## Documentation officielle
|
||||
|
||||
| Ressource | Pour quoi faire |
|
||||
|---|---|
|
||||
| 🇫🇷 [Tutoriel officiel Python](https://docs.python.org/fr/3/tutorial/) | La référence, traduite en français. Idéal pour revoir une notion après le chapitre correspondant. |
|
||||
| 🇫🇷 [Bibliothèque standard](https://docs.python.org/fr/3/library/) | Tous les modules fournis avec Python (`random`, `datetime`, `pathlib`…). |
|
||||
| 🇫🇷 [Glossaire Python](https://docs.python.org/fr/3/glossary.html) | Quand un terme technique t'échappe. |
|
||||
| [PEP 8](https://peps.python.org/pep-0008/) | Les conventions d'écriture du code Python (vues au chapitre 13). |
|
||||
|
||||
---
|
||||
|
||||
## Outils pour comprendre son code
|
||||
|
||||
| Outil | Pour quoi faire |
|
||||
|---|---|
|
||||
| [Python Tutor](https://pythontutor.com/) | Visualise l'exécution ligne par ligne : variables, listes, appels de fonctions. Excellent pour les chapitres 03 à 05. |
|
||||
| Le débogueur de VS Code | Points d'arrêt et exécution pas à pas (chapitre 08). |
|
||||
|
||||
---
|
||||
|
||||
## Cours et livres
|
||||
|
||||
### Pour débuter
|
||||
|
||||
- 🇫🇷 **Apprendre à programmer avec Python 3**, Gérard Swinnen — un classique, disponible gratuitement en PDF sur [le site de l'auteur](https://inforef.be/swi/python.htm) et en version papier chez Eyrolles.
|
||||
- 🇫🇷 **OpenClassrooms** — cours d'initiation à Python, gratuits en ligne.
|
||||
- 🇫🇷 **Zeste de Savoir** — tutoriels Python rédigés par la communauté, et un forum d'entraide.
|
||||
- **Python Crash Course**, Eric Matthes — progression très claire, avec trois projets (jeu, data, web) en seconde partie.
|
||||
- **Automate the Boring Stuff with Python**, Al Sweigart — gratuit en ligne sur [automatetheboringstuff.com](https://automatetheboringstuff.com/). Parfait pour l'automatisation (chapitre 14).
|
||||
- **Think Python**, Allen Downey — gratuit en ligne, plus orienté « penser comme un programmeur ».
|
||||
|
||||
### Pour progresser
|
||||
|
||||
- **Real Python** ([realpython.com](https://realpython.com/)) — articles et tutoriels de qualité sur à peu près tous les sujets.
|
||||
- **Fluent Python**, Luciano Ramalho — pour comprendre Python en profondeur une fois les bases solides (à garder pour après le cours).
|
||||
- **Effective Python**, Brett Slatkin — des dizaines de bonnes pratiques concrètes.
|
||||
|
||||
---
|
||||
|
||||
## Plateformes d'exercices
|
||||
|
||||
| Plateforme | Niveau | Particularité |
|
||||
|---|---|---|
|
||||
| 🇫🇷 [France-IOI](https://www.france-ioi.org/) | Débutant → avancé | Exercices très progressifs, en français, avec correction automatique |
|
||||
| [Exercism](https://exercism.org/tracks/python) | Débutant → intermédiaire | Exercices gratuits avec possibilité de retours de mentors bénévoles |
|
||||
| [Codewars](https://www.codewars.com/) | Tous niveaux | Petits défis (« kata ») classés par difficulté ; on voit ensuite les solutions des autres |
|
||||
| [CodinGame](https://www.codingame.com/) | Tous niveaux | Puzzles et jeux de programmation, ludique |
|
||||
| [Advent of Code](https://adventofcode.com/) | Intermédiaire | 25 problèmes chaque décembre ; les archives des années passées restent disponibles |
|
||||
| [Project Euler](https://projecteuler.net/) | Intermédiaire → avancé | Problèmes mathématiques à résoudre par le code |
|
||||
|
||||
> **Méthode** : après avoir résolu un exercice, lis deux ou trois solutions d'autres personnes. C'est l'un des meilleurs moyens d'apprendre de nouvelles façons d'écrire du code.
|
||||
|
||||
---
|
||||
|
||||
## Par spécialisation (chapitre 14)
|
||||
|
||||
| Domaine | Point de départ |
|
||||
|---|---|
|
||||
| Automatisation | *Automate the Boring Stuff with Python* ; documentation de `pathlib`, `requests`, `openpyxl` |
|
||||
| Web | Tutoriel officiel de Flask, tutoriel de Django (« Écrire sa première application Django », traduit en français), documentation de FastAPI |
|
||||
| Data | Guide « 10 minutes to pandas » dans la documentation de pandas ; cours gratuits de Kaggle Learn |
|
||||
| IA / Machine learning | Tutoriels de scikit-learn ; Kaggle Learn ; cours gratuits de fast.ai pour le deep learning |
|
||||
| Jeux | Documentation et tutoriels de pygame ; Arcade, une autre bibliothèque de jeux 2D |
|
||||
|
||||
---
|
||||
|
||||
## Communautés et entraide
|
||||
|
||||
- 🇫🇷 **AFPy** ([afpy.org](https://www.afpy.org/)) — l'Association Francophone Python, avec un forum, des offres d'emploi et l'organisation de la PyConFR.
|
||||
- 🇫🇷 **Forum de Zeste de Savoir** — section programmation, bienveillante avec les débutants.
|
||||
- **r/learnpython** sur Reddit — très actif, questions de débutants bienvenues.
|
||||
- **Stack Overflow** — l'immense majorité des messages d'erreur y a déjà une réponse ; cherche avant de poster.
|
||||
- **Meetups Python locaux** — beaucoup de grandes villes ont des rencontres régulières ; regarde sur Meetup ou sur le site de l'AFPy.
|
||||
|
||||
### Bien poser une question
|
||||
|
||||
Une bonne question obtient une réponse rapide. Elle contient :
|
||||
|
||||
1. **Ce que tu veux faire** (le but, pas seulement le problème technique).
|
||||
2. **Le code minimal** qui reproduit le problème, formaté comme du code.
|
||||
3. **Le message d'erreur complet**, copié-collé (pas une capture d'écran).
|
||||
4. **Ce que tu as déjà essayé.**
|
||||
5. Ta version de Python et ton système d'exploitation si c'est pertinent.
|
||||
|
||||
---
|
||||
|
||||
## Rester motivé
|
||||
|
||||
- **Code sur des sujets qui t'intéressent** : un script pour ta passion, ton travail, tes jeux. La motivation intrinsèque est le meilleur carburant.
|
||||
- **Garde une trace de tes progrès** : un dépôt GitHub qui se remplit est très encourageant à regarder après quelques mois.
|
||||
- **Accepte d'être bloqué** : c'est l'état normal d'un programmeur, même expérimenté. Chaque bug résolu est une compétence acquise.
|
||||
- **Explique ce que tu apprends** à quelqu'un d'autre (ou à un canard en plastique). Si tu peux l'expliquer simplement, tu l'as compris.
|
||||
|
||||
---
|
||||
|
||||
[← Aide-mémoire](aide-memoire.md) | [Sommaire](README.md)
|
||||
|
|
@ -181,57 +181,6 @@ Une exécution réussie encadre le build par une ligne `Deploy started` et une l
|
|||
|
||||
---
|
||||
|
||||
## Ce que le build publie pour alpinux.org
|
||||
|
||||
Chaque build écrit deux fichiers à la racine du site, avec pour chaque page son titre,
|
||||
son adresse et la date du commit qui a touché son contenu :
|
||||
|
||||
| Fichier | Ce qu'il porte | Qui le lit |
|
||||
|---|---|---|
|
||||
| `derniers-articles.json` | Les vingt dernières pages créées ou modifiées | L'accueil d'alpinux.org, section « Le wiki, fraîchement mis à jour » |
|
||||
| `toutes-les-pages.json` | Toutes les pages, sans limite, avec leur rubrique | La page des mises à jour d'alpinux.org |
|
||||
|
||||
Le second est la liste entière, le premier son début : un seul parcours de l'historique
|
||||
git les produit tous les deux, et ils portent la même date de génération.
|
||||
|
||||
Ils sont produits par le hook `hooks/derniers_articles.py`, déclaré dans `mkdocs.yml`.
|
||||
Trois choses à savoir :
|
||||
|
||||
- **Un déplacement n'est pas une mise à jour.** Les dates viennent de `git log` avec
|
||||
suivi des renommages : déplacer `guides/truc.md` ne fait pas remonter l'article en
|
||||
tête de liste, seule une modification de son texte le fait.
|
||||
- **Seules les pages de la navigation sont annoncées.** Une page absente de `nav` —
|
||||
typiquement la redirection laissée derrière un article déplacé — n'apparaît jamais
|
||||
dans la liste.
|
||||
- **Le hook n'échoue jamais.** Sans historique git, il n'écrit rien et le build
|
||||
continue ; alpinux.org masque alors simplement ce qu'il ne peut pas remplir. Ses
|
||||
messages sont pour cela de niveau *info* et jamais *warning* : le déploiement
|
||||
construit avec `--strict`, où un seul avertissement suffit à interrompre le build,
|
||||
et donc la publication.
|
||||
|
||||
Le même hook pose l'en-tête `Access-Control-Allow-Origin` sur ces deux fichiers, et
|
||||
sur eux seuls, au moyen d'un `.htaccess` déposé à la racine du site construit. Sans
|
||||
lui, le navigateur refuserait à alpinux.org le droit de lire une réponse venue de
|
||||
wiki.alpinux.org.
|
||||
|
||||
!!! warning "Deux conditions"
|
||||
**Le clone doit avoir son historique.** Un clone `--depth 1` ne porte qu'un
|
||||
commit : toutes les pages sembleraient modifiées le même jour. Le hook le détecte
|
||||
et le signale dans le journal du build, sans rien casser.
|
||||
|
||||
**Un `.htaccess` posé à la main sur le serveur est effacé au déploiement suivant**,
|
||||
puisque le staging est recopié avec `rsync --delete`. Pour ajouter des règles
|
||||
Apache durables, placez-les dans `docs/.htaccess` : MkDocs le recopie dans le site
|
||||
construit, et le hook **ajoute** son bloc à la suite au lieu de le remplacer.
|
||||
|
||||
```bash
|
||||
# vérifier ce que le dernier build a publié
|
||||
curl -s https://wiki.alpinux.org/derniers-articles.json | head -20
|
||||
curl -s https://wiki.alpinux.org/toutes-les-pages.json | head -20
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## En cas d'erreur de build
|
||||
|
||||
Si `mkdocs build` échoue, le site en ligne **n'est pas modifié** — l'ancien contenu reste en place. Lisez le message d'erreur : il indique généralement le fichier et la ligne problématiques.
|
||||
|
|
@ -263,6 +212,4 @@ Ouvrez [http://localhost:8000](http://localhost:8000) — MkDocs recharge automa
|
|||
| Vérifier le build avant de pousser | `mkdocs build --strict -d /tmp/wiki-build` |
|
||||
| Déployer à la main (webhook en panne) | `deploy-wiki.sh`, sur le serveur |
|
||||
| Voir le journal des déploiements | `tail -20 /var/log/wiki-deploy.log` |
|
||||
| Vérifier la liste envoyée à l'accueil | `curl -s https://wiki.alpinux.org/derniers-articles.json` |
|
||||
| Vérifier l'inventaire complet publié | `curl -s https://wiki.alpinux.org/toutes-les-pages.json` |
|
||||
| Régénérer les fichiers du logo (poste local) | `python3 scripts/build-assets.py` |
|
||||
|
|
|
|||
|
|
@ -1,169 +0,0 @@
|
|||
---
|
||||
description: Le serveur qu'Alpinux emporte en install party — partage de connexion, réseau local, cache de paquets APT, page de santé, et ce qu'un bénévole doit en savoir sur place.
|
||||
---
|
||||
|
||||
# Le serveur qu'on emporte en install party
|
||||
|
||||
Quinze ordinateurs qui s'installent le même matin, c'est quinze fois les mêmes
|
||||
cinq cents mégaoctets tirés par la ligne de la salle — quand il y en a une. Alpinux
|
||||
apporte donc sa propre machine, **alpicache**, qui partage l'accès à Internet, sert un
|
||||
réseau local aux postes en cours d'installation, et **garde en cache les paquets déjà
|
||||
téléchargés**.
|
||||
|
||||
!!! note "Pour qui est cette page"
|
||||
Pour les bénévoles qui installent, et pour qui prépare la salle. La configuration
|
||||
complète de la machine — interfaces, services, dépannage détaillé — vit dans son
|
||||
propre dépôt, `alpinux.alpicache`, et non ici.
|
||||
|
||||
---
|
||||
|
||||
## Le réseau de la salle
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
A[Prise murale<br/>ou box de la salle] --> B[alpicache<br/>10.0.0.1]
|
||||
B --> C[Switch]
|
||||
C --> D[Poste 1]
|
||||
C --> E[Poste 2]
|
||||
C --> F[Poste n]
|
||||
```
|
||||
|
||||
La machine tient les deux bouts : d'un côté elle demande un accès à la salle, de l'autre
|
||||
elle distribue un réseau en **10.0.0.x** aux postes branchés sur le switch. Les rôles ne
|
||||
sont pas figés à l'avance : elle désigne comme sortie la première prise où on lui répond,
|
||||
et sert le réseau local sur l'autre.
|
||||
|
||||
!!! warning "Les postes se branchent sur le switch, jamais sur la box"
|
||||
Un poste branché directement sur la box de la salle reçoit une adresse de la salle :
|
||||
il ne voit plus le cache, ne trouve plus les scripts, et fait tomber les compteurs à
|
||||
zéro. C'est l'erreur la plus fréquente, et elle ne se voit pas tout de suite.
|
||||
|
||||
---
|
||||
|
||||
## Ce que la machine offre, une fois branchée
|
||||
|
||||
| Adresse | À quoi ça sert |
|
||||
| --- | --- |
|
||||
| **<http://alpicache.lan/>** | La page de santé : réseau, disques, machines servies, cache |
|
||||
| **`http://apt-proxy:3142`** | Le cache de paquets, à déclarer comme mandataire |
|
||||
| **`http://10.0.0.1/`** | Les scripts d'Alpinux, servis sur place — dont `verif-disque.sh` et `install.sh` |
|
||||
|
||||
La page de santé se rafraîchit seule ; c'est le tableau de bord de la journée. Quatre
|
||||
cartes à surveiller :
|
||||
|
||||
| Carte | Ce qu'on veut y voir |
|
||||
| --- | --- |
|
||||
| **Réseau** | une sortie *et* un réseau local nommés, « Internet joignable » |
|
||||
| **Disques** | le disque du cache présent, avec de la place |
|
||||
| **Machines servies** | le nombre grandit à mesure que les postes arrivent |
|
||||
| **Cache de paquets** | « Économisé » qui monte au fil de la matinée |
|
||||
|
||||
**« Machines servies » qui reste à zéro** alors que des postes sont branchés, c'est le
|
||||
signe que le réseau local ne distribue pas d'adresses : prévenez la personne qui tient la
|
||||
machine plutôt que de chercher sur le poste du participant.
|
||||
|
||||
---
|
||||
|
||||
## Faire passer une installation par le cache
|
||||
|
||||
C'est là que tout se joue, et le geste n'est pas le même selon le système.
|
||||
|
||||
### Debian
|
||||
|
||||
L'installateur demande un mandataire à l'écran **« Configurer le miroir de l'archive
|
||||
Debian »**. Saisissez-y :
|
||||
|
||||
```
|
||||
http://apt-proxy:3142
|
||||
```
|
||||
|
||||
C'est **le seul moment** où on peut le faire, et c'est celui qui compte : toute
|
||||
l'installation passe alors par le cache.
|
||||
|
||||
### Linux Mint et Ubuntu
|
||||
|
||||
Leur installateur ne demande pas de mandataire : l'installation elle-même sortira sur
|
||||
Internet. Le gain arrive juste après — sur les mises à jour et les logiciels ajoutés,
|
||||
c'est-à-dire sur l'essentiel du volume.
|
||||
|
||||
Une fois la machine redémarrée sur son nouveau système :
|
||||
|
||||
```bash
|
||||
sudo apt install auto-apt-proxy
|
||||
```
|
||||
|
||||
Ce paquet cherche un cache sur le réseau local et s'en sert quand il en trouve un — sans
|
||||
rien à configurer, et sans gêner la machine une fois rentrée chez son propriétaire.
|
||||
|
||||
!!! tip "Le script de post-installation le fait déjà"
|
||||
Le [script d'Alpinux](../guides/linux-mint-depuis-windows.md#le-script-de-post-installation-alpinux)
|
||||
installe `auto-apt-proxy` parmi ses réglages : si vous le lancez, c'est fait.
|
||||
|
||||
---
|
||||
|
||||
## Ce qui coince, et la parade
|
||||
|
||||
**La salle n'a pas de réseau.** Un téléphone Android en partage de connexion USB fait
|
||||
l'affaire : branché sur la machine, il devient la sortie. Prévoyez le câble.
|
||||
|
||||
**Le disque du cache n'est pas vu.** Il doit être branché **avant** d'allumer la machine.
|
||||
Après coup, le cache démarre sans rien dire et ne garde rien — la carte *Disques* de la
|
||||
page de santé le montre tout de suite.
|
||||
|
||||
**Un poste n'obtient pas d'adresse.** Vérifiez d'abord le câble et le switch, puis la
|
||||
carte *Machines servies*. Une adresse en `169.254.x.x` signifie que le poste n'a reçu
|
||||
aucune réponse : il s'en est inventé une.
|
||||
|
||||
**`apt` renvoie des « 503 Connection closed » en série.** Le cache accepte la requête mais
|
||||
ne sait pas où aller la chercher — c'est arrivé le 24/09/2026, et une installation Mint
|
||||
s'y est arrêtée. Le piège est qu'**interroger le cache directement répond parfaitement** :
|
||||
les deux chemins ne suivent pas la même route à l'intérieur du serveur. Ne cherchez donc
|
||||
pas sur la machine du participant : prévenez la personne qui tient le serveur.
|
||||
|
||||
---
|
||||
|
||||
## Pour préparer une install party
|
||||
|
||||
La veille, la machine s'allume chez quelqu'un, sur une ligne rapide, et l'on garnit le
|
||||
cache avec ce qu'on va installer — si la version de Mint a changé depuis la dernière
|
||||
sortie, autant la tirer maintenant.
|
||||
|
||||
!!! warning "Le cache ne sert que ce qu'il connaît"
|
||||
Le pré-chargement vise des versions nommées, et une version absente de la liste ne
|
||||
profite à personne. Le 24/09/2026, la première Mint 22.3 de la soirée a tiré **1,3 Go
|
||||
d'Internet pour 82 Mo servis par le cache** : le pré-chargeur couvrait encore les
|
||||
versions précédentes.
|
||||
|
||||
Avant chaque sortie, vérifiez donc que la liste des versions pré-chargées correspond à
|
||||
celle que vous allez réellement installer. C'est par le **nom de code** que le
|
||||
pré-chargement les désigne, et un décalage d'un cran suffit à garnir le cache de la
|
||||
mauvaise version :
|
||||
|
||||
| Version | Nom de code |
|
||||
|---|---|
|
||||
| Mint 22 | `wilma` |
|
||||
| Mint 22.1 | `xia` |
|
||||
| Mint 22.2 | `zara` |
|
||||
| Mint 22.3 | `zena` |
|
||||
|
||||
Pour mémoire, la série précédente : `vanessa` (21), `vera` (21.1), `victoria` (21.2),
|
||||
`virginia` (21.3).
|
||||
|
||||
Sur place, l'ordre de branchement n'est pas une superstition : le disque externe d'abord,
|
||||
puis le câble Internet **seul**, puis la machine, et seulement ensuite le switch et les
|
||||
postes. Brancher la sortie seule d'abord, c'est ôter à la machine toute occasion de se
|
||||
tromper de rôle.
|
||||
|
||||
La procédure complète — ce qu'on emporte, les vérifications, le dépannage, la fiche à
|
||||
cocher pour chaque participant et l'affiche à scotcher près du switch — est dans le dépôt
|
||||
`alpinux.alpicache`. Demandez-la à un membre du bureau avant une sortie.
|
||||
|
||||
---
|
||||
|
||||
## Voir aussi
|
||||
|
||||
- [Install Party](../alpinux/install-party.md) — les dates, et comment y participer
|
||||
- [Installer Linux Mint depuis Windows](../guides/linux-mint-depuis-windows.md) — le guide
|
||||
suivi sur place
|
||||
- [Préparation d'un serveur Debian 13](serveur-debian-13.md) — pour la machine, la base
|
||||
système est la même
|
||||
|
|
@ -1,15 +1,8 @@
|
|||
"""Publie ce que le wiki a écrit ou repris, pour qui l'affiche ailleurs.
|
||||
"""Publie `derniers-articles.json` : ce que le wiki a écrit ou repris récemment.
|
||||
|
||||
Deux fichiers, écrits à chaque build à côté des pages et servis avec l'en-tête CORS
|
||||
sans lequel un autre domaine ne peut pas les lire :
|
||||
|
||||
- `derniers-articles.json` — les vingt dernières pages touchées, que la page d'accueil
|
||||
d'alpinux.org lit pour sa section « Le wiki, fraîchement mis à jour » ;
|
||||
- `toutes-les-pages.json` — le même inventaire, sans limite de nombre et avec la
|
||||
rubrique de chaque page, pour la page des mises à jour d'alpinux.org.
|
||||
|
||||
Les deux sortent du même calcul : le second est la liste entière, le premier son
|
||||
début.
|
||||
La page d'accueil d'alpinux.org lit ce fichier pour afficher « Le wiki, fraîchement
|
||||
mis à jour ». Il est donc écrit à chaque build, à côté des pages, et servi avec
|
||||
l'en-tête CORS sans lequel un autre domaine ne peut pas le lire.
|
||||
|
||||
Les dates viennent de git, pas du système de fichiers : un `git clone` repose tous les
|
||||
fichiers à la même seconde, et une page recopiée depuis Obsidian aurait l'air neuve.
|
||||
|
|
@ -27,11 +20,10 @@ from urllib.parse import urljoin
|
|||
|
||||
from mkdocs.plugins import log
|
||||
|
||||
FICHIER_RECENTS = "derniers-articles.json"
|
||||
FICHIER_TOUTES = "toutes-les-pages.json"
|
||||
FICHIER = "derniers-articles.json"
|
||||
|
||||
# Ce que le premier fichier porte au plus. L'accueil n'en affiche que six, mais le
|
||||
# fichier sert aussi à qui voudrait en faire autre chose. Le second ne plafonne pas.
|
||||
# Ce que le fichier porte au plus. L'accueil n'en affiche que six, mais le fichier
|
||||
# sert aussi à qui voudrait en faire autre chose.
|
||||
NB_MAX = 20
|
||||
|
||||
# En deçà, un article est annoncé comme « publié » plutôt que « mis à jour ».
|
||||
|
|
@ -42,24 +34,10 @@ EXCLUS = {"index.md"}
|
|||
|
||||
_pages: dict[str, dict[str, str]] = {}
|
||||
_dans_la_nav: set[str] = set()
|
||||
_rubriques: dict[str, str] = {}
|
||||
|
||||
|
||||
def _rubrique_par_page(items, rubrique=""):
|
||||
"""Associe chaque page de la navigation au titre de la section qui la porte.
|
||||
|
||||
On garde la section de premier niveau — « Guides », « Contribuer » — plutôt que la
|
||||
plus proche : c'est l'échelle à laquelle un lecteur range les pages.
|
||||
"""
|
||||
for item in items:
|
||||
if item.is_section:
|
||||
yield from _rubrique_par_page(item.children, rubrique or item.title)
|
||||
elif item.is_page:
|
||||
yield item.file.src_uri, rubrique
|
||||
|
||||
|
||||
def on_nav(nav, config, files):
|
||||
"""Retient les pages de la navigation, et sous quelle rubrique elles vivent.
|
||||
"""Retient les pages de la navigation.
|
||||
|
||||
Ce qui en est absent — les redirections laissées derrière un article déplacé, par
|
||||
exemple — n'a pas à être annoncé comme une nouveauté.
|
||||
|
|
@ -67,9 +45,6 @@ def on_nav(nav, config, files):
|
|||
_dans_la_nav.clear()
|
||||
_dans_la_nav.update(page.file.src_uri for page in nav.pages)
|
||||
|
||||
_rubriques.clear()
|
||||
_rubriques.update(_rubrique_par_page(nav.items))
|
||||
|
||||
|
||||
def on_page_context(context, page, config, nav):
|
||||
"""Retient le titre et l'URL de chaque page rendue."""
|
||||
|
|
@ -131,30 +106,24 @@ def _historique(depot: Path, dossier: str) -> tuple[dict, dict]:
|
|||
return modifiees, creees
|
||||
|
||||
|
||||
def _autoriser_la_lecture_croisee(site_dir: Path, fichiers: list[str]) -> None:
|
||||
"""Pose l'en-tête CORS sur les seuls fichiers qui en ont besoin.
|
||||
def _autoriser_la_lecture_croisee(site_dir: Path) -> None:
|
||||
"""Pose l'en-tête CORS sur le seul fichier qui en a besoin.
|
||||
|
||||
Ils sont lus depuis alpinux.org : sans cet en-tête, le navigateur refuse la
|
||||
Le fichier est lu depuis alpinux.org : sans cet en-tête, le navigateur refuse la
|
||||
réponse et la section reste masquée. Le bloc s'ajoute à un `.htaccess` déjà là
|
||||
plutôt que de le remplacer — on ne sait pas ce qu'il porte d'autre — et n'est
|
||||
écrit que pour les fichiers qui n'y figurent pas encore.
|
||||
plutôt que de le remplacer — on ne sait pas ce qu'il porte d'autre.
|
||||
"""
|
||||
bloc = (
|
||||
"<IfModule mod_headers.c>\n"
|
||||
f' <Files "{FICHIER}">\n'
|
||||
' Header set Access-Control-Allow-Origin "*"\n'
|
||||
" </Files>\n"
|
||||
"</IfModule>\n"
|
||||
)
|
||||
fichier = site_dir / ".htaccess"
|
||||
existant = fichier.read_text(encoding="utf-8") if fichier.exists() else ""
|
||||
|
||||
manquants = [nom for nom in fichiers if nom not in existant]
|
||||
if not manquants:
|
||||
if FICHIER in existant:
|
||||
return
|
||||
|
||||
bloc = "<IfModule mod_headers.c>\n"
|
||||
for nom in manquants:
|
||||
bloc += (
|
||||
f' <Files "{nom}">\n'
|
||||
' Header set Access-Control-Allow-Origin "*"\n'
|
||||
" </Files>\n"
|
||||
)
|
||||
bloc += "</IfModule>\n"
|
||||
|
||||
separateur = "\n" if existant and not existant.endswith("\n") else ""
|
||||
fichier.write_text(existant + separateur + bloc, encoding="utf-8")
|
||||
|
||||
|
|
@ -175,7 +144,7 @@ def on_post_build(config):
|
|||
log.info("derniers-articles : clone superficiel, les dates ne sont pas fiables")
|
||||
|
||||
seuil = datetime.now(timezone.utc) - timedelta(days=JOURS_NOUVEAU)
|
||||
pages = []
|
||||
articles = []
|
||||
|
||||
for chemin, modifiee in modifiees.items():
|
||||
prefixe = docs_dir.name + "/"
|
||||
|
|
@ -193,43 +162,30 @@ def on_post_build(config):
|
|||
except ValueError:
|
||||
nouveau = False
|
||||
|
||||
pages.append({
|
||||
"titre": page["titre"],
|
||||
"url": page["url"],
|
||||
"date": creee if nouveau else modifiee,
|
||||
"nouveau": nouveau,
|
||||
"rubrique": _rubriques.get(src_uri, ""),
|
||||
articles.append({
|
||||
"titre": page["titre"],
|
||||
"url": page["url"],
|
||||
"date": creee if nouveau else modifiee,
|
||||
"nouveau": nouveau,
|
||||
})
|
||||
|
||||
if not pages:
|
||||
if not articles:
|
||||
log.info("derniers-articles : aucune page datée, fichier non écrit")
|
||||
return
|
||||
|
||||
pages.sort(key=lambda page: page["date"], reverse=True)
|
||||
articles.sort(key=lambda article: article["date"], reverse=True)
|
||||
articles = articles[:NB_MAX]
|
||||
|
||||
genere = datetime.now(timezone.utc).replace(microsecond=0).isoformat()
|
||||
|
||||
# L'accueil lit ce fichier depuis longtemps : il garde ses quatre clés, sans la
|
||||
# rubrique dont il n'a que faire.
|
||||
recents = [
|
||||
{clef: page[clef] for clef in ("titre", "url", "date", "nouveau")}
|
||||
for page in pages[:NB_MAX]
|
||||
]
|
||||
|
||||
ecrits = {
|
||||
FICHIER_RECENTS: {"genere": genere, "articles": recents},
|
||||
FICHIER_TOUTES: {"genere": genere, "pages": pages},
|
||||
}
|
||||
contenu = json.dumps({"genere": genere, "articles": articles},
|
||||
ensure_ascii=False, indent=2) + "\n"
|
||||
|
||||
try:
|
||||
for nom, contenu in ecrits.items():
|
||||
texte = json.dumps(contenu, ensure_ascii=False, indent=2) + "\n"
|
||||
(site_dir / nom).write_text(texte, encoding="utf-8")
|
||||
_autoriser_la_lecture_croisee(site_dir, list(ecrits))
|
||||
(site_dir / FICHIER).write_text(contenu, encoding="utf-8")
|
||||
_autoriser_la_lecture_croisee(site_dir)
|
||||
except OSError as erreur:
|
||||
log.info("derniers-articles : écriture impossible (%s), fichier non écrit",
|
||||
erreur)
|
||||
return
|
||||
|
||||
log.info("derniers-articles : %d page(s) publiée(s) dans %s, %d dans %s",
|
||||
len(pages), FICHIER_TOUTES, len(recents), FICHIER_RECENTS)
|
||||
log.info("derniers-articles : %d article(s) publié(s) dans %s", len(articles), FICHIER)
|
||||
|
|
|
|||
|
|
@ -111,10 +111,6 @@ nav:
|
|||
- guides/sauvegardes.md
|
||||
- guides/tesseract.md
|
||||
- guides/ventoy.md
|
||||
- Apprendre:
|
||||
- apprendre/index.md
|
||||
- Une semaine pour découvrir Linux: apprendre/semaine-college-lycee.md
|
||||
- "Fiche : le terminal": apprendre/terminal-se-reperer.md
|
||||
- Technique:
|
||||
- technique/deploiement-wiki.md
|
||||
- technique/deploiement-dynamic.md
|
||||
|
|
@ -123,7 +119,6 @@ nav:
|
|||
- technique/matrix.md
|
||||
- technique/arduino-ide.md
|
||||
- technique/serveur-debian-13.md
|
||||
- technique/serveur-install-party.md
|
||||
- technique/bigbluebutton.md
|
||||
- technique/ateliers.md
|
||||
- Communication:
|
||||
|
|
|
|||