diff --git a/Dockerfile-local b/Dockerfile similarity index 100% rename from Dockerfile-local rename to Dockerfile diff --git a/docker-compose.yml b/docker-compose.yml index 52b311b..ef46501 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,8 +2,8 @@ version: '2' name: arfp-io services: pages: - build: https://raw.githubusercontent.com/mdevoldere/edu-docker/develop/jekyll/Dockerfile - # build: . + # build: https://raw.githubusercontent.com/mdevoldere/edu-docker/develop/jekyll/Dockerfile + build: . image: mdevoldere-jekyll-develop container_name: arfpio ports: @@ -11,4 +11,5 @@ services: - 35728:35729 volumes: - ./docs:/srv/jekyll - command: jekyll serve --force_polling --incremental --livereload \ No newline at end of file + command: jekyll serve --force_polling --livereload + \ No newline at end of file diff --git a/docs/_config.yml b/docs/_config.yml index 321ff12..acb698c 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -80,6 +80,11 @@ defaults: path: "tp/git" values: module: "git" + - + scope: + path: "tp/deploiement" + values: + module: "deploiement" - scope: path: "tp/web" diff --git a/docs/_sass/_code.scss b/docs/_sass/_code.scss index 1190ea4..fc34b51 100644 --- a/docs/_sass/_code.scss +++ b/docs/_sass/_code.scss @@ -35,6 +35,10 @@ blockquote { margin: 2rem 1rem; } +blockquote a { + color: #CC9; +} + .result { border: 1px solid #aaccaa; } diff --git a/docs/sitemap.json b/docs/sitemap.json new file mode 100644 index 0000000..7e11c51 --- /dev/null +++ b/docs/sitemap.json @@ -0,0 +1,15 @@ +--- +--- +[ + {% for post in site.posts %} + { + + "title" : "{{ post.title | escape }}", + "url" : "{{ site.baseurl }}{{ post.url }}", + "category" : "{{ post.category }}", + "tags" : "{{ post.tags | join: ', ' }}", + "date" : "{{ post.date }}" + + } {% unless forloop.last %},{% endunless %} + {% endfor %} +] \ No newline at end of file diff --git a/docs/tp/databases/sql/03-faq/correction/01-faq-creation-bdd.sql b/docs/tp/databases/sql/03-faq/correction/01-faq-creation-bdd.sql new file mode 100644 index 0000000..8308e69 --- /dev/null +++ b/docs/tp/databases/sql/03-faq/correction/01-faq-creation-bdd.sql @@ -0,0 +1,41 @@ +DROP DATABASE IF EXISTS minifaq; + +CREATE DATABASE mini_faq; + +USE mini_faq; + +CREATE TABLE users( + user_id INT, + user_email VARCHAR(128) NOT NULL, + user_lastname VARCHAR(50) NOT NULL, + user_firstname VARCHAR(50) NOT NULL, + PRIMARY KEY(user_id), + UNIQUE(user_email) +); + +CREATE TABLE questions( + question_id INT AUTO_INCREMENT, + question_date DATE NOT NULL, + question_label VARCHAR(255) NOT NULL, + question_response TEXT NOT NULL, + user_id INT NOT NULL, + PRIMARY KEY(question_id), + FOREIGN KEY(user_id) REFERENCES users(user_id) +); + +CREATE TABLE categories( + category_name VARCHAR(30), + category_description VARCHAR(255), + category_order TINYINT NOT NULL, + PRIMARY KEY(category_name), + UNIQUE(category_order) +); + +CREATE TABLE categories_questions( + question_id INT, + category_name VARCHAR(30), + PRIMARY KEY(question_id, category_name), + FOREIGN KEY(question_id) REFERENCES questions(question_id), + FOREIGN KEY(category_name) REFERENCES categories(category_name) +); + diff --git a/docs/tp/databases/sql/03-faq/correction/02-faq-jeu-d-essai.sql b/docs/tp/databases/sql/03-faq/correction/02-faq-jeu-d-essai.sql new file mode 100644 index 0000000..40e0d99 --- /dev/null +++ b/docs/tp/databases/sql/03-faq/correction/02-faq-jeu-d-essai.sql @@ -0,0 +1,38 @@ +use mini_faq; + +INSERT INTO users +(user_id, user_email, user_lastname, user_firstname) +VALUES +(1, 'zorb@example.com', 'Rabbit', 'Zora'), +(2, 'patchouli@example.fr', 'Patchouli', 'Édouard'), +(3, 'eva.stt@example.com', 'Satiti', 'Eva'); + +INSERT INTO questions +(question_date, question_label, question_response, user_id) +VALUES +('2024-11-23', 'Dans MySQL, quel type de données permet de stocker des valeurs numériques dont le maximum est 127 ?', 'Le type TINYINT stocke des valeurs numériques comprises entre -128 et 127', 3), +('2024-11-23', 'Quels sont les principaux serveurs SQL gratuits ?', 'MySQL, MariaDB, PostgreSQL, SQLite', 2), +('2024-11-27', 'Que signifie le sigle SGBDR ?', 'Système de Gestion de Bases de Données Relationnelles', 1), +('2024-12-05', 'Que signifie le sigle SQL ?', 'Structured Query Language !', 2), +('2024-12-05', 'Que signifie le sigle noSQL ?', 'Not Only SQL !', 3); + +INSERT INTO categories +(category_name, category_description, category_order) +VALUES +('Bases de données', 'Les questions relatives aux bases de données', 2), +('SQL', 'Les questions sur le langage SQL', 3), +('NoSQL', 'Les questions sur l’approche NoSQL', 4), +('PHP', 'Les questions relatives à PHP', 1); + +INSERT INTO categories_questions +(question_id, category_name) +VALUES +(1, 'Bases de données'), +(1, 'SQL'), +(2, 'Bases de données'), +(2, 'SQL'), +(3, 'Bases de données'), +(4, 'Bases de données'), +(4, 'SQL'), +(5, 'Bases de données'), +(5, 'NoSQL'); diff --git a/docs/tp/databases/sql/03-faq/correction/03-faq-selects.sql b/docs/tp/databases/sql/03-faq/correction/03-faq-selects.sql new file mode 100644 index 0000000..6d5a95c --- /dev/null +++ b/docs/tp/databases/sql/03-faq/correction/03-faq-selects.sql @@ -0,0 +1,52 @@ +use mini_faq; + +-- 1. Sélectionner tous les utilisateurs (identifiant, nom, prénom, email). + +SELECT user_id, user_lastname, user_firstname, user_email FROM users; + +-- 2. Sélectionner toutes les questions (date, intitulé, réponse, identifiant utilisateur) triées par date de la plus ancienne à la plus récente. + +SELECT question_date, question_label, question_response, user_id FROM questions ORDER BY question_date DESC; + +-- 3. Sélectionner les questions (identifiant, date, intitulé, réponse) de l’utilisateur n°2. + +SELECT question_id, question_date, question_label, question_response FROM questions WHERE user_id = 2; + +-- 4. Sélectionner les questions (date, intitulé, réponse, identifiant utilisateur) de l’utilisateur Eva Satiti. + +/* Sans jointure */ +SELECT question_date, question_label, question_response, questions.user_id +FROM questions,users +WHERE users.user_id = questions.user_id AND users.user_lastname = 'Satiti' AND users.user_firstname = 'Eva'; + +/* Avec jointure */ +SELECT question_date, question_label, question_response, users.user_id +FROM questions +JOIN users ON questions.user_id = users.user_id +WHERE users.user_lastname = 'Satiti' AND users.user_firstname = 'Eva'; + +-- 5. Sélectionner les questions (identifiant, date, intitulé, réponse, identifiant utilisateur) dont l’intitulé contient “SQL”. Le résultat est trié par le titre et par ordre décroissant. + +SELECT question_id, question_date, question_label, question_response +FROM questions +WHERE question_label LIKE '%SQL%' +ORDER BY question_label DESC; + +-- 6. Sélectionner les catégories (nom, description) sans question associée. + +SELECT categories.category_name, category_description FROM categories +LEFT JOIN categories_questions ON categories.category_name = categories_questions.category_name +WHERE categories_questions.category_name IS NULL; + +-- 7. Sélectionner les questions triées par titre (ordre alphabétique) avec le nom et prénom de l’auteur (nécessite une jointure). + +SELECT question_id, question_date, question_label, question_response, user_lastname, user_firstname +FROM questions +JOIN users ON users.user_id = questions.user_id; + +-- 8. Sélectionner les catégories (nom) avec, pour chaque catégorie le nombre de questions associées (nécessite une jointure). + +SELECT categories.category_name, COUNT(categories_questions.question_id) as nb_questions +FROM categories +LEFT JOIN categories_questions ON categories.category_name = categories_questions.category_name +GROUP BY categories.category_name; diff --git a/docs/tp/databases/sql/05-rezo-social/correction/01-rezoSocial-creation-bdd.sql b/docs/tp/databases/sql/05-rezo-social/correction/01-rezoSocial-creation-bdd.sql new file mode 100644 index 0000000..3864371 --- /dev/null +++ b/docs/tp/databases/sql/05-rezo-social/correction/01-rezoSocial-creation-bdd.sql @@ -0,0 +1,51 @@ +/* SUPPRIMER la base de données "rezo_social" */ + +DROP DATABASE IF EXISTS rezo_social; + +/* CREER la base de données "rezo_social" */ + +CREATE DATABASE IF NOT EXISTS rezo_social; + +/* Sélectionner la base de données */ + +USE rezo_social; + +CREATE TABLE utilisateur +( + id INT PRIMARY KEY, + nom_utilisateur VARCHAR(32) NOT NULL UNIQUE, + email VARCHAR(128) UNIQUE NOT NULL +); + +CREATE TABLE aimer +( + id INT, + pub_id INT, + PRIMARY KEY (id, pub_id) +); + +CREATE TABLE publication +( + pub_id INT AUTO_INCREMENT PRIMARY KEY, + pub_date DATETIME NOT NULL, + pub_titre VARCHAR(255), + pub_contenu TEXT, + id INT +); + +/* Modifier la table publication et y ajouter une clé étrangère */ +ALTER TABLE publication ADD FOREIGN KEY (id) REFERENCES utilisateur(id); + +ALTER TABLE aimer ADD CONSTRAINT fk_aimer_utilisateur FOREIGN KEY (id) REFERENCES utilisateur(id); + +ALTER TABLE aimer ADD CONSTRAINT fk_aimer_publication FOREIGN KEY (pub_id) REFERENCES publication(pub_id); + +/* ALTER TABLE aimer + ADD CONSTRAINT fk_aimer_utilisateur FOREIGN KEY (id) REFERENCES utilisateur(id), + ADD CONSTRAINT fk_aimer_publication FOREIGN KEY (pub_id) REFERENCES publication(pub_id); */ + +/* ALTER TABLE aimer DROP CONSTRAINT fk_aimer_utilisateur; */ + + + + diff --git a/docs/tp/databases/sql/05-rezo-social/correction/02-rezoSocial-jeu-d-essai.sql b/docs/tp/databases/sql/05-rezo-social/correction/02-rezoSocial-jeu-d-essai.sql new file mode 100644 index 0000000..6d9d8d6 --- /dev/null +++ b/docs/tp/databases/sql/05-rezo-social/correction/02-rezoSocial-jeu-d-essai.sql @@ -0,0 +1,36 @@ +use rezo_social; + +/* AJOUTER DES DONNEES DANS LA TABLE utilisateur */ + +INSERT INTO utilisateur +(id, nom_utilisateur, email) +VALUES +(1, 'Zorro', 'zorb@example.com'), +(2, 'Patchouli', 'patchouli@example.fr'), +(3, 'Eva', 'eva.stt@example.com'); + +/* AJOUTER DES DONNEES DANS LA TABLE publication */ + +INSERT INTO publication +(pub_date, pub_titre, pub_contenu, id) +VALUES +('2024-11-23 14:30', 'Il fait beau', 'Quel beau soleil aujourd’hui !', 1), +('2024-11-23 09:15', 'Les bonbons', "Les bonbons, c’est bon", 2), +('2024-11-27 08:17', 'Super resto', 'J’ai découvert un super restaurant hier soir.', 1), +('2024-12-05 17:52', 'Album disponible', 'Nouvel album de mon groupe préféré !', 2), +('2024-12-15 10:05', 'Aidez-moi', 'Je cherche une recette de gâteau au chocolat.', 3); + +INSERT INTO aimer +(id, pub_id) +VALUES +(1, 5), +(2, 4), +(3, 3), +(2, 2), +(1, 1); + +/* +SELECT * FROM utilisateur; +SELECT * FROM publication; +SELECT * FROM aimer; +*/ \ No newline at end of file diff --git a/docs/tp/databases/sql/05-rezo-social/correction/03-RezoSocial-selects.sql b/docs/tp/databases/sql/05-rezo-social/correction/03-RezoSocial-selects.sql new file mode 100644 index 0000000..66edd35 --- /dev/null +++ b/docs/tp/databases/sql/05-rezo-social/correction/03-RezoSocial-selects.sql @@ -0,0 +1,59 @@ +use rezo_social; + +/* SELECTIONNER TOUTES LES COLONNES ET TOUTES LES LIGNES */ +SELECT * FROM utilisateur; +SELECT * FROM publication; +SELECT * FROM aimer; + +-- Sélectionner tous les utilisateurs (nom d’utilisateur + email). + +SELECT nom_utilisateur, email FROM utilisateur; + +-- Sélectionner toutes les publications (titre, date, contenu, id utilisateur) +-- triées par date de la plus récente à la plus ancienne. + +SELECT pub_titre, pub_date, pub_contenu, id +FROM publication +ORDER BY pub_date DESC; + +-- Sélectionner toutes les publications +-- triées par id utilisateur puis par date de la plus récente à la plus ancienne. + +SELECT * FROM publication ORDER BY id ASC, pub_date DESC; + +-- Sélectionner les publications (pub_id, date, titre) de l’utilisateur N°2. + +SELECT pub_id, pub_date, pub_titre FROM publication +WHERE id = '2'; + +-- Sélectionner les publications (pub_id, titre, contenu) dont le titre contient la lettre “a”. +-- Le résultat est trié par le titre et par ordre décroissant. + +SELECT pub_id, pub_titre, pub_contenu FROM publication +WHERE pub_titre LIKE '%a%' +ORDER BY pub_titre DESC; + +-- Sélectionner les publications (pub_id, titre, contenu) dont le titre NE contient PAS la lettre “a”. +-- Le résultat est trié par le titre et par ordre décroissant. + +SELECT pub_id, pub_titre, pub_contenu FROM publication +WHERE pub_titre NOT LIKE '%a%' +ORDER BY pub_titre DESC; + +-- Sélectionner les utilisateurs (id, nom, email) dont l’adresse email se termine par “com”. + +SELECT id, nom_utilisateur, email FROM utilisateur +WHERE email LIKE '%com'; + +-- Sélectionner les publications triées par titre (ordre alphabétique) +-- avec le nom d’utilisateur de l’auteur (nécessite une jointure). + +-- Version sans jointure +SELECT * FROM publication, utilisateur +WHERE publication.id = utilisateur.id +ORDER BY publication.pub_titre; + +-- Version avec jointure --> A privilégier pour des raisons de performances +SELECT * FROM publication +INNER JOIN utilisateur ON publication.id = utilisateur.id +ORDER BY publication.pub_titre; diff --git a/docs/tp/deploiement/docker/index.md b/docs/tp/deploiement/docker/index.md new file mode 100644 index 0000000..20aeeb0 --- /dev/null +++ b/docs/tp/deploiement/docker/index.md @@ -0,0 +1,5 @@ +--- +title: "Docker" +serie: "exercices" +index: 3 +--- \ No newline at end of file diff --git a/docs/tp/deploiement/ftp/index.md b/docs/tp/deploiement/ftp/index.md new file mode 100644 index 0000000..06c5570 --- /dev/null +++ b/docs/tp/deploiement/ftp/index.md @@ -0,0 +1,6 @@ +--- +title: "Déploiement manuel" +serie: "manuel" +index: 1 +--- + diff --git a/docs/tp/deploiement/ftp/publier-site-sftp.md b/docs/tp/deploiement/ftp/publier-site-sftp.md new file mode 100644 index 0000000..0aa6098 --- /dev/null +++ b/docs/tp/deploiement/ftp/publier-site-sftp.md @@ -0,0 +1,81 @@ +--- +title: "Déploiement manuel" +serie: "manuel" +index: 2 +--- + +Dans cet article, vous apprendrez à publier du contenu sur un serveur distant en utilisant le protocole FTP et/ou SFTP et le logiciel FileZilla. + + +## Téléchargez et installez FileZilla + +Si FileZilla n'est pas déjà installé sur votre machine: + +1. Téléchargez FileZilla depuis le site officiel : [filezilla-project.org](https://filezilla-project.org/download.php?show_all=1). + - Sélectionnez la version "ZIP" + +![Filezilla Download](../img/filezilla-dl.jpg) + +2. Décompressez l'archive ZIP dans le répertoire `Documents/apps/` + + +![Filezilla Unzip](../img/filezilla-install.jpg) + +3. Ouvrez le répertoire puis épinglez l'exécutable dans votre menu démarrer + - Si vous le souhaitez vous pouvez aussi créer un raccourci sur votre bureau + +![Filezilla Shortcut](../img/filezilla-shortcut.jpg) + + +## Obtenez vos informations de connexion FTP + +Vous aurez besoin des informations suivantes pour vous connecter à votre serveur FTP : + +- **Hôte**: L'adresse du serveur FTP (par exemple, ftp.example.com). +- **Nom d'utilisateur**: Votre nom d'utilisateur FTP. +- **Mot de passe**: Votre mot de passe FTP. +- **Port**: Le numéro de port FTP ou SFTP + - Généralement **21** pour le protcole FTP + - Généralement **22** pour le protocole SFTP + +Ces informations vous ont été fournies par votre formateur ou votre hébergeur web lors de la création de votre compte. + + +## Connectez-vous à votre serveur FTP + +1. Ouvrez FileZilla et cliquez sur le bouton "gestionnaire de sites" en haut à gauche. +2. Cliquez sur le bouton "Nouveau site" +3. Choisiseez un nom pour cette connexion (celui que vous voulez) +4. Entrez les informations de connexion dans le champs correspondants +5. Sauvegarder en cliquant sur le bouton "OK" + +![Filezilla Add site](../img/filezilla-add.jpg) + +Une fois configuré, cliquez sur la petite flèche à coté du bouton "Gestionnaire de sites" et cliquez le nom que vous avez choisi pour établir la connexion. + +## Naviguez dans les répertoires + +Une fois connecté, vous verrez deux panneaux : + +- **Panneau de gauche**: Affiche les fichiers et dossiers de *votre ordinateur*. +- **Panneau de droite**: Affiche les fichiers et dossiers du *serveur distant*. + +Utilisez ces panneaux pour naviguer vers le répertoire où vous souhaitez publier votre contenu sur le serveur. + +## Transférez vos fichiers + +Sélectionnez les fichiers ou dossiers que vous souhaitez publier dans le panneau de gauche, puis faites-les glisser vers le panneau de droite pour les transférer sur le serveur. Vous pouvez également utiliser le menu contextuel (clic droit) pour choisir l'option "Envoyer". + +## Attendez la fin du transfert + +FileZilla affichera la progression du transfert dans la partie inférieure de la fenêtre. Une fois le transfert terminé, vos fichiers seront publiés sur le serveur. + + +# Exercice + +1. Créer un compte sur le site [https://alwaysdata.com](https://alwaysdata.com) + - Sélectionnez le "Pack 100Mo gratuit" +2. Regardez cette vidéo pour savoir comment publier votre 1er site web : + +[![Titre de la vidéo](https://img.youtube.com/vi/SmIdDn86i5M/0.jpg)](https://www.youtube.com/watch?v=SmIdDn86i5M) + diff --git a/docs/tp/deploiement/img/filezilla-add.jpg b/docs/tp/deploiement/img/filezilla-add.jpg new file mode 100644 index 0000000..e6d977b Binary files /dev/null and b/docs/tp/deploiement/img/filezilla-add.jpg differ diff --git a/docs/tp/deploiement/img/filezilla-dl.jpg b/docs/tp/deploiement/img/filezilla-dl.jpg new file mode 100644 index 0000000..4db10fb Binary files /dev/null and b/docs/tp/deploiement/img/filezilla-dl.jpg differ diff --git a/docs/tp/deploiement/img/filezilla-install.jpg b/docs/tp/deploiement/img/filezilla-install.jpg new file mode 100644 index 0000000..77e5c3c Binary files /dev/null and b/docs/tp/deploiement/img/filezilla-install.jpg differ diff --git a/docs/tp/deploiement/img/filezilla-shortcut.jpg b/docs/tp/deploiement/img/filezilla-shortcut.jpg new file mode 100644 index 0000000..7354cd2 Binary files /dev/null and b/docs/tp/deploiement/img/filezilla-shortcut.jpg differ diff --git a/docs/tp/deploiement/index.md b/docs/tp/deploiement/index.md new file mode 100644 index 0000000..f6acdd9 --- /dev/null +++ b/docs/tp/deploiement/index.md @@ -0,0 +1,54 @@ +--- +title: "Déploiement" +layout: module +id: 95 +level: 5 +--- + +Toute entreprise a besoin, à un moment ou à un autre, de déployer une application ou un site web. L'objectif d'un déploiement est d'implémenter un nouveau logiciel dans l'environnement informatique. Toutefois, il s'agit d'une tâche qui peut mettre en péril les opérations commerciales de l'entreprise. C'est pour cette raison qu'il est important de mettre en place un processus performant : **le plan de déploiement**. + +## Déploiement : Kesako ? + +Le déploiement en informatique désigne l'ensemble des opérations nécessaires pour qu'une application logicielle ou un système soit introduit dans son environnement d'utilisation prévu. Il comporte l'installation, la configuration, les tests et la maintenance. + +## Différents types de déploiement + +Il existe plusieurs types de déploiement. Chacun comporte des avantages et des inconvénients. Les services informatiques doivent les comparer pour trouver la meilleure technique à utiliser selon l'application prise en charge. + +Parmi les plus courants, quatre ressortent : + +**Le déploiement de base :** c'est le plus simple. Il permet de mettre à jour tous les environnements cibles de manière simultanée, sans avoir de stratégie ou de processus. C'est aussi le type de déploiement le plus risqué, car les logiciels ne sont pas déployés de façon contrôlée et lente. Ce type de déploiement peut être manuel ou automatisé. + +**Le déploiement progressif :** ici, les applications logicielles sont mises à jour lentement et vont progressivement remplacer l'ancien logiciel. Il possède un certain risque, car l'application originale n'est pas préservée. + +**Le déploiement bleu-vert :** celui-ci permet de préserver l'ancien environnement tout en déployant le nouveau en simultanée. Une fois l'application déployée, s'il y a un problème, il est possible de rediriger le trafic vers l'ancien pour qu'il fonctionne de manière optimale. Dès que le nouvel environnement est fonctionnel et ne présente pas de faille, il convient de mettre fin à l'ancien environnement. + +**Le déploiement canari :** il consiste à déployer une application par sous-ensemble. Au début, il est destiné à un petit groupe de personnes, puis il est déployé de manière incrémentielle au travers de versions progressives. Ce type de déploiement permet d'avoir des retours d'expérience anticipés d'utilisateurs et d'identifier les bugs afin de les supprimer pour la version finale. Le déploiement canari est intéressant pour les applications qui possèdent un groupe identifiable d'utilisateurs et non général. + + +# Ressources + +**Lectures :** + +- [Les environnements d'exécution](https://devoldere.net/ressources/deploiement/01%20-%20Environnements-dev-test-prod.pdf) +- [Le déploiement manuel et automatique](https://devoldere.net/ressources/deploiement/02%20-%20Deploiement%20-%20manuel%20et%20auto.pdf) +- [Définir un plan de déploiement](https://devoldere.net/ressources/deploiement/03%20-%20Deploiement%20-%20plan%20de%20deploiement.pdf) +- [Rédiger une procédure de déploiement](https://devoldere.net/ressources/deploiement/04%20CDA%20DWWM%20Modele%20Documentation%20D%c3%a9ploiement%201.0.7.pdf) +- [Rédiger un changelog](https://devoldere.net/ressources/deploiement/05%20CDA%20DWWM%20Changelog%201.0.0.pdf) + +**Vidéos :** + +- Déploiement manuel avec un logiciel FTP + - [Mettre son site en ligne - FileZilla](https://www.youtube.com/watch?v=Mw9uoD346-k) +- Déploiement automatique avec Github + - [Héberger un site gratuitement sur GitHub](https://www.youtube.com/watch?v=hNRxn5sKOdE) + - [Comment héberger un site web facilement avec GitHub](https://www.youtube.com/watch?v=dBAZ5Qc2bIk) + + +# Travail à réaliser + +Publier votre site web personnel (cv ou autre) sur Github Pages. + +[Documentation Github Pages](https://docs.github.com/fr/pages/getting-started-with-github-pages/creating-a-github-pages-site) + +> Vous ne pouvez publier que du contenu statique (HTML, CSS, Javascript, images...). PHP et les langages serveurs ne fonctionnent pas sur Github Pages. diff --git a/docs/tp/deploiement/plan-deploiement.md b/docs/tp/deploiement/plan-deploiement.md new file mode 100644 index 0000000..94dfc19 --- /dev/null +++ b/docs/tp/deploiement/plan-deploiement.md @@ -0,0 +1,102 @@ +--- +title: "Déploiement manuel" +serie: "exercices" +index: 1 +--- + +Le déploiement informatique est une étape cruciale pour intégrer de nouvelles applications, systèmes ou logiciels dans l’environnement d’une entreprise. Il s’agit d’un processus complexe qui nécessite une planification minutieuse et une exécution rigoureuse. + +## Comment faire un plan de déploiement ? + + +### Définir la méthode de déploiement + +Avant toute chose, il convient de déterminer la méthode de déploiement à utiliser en fonction du projet web. Il faut se poser diverses questions comme : + +- Quel système, logiciel ou application faut-il déployer ? +- Quels sont les besoins de l'entreprise ? +- Combien d'utilisateurs finaux y aura-t-il ? +- Quels sont les risques du déploiement ? +- Quel outil est utilisé pour suivre le déploiement ? +- Qui fera partie de l'équipe de déploiement ? +- Quand le déploiement sera-t-il effectué ? +- Quand et comment les données existantes du système migreront-elles ? +- Le déploiement doit-il être simultané ou effectué de manière lente ? +- Combien de temps le système existant continuera-t-il d'exister en parallèle du système cible ? +- Quelle sera l'assistance fournie les jours suivant le déploiement ? +- Comment les problèmes seront-ils identifiés, suivis et résolus ? + +Ces questions permettent de définir la meilleure manière d'aborder le déploiement et donc de choisir entre l'un des types de déploiement existants. + + +### Planifier le déploiement + +Cette étape permet de déterminer les fondements du plan de déploiement. Elle doit inclure les objectifs visés, les indicateurs de performance et les moyens utilisés pour atteindre les objectifs fixés. + +Chaque plan de déploiement s'adapte à la structure et aux pratiques de l'entreprise. + + +### Identifier l'équipe de déploiement + +Pour mener le projet à bien de la phase d'idée jusqu'à la production, une équipe doit être constituée. + +Celle-ci comprend tous les talents nécessaires pour mettre en œuvre la méthode de déploiement choisie. L'équipe de projet comprend aussi bien l'équipe informatique, que l'équipe de développement, les DevOps et les responsables des opérations. + +Il ne faut pas non plus négliger le fait de collaborer avec les fournisseurs (hébergeurs, prestaires cloud etc...). + + +### Faire des tests + +Lors du déploiement, nombreux sont les facteurs qui peuvent venir le perturber. La meilleure chose à faire pour s'assurer que cela n'arrive pas est de mettre en place un environnement de test. + +Il est possible d'utiliser des simulations identiques ou qui imitent les activités réelles de l'entreprise. + +Les tests permettent de détecter les potentiels problèmes et de vérifier que les éléments clés du projet fonctionnent correctement. En cas de problèmes, il est nécessaire d'apporter des modifications pour les corriger. + +C'est aussi un bon moyen de s'assurer de la bonne migration des données de l'ancien système vers le nouveau système. + + +### Créer un calendrier de déploiement + +Pour un plan de déploiement efficace, il est conseillé de le diviser en tâches. Cela permet de faciliter le travail, de le rendre plus gérable tout en optimisant la productivité. + +Ces tâches doivent être planifiées dans un calendrier. Celui-ci peut être créé à l'aide d'un logiciel automatisé ou par les membres de l'équipe. Ce calendrier regroupe les échéances de chacune des tâches et leur attribution. La répartition des activités de déploiement est clairement indiquée pour simplifier le processus de déploiement et éviter les problèmes. + + +### Déployer + +La phase de mise en service permet de déployer définitivement le logiciel ou l'application dans son environnement de production. + +Il est utile d'avertir les collaborateurs et les utilisateurs du déploiement afin de renforcer la coordination tout au long du processus et d'être au plus près des attentes utilisateurs. + +Il est aussi conseillé de prévoir une formation pour les utilisateurs afin qu'ils utilisent le logiciel/site de manière optimale. La formation des utuilisateurs est d'ailleurs souvent oubliée dans le plan de déploiement et pourtant, elle est nécessaire car elle permet de s'assurer que le logiciel sera bien utilisé et cela rassurera les utilisateurs finaux ! + + +### Assurer un suivi continu + +Une fois l'application déployée, il est recommandé de surveiller le déploiement et de l'optimiser avec les corrections nécessaires en cas d'erreur. Les Logs vous seront alors très utiles pour détecter les éventuels problèmes. + + +## Avantages d’un déploiement informatique bien préparé + +Un déploiement informatique réussi offre de nombreux avantages pour les entreprises. Voici les 5 principaux avantages d’un plan de déploiement informatique bien conçu et bien exécuté. + +### Amélioration de l’efficacité opérationnelle + +Un déploiement informatique bien planifié permet d’automatiser et d’optimiser les processus métiers, réduisant ainsi le temps et les efforts nécessaires pour accomplir des tâches courantes. Cela conduit à une augmentation de la productivité et de l’efficacité opérationnelle. + +### Réduction des coûts + +L’automatisation et l’optimisation des processus grâce à un déploiement informatique permettent de réduire les coûts opérationnels. Les entreprises peuvent économiser sur les coûts de main-d’œuvre, de maintenance et d’exploitation en utilisant des technologies plus efficaces. + +### Amélioration de la sécurité + +Un plan de déploiement informatique bien conçu inclut des mesures de sécurité robustes pour protéger les données sensibles de l’entreprise. Cela réduit le risque de violations de données, de cyberattaques et d’autres menaces de sécurité. + +### Flexibilité et évolutivité + +Un déploiement informatique bien fait offre une flexibilité accrue, permettant à l’entreprise de s’adapter rapidement aux changements du marché et aux nouvelles opportunités. De plus, les systèmes informatiques déployés peuvent être facilement mis à jour et étendus pour répondre aux besoins futurs. + +### Meilleure prise de décision + +L’intégration de nouvelles technologies permet de collecter et d’analyser des données en temps réel. Cela aide les décideurs à prendre des décisions plus éclairées et stratégiques, basées sur des informations précises et à jour. diff --git a/docs/tp/deploiement/wsl/index.md b/docs/tp/deploiement/wsl/index.md new file mode 100644 index 0000000..ed0dc99 --- /dev/null +++ b/docs/tp/deploiement/wsl/index.md @@ -0,0 +1,83 @@ +--- +title: "Windows Subsystem Linux" +serie: "wsl" +index: 2 +--- + +**WSL**, ou **Windows Subsystem for Linux** (Sous-système Windows pour Linux), est une fonctionnalité de Windows qui vous permet d'exécuter un environnement Linux directement sur votre machine Windows, sans avoir besoin d'utiliser un logiciel de virtualisation tiers. + +WSL permet d'installer et d'utiliser des distributions GNU/Linux (comme Debian, Ubuntu, CentOS, etc...) de la même manière que des applications Windows. WSL permet d'accéder à un terminal Linux, exécuter des commandes Linux et même installer des applications Linux, le tout dans un environnement intégré à Windows. + +Voici quelques points clés à retenir sur WSL : + +- **Intégration**: WSL s'intègre étroitement avec Windows. Il est possible d'accéder aux fichiers Windows depuis Linux et vice-versa. +- **Performance**: WSL est conçu pour être léger et rapide. Il offre généralement de meilleures performances que les machines virtuelles traditionnelles. +- **Flexibilité**: WSL prend en charge plusieurs distributions Linux, ce qui permet de sélectionner celle qui convient le mieux aux besoins du projet. +- **Développement**: WSL est un outil puissant pour les développeurs. Il permet d'utiliser des outils et des environnements de développement Linux directement sur Windows. + +WSL est une fonctionnalité très pratique pour ceux qui ont besoin d'utiliser Linux sur Windows. Il offre un moyen simple, rapide et efficace d'accéder à un environnement Linux. + +# Avantages de WSL : + +- **Léger** : WSL est beaucoup plus léger qu'une machine virtuelle traditionnelle, ce qui signifie qu'il consomme moins de ressources système. +- **Rapide** : Les performances sont généralement meilleures qu'avec une machine virtuelle classique, car WSL s'intègre directement au noyau Windows. +- **Facile à utiliser** : L'installation et la gestion de distributions Linux avec WSL sont relativement simples. + +# Installer une distribution GNU/Linux + +Dans la suite de ce document, vous allez apprendre à activer WSL et installer [GNU/Linux Debian](https://debian.org). + +> Plus d'informations sur [les distributions GNU/Linux](https://fr.wikipedia.org/wiki/Distribution_Linux). + +## Prérequis: + +1. Le système Windows est à jour. +2. La virtualisation est activée dans le BIOS. +3. WSL est installé et activé + - Si ce n'est pas le cas, ouvrir PowerShell en tant qu'administrateur et exécuter la commande: `wsl --install` + +> Sur les machines disponibles en formation, WSL est déjà installé et prêt à l'emploi. + + +## Installation de GNU/Linux Debian + +Il est possible d'installer une distribution GNU/Linux en ligne de commande avec PowerShell ou en utilisant le Microsoft Store. + +### Avec PowerShell + +1. Ouvrir PowerShell. +2. Saisir la commande `wsl --install -d Debian`. + - Debian est téléchargé puis installé (cela peut prendre du temps...). +3. Redémarrer l'ordinateur. + +### Via le Microsoft Store + +1. Ouvrir le Microsoft Store : Recherchez "[Debian](https://apps.microsoft.com/search?query=debian&hl=fr-fr&gl=FR)" et sélectionner la distribution officielle. +2. Cliquez sur "Installer" : Le téléchargement et l'installation de Debian démarrent. +3. Il n'est normalement pas nécessaire de redémarrer l'ordinateur. + - Si toutefois Debian ne se lance pas après installation, tentez le redémarrage ;) + +## Démarrer et initialiser GNU/Linux Debian + +Une fois installé, vous pouvez lancer **Debian** depuis le **menu Démarrer**. La première fois, il faudra patienter pendant que la distribution s'initialise. + +Au premier lancement, vous devrez créer un utilisateur : Suivez les instructions pour configurer votre nom d'utilisateur et votre mot de passe pour votre nouvelle instance Debian. + +> Attention, sur les systèmes UNIX et LINUX, lorsque vous tapez un mot de passe, rien ne s'affiche à l'écran (pas d'astérisques ou autre), c'est tout à fait normal, il s'agit d'un mécanisme de sécurité ! + +### Mises à jour + +Après l'installation, il est recommandé de mettre à jour les paquets de Debian. Dans le terminal Debian, tapez : + +```bash +sudo apt update && sudo apt upgrade +``` + +Il vous sera demandé de saisir votre mot de passe. + + +Voilà, Debian est installé, à jour et prêt à être utilisé. + +Il est maintenant possible d'installer tous les outils de développement nécessaires comme GCC, Python, un serveur Web... + +Mais avant de se lancer t^te baissée... Prenez le temps d'apprendre les commandes Linux de base : diff --git a/docs/tp/deploiement/wsl/linux-cmd.md b/docs/tp/deploiement/wsl/linux-cmd.md new file mode 100644 index 0000000..aadc6e3 --- /dev/null +++ b/docs/tp/deploiement/wsl/linux-cmd.md @@ -0,0 +1,363 @@ +--- +title: "Les commandes Linux de base" +serie: "wsl" +order: 1 +--- + +Les commandes Linux facilitent la prise en main du système d’exploitation. + +En effet, bien que de nombreuses grandes distributions GNU/Linux comme Ubuntu, Debian ou Fedora proposent des interfaces utilisateur graphiques (GUI) intuitives et faciles à manipuler, les interfaces en ligne de commande (CLI) sont efficaces et font vraiment la différence. + +Elles permettent en effet d’exploiter le plein potentiel de l’OS. Par exemple, avec des commandes Linux, vous pouvez réaliser en quelques secondes seulement des opérations qui pourraient nécessiter de nombreuses étapes sur une interface graphique. + +Ce document répertorie les commandes GNU/Linux de base que vous vous devez de connaître. + +> Note: L’interpréteur de commandes Linux est sensible à la casse. En d’autres termes, il fait une différence entre les caractères en majuscule et en minuscule. Tenez-en compte aussi bien au niveau de l’écriture des commandes que des chemins d’accès. + +# 1 – La commande `ls` + +La commande `ls` est la première que de nombreux utilisateurs de Linux saisissent dans leur interpréteur de commandes. Cette commande affiche par défaut le contenu du répertoire courant. Il est toutefois possible d’afficher le contenu d’un dossier spécifique en indiquant son chemin d’accès en argument. + +Cette instruction a de multiples options que vous pouvez toutes découvrir avec la commande `ls –help`. + +Exemples d'options de la commande **ls**: + +- **ls – l** : donne des informations sur les fichiers dans chacun des répertoires ; +- **ls – al** : liste les fichiers et répertoires avec des informations détaillées ; +- **ls -R**: affiche également le contenu des sous-répertoires. + + +# 2 – La commande `cd` +`cd`, pour **Change Directory**, est également une commande très utilisée sur le CLI Linux. Cette commande permet en effet de changer le répertoire courant. + +Selon le répertoire dans lequel vous vous trouvez, vous aurez besoin du nom du répertoire où vous allez ou encore de son chemin d’accès complet. On distingue quelques raccourcis intéressants avec cette instruction Linux : + + +cd.. : permet de passer au répertoire directement plus haut dans l’arborescence ; +cd : permet de se rendre au dossier principal (home). + + + + +3 – La commande pwd +La commande « pwd » est un diminutif de Print Working Directory. Comme son nom l’indique, sans argument et sans flag, cette commande retourne le chemin absolu complet du répertoire de travail dans lequel on se trouve. Le résultat obtenu peut être copié pour servir à d’autres usages. + +Command Linux pwd +Command Linux ‘pwd’ +Command Linux pwd Resultat +Command Linux ‘pwd’ – resultat +4 – La commande cat +Abréviation de Concatenate, la commande « cat » est aussi très utilisée. Si elle sert souvent à prévisualiser un fichier sans ouvrir un éditeur de texte, elle permet essentiellement de créer, d’afficher et de concaténer des fichiers en ligne de commande. + +De plus, la ligne “cat nomDuFichier.extension” affiche le contenu d’un fichier. Cette commande offre également d’autres options pour le traitement de textes. Elle peut par exemple afficher les numéros de ligne ou supprimer les lignes d’un fichier dans la mesure où elles sont vides. + +Command Linux cat +Command Linux ‘cat’ +Command Linux cat Resultat +Command Linux ‘cat’ – resultat +5 – La commande cp +Pour copier un fichier du répertoire courant ou non, utilisez la commande « cp ». Le premier paramètre prend le nom et l’extension du fichier à copier ou encore son chemin absolu. + +Le second paramètre quant à lui est le nom et l’extension du fichier de destination. Il peut également s’agir du chemin absolu du répertoire de destination. Cette commande permet de copier des répertoires grâce à l’option - r. Ces derniers se terminent par une barre oblique sous Linux (/). + +Command Linux cp +Command Linux ‘cp’ +Command Linux cp Resultat +Command Linux ‘cp’ – resultat +Command Linux cp +Command Linux ‘cp’ +Command Linux cp Resultat +Command Linux ‘cp’ – resultat +6 – La commande mkdir +L’instruction « mkdir » pour Make Directory permet de créer un nouveau dossier dans le répertoire courant. Spécifiez le nom du nouveau répertoire et assurez-vous qu’il n’existe pas encore. Par exemple, faites « mkdir Articles/ » pour créer un répertoire nommé « Articles ». + +Pour créer des répertoires avec des sous-répertoires, ajoutez le flag « -p ». Avec la commande « mkdir -p Articles/Baskets/ », vous créerez un répertoire « Articles » qui en contient un autre nommé « Baskets ». + +Command Linux mkdir +Command Linux ‘mkdir’ +Command Linux mkdir verifier +Command Linux ‘mkdir’ – verifier +Command Linux mkdir resultat +Command Linux ‘mkdir’ – resultat +7 – La commande mv +Si la commande « mv » sert principalement à déplacer des fichiers ou répertoires, elle permet également de les renommer. Comme avec « cp », il faut, à la suite de l’instruction « mv », spécifier la source et la destination. + +Pour copier un dossier en entier, il vous suffira d’ajouter l’option r et d’indiquer le nom du fichier ou répertoire en argument. + +Command Linux mv Renommer un fichier +Command Linux ‘mv’ – Renommer un fichier +Command Linux mv Déplacer un fichier dans un autre répertoire +Command Linux ‘mv’ – Déplacer un fichier dans un autre répertoire +Command Linux mv Déplacer un répertoire +Command Linux ‘mv’ – Déplacer un répertoire +8 – La commande rm +« rm » permet la suppression de fichiers et même d’un répertoire. Faites toutefois attention à l’usage de cette commande, car elle peut avoir des actions irréversibles. + +Ajoutez le nom et l’extension d’un fichier ordinaire en paramètre pour le supprimer. La commande « rm -r » permet de supprimer des répertoires vides. Elle se comporte donc comme la commande « rmdir ». + +Quant à la suppression d’un répertoire avec son contenu, ajoutez le flag force. « rm -rf Liste/ » permettrait ainsi de supprimer un répertoire nommé « Liste » avec tout son contenu. + +Command Linux rm Suppression d'un fichier +Command Linux ‘rm’ – Suppression d’un fichier +Command Linux rm Supprimer un répertoire et son contenu +Command Linux ‘rm’ – Supprimer un répertoire et son contenu +Command Linux rm Suppression d'un fichier sans invite +Command Linux ‘rm’ – Suppression d’un fichier sans invite +9 – La commande man +Le terminal Linux a tout prévu pour vous permettre de bien utiliser chacune de ses commandes. La commande « man » affiche la page du manuel de toutes les autres commandes. Avec « man alias » par exemple, vous aurez tous les détails sur les fonctions de l’instruction « alias ». + +Command Linux man +Command Linux ‘rm’ +Command Linux man resultat +Command Linux ‘man’ – resultat +10 – La commande alias, unalias +La création et la suppression d’alias est possible respectivement avec les commandes Linux « alias » et « unalias ». Avec cet OS open source, un alias est un mot qui remplace une série de commandes. + +Commande Linux alias +La commande Linux « alias » définit des alias temporaires dans une section du Shell. Depuis votre interface en ligne de commande, tapez « alias ls=”ls –color=auto” » par exemple. Les sorties de « ls » seront systématiquement en couleur sans que vous ayez besoin d’utiliser le flag à chaque fois. + +Cette commande prend ainsi en paramètre une chaîne clé-valeur. Sans arguments, cette commande renvoie plutôt la liste de tous les alias actifs dans la section. + +Command Linux alias +Command Linux ‘alias’ +Command Linux alias resultat +Command Linux ‘alias’ – resultat +Commande Linux unalias +Pour désactiver un alias par contre, saisissez la commande Linux « unalias » suivi de l’alias à supprimer. Vous pourriez ainsi faire un « unalias ls » pour supprimer l’alias « ls » créé. + +Command Linux unalias +Command Linux ‘alias’ +Command Linux unalias resultat +Command Linux ‘unalias’ – resultat +11 – La commande touch +Dans le lot des principales commandes Linux, « touch » permet la création d’un fichier vierge sur un terminal de Linux. Cette commande est aussi connue pour mettre à jour les temps d’accès et de modifications des fichiers. Cette seconde fonction de la commande n’est toutefois que peu connue. + +Command Linux touch +Command Linux ‘touch’ +Command Linux touch plusieurs fichiers +Command Linux ‘touch’ – plusieurs fichiers +12 – La commande chmod +Les permissions de lecture (r), d’écriture (w) et d’exécution (x) de répertoires et de fichiers ont une grande importance sur Linux. Cette commande Linux permet de gérer et de changer ces permissions. + +Pour rendre un fichier exécutable par exemple, il faut faire « chmod +x » suivi du nom du fichier concerné. + +Command Linux chmod +Command Linux ‘chmod’ +Command Linux chmod vérifier les permissions du fichier +Command Linux ‘chmod’ – vérifier les permissions du fichier +Command Linux chmod vérifier resultat +Command Linux ‘chmod’ – vérifier resultat +13 – La commande chown +Vous pouvez changer ou transférer la propriété d’un fichier à un utilisateur donné avec « chown ». Tous les fichiers sous GNU/Linux sont en effet rattachés à un user spécifique. + +Cette commande prend en premier argument le nom du nouvel utilisateur et en second le nom du fichier dont on veut transférer la propriété. + +Command Linux chown +Command Linux ‘chown’ +Command Linux chown vérifier la propriété du fichier +Command Linux ‘chown’ – vérifier la propriété du fichier +Command Linux chown vérifier resultat +Command Linux ‘chown’ – vérifier resultat +14 – La commande ./ +Si la notation « ./ » n’est pas réellement une commande, elle a une grande importance. Elle permet en effet à n’importe quel interpréteur de ligne de commande Linux l’exécution d’un fichier. Vous pourriez toutefois avoir besoin de changer la permission d’exécution avant de le faire. + +Command Linux ./ +Command Linux ‘./’ +Command Linux ./ resultat +Command Linux ‘./’ resultat +15 – La commande exit +Comme son nom l’indique, la commande « exit » met fin à une section du Shell sur Linux. Généralement, cette commande s’accompagne aussi de la fermeture de la console Linux. + +Command Linux exit +Command Linux ‘exit’ +Command Linux exit resultat +Command Linux ‘exit’ – resultat +16 – La commande shutdown +« shutdown » permet d’éteindre une machine fonctionnant sous une distribution de Linux. Elle peut aussi la redémarrer immédiatement ou à une heure programmée. Le temps d’attente par défaut est d’une minute. + +Vous pouvez toutefois utiliser le paramètre « now » avec cette commande Linux pour une mise hors tension instantanée. Indiquez plutôt « 22 : 35 » pour attendre cette heure-là avant l’extinction. Le flag « -c » quant à lui permet d’annuler une mise sous tension programmée. + +Command Linux shutdown +Command Linux ‘shutdown’ +Command Linux shutdown reussie +Command Linux ‘shutdown’ – reussie +17 – La commande locate +Pour simplifier la localisation d’un fichier ou un répertoire sur une machine Linux, il faut utiliser la commande Linux « locate ». L’ajout du flag « -i » rend la recherche insensible à la casse. Il y a de nombreuses autres options de recherche. + +Command Linux locate +Command Linux ‘locate’ +Command Linux locate resultat +Command Linux ‘locate’ – resultat +18 – La commande find +La commande « find » se comporte comme la commande « locate » à quelques différences près. La principale différence est que cette commande recherche des fichiers dans un répertoire donné. La commande permet de multiples options pour affiner la recherche. + +Command Linux find +Command Linux ‘find’ +Command Linux find resultat +Command Linux ‘find’ – resultat +19 – La commande sudo +Si vous avez un niveau intermédiaire en Linux, vous avez sans doute déjà entendu parler de la commande « sudo » pour SuperUser Do. Cette commande permet d’exécuter des tâches qui requièrent des droits administrateur ou root. + +Elle vous permettra d’effectuer plusieurs opérations pouvant endommager de manière irréversible votre système Linux. Utilisez là donc de manière intelligente et réfléchie. + +Command Linux sudo +Command Linux ‘sudo’ +Command Linux sudo resultat +Command Linux ‘sudo’ – resultat +20 – La commande df +Retrouvez en Kilo octets (Ko) les détails du pourcentage d’utilisation de l’espace disque de votre système. Vous pourrez plutôt les avoir en Méga octets (Mo) avec « df -m ». + +Command Linux df +Command Linux ‘df’ +Command Linux df resultat +Command Linux ‘df’ – resultat +21 – La commande du +« du » pour Disk Usage par contre permet de connaître l’espace mémoire qu’un fichier ou répertoire occupe sur un disque. Vous pouvez ajouter le flag « -h » à la commande “du” pour avoir cette valeur en octets, Ko ou Mo. + +Command Linux du +Command Linux ‘du’ +Command Linux du resultat +Command Linux ‘du’ – resultat +22 – La commande head +La commande Linux « head » permet de visualiser les premières lignes d’un fichier texte. Si cette commande affiche les 10 premières lignes par défaut, on peut aisément modifier ce nombre à sa convenance. Avec « head -n 6 » suivi du nom et de l’extension, les 6 premières lignes du fichier s’afficheront. + +Command Linux head +Command Linux ‘head’ +Command Linux head resultat +Command Linux ‘head’ – resultat +23 – La commande diff +Vous pourrez comparer ligne par ligne deux fichiers dans un terminal Linux. La commande « diff » permet de le faire, mais elle n’affiche que les lignes qui ne concordent pas en sortie. + +Cette commande est par sa fonction très utilisée par les développeurs. Pour s’en servir, il faut écrire la syntaxe de la commande et passer successivement les fichiers à comparer en paramètre. + +Command Linux diff +Command Linux ‘diff’ +Command Linux diff resultat +Command Linux ‘diff’ – resultat +24 – La commande jobs +La commande « jobs » en ligne de commande peut être utilisée pour avoir la liste de tous les programmes qui s’exécutent sur un système Linux. + +Command Linux jobs +Command Linux ‘jobs’ +Command Linux jobs resultat +Command Linux ‘jobs’ – resultat +25 – La commande top +« top » liste et affiche le nom de tous les processus en cours d’exécution sur une machine Linux avec le détail de la quantité de CPU utilisée. Cette commande est très pratique pour suivre l’utilisation des ressources du système. Elle permet aussi d’identifier les programmes qui doivent être arrêtés en cas de surconsommation. + +Command Linux top +Command Linux ‘top’ +Command Linux top resultat +Command Linux ‘top’ – resultat +26 – La commande kill +Pour arrêter un programme Linux en qui ne répond pas ou qui consomme énormément de mémoire RAM, vous pouvez utiliser la commande « kill » Cette commande est si puissante qu’elle peut être utilisée pour forcer la fermeture d’une session. Il faudra bien sûr suivre certaines indications pour bien s’en servir. + +Command Linux kill +Command Linux ‘kill’ +Command Linux kill forcer l'arrêt +Command Linux ‘kill’ – forcer l’arrêt +27 – La commande ping +Les administrateurs de réseaux informatiques connaissent très bien la commande « ping ». Cette commande permet de vérifier le statut de la connectivité à un serveur et de mesurer le temps de réponse. + +Command Linux ping +Command Linux ‘ping’ +Command Linux ping resultat +Command Linux ‘ping’ – resultat +28 – La commande wget +En ligne de commande, vous pouvez utiliser « wget » pour lancer un téléchargement sur internet. Il suffit d’ajouter le lien de téléchargement en paramètre.Cette commande permet de tout télécharger, que ce soit un site web, une vidéo ou une image. + +Command Linux wget +Command Linux ‘wget’ +Command Linux wget resultat +Command Linux ‘wget’ – resultat +29 – La commande hostname +La commande « hostname -I » vous permettra d’identifier l’adresse IP de votre réseau. Utilisée sans ce flag, elle affiche le nom de votre hôte ou réseau. Toutefois, pour utiliser cette commande, il faut disposer des droits d’utilisateur root. + +Command Linux hostname +Command Linux ‘hostname’ +Command Linux hostname resultat +Command Linux ‘hostname’ – resultat +30 – La commande uname +« uname » donne des informations intéressantes et utiles sur le système d’exploitation utilisé. Il s’agit entre autres de l’OS, du noyau et du nom de la machine. + +Command Linux uname +Command Linux ‘uname’ +Command Linux uname resultat +Command Linux ‘uname’ – resultat +31 – La commande history +Vous pouvez retrouver l’historique des commandes Linux entrées auparavant grâce à la commande « history ». Cette commande est très pratique compte tenu du fait qu’on est souvent amené à exécuter des centaines de commandes au quotidien. + +La commande “history” vous permettra de retrouver jusqu’à 500 lignes de commande. En manipulant habilement les flags, vous pourrez aisément retrouver une commande particulière. + +Command Linux history +Command Linux ‘history’ +Command Linux history resultat +Command Linux ‘history’ – resultat +32 – La commande echo +La commande « echo » déplace ou ajoute des données comme du texte dans un fichier spécifique. Cette commande est l’une des plus basiques et des plus utilisées car elle permet d’avoir accès au contenu d’un fichier sans avoir à l’ouvrir. + +Command Linux echo +Command Linux ‘echo’ +Command Linux echo resultat +Command Linux ‘echo’ – resultat +Command Linux echo afficher les variables +Command Linux ‘echo’ – afficher les variables +Command Linux echo afficher les variables resultat +Command Linux ‘echo’ – afficher les variables resultat +33 – La commande zip, unzip et tar +Pour compresser des fichiers dans une archive zip et pour extraire des données d’un fichier zippé, il faut respectivement utiliser « zip » et « unzip ». Si vous recherchez une alternative à ces dernières, la commande « tar » est une excellente option, bien qu’elle soit plus complexe à utiliser. + +Command Linux zip +Command Linux ‘zip’ +Command Linux zip resultat +Command Linux ‘zip’ – resultat +Command Linux unzip +Command Linux ‘unzip’ +Command Linux unzip resultat +Command Linux ‘unzip’ – resultat +34 – Le lot de commandes groupadd, groupmod, useradd, userdel, usermod +Ce lot de commandes est indispensable à tout administrateur système. Il permet à ce dernier de gérer chaque utilisateur présent sur son réseau. Les commandes peuvent aussi être utilisées pour limiter l’accès aux utilisateurs au contenu d’un fichier ou un répertoire spécifique. + +Par exemple, utilisez la commande « useradd » pour créer un nouvel utilisateur et « passwd » pour assigner un mot de passe à ce compte. « userdel » par contre permet de supprimer un utilisateur. La commande “groupmod” elle, vous permet de modifier un groupe existant sur votre machine. + +Command Linux groupadd +Command Linux ‘groupadd’ +Command Linux groupadd vérifier +Command Linux ‘groupadd’ – vérifier +Command Linux groupadd vérifier resultat +Command Linux ‘groupadd’ – vérifier resultat +Command Linux groupmod +Command Linux ‘groupmod’ +Command Linux groupmod resultat +Command Linux ‘groupmod’ – resultat +Command Linux useradd +Command Linux ‘useradd’ +Command Linux useradd resultat +Command Linux ‘useradd’ – resultat +Command Linux userdel +Command Linux ‘userdel’ +Command Linux userdel resultat +Command Linux ‘userdel’ – resultat +Command Linux usermod +Command Linux ‘usermod’ +Command Linux usermod resultat +Command Linux ‘usermod’ – resultat +Les bonnes astuces à utiliser sur un terminal Linux +Lorsque vous exécutez des commandes Linux, il est assez courant de se retrouver avec une console visuellement chargée. Vous pouvez utiliser la commande « clear » pour vider les messages à l’écran du terminal. + +Linux propose aussi des suggestions ou auto complétions pertinentes avec la touche tabulation « Tab » du clavier. Par ailleurs, comme raccourcis clavier, vous pouvez utiliser : + +Ctrl + A pour aller au début de la ligne ; +Ctrl + E pour aller à la fin de la ligne ; +Ctrl + Z pour mettre une commande en cours d’exécution en pause ; +Ctrl + C pour arrêter une commande en cours d’exécution ; +Ctrl + E pour aller à la fin de la ligne ; +Ctrl + S pour bloquer le terminal ; +Ctrl + Q pour débloquer le terminal. +Par ailleurs, plutôt que d’exécuter des commandes Linux les unes après les autres, vous pouvez les exécuter en une seule ligne en les séparant par des « ; ». Utilisez plutôt « && » si vous souhaitez que la commande suivante s’exécute à condition que la précédente ait abouti. + +Conclusion +Si l’apprentissage des principales commandes Linux peut prendre un certain temps, le processus est relativement simple et assez agréable. + +En effet, vous parviendrez vite à maîtriser les commandes et les principaux outils Linux. Toutefois, vous ne cesserez jamais d’apprendre et de découvrir de nouvelles choses avec ce puissant système d’exploitation. + +En attendant, connaître et maîtriser les principales commandes Linux devrait grandement améliorer votre productivité et être d’une grande utilité. \ No newline at end of file diff --git a/docs/tp/git/github/20-github-pages.md b/docs/tp/git/github/20-github-pages.md new file mode 100644 index 0000000..526c700 --- /dev/null +++ b/docs/tp/git/github/20-github-pages.md @@ -0,0 +1,79 @@ +--- +title: "Créer un site web avec Github" +order: 20 +serie: "github" +--- + +Dans ce document, vous allez apprendre à publier un site sur Github. + +## Pré-requis : +- Bases HTML +- Bases CSS +- Posséder un compte sur [Github](https://github.com) +- Savoir créer un dépôt sur github +- Savoir synchroniser un dépôt GIT avec [Github Desktop](https://desktop.github.com) +- Savoir fusionner des branches avec l'outil "Pull request" de Github +- Savoir lire et suivre un tutoriel en Anglais + +## Compétences mises en oeuvre : +- Créer un document HTML +- Mettre en forme un document HTML avec CSS +- Gérer ses fichiers sources avec GIT et Github +- Publier un site statique sur Github avec Github Pages +- Utiliser l'Anglais dans un contexte professionnel + + +## Publication d'un site web statique sur Github + +Les développeurs ont généralement un compte sur une plateforme de gestion de version comme [Github](https://github.com) ou [Gitlab](https://gitlab.com). Cela leur permet de gérer leurs projets et de partager leur savoir-faire. Ces plateformes proposent des fonctionnalités similaires aux réseaux sociaux mais adaptés aux développeurs. Sur de telles plateformes, on publie du code plutôt que des photos de vacances. + +Ces grandes plateformes proposent une fonctionnalité intéressante : **publier automatiquement un site web à partir d'un dépôt GIT grâce à l'intégration continue**. Le site est alors accessible via un sous domaine de la plateforme. + +> Note: La fonctionnalité "pages" de Github et Gitlab ne fonctionne qu'avec des sites statiques. PHP, Java et tout autre langage exécuté coté serveur ne sont pas pris en charge ! + +# Publier son site statique sur Github + +Pour publier un site statique sur Github, vous devez suivre la procédure décrite ci-dessous. + +1. S'identifier sur github +2. Créer un nouveau dépôt respectant les règles suivantes : + - Le nom du dépôt doit être *username.github.io* + - Ex: mon nom d'utilisateur est *mdevoldere*, je crée un dépôt nommé "*mdevoldere.github.io*" + - Le dépôt doit être public +3. Une fois le dépôt créé, rendez-vous dans les **paramètres** du dépôt + +![Paramètres du dépôt](./img/github-pages-settings.jpg) + +4. Dans le menu latéral, cliquer sur la section "**pages**" + +![Menu Github Pages](./img/github-pages-menu.jpg) + +5. Appliquez la configuration comme sur la capture suivante : + +![Configuration Github Pages](./img/github-pages-config.jpg) + +6. Cloner le dépôt sur votre mahcine locale + - Pour vous aider : [Cloner un dépôt Github](https://docs.github.com/fr/repositories/creating-and-managing-repositories/cloning-a-repository) + +7. Une fois votre dépôt cloné en local, l'ouvrir dans Visual Studio Code + +8. A la racine du dépôt, créer un répertoire "**docs**" + +9. Dans ce répertoire "**docs**", créer un fichier "**index.html**" + +10. Dans ce fichier, ajouter une structure HTML de base et un titre de niveau 1 + +11. Une fois les modifications terminées, créer un commit et pousser le sur Github + +12. Retourner sur github.com et afficher votre dépôt + +13. Avec votre navigateur web, accéder à l'adresse correspondant au nom du dépôt. + - Mon dépôt est "mdevoldere.github.io" + - l'adresse du site correspondant est https://mdevoldere.github.io + +14. Vous devriez voir aparaitre votre page web ! + + +# Exercez vous + +[Publier votre CV en ligne sur Github Pages](./21-cv-github) diff --git a/docs/tp/git/github/21-cv-github.md b/docs/tp/git/github/21-cv-github.md index ced0875..c21b224 100644 --- a/docs/tp/git/github/21-cv-github.md +++ b/docs/tp/git/github/21-cv-github.md @@ -10,6 +10,7 @@ serie: "github" - Posséder un compte sur [Github](https://github.com) - Savoir créer un dépôt sur github - Savoir synchroniser un dépôt GIT avec [Github Desktop](https://desktop.github.com) +- Savoir fusionner des branches avec l'outil "Pull request" de Github - Savoir lire et suivre un tutoriel en Anglais ## Compétences mises en oeuvre : diff --git a/docs/tp/git/github/img/github-pages-config.jpg b/docs/tp/git/github/img/github-pages-config.jpg new file mode 100644 index 0000000..c0abf84 Binary files /dev/null and b/docs/tp/git/github/img/github-pages-config.jpg differ diff --git a/docs/tp/git/github/img/github-pages-menu.jpg b/docs/tp/git/github/img/github-pages-menu.jpg new file mode 100644 index 0000000..b35e572 Binary files /dev/null and b/docs/tp/git/github/img/github-pages-menu.jpg differ diff --git a/docs/tp/git/github/img/github-pages-settings.jpg b/docs/tp/git/github/img/github-pages-settings.jpg new file mode 100644 index 0000000..0b34aa2 Binary files /dev/null and b/docs/tp/git/github/img/github-pages-settings.jpg differ diff --git a/docs/tp/poo/img/poo-class-car.jpg b/docs/tp/poo/img/poo-class-car.jpg new file mode 100644 index 0000000..ecda5bf Binary files /dev/null and b/docs/tp/poo/img/poo-class-car.jpg differ diff --git a/docs/tp/poo/img/poo-class-object.png b/docs/tp/poo/img/poo-class-object.png new file mode 100644 index 0000000..2fe3308 Binary files /dev/null and b/docs/tp/poo/img/poo-class-object.png differ diff --git a/docs/tp/poo/img/poo-class-structure.png b/docs/tp/poo/img/poo-class-structure.png new file mode 100644 index 0000000..3637d4e Binary files /dev/null and b/docs/tp/poo/img/poo-class-structure.png differ diff --git a/docs/tp/poo/img/poo-class-structure2.png b/docs/tp/poo/img/poo-class-structure2.png new file mode 100644 index 0000000..03e092d Binary files /dev/null and b/docs/tp/poo/img/poo-class-structure2.png differ diff --git a/docs/tp/poo/img/poo-concepts.png b/docs/tp/poo/img/poo-concepts.png new file mode 100644 index 0000000..7cbd159 Binary files /dev/null and b/docs/tp/poo/img/poo-concepts.png differ diff --git a/docs/tp/poo/index.md b/docs/tp/poo/index.md index a41e29d..14a416d 100644 --- a/docs/tp/poo/index.md +++ b/docs/tp/poo/index.md @@ -7,6 +7,8 @@ level: 4 Programmation Orientée Objet (POO), Vous en avez peut-être déjà entendu parler. En quoi cela consiste-t-il ? +![Poo Concepts](./img/poo-concepts.png) + ## Qu'est ce qu'un objet ? Un **objet** en programmation n’est pas si différent de ce qu’on considère comme objet dans la vie de tous les jours. Si je vous dis "*Donnez-moi un objet*", vous pourriez m’apporter un *stylo*, un *écran de télévision*, ou encore un *livre*. @@ -38,8 +40,21 @@ Vous avez compris, dans la vie réelle, pour fabriquer quelque chose, vous avez Une **classe** est une définition, un modèle, une recette pour fabriquer quelque chose : les fameux **objets** ! +**Partons sur un autre exemple : Une voiture** + +![Poo classes objets](./img/poo-class-object.png) + +A partir d'un concept générique (la classe **voiture**), nous pouvons construire des voitures différentes (les objets). Toutes les voitures possèderont des caractéristiques en commun (les attributs). + +Chaque voiture créée à partir du modèle possèdera des valeurs différentes pour chacune des caractéristiques. + +Pour résumer, à partir d'une classe, on instancie des objets : + +![Classe Objet](./img/poo-class-car.jpg) ## Ressources +Poursuivre la lecture : + - [Introduction aux concepts Objet](https://devoldere.net/ressources/objet/1.Cours%20Concepts_objet.pdf) - [Cours UML sur Developpez.com](https://laurent-audibert.developpez.com/Cours-UML/?page=diagramme-classes) diff --git a/docs/tp/web/php/formulaires/formulaires-auth.md b/docs/tp/web/php/formulaires/formulaires-auth.md new file mode 100644 index 0000000..1b54adb --- /dev/null +++ b/docs/tp/web/php/formulaires/formulaires-auth.md @@ -0,0 +1,186 @@ +--- +title: "PHP: Authentification" +serie: "php" +order: 19 +--- + +Dans ce document, vous serez initié à l'authentification avec PHP et une base de données MySQL. + +Pour démarrer, créons une base de données qui stockera les comptes utilisateurs. + +```sql +/* mysql */ +DROP DATABASE IF EXISTS demo_auth; + +CREATE DATABASE IF NOT EXISTS demo_auth; + +USE demo_auth; + +CREATE TABLE tbl_users +( + `id` INT PRIMARY KEY AUTO_INCREMENT, + `username` VARCHAR(50) UNIQUE NOT NULL, + `password` VARCHAR(128) NOT NULL +); + +INSERT INTO tbl_users +(`username`, `password`) +VALUES +('maman', '$argon2id$v=19$m=65536,t=4,p=1$ZlVHdGNnejUybzJyYzF3cg$erdxiPjnXY3ZxfP8mxrj7ETtWv7D/ROcPr8lRC/k59k'), +('papa', '$argon2id$v=19$m=65536,t=4,p=1$UUd0cUp6OVpzTE5QekloaA$Z1igb3NJr2lqr/FK+AJMLjEZMFewTxMA3al6+VU2d/Y'), +('toto', '$argon2id$v=19$m=65536,t=4,p=1$NFhKOVEzTlVKVWh0c0tsUA$1YoRbCsjfhhsQynoxBdGSaKm4jnOyOjoHbh80BKZOR0'); +``` + +**Informations sur les 3 comptes utilisateur :** + +| id | username | mot de passe | mot de passe chiffré avec ARGON_2ID | +| --- | --- | --- | --- | +| 1 | maman | azer1234 | $argon2id$v=19$m=65536,t=4,p=1$ZlVHdGNnejUybzJyYzF3cg$erdxiPjnXY3ZxfP8mxrj7ETtWv7D/ROcPr8lRC/k59k | +| 2 | papa | baba0123! | $argon2id$v=19$m=65536,t=4,p=1$UUd0cUp6OVpzTE5QekloaA$Z1igb3NJr2lqr/FK+AJMLjEZMFewTxMA3al6+VU2d/Y | +| 3 | toto | my:PasswOrd | $argon2id$v=19$m=65536,t=4,p=1$NFhKOVEzTlVKVWh0c0tsUA$1YoRbCsjfhhsQynoxBdGSaKm4jnOyOjoHbh80BKZOR0 | + +Nous devons créer un répertoire pour ce petit projet dont l'arborescence sera : + +``` +/mon_projet/ + - index.php + - auth.php + Dao/ + - DbConnect.php + - AuthRepository.php +``` + +### /Dao/DbConnect.php : Classe de connexion à la base de données + +```php +prepare("SELECT * FROM tbl_users WHERE username=:username"); + + // exécution de la requêtes préparée + // execute() retourne true si la requête a été exécutée avec succés, sinon false + if($stmt->execute([':username' => $username])) { + // récupération de l'utilisateur + $user = $stmt->fetch(PDO::FETCH_ASSOC); + + if($user === false) { // Si l'utilisateur n'a pas été trouvé + $user = []; + } + else if(!password_verify($password, $user['password'])) { // Si le mot de passe est incorrect + $user = []; + } + } + + // fermeture de la requête (pour libérer les ressources) + $stmt->closeCursor(); + + // Retourne l'utilisateur trouvé (ou un tableau vide si l'utilisateur n'a pas été trouvé) + return $user; + } +} +``` + +### /index.php : Formulaire d'identification. + +```html + + +
+
+ + +
+
+ + +
+
+ +
+
+``` + +### /Auth.php : Traitement du formulaire + +```php +getMessage(); + } +} + +``` \ No newline at end of file diff --git a/docs/tp/web/php/formulaires/formulaires-dao.md b/docs/tp/web/php/formulaires/formulaires-dao.md new file mode 100644 index 0000000..e3e87cc --- /dev/null +++ b/docs/tp/web/php/formulaires/formulaires-dao.md @@ -0,0 +1,291 @@ +--- +title: "PHP: Formulaires 3" +serie: "php" +order: 14 +--- + +## Prerequis + +- Avoir terminé et corrigé la partie précédente [Introduction aux formulaires avec PHP](./formulaires-intro). + +## Validation des données du formulaire + +Dans la partie précédente, vous avez implémenté un formulaire de contact avec un traitement backend dans un script PHP. + +Une fois les données validées, il vous a été demandé de les afficher. + +Dans cette partie, vous allez mettre en place la persistance dans une base de données. + +Reprenons [l'exemple de la partie 1](./formulaires-intro). Le formulaire demande à l'utilisateur de saisir son nom et son âge : + +**Le formulaire...** + +```html + +
+ + + + + + + +
+``` + +**...et le traitement backend avec les contrôles de saisie** + +```php + ['min_range' => 1, 'max_range' => 120]] + )) { + throw new Exception('L\âge renseigné est invalide'); + } + + // Une fois les contrôles effectués, et à partir de ce point, on considère les données valides. Nous pouvons donc les exploiter. + + // Afficher les données + echo "

Informations soumises :

"; + echo "Nom : " . $nom . "
"; + echo "Âge : " . $age . "
"; + } catch(Exception $ex) { + // Si une erreur est levée dans le bloc "try" ci-dessus, l'erreur correspondante est affichée et le script s'arrête + echo $ex->getMessage(); + exit; + } +} +``` + +Une fois les contrôles de saisie effectués, il convient maintenant d'exploiter les données du formulaire. + +Selon le besoin, vous pouvez : + +- Afficher les données sans rien faire d'autre + - c'est ce qui est fait dans l'exemple ci-dessus +- Transmettre les données par email + - pour un formulaire de contact par exemple +- Enregistrer les données dans une base de données + - c'est ce que nous allons faire dans la suite de ce document + +## La base de données + +Pour illustrer la persistance des données, nous allons créer une petite base de données qui stockera les informations transmises par notre formulaire. + +Cette base de donnés contiendra 1 seule table comme illustré dans le code ci-dessous. + +```sql +/* mysql */ +DROP DATABASE IF EXISTS demo_formulaire; + +CREATE DATABASE IF NOT EXISTS demo_formulaire; + +USE demo_formulaire; + +CREATE TABLE tbl_formulaire +( + id INT PRIMARY KEY AUTO_INCREMENT, + nom VARCHAR(50) NOT NULL, + age INT NOT NULL +); +``` + +Une fois la base de données en place, nous pouvons implémenter une couche d'accès aux données qui sera composée de 2 éléments : + +- Une classe `DbConnect` qui servira à se connecter à la base de données. + - Cette classe implémentera le Design Pattern **Singleton** +- Une classe `FormRepository` qui contiendra les "requêtes" vers la base de données. + +Ces 2 classes seront créées dans un sous dossier **Dao** du projet. + +L'arborescence du projet doit ressembler à ceci : + +``` +/mon-projet/ + - index.html (le formulaire) + - traitement.php (traitement du formulaire) + - Dao/ + - DbConnect.php (la classe de connection à la base de données) + - FormRespository.php (la classe qui contiendra les opérations vers la base de données) +``` + +```php +/* /Dao/DbConnect.php */ +/** + * Classe de connexion à la base de données +*/ +class DbConnect +{ + /** @var PDO|null $instance stockage de l'instance PDO unique */ + private static ?PDO $instance = null; + + /** + * Créer et retourne l'instance PDO + * @return PDO l'instance PDO créée + */ + public static function getInstance(): PDO { + if(self::$instance === null) { + self::$instance = new PDO('mysql:host=localhost;port=3306;dbname=demo_formulaire;charset=utf8', 'root', ''); + } + + return self::$instance; + } +} +``` + + +```php +/* /Dao/FormRepository.php */ + +// inclusion de la classe DbConnect qui sera utilisée dans la méthode insertData() +require_once 'Dbconnect.php'; + +class FormRepository +{ + /** + * Ajoute une nouvelle ligne dans la table 'tbl_formulaire' + * @param string $nom le nom renseigné dans le formulaire + * @param int l'âge renseigné dans le formulaire + * @return bool TRUE si l'ajout a réussi, sinon FALSE + */ + public static function insertData(string $nom, int $age): bool { + + /** @var PDO $db connexion à la base de données */ + $db = Dbconnect::getInstance(); + + /** @var $nblines stockera le nombre de lignes affectées par la requête */ + $nblines = 0; + + /** @var PDOStatement $stmt initialisation de la requête préparée */ + $stmt = $db->prepare("INSERT INTO tbl_formulaire (nom, age) VALUES (:nom, :age)"); + + // exécution de la requêtes préparée + // execute() retourne true si la requête a été exécutée avec succés, sinon false + if($stmt->execute([':nom' => $nom, ':age' => $age])) { + // récupération du nombre de lignes affectées par la requête + $nblines = $stmt->rowCount(); + } + + // fermeture de la requête (pour libérer les ressources) + $stmt->closeCursor(); + + // Retourne le résultat. + // Si le nombre de lignes affectées est égal à 1, les données ont bien été insérées + return $nblines == 1; + } +} +``` + +Une fois ces classes implémentées, nous pouvons maintenant invoquer la méthode **insertData** de la classe **FormRepository** afin d'enregistrer les données du formulaire dans la base de données. + +Cette méthode sera appelée dans le fichier **traitement.php** après la validation des données. + +Le code ci-dessous illustre les modifications apportées au fichier **traitement.php** : + +```php + ['min_range' => 1, 'max_range' => 120]] + )) { + throw new Exception('L\âge renseigné est invalide'); + } + + // Une fois les contrôles effectués, et à partir de ce point, on considère les données valides. Nous pouvons donc les exploiter. + + // Sauvegarde dans la base de données et affichage du résultat + if(FormRepository::insertData($nom, $age)) { + echo 'Les données ont bien été sauvegardées'; + } else { + echo 'Erreur lors de la sauvegarde des données'; + } + + // Ajout d'un lien pour retourner vers le formulaire + echo '

Retour au formulaire

'; + + + } catch(Exception $ex) { + // Si une erreur est levée dans le bloc "try" ci-dessus, l'erreur correspondante est affichée et le script s'arrête + echo $ex->getMessage(); + exit; + } +} +``` + +## Exercez vous + +### Formulaire de contact + +Reprenez l'exercie "Formulaire de contact" que vous avez réalisé précédemment + +**Tâches à réaliser :** + +1. Créer une base de données **db_contact** dans laquelle vous ajouterez une table **tbl_contact** + - La table doit permettre de stocker toutes les informations saisies dans le formulaire et contiendra les champs suivants (tous obligatoires): + - id INT AUTO_INCREMENT PRIMARY KEY + - nom VARCHAR(50) + - date_naissance DATE + - email VARCHAR(128) + - message TEXT +2. Créer la classe **Dbconnect** en reprenant les informations de connexion à votre base de données +3. Créer la classe **ContactRepository** qui contiendra une méthode **insertMessage** qui permettra d'ajouter une nouvelle ligne dans la table **tbl_contact** +4. Dans le fichier **traitement-contact.php** + 1. Invoquer la méthode **insertMessage** de la classe **ContactRepository** après la validation des données. + 2. Afficher le résultat de l'insertion : + - "*Votre message a été envoyé*" en cas de succès. + - "*Erreur lors de l'enregistrement de votre message*" en cas d'échec. + 3. Ajouter un lien permettant à l'utilisateur de retourner vers le formulaire de contact. + + +> Valider votre travail avec un formateur. diff --git a/docs/tp/web/php/formulaires/formulaires-intro-correction.md b/docs/tp/web/php/formulaires/formulaires-intro-correction.md new file mode 100644 index 0000000..5f125c4 --- /dev/null +++ b/docs/tp/web/php/formulaires/formulaires-intro-correction.md @@ -0,0 +1,155 @@ +--- +title: "PHP: Formulaires 2" +serie: "php" +order: 13 +--- + +## Prerequis + +- Avoir terminé la partie précédente [Introduction aux formulaires avec PHP](./formulaires-intro). + +## Corrigé type + +Dans la partie précédente, vous avez implémenté un formulaire avec un traitement backend dans un script PHP. + +Le formulaire devrait ressembler à ceci : + +### Formulaire HTML + +```html +
+ +
+ + +
+
+ + +
+
+ + +
+
+ + +
+ + +
+``` + +Lorsque le formulaire est soumis, le fichier **traitement-contact.php** : +1. Vérifie qu'il s'agit bien d'une requête **POST**, +2. Récupère les informations saisies, +3. Affiche les informations saisies. + +```php +Informations soumises :"; + echo "Nom : " . $nom . "
"; + echo "Date de naissance : " . $dateDeNaissance . "
"; + echo "Adresse Email : " . $email . "
"; + echo "Message : " . $message . "
"; +} +``` + +Le script ci-dessus fonctionne mais n'effectue aucun contrôle sur la saisie utilisateur. Si un utilisateur malveillant soumet des informations vérolées (des balises HTML, du Javascript etc...), votre système et vos utilisateurs sont exposés. + +En d'autres termes, le code précédent est une porte ouverte pour les eventuels pirates... + +Il convient donc de contrôler toutes les données transmises. Pour chaque champ du formulaire, vous devez : +1. Vérifier que tous le champ a bien été soumis +2. Vérifier que la donnée soumise correspond au format attendu +3. Nettoyer les données qui peuvent contenir du code malveillant + +Par exemple, + +- Pour du texte, une expression régulière permet de contrôler que la donnée respecte un certain format. +- Pour les données numériques, il convient de s'assurer que la donnée soumise est bien un nombre (entier ou décimal, selon le besoin). +- etc... ([Plus d'infos sur la page précédente](./formulaires-intro)) + +PHP propose des fonctions permettant de contrôler la majorité des formats de données soumises dans les formulaires. + +Dans l'exercice courant, il convient donc de contrôler le nom, la date de naissance, l'adresse email et le message soumis dans le formulaire. Le code ci-dessous illustre ces contrôles de saisie. + +```php +setTime(0, 0, 0, 0); + + // Si la date fournie est supérieure ou égale à la date du jour: erreur + if($date >= $auj) { + throw new Exception('La date doit être dans le passé !'); + } + + // Si le format de l'email est incorrect : erreur + if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { + throw new Exception('Le format de l\'adresse e-mail est incorrect.'); + } + + // Nettoyage du message (suppression des balises HTML) + $message = strip_tags($message); + // Convertit les sauts de lignes en balises `
` + $message = nl2br($message); + + // A partir de ce point, on estime que les données sont correctes (aucune erreur levée) + + // Afficher les données + echo "

Informations soumises :

"; + echo "Nom : " . $nom . "
"; + echo "Date de naissance : " . $dateDeNaissance . "
"; + echo "Adresse Email : " . $email . "
"; + echo "Message :
" . $message . "

"; + } + catch(Exception $ex) { + // Si une erreur est levée dans le bloc "try" ci-dessus, l'erreur correspondante est affichée + echo $ex->getMessage(); + exit; + } // fin du try/catch + +} // fin du if !empty($_POST) + +``` + +> Vérifiez votre code, corrigez le si nécessaire car il sera réutilisé dans les parties suivantes (vous allez faire évoluer votre petit projet de formulaire de contact). + +Une fois terminé, vous pouvez [accéder à la suite](./formulaires-dao) diff --git a/docs/tp/web/php/formulaires/formulaires-intro.md b/docs/tp/web/php/formulaires/formulaires-intro.md new file mode 100644 index 0000000..233ff8b --- /dev/null +++ b/docs/tp/web/php/formulaires/formulaires-intro.md @@ -0,0 +1,195 @@ +--- +title: "PHP: Formulaires" +serie: "php" +order: 12 +--- + +Le HTML permet de créer des [formulaires](https://developer.mozilla.org/fr/docs/Learn_web_development/Extensions/Forms/Your_first_form). Cependant, pour récupérer et manipuler les données envoyées, un langage "serveur" (PHP, Java, C#...) est nécessaire. + +Voici un exemple simple de formulaire traité avec PHP pour vous aider à démarrer. + +Le formulaire ci-dessous permet à un utilisateur de saisir son nom et son âge, puis affiche ces informations après la soumission. + +### Formulaire HTML + +```html + +
+ + + + + + + + +
+``` + +Dans le code précédent : + +- La balise `
` contient 2 attributs : + - **action="traitement.php"** : indique vers quel script les données du formulaire seront soumises. + - **method="POST"** : indique la [méthode HTTP](https://developer.mozilla.org/fr/docs/Web/HTTP/Methods) utilisée pour transmettre les données au script indiqué par l'attribut *action*. +- Le formulaire utilise donc la méthode `POST` pour envoyer les données à `traitement.php`. +- Le champ `nom` est de type text. +- Le champ `age` est de type number. + +### Script PHP (traitement.php) + +```php +Informations soumises :"; + echo "Nom : " . $nom . "
"; + echo "Âge : " . $age . "
"; +} +``` + +- Le script vérifie si la méthode de la requête est `POST`. +- Les données du formulaire sont récupérées. +- Les informations saisies sont ensuite affichées. + +> Plus d'infos sur le traitement des formulaires avec PHP : [PHP: Utiliser les formulaires](https://www.php.net/manual/fr/tutorial.forms.php) + +--- + +Lorsque le formulaire est soumis, les données sont transmises au script PHP indiqué dans l'attribut `action` de la balise ``. +La [méthode HTTP](https://developer.mozilla.org/fr/docs/Web/HTTP/Methods) utilisée (attribut `method` de la balise ``) permet de déterminer où les données seront disponibles après soumission du formulaire. + +Selon la méthode utilisée par le formulaire, les données sont disponibles: +- Dans le tableau `$_GET` si le formulaire est soumis avec la méthode `GET`. +- Dans le tableau `$_POST` si le formulaire est soumis avec la méthode `POST`. + +> **$_GET** et **$_POST** sont des variables **Superglobales**, ce qui signifie qu'elles sont disponibles quel que soit le contexte du script. + +Le formulaire contient 2 champs : `nom` et `age` (visible dans l'attribut `name` de chaque champ). + +Lorsque le formulaire est soumis, PHP va utiliser la valeur de l'attribut `name` de chaque champ pour créer un tableau associatif dont les clés seront les `name` des différents champs et la valeur associée sera celle saisie dans le champ correspondant. + +- Pour le champ "nom" (``), la valeur saisie sera disponible dans `$_POST['nom']`. +- Pour le champ "age" (``), la valeur saisie sera disponible dans `$_POST['age']`. + +### Never Trust User Input + +*Il convient de contrôler les données soumises dans un formulaire car ... **[NEVER TRUST USER INPUT !](https://www.garybell.co.uk/never-trust-user-input/)**.* + +Les contrôles effectués côté serveur avec PHP **seront plus efficaces et sécurisés** que tous les contrôles côté client avec Javascript (Javascript peut être désactivé dans le navigateur client). + +- Mettre en place les contrôles coté *frontend* (avec l'attribut HTML *[pattern](https://developer.mozilla.org/fr/docs/Web/HTML/Attributes/pattern)* et/ou avec Javascript) offrira à l'utilisateur un confort d'utilisation amélioré (pas besoin de recharger la page pour voir les erreurs de saisie). + +- Mettre en place les contrôles coté *backend* sécurisera votre système (serveur, base de données) et vos utilisateurs. + +#### Contrôlez systématiquement les données entrantes + +- Pour les champs de type texte, le contrôle sera généralement effectué avec une **expression régulière (Regex)** et la fonction **[preg_match()](https://www.php.net/manual/fr/function.preg-match.php)**. +- Pour les données numériques, les fonctions **[filter_var()](https://www.php.net/manual/fr/function.filter-var.php)**, **[intval()](https://www.php.net/manual/fr/function.intval.php)** et/ou **[floatval()](https://www.php.net/manual/fr/function.floatval.php)** peuvent être utiles. +- Pour les dates, contrôler la validité et le format de la date avec la classe **[DateTime](https://www.php.net/manual/fr/class.datetime.php)**. + +Consultez la page de la fonction **[filter_var()](https://www.php.net/manual/fr/function.filter-var.php)** pour découvrir tous les contrôles disponibles dans le langage PHP. + +Si vous devez contrôler des formats de données particuliers, vous devrez probablement utiliser des expressions régulières. + + +**Reprenons notre script traitement.php et ajoutons-y des contrôles de saisie :** + +```php + ['min_range' => 1, 'max_range' => 120]] + )) { + throw new Exception('L\âge renseigné est invalide'); + } + + // Une fois les contrôles effectués, et à partir de ce point, on considère les données valides. Nous pouvons donc les exploiter. + + // Afficher les données + echo "

Informations soumises :

"; + echo "Nom : " . $nom . "
"; + echo "Âge : " . $age . "
"; + } catch(Exception $ex) { + // Si une erreur est levée dans le bloc "try" ci-dessus, l'erreur correspondante est affichée et le script s'arrête + echo $ex->getMessage(); + exit; + } +} +``` + +## Exercez vous + +### Formulaire de contact + +Créer un répertoire pour cet exercice. + +Créer un fichier `contact.html` et y implémenter un formulaire de contact demandant à l'utilisateur de saisir : + +- Un nom (input de type "text") +- Une date de naissance (input de type "date") +- Une adresse email (input de type "email") +- Un message (textarea) + +Le formulaire doit être soumis avec la méthode `POST` vers le fichier `traitement-contact.php`. + +Dans le même répertoire, créer ensuite un fichier `traitement-contact.php` qui implémentera les opérations suivantes : + +- Contrôler si le méthode utilisée est bien `POST`. +- Récupérer les informations saisies dans le formulaire dans des variables. +- Afficher les données saisies. + +Lorsque vous avez terminé d'implémenter ces 2 fichiers et après avoir vérifié leur bon fonctionnement, trouvez une solution pour contrôler les données saisies : + +- Le nom doit contenir au moins 2 caractères et ne peut contenir que des lettres. +- La date doit être dans le passé. +- L'adresse email doit être dans le bon format. +- Le message ne doit pas contenir de balises HTML. + +Lorsque vous avez terminé d'implémenter ces contrôles, ajouter la vérification suivante : + +- A partir de la date de naissance, calculer l'âge. + - Si l'âge est inférieur à 18, afficher l'erreur "vous êtes mineur, accès interdit". + - si l'âge est supérieur ou égal à 18, afficher les données saisies dans le formulaire ainsi que l'âge calculé. + +## Pour vous aider : + +- [Les formulaires HTML (MDN)](https://developer.mozilla.org/fr/docs/Learn_web_development/Extensions/Forms/Your_first_form) +- [Validation des formulaires coté frontend (MDN)](https://developer.mozilla.org/fr/docs/Learn_web_development/Extensions/Forms/Form_validation) +- [Traiter des formulaires avec PHP (Apprendre PHP)](https://www.apprendre-php.com/tutoriels/tutoriel-12-traitement-des-formulaires-avec-get-et-post.html) +- [Valider des formulaires avec PHP (Pierre GIRAUD)](https://www.pierre-giraud.com/php-mysql-apprendre-coder-cours/securiser-valider-formulaire/) + + +> Valider votre travail avec un formateur. + +Lorsque vous avez terminé, vous pouvez [accéder à la suite](./formulaires-intro-correction) \ No newline at end of file