Compare commits

..

323 Commits
master ... skb

Author SHA1 Message Date
Benjamin Bohard f8d678994b Éléments pour le manuel de la mallette pédagogique 2020-08-05 14:32:43 +02:00
Benjamin Bohard 356a0a9689 Correction pour la passage en python 3 2020-08-05 14:29:14 +02:00
Benjamin Bohard 00ff5356c9 ajustements de mise en page pour les documents type article 2020-08-05 14:29:14 +02:00
Benjamin Bohard f9b473a7d9 WIP 2020-08-05 14:29:14 +02:00
Emmanuel Garette dc5480785e correction 2020-07-06 16:51:49 +02:00
Philippe Caseiro 8f3d52eaee Update ScribeHorus 2020-02-07 09:13:06 +01:00
Benjamin Bohard 156d34e91e support de formation Scribe-Horus d’octobre 2019 2019-10-22 13:54:37 +02:00
Benjamin Bohard 510129b96e Révision de la formation ScribeAD-HorusAD 2019-10-09 16:57:11 +02:00
Benjamin Bohard e940a629d8 Mise à jour de la formation ScribeAD-HorusAD 2019-10-09 10:38:31 +02:00
Benjamin Bohard 318c24f60b Révision du script d’initialisation des documents de formation 2019-10-09 10:30:01 +02:00
Benjamin Bohard d27cbaf6ce Modifications pour la Nouvelle-Calédonie 2019-10-04 08:09:45 +02:00
Benjamin Bohard 6223b6b0f7 Mise à jour 2019-10-04 08:09:45 +02:00
Philippe Caseiro 7333bd2ad6 Mise à jour dse formations ScribeHorus 2019-10-02 16:03:36 +02:00
Benjamin Bohard 5e6aac0afd Fixes framesubtitle used twice in a frame 2019-04-09 20:36:27 +02:00
Benjamin Bohard ee40013d4f Fixes syntax for description environment 2019-04-09 20:34:14 +02:00
Benjamin Bohard bfd37a48db Détail sur les comptes d’un module Horus 2019-04-09 13:33:54 +02:00
Benjamin Bohard 7ff1621a09 Changement du titre 2019-04-07 21:27:26 +02:00
Benjamin Bohard 757b8c9a1e Réintroduction de la partie zéphir 2 et configuration de Horus 2019-04-07 21:25:37 +02:00
Benjamin Bohard 10b957930f Utiliser le routeur pour faciliter le déploiement 2019-04-07 12:12:41 +02:00
Benjamin Bohard 69392c851a Utiliser des ova plutôt que des images de disque simples 2019-04-07 09:58:26 +02:00
Philippe Caseiro 5f623509c8 Update plan show options 2019-04-07 05:48:47 +02:00
Philippe Caseiro 7ac1e75ec4 Adding MENJ logowq 2019-04-07 02:31:38 +02:00
Benjamin Bohard 047e6bddf8 Reprise de la formation scribe horus tronc commun 1 pour la Nouvelle Calédonie 2019-04-07 01:07:53 +02:00
Benjamin Bohard 7fc315f0ad Chambéry 2019-03-25 13:20:07 +01:00
Benjamin Bohard e79bdb1ff0 wip 2019-03-25 13:20:07 +01:00
Benjamin Bohard 5b34655e4c Récupération des fragments manquants 2019-03-25 13:20:07 +01:00
Benjamin Bohard ce9ee26e78 Mise à jour des utilitaires pour la création des formations 2019-03-25 13:20:07 +01:00
Benjamin Bohard ddd71f3332 Composition de la formation pour le conseil départemental 73 2019-03-25 13:20:07 +01:00
Benjamin Bohard 79a7a997bb Initialisation du projet de formation pour le conseil départemental de Savoie 2019-03-25 13:20:07 +01:00
Benjamin Bohard 525d75a3f6 Mise à jour des fichiers communs et script d’initialisation 2019-03-25 13:20:07 +01:00
Benjamin Bohard 893066181c Prise en compte d'un argument positionnel pour restreindre la recherche des programmes à compiler à un répertoire 2019-03-25 13:20:07 +01:00
Benjamin Bohard dbb51ab930 Exclure les fichiers temporaires de la coloration syntaxique. 2019-03-25 13:20:07 +01:00
Gérald Schwartzmann ac59103f33 Rédaction du README
Explications sur comment utiliser le .tex
2019-03-25 13:20:07 +01:00
Benjamin Bohard 56c3c52fbb remise au propre après déplacements 2019-03-25 13:20:07 +01:00
Emmanuel Garette dbf61a7e4e ajouter l'option shell-escape à xelatex pour les exercices TC2 2019-03-25 13:16:10 +01:00
wpetit b465d9156c CESI - Exo Microbloggr Solution - Création de statuts fonctionnelle 2019-03-25 13:16:10 +01:00
wpetit 165dd355e6 CESI - Exo Microbloggr Solution - Authentification fonctionnelle 2019-03-25 13:16:09 +01:00
wpetit 27c76de966 Intro Big Data: mise à jour slides + données d'exemple graphe 2019-03-25 13:16:09 +01:00
wpetit 845ca0f67b Architecture N Tiers: ajout QCM 2019-03-25 13:16:09 +01:00
gwen 97dd70b285 some cleaning 2019-03-25 13:16:09 +01:00
wpetit cfd94c08b6 CESI: Intro Big Data - ajout exercice bdd clé/valeur et graphe 2019-03-25 13:16:09 +01:00
wpetit 0918bbb1bb CESI: Intro Big Data - ajout tuile + exercice BDD orientée graphe 2019-03-25 13:16:09 +01:00
wpetit 1ba5a6d790 CESI: Intro Big Data, biblio + environnement démo Hadoop 2019-03-25 13:16:09 +01:00
gwen fede121bc4 algo et data science 2019-03-25 13:16:09 +01:00
wpetit f20ef936ce CESI: Intro Big Data, base bibliographie 2019-03-25 13:16:09 +01:00
gwen 008090d721 python2 -> python subfolder 2019-03-25 13:16:09 +01:00
gwen 0d286b85a0 en and fr python3 courses 2019-03-25 13:16:09 +01:00
gwen 323b4f6685 ancien cours python -> python2 2019-03-25 13:16:09 +01:00
gwen 1418454c18 algorithmique : api et paramètres 2019-03-25 13:16:09 +01:00
wpetit 10485c94f1 CESI: DevOps, mise à jour des slides 2019-03-25 13:16:09 +01:00
wpetit f5356e2e41 CESI: Métiers DevOps, base slides 2019-03-25 13:16:09 +01:00
wpetit b7f40beda0 DIIAGE: session 23/03/2018 2019-03-25 13:16:09 +01:00
wpetit 00c308cca6 Logomotion: React+Redux, corrections typo 2019-03-25 13:16:09 +01:00
wpetit 675ad0fb70 Logomotion: Qualification 2019-03-25 13:16:09 +01:00
wpetit 68a2e82bf2 Logomotion: React + Redux 2019-03-25 13:16:09 +01:00
wpetit bf25f8b140 CESI: Architectures N Tiers, ajout mini projet 'Alfred' 2019-03-25 13:16:09 +01:00
wpetit 506d99e91b DIIAGE: ajout derniers cours 2019-03-25 13:16:09 +01:00
wpetit 3998722c7f Logomotion: Base des slides pour la formation sur la qualification 2019-03-25 13:16:09 +01:00
wpetit 10e0f69dba CESI: Sécurité entreprise, maquette + support OK 2019-03-25 13:16:09 +01:00
wpetit 13e4a95892 CESI: Sécurité des entreprises, infrastructure Vagrant avec supervision Prometheus 2019-03-25 13:16:09 +01:00
wpetit 708bed3a16 CESI: présentation + maquette Vagrant Sécurité entreprise 2019-03-25 13:16:09 +01:00
wpetit 1fd175b4c9 Logomotion: maj formation Sécurité Web 2019-03-25 13:16:09 +01:00
wpetit de6251fed3 Logomotion: Sécurité Web, sécurisation du serveur GNU/Linux 2019-03-25 13:16:09 +01:00
wpetit 4e4cf16e97 Logomotion: sécurité web, ajout exercice métrologie 2019-03-25 13:16:09 +01:00
wpetit b975949318 CESI: Architecture N Tiers, exemple microservices 2019-03-25 13:16:09 +01:00
wpetit 8d6f44d938 Logomotion: Sécurité Web 2019-03-25 13:16:09 +01:00
wpetit 3d295bac6e DIIAGE: session 19/01/2018 2019-03-25 13:16:09 +01:00
wpetit bcb396d40c DIIAGE: Prépa session 19/01/2018 2019-03-25 13:16:09 +01:00
wpetit 1b1f48a0e3 CESI: architectures n tiers 2019-03-25 13:16:09 +01:00
wpetit f679c37468 CESI: Architecture N tiers 2019-03-25 13:16:09 +01:00
wpetit 20cbdeef8d CESI: Architecture N tiers, exercice 2019-03-25 13:16:09 +01:00
wpetit 34833d8186 CESI: Architecture N Tiers 2019-03-25 13:16:09 +01:00
wpetit 3e85ca32a0 CESI: mise à jour fiche de préparation Architecture N tiers 2019-03-25 13:16:09 +01:00
wpetit 3d2afb8b17 Logomotion: mise à jour introduction framework javascript 2019-03-25 13:16:09 +01:00
wpetit 7add972706 Logomotion: tour d'horizon Javascript, base EmberJS 2019-03-25 13:16:09 +01:00
wpetit d3914eb51e Logomotion: Introduction Javascript 2019-03-25 13:16:09 +01:00
wpetit 050515bbe6 Logomotion: slides Symfony3 seconde journée 2019-03-25 13:16:09 +01:00
wpetit 6fa95a6de9 Logomotion: suites des slides Symfony3 2019-03-25 13:16:09 +01:00
wpetit 4d1f3f73e1 CESI: réorganisation de l'arborescence 2019-03-25 13:16:09 +01:00
wpetit c3e75343db DIIAGE: réorganisation des questions 2019-03-25 13:16:09 +01:00
wpetit a9dba3b3b6 DIIAGE: TP sécurité des applicaiton web & métrologie appliquée à la sécurité 2019-03-25 13:16:09 +01:00
wpetit c90015ab94 Logomotion: Volet sécurité des applications Web, métrologie / prometheus 2019-03-25 13:16:09 +01:00
wpetit 884905c1db Diiage: préparation QCM évaluation 22/12/2017 2019-03-25 13:16:09 +01:00
wpetit 312c465084 Remise à niveau Symfony3: slides 2019-03-25 13:16:09 +01:00
wpetit 3eb9b8da29 Symfony3: slides + revue planning journée 1 2019-03-25 13:16:09 +01:00
wpetit a741a6b20e Remise à niveau Symfony3: slides + planning 2019-03-25 13:16:09 +01:00
wpetit bef56bc3b4 CESI: Mise à jour slides/planning "Sécurité en entreprise" 2019-03-25 13:16:09 +01:00
wpetit 23c84980a2 CESI: Mise à jour programme formation "Sécurité en entreprise" 2019-03-25 13:16:09 +01:00
wpetit 150ba9180a Ajout des fichiers de lock LibreOffice à la liste des ignorés 2019-03-25 13:16:09 +01:00
wpetit bde23f198d CESII: Mise à jour slides, planning et notes 2019-03-25 13:15:33 +01:00
wpetit 21fa68542c CESII: Slides formation sécurité entreprise 2019-03-25 13:15:33 +01:00
wpetit e65a11ae3b DIIAGE: mise à jour sujet TP 2019-03-25 13:15:33 +01:00
wpetit e92e905ec4 DIIAGE: Préparation session 20171208 2019-03-25 13:15:33 +01:00
wpetit 0bcbd982cb Ajout rendus TP 2019-03-25 13:15:33 +01:00
wpetit fc21384b39 Préparation cours DIIAGE 08/12/2017 2019-03-25 13:15:33 +01:00
wpetit 4b9665c390 Création de fiches d'exemple 2019-03-25 13:15:33 +01:00
wpetit 4db1f56cd6 Ajout supports formation DIIAGE (DEV & RES 3) 2019-03-25 13:15:33 +01:00
gwen 894a252479 algo avancée 2019-03-25 13:15:33 +01:00
gwen 4a3107fd62 exercices de programmation raisonnée 2019-03-25 13:15:33 +01:00
gwen 1d4ba95e00 algo avancée 2019-03-25 13:15:33 +01:00
gwen 2ed2488a47 algo : problèmes NP complets 2019-03-25 13:15:33 +01:00
gwen b5b00ce4d3 méthodes de tri rapide en python 2019-03-25 13:15:33 +01:00
gwen bf45ad7859 support de cours algo avancée - correction unicode 2019-03-25 13:15:33 +01:00
gwen a04519ca4a support de cours algo avancée 2019-03-25 13:15:33 +01:00
gwen 07b57d4515 contrainte de type par signature 2019-03-25 13:15:33 +01:00
gwen 98dd6eea17 corrections cours poo 2019-03-25 13:15:33 +01:00
gwen 14212752fc premiere version stable du cours de poo 2019-03-25 13:15:33 +01:00
Philippe Caseiro 051c60fed6 Correction du public pour les méthodes AGile 2019-03-25 13:15:33 +01:00
Benjamin Bohard 116fe4fcab relecture de qualification 2019-03-25 13:15:33 +01:00
Benjamin Bohard 7954bdadad relecture des méthodes agiles 2019-03-25 13:15:33 +01:00
Benjamin Bohard bf6fc81fd0 relecture de la messagerie électronique 2019-03-25 13:15:33 +01:00
Benjamin Bohard 7973e2bfc8 relecture 2019-03-25 13:15:33 +01:00
Benjamin Bohard ca20fc14f1 relecture 2019-03-25 13:15:33 +01:00
Benjamin Bohard e4bc8d7263 relecture 2019-03-25 13:15:33 +01:00
Benjamin Bohard 450ad67479 relecture 2019-03-25 13:15:33 +01:00
Benjamin Bohard 6c1b3698ef relecture 2019-03-25 13:15:33 +01:00
Philippe Caseiro a214ef0eda Mise à jour durée 2019-03-25 13:15:33 +01:00
Philippe Caseiro 8918d71c0a Coquillesé 2019-03-25 13:15:33 +01:00
wpetit a5dc1cce72 Programme de formation Logomotion - version LaTeX 2019-03-25 13:15:33 +01:00
Philippe Caseiro 9dd4040359 Retour de inc dans le dépôt 2019-03-25 13:15:33 +01:00
Benjamin Gaudé 26b808e5ad Relecture - Corrections 2019-03-25 13:15:33 +01:00
Philippe Caseiro becb4ce2c9 Retour du style dans le dépôt 2019-03-25 13:15:33 +01:00
Philippe Caseiro 07d685df35 Mise à jour du tire de la formation 2019-03-25 13:15:33 +01:00
Philippe Caseiro 6ffd056366 Mise à jour du tire de la formation 2019-03-25 13:15:33 +01:00
Philippe Caseiro 3e4e753cfb Mise à jour des plans de formation methodes agiles, qualification et smtp-imap 2019-03-25 13:15:33 +01:00
Philippe Caseiro 750d161159 Now we can build only one program
./programme.sh my_directory
2019-03-25 13:15:33 +01:00
Philippe Caseiro 778e98356a Ajout du programme de qualification 2019-03-25 13:14:17 +01:00
Philippe Caseiro b80967a4f0 Ajout du programme de la formation AGILE 2019-03-25 13:14:17 +01:00
Benjamin Gaudé eeb73453e4 Precisions partie symfony 3 2019-03-25 13:14:17 +01:00
Philippe Caseiro 4b2a295589 Ajout du plan de formation pour Logomotion 2019-03-25 13:14:17 +01:00
Philippe Caseiro 43ff0af8a8 Ajout du programme pour la formation smtp-imap 2019-03-25 13:14:17 +01:00
gwen d994e6762b modèle objet de python 2019-03-25 13:14:17 +01:00
gwen 0d2e9732b3 méchanismes objets 2019-03-25 13:14:17 +01:00
gwen baab6fdd1f debut du cours de poo 2019-03-25 13:14:17 +01:00
gwen 9a03e5190d tronc commun algo/algo approfondie 2019-03-25 13:14:17 +01:00
gwen ca7c2df715 tronc commun 2019-03-25 13:14:17 +01:00
gwen a375adbd45 menage 2019-03-25 13:14:17 +01:00
gwen ea52e31866 mise en place des cours algo + poo 2019-03-25 13:14:17 +01:00
gwen de3a902fc5 mise en place des cours poo et algo approfondie 2019-03-25 13:14:17 +01:00
gwen 0f29f8442d alog : rappels de cybernétique 2019-03-25 13:14:17 +01:00
gwen 018af24545 notes pour amélioration du cours 2019-03-25 13:14:17 +01:00
gwen b98c46b4ae corrections du cours après la présentation 2019-03-25 13:14:17 +01:00
gwen 08495c6a07 typo 2019-03-25 13:14:17 +01:00
gwen 07e85ce432 exercices de travaux pratiques 2019-03-25 13:14:17 +01:00
gwen c225693e35 premiers sujets de tp 2019-03-25 13:14:17 +01:00
gwen 635b81422b logos 2019-03-25 13:14:17 +01:00
gwen 175a8424f9 diaporama algorithmique 2019-03-25 13:14:17 +01:00
gwen 29e46e0e16 présentation beamer 2019-03-25 13:14:17 +01:00
gwen dcfe04bd9b template de présentation beamer 2019-03-25 13:14:17 +01:00
gwen 90a02579ac exercices de manipulation des structures de données 2019-03-25 13:14:17 +01:00
gwen c495caed08 exercices supplémentaires 2019-03-25 13:14:17 +01:00
gwen eb3e054e8c ajout du diaporama 2019-03-25 13:14:17 +01:00
gwen c9f85c3355 suprression des warning au build 2019-03-25 13:14:17 +01:00
gwen cf04024d38 suppression des derniers fixme 2019-03-25 13:14:17 +01:00
gwen c23e306403 cours : premiere version 2019-03-25 13:14:17 +01:00
gwen 11c43df090 algo programmation structurée 2019-03-25 13:14:17 +01:00
gwen 428dc25db2 langage de modules 2019-03-25 13:14:17 +01:00
gwen 7c62b61421 algorithme module python 2019-03-25 13:14:17 +01:00
gwen 310d8021b4 exercices (maximum d'une liste) 2019-03-25 13:14:17 +01:00
gwen 141f4a12a7 modulatié et programmation raisonnée 2019-03-25 13:14:17 +01:00
gwen 57244e006e exercices sur les structures de données de base (2) 2019-03-25 13:14:17 +01:00
gwen 5420d0841b exercices sur les structures de données de base 2019-03-25 13:14:17 +01:00
gwen 79eeb4a1df exos d'algo 2019-03-25 13:14:17 +01:00
gwen 2dee810ffd exercices sur les structures de controle de base 2019-03-25 13:14:17 +01:00
gwen 75b80773cc exercices sur les variables 2019-03-25 13:14:17 +01:00
gwen bf2d772c1b exemples d'algorithmes 2019-03-25 13:14:17 +01:00
Benjamin Bohard 65adac7ac9 Corrections dans l’exercice ircd 2019-03-25 13:14:17 +01:00
gwen 11b2b9f935 exemples d'algorithmes sur des structures de données simples 2019-03-25 13:14:17 +01:00
gwen b8bf37cafb structures de données (list + dico) 2019-03-25 13:14:17 +01:00
gwen a2711a778e algorithme vague 2019-03-25 13:14:17 +01:00
gwen 6e3966418f portée d'une variable 2019-03-25 13:14:17 +01:00
gwen f2e7a835f2 structures de données 2019-03-25 13:14:17 +01:00
gwen 9a14db234b organisation des exercices 2019-03-25 13:14:17 +01:00
gwen 00a9217e47 programmation modulaire 2019-03-25 13:14:17 +01:00
gwen 97a8e6d31f suppresion des Statex des algo de style impératif 2019-03-25 13:14:17 +01:00
gwen 287dc14656 ajout d'aperçu des types d'algorithmes 2019-03-25 13:14:17 +01:00
gwen 5c2ec45681 utilisation de l'extension ifconfig pour les exercices et les corrections 2019-03-25 13:14:17 +01:00
gwen a6f960e6bc reorganisation du cours 2019-03-25 13:14:17 +01:00
gwen f649769545 reorganisation du cours 2019-03-25 13:14:17 +01:00
gwen b988c5cc07 reorganisation (ordonnancement) du cours 2019-03-25 13:14:17 +01:00
gwen 07d2fa69ed presentation du cours d'algo 2019-03-25 13:14:17 +01:00
gwen f5670a7321 définition des actions d'un programme 2019-03-25 13:14:17 +01:00
gwen fdfc702149 présentation du cours et avant propos 2019-03-25 13:14:17 +01:00
Emmanuel Garette 47fa14c1af mise à jour pour PSI + raid logiciel (non inclu) 2019-03-25 13:14:17 +01:00
gwen 859f2cdf1c algorithme factorielle 2019-03-25 13:14:17 +01:00
gwen 55234742c5 diveres définitions de la programmation 2019-03-25 13:14:17 +01:00
gwen 3915b852d4 définition d'une fonction 2019-03-25 13:14:17 +01:00
gwen 9579fbc662 ajout des principales structures de contrôles 2019-03-25 13:14:17 +01:00
gwen a90179af53 instruction de saut conditionnel 2019-03-25 13:14:17 +01:00
gwen 2d4265308b ajout d'un exemple de procedure 2019-03-25 13:14:17 +01:00
gwen be32ccce02 Ajout de la notion de fonction 2019-03-25 13:14:17 +01:00
vincent 5f289978d7 correction orthographique 2019-03-25 13:14:17 +01:00
vincent 30f8406457 exo avec roundcube et non thunderbird 2019-03-25 13:14:17 +01:00
vincent 19b2b206dc ajout script création user 2019-03-25 13:14:17 +01:00
vincent 6adb6f614d mise en page 2019-03-25 13:14:17 +01:00
vincent 836c70c346 modification exercice et contenu 2019-03-25 13:14:17 +01:00
Emmanuel Garette c66700d016 amelioration création utilisateur Mysql 2019-03-25 13:14:17 +01:00
vincent 103909fe15 modification de l'exercice pour l'ajout d'application web 2019-03-25 13:14:17 +01:00
Emmanuel Garette 99737bbc87 maj log squid/e2guardian 2019-03-25 13:14:17 +01:00
Emmanuel Garette 9f706ad27b maj formation amon 2019-03-25 13:14:17 +01:00
gwen 603bbf6bf1 réflexions sur l'abstraction algorithmique 2019-03-25 13:14:16 +01:00
gwen ce0578399d définition d'un algorithme 2019-03-25 13:14:16 +01:00
gwen 380bfe4356 package algorithm 2019-03-25 13:14:16 +01:00
gwen c08cfd5492 section algorithme 2019-03-25 13:14:16 +01:00
gwen bb68fc6067 ajout des annexses 2019-03-25 13:14:16 +01:00
vincent 0ad6ba087e séparation trouver information serveur/internet + ajout info internet dans les différentes formations 2019-03-25 13:14:16 +01:00
vincent e4c68538cf ajout des coordonnées du forum EOLE 2019-03-25 13:14:16 +01:00
gwen 34aa40e3d9 présentation du cours 2019-03-25 13:14:16 +01:00
gwen 09ed36f009 debut de glossaire 2019-03-25 13:14:16 +01:00
gwen 9d22aa4bb4 debut de glossaire 2019-03-25 13:14:16 +01:00
gwen 60b1491067 methodes agiles 2019-03-25 13:14:16 +01:00
gwen 1bb3ebca56 méthodologies agiles 2019-03-25 13:14:16 +01:00
vincent 259173dd27 modification des besoins pour la prépartion de la formation scribe-horus 2019-03-25 13:14:16 +01:00
gwen 8a577a72a3 définition du cours d'algorithmique 2019-03-25 13:14:16 +01:00
gwen fed6abb954 début du cours d'algorithmique pour le CESI 2019-03-25 13:14:16 +01:00
vincent b4d14ffbcb coorection orthographique et ajout changement bacula-bareos 2019-03-25 13:14:16 +01:00
vincent 341567b3d0 modification preparation 2019-03-25 13:14:16 +01:00
vincent 9e29ca6879 mise à jour du contenu 2019-03-25 13:14:16 +01:00
vincent 1cd8714020 modification formation pour scribe 2.6 et W10 2019-03-25 13:14:16 +01:00
vincent c79cc823c5 modification contenu 2019-03-25 13:14:16 +01:00
Emmanuel Garette 38b317411a erreur chemin des dicos locals 2019-03-25 13:14:16 +01:00
Emmanuel Garette 15f0448816 mise à jour des excercices tronc-commun-2 2019-03-25 13:14:16 +01:00
Emmanuel Garette 7157bb6725 mise à jour formation tc1 et tc2 2019-03-25 13:14:16 +01:00
Philippe Caseiro 27ac5aa3c5 Ajout des nouvelles images 2019-03-25 13:14:16 +01:00
Philippe Caseiro 71bed745c0 Ajout 2.6.0 2019-03-25 13:14:16 +01:00
vincent bff6fd0347 mise à jour 2019-03-25 13:14:16 +01:00
vincent c59973e342 ajout restauration complète en 2.6 2019-03-25 13:14:16 +01:00
vincent 588a446ebd reformulation et correction orthographique 2019-03-25 13:14:16 +01:00
Emmanuel Garette 11205e7eae complement dans l'exemple d'exercice 2019-03-25 13:14:16 +01:00
Emmanuel Garette 86a64f73ce corrections 2019-03-25 13:14:16 +01:00
Emmanuel Garette 9d50c05062 ajout d'un exemple d'exercice corrigé 2019-03-25 13:14:16 +01:00
Emmanuel Garette 180780bfb3 mise à jour de la formation pour 2.6 2019-03-25 13:14:16 +01:00
Philippe Caseiro d23f750963 Fix title 2019-03-25 13:14:16 +01:00
vfebvre 792183c404 modification plan et affichage formation 2019-03-25 13:14:16 +01:00
vfebvre 99539bfbe1 ajout formation personnalidée sallanches 2019-03-25 13:14:16 +01:00
Philippe Caseiro d6d8d34c83 Adding new background 2019-03-25 13:14:16 +01:00
Philippe Caseiro 4cd17235e5 Update de la formation amon sphynx 2019-03-25 13:14:16 +01:00
gwen dd4f04fa56 ajout de doc sur les méta classes 2019-03-25 13:14:16 +01:00
gwen ad27c7704e ajout de doc sur les classes et les objets 2019-03-25 13:14:16 +01:00
gwen 5b42326506 corrections coquilles 2019-03-25 13:14:16 +01:00
gwen a5c3e0bf29 paragraphe generique 2019-03-25 13:14:16 +01:00
gwen 6f69f127b9 sphinx et docutils 2019-03-25 13:14:16 +01:00
gwen 8a8d2c1d52 ajout des imports et de sys.modules 2019-03-25 13:14:16 +01:00
gwen 8ea173ab17 ajout des design patterns 2019-03-25 13:14:16 +01:00
gwen cbecfcbc23 ajout des design patterns 2019-03-25 13:14:16 +01:00
gwen 7b99d805c6 ajout de la doc sur les exceptions 2019-03-25 13:14:16 +01:00
gwen 78acdb5816 config pour la version pdf 2019-03-25 13:14:16 +01:00
gwen 122ae1e085 editeurs python : syntaxe 2019-03-25 13:14:16 +01:00
gwen a2dd45b16a editeurs python 2019-03-25 13:14:16 +01:00
William Petit 478b2134f1 Exo ngResource 2019-03-25 13:14:16 +01:00
William Petit 65bfa0f9b3 Ajout exo protractor 2019-03-25 13:14:16 +01:00
William Petit 361715d79e Ajout exo Karma 2019-03-25 13:14:16 +01:00
William Petit 67b56e88ec Ajout exo routage 2019-03-25 13:14:16 +01:00
William Petit 84381980f7 Corrections slides 2019-03-25 13:14:16 +01:00
William Petit 3fe0bcd45d Formation Angular: exos supplémentaires 2019-03-25 13:14:16 +01:00
William Petit 7df3129ace (not) vanilla todos 2019-03-25 13:14:16 +01:00
William Petit 18aec7b86f Angular, première partie 2019-03-25 13:14:16 +01:00
William Petit a6f66208f9 Ajout exo services 2019-03-25 13:14:16 +01:00
William Petit 7cbddf946d Base formation angular+amélioration layout formations JS 2019-03-25 13:14:16 +01:00
wpetit 60d10200f7 Suppression node_modules exercices 2019-03-25 13:14:16 +01:00
wpetit f8046ab176 Nettoyage exemple tests-unitaires 2019-03-25 13:14:16 +01:00
wpetit fe2ccc442c Nettoyage exercices 2019-03-25 13:14:15 +01:00
wpetit eb7125bd6d Correction exo heritge js 2019-03-25 13:14:15 +01:00
William Petit b1cbcaefd3 Ajout exercices supplémentaires formation JS 2019-03-25 13:14:15 +01:00
wpetit ee0ae6d1be Corrections typo + exo VanillaTodos complet 2019-03-25 13:14:15 +01:00
wpetit 482caf5b47 Ajout exo VanillaTodos 2019-03-25 13:14:15 +01:00
William Petit 4a10785c1a Ajout slides supplémentaires formation JS 2019-03-25 13:14:15 +01:00
William Petit ebbfb6cc5b More Javascript 2019-03-25 13:14:15 +01:00
Benjamin Bohard d525a262de Inversion des paramètres pour bacula 2019-03-25 13:14:15 +01:00
Benjamin Bohard 4a25906d2a Ajustement du plan 2019-03-25 13:14:15 +01:00
Benjamin Bohard 84e0fa6967 Mise à jour du plan de formation 2019-03-25 13:14:15 +01:00
wpetit 95b99232a6 Formation JS, ajout slides suppl. 2019-03-25 13:14:15 +01:00
Benjamin Bohard a041e90b70 Essai de markdown pour documenter la génération des plans de formations 2019-03-25 13:14:15 +01:00
Benjamin Bohard 91fd1e10d3 Ajout de la durée 2019-03-25 13:14:15 +01:00
wpetit 26918e45b2 Ajout doc dépendances Latex 2019-03-25 13:13:21 +01:00
wpetit 708e54482b Ajout base formation Javascript 2019-03-25 13:12:26 +01:00
Benjamin Bohard 1411a3349c Relecture 2019-03-25 13:12:26 +01:00
Benjamin Bohard 1f076c6c0b Relecture 2019-03-25 13:12:26 +01:00
Benjamin Bohard d4b36cd125 Relecture 2019-03-25 13:12:26 +01:00
Benjamin Bohard 2b39d24ab8 Couleur différente pour le sous-titre de diapo 2019-03-25 13:12:26 +01:00
Benjamin Bohard 4006cde326 Arrangement des diapos trop longues 2019-03-25 13:12:26 +01:00
Benjamin Bohard a0c039ba4e Relecture scribe-horus 2019-03-25 13:12:26 +01:00
Benjamin Bohard 78102f3422 Relecture scribe-horus 2019-03-25 13:12:26 +01:00
Benjamin Bohard 55c915cd38 Relecture scribe-horus 2019-03-25 13:12:26 +01:00
Benjamin Bohard 0161468259 Relecture scribe/horus 2019-03-25 13:12:26 +01:00
Emmanuel Garette 176864177d ajout EOP 2019-03-25 13:12:26 +01:00
Emmanuel Garette 044d590441 plus de <fichier>.eol pour instance 2019-03-25 13:12:26 +01:00
vfebvre 63e1f4fc5d mise à jour schedule 2019-03-25 13:12:26 +01:00
Benjamin Bohard 74ed95a8a0 Adaptation pour EOLE 2.4.1 2019-03-25 13:12:26 +01:00
Benjamin Bohard d00ff3d73c Adaptation des dictionnaire et template pour la 2.4.x 2019-03-25 13:12:26 +01:00
Benjamin Bohard 94dd82ed99 Corrections mineures 2019-03-25 13:12:26 +01:00
Benjamin Bohard 5d6d63de55 Corrections mineures (ou pas) 2019-03-25 13:12:26 +01:00
Benjamin Bohard 82fde1dd72 Corrections mineures 2019-03-25 13:12:26 +01:00
Benjamin Bohard b1e0494239 Adaptations à la 2.4 2019-03-25 13:12:25 +01:00
Benjamin Bohard f8beb13cae Échappement des caractères spéciaux 2019-03-25 13:12:25 +01:00
Benjamin Bohard 24d6d59b87 Relecture de la formation tronc commun 1 2019-03-25 13:12:25 +01:00
Benjamin Bohard 3f2cddb0f2 Relecture et correction 2019-03-25 13:09:52 +01:00
vfebvre d1e541032b modif exercices 2019-03-25 13:09:52 +01:00
Benjamin Bohard 99de52f66b Prise en compte d'un argument positionnel pour restreindre la recherche des programmes à compiler à un répertoire 2016-03-01 11:44:10 +01:00
Benjamin Bohard 08eef1bb14 Exclure les fichiers temporaires de la coloration syntaxique. 2015-11-06 12:12:39 +01:00
Gérald Schwartzmann 0a4c8eed61 Ajout d'un complément d'information pour la formation Git 2015-08-31 12:25:09 +02:00
Gérald Schwartzmann 934758dd1d Mise à jour de la syntax pour la mise en forme dans Gogs 2015-08-31 11:57:18 +02:00
Gérald Schwartzmann 725f4d7274 Rédaction du README
Explications sur comment utiliser le .tex
2015-08-31 11:52:20 +02:00
Benjamin Bohard a67a326fef Diapo manquante 2015-07-20 17:59:57 +02:00
Benjamin Bohard d562837e6c Utilitaires pour préparer les fichiers des formations 2015-07-20 17:54:14 +02:00
Benjamin Bohard 0cc6b9bc0b Consignes plus claires pour les exercices pour une utilisation en l'absence de formateur 2015-07-20 17:53:41 +02:00
Benjamin Bohard 32ab048803 Utilisation d'une version récente de minted pour les retours à la ligne automatiques 2015-07-20 17:51:37 +02:00
Benjamin Bohard a8aa04147c Version utilisée pour la formation à OCP 2015-07-20 10:16:18 +02:00
Benjamin Bohard 232473472a Formation git 2015-07-15 20:52:22 +02:00
Benjamin Bohard dbd84ec3a0 Plan de formation git 2015-07-07 10:03:09 +02:00
Benjamin Bohard c4642d833a Ajout du nom du fichier dans le template pour faciliter la recherche 2015-07-06 15:11:15 +02:00
Benjamin Bohard 82603c4400 Ajout de diapositive 2015-07-06 15:08:31 +02:00
Benjamin Bohard acabd531bb Script de création des diapositives 2015-07-06 15:08:07 +02:00
Benjamin Bohard 62a39c31bc Ajout des diapositives 2015-07-06 15:06:10 +02:00
Benjamin Bohard 003cf96b4d Méthodes pour initialiser les fichiers de la formation 2015-07-06 14:45:39 +02:00
Benjamin Bohard 96e93882b2 Avancement du plan 2015-07-06 11:28:10 +02:00
Benjamin Bohard f8d8f8cfcf Mise en forme 2015-07-06 08:55:50 +02:00
Benjamin Bohard 2825c2c32f Mise en forme de la présentation sur git 2015-06-29 14:16:46 +02:00
Benjamin Bohard 41ef53be2e Tentative de compilation 2015-03-10 11:49:25 +01:00
Benjamin Bohard e1ad7bc2e1 remise au propre après déplacements 2015-03-10 09:20:45 +01:00
Benjamin Bohard f6d7da7878 Formation tronc commun 1 au format skb 2015-03-09 15:19:54 +01:00
Benjamin Bohard 47c26b2cfc déplacement des images et suppression de fichiers inutiles. 2015-03-09 15:07:39 +01:00
Benjamin Bohard 9e83c67bf7 répertoires pour skb 2015-03-09 09:27:18 +01:00
516 changed files with 432 additions and 10193 deletions

6
.gitignore vendored
View File

@ -11,8 +11,10 @@
*.bcf
*.idx
*.run.xml
*.pygtex
*.vrb
build-messages-*.txt
plans_de_formation.tar.gz
_minted-*/
.~lock*
*.pygtex
*.pygstyle
_minted-*/

25
README Normal file
View File

@ -0,0 +1,25 @@
Pour la formation sur Git, il faut compiler avec XeLaTeX.
XeLaTeX
=======
Langage de description de document avec prise en charge native de l'UTF-8
XeLaTeX est une variante de LaTeX, la structure générale du document reste identique et l'immense majorité des commandes et packages continuent de fonctionner comme d'habitude.
http://doc.ubuntu-fr.org/xelatex
http://fr.wikipedia.org/wiki/XeTeX
Installation
============
Sous Ubuntu 12.04 :
# apt-get install texlive-xetex
Utilisation
===========
Pour la formation sur Git, il faut compiler avec XeLaTeX.
Usage :
$ xelatex --shell-escape skell.tex

233
README.md
View File

@ -36,236 +36,3 @@ L'ensemble des plans est regroupé et compressé sous le nom plans_de_formation.
- compléter ces fichiers
Penser à générer de nouveau les plans
# Révision du processus de production des supports de formation
## Organisation du dépôt
Le dépôt encourage autant que possible la réutilisation et la mutualisation du contenu.
Les éléments de contenu à inclure sont dans les dossiers _content_ et _slides_ pour les documents de type _article_ et _beamer_ respectivement.
Les figures sont placées à part dans le répertoire _figures_.
Ces éléments de contenu sont inclus dans des fichiers principaux placés dans le répertoire _presentations_.
Le répertoire _templates_ contient des modèles de document au format jinja utilisés par le script _setup_main_tex_file.py_.
## setup_main_tex_file.py
Le script setup_main_tex_file.py permet dorganiser la procédure en proposant :
- la création des fichiers maîtres pour une formation ;
- la création des fichiers de contenu à inclure si nécessaire ;
- la mise à jour du plan de formation en fonction des éléments inclus ;
- la compilation des trois documents (diaporama, support de cours et programme) si lapplication rubber est installée.
Pour chacune de ses sous-étapes, le script propose une sous-commande.
### Démarrer une formation (sous-commande init)
```
./setup_main_tex_file.py init -f beamer -a Cadoles -t "Formation personnalisée Scribe" -c "Conseil départemental" -d modules_EOLE_envole/Conseil_Départemental -i Cadoles -l cc-by-sa -n CD_Formation_Scribe
```
Les options obligatoires sont :
- le format (beamer ou article) : -f
- le titre qui apparaîtra sur la page de garde ou la première diapositive : -t
- lemplacement, soit le sous-répertoire du répertoire presentations : -d
- le nom du fichier (sans lextension) qui sera créé à lemplacement indiqué.
Les autres options prendront des valeurs par défaut si elles ne sont pas fournies :
- lauteur est Cadoles par défaut
- linstitut, qui détermine les logos à intégrer, est Cadoles par défaut
- la licence est la Creative Commons CC-BY-SA v2 par défaut
- le client est XXX par défaut
À noter, pour la licence, que seule la CC-BY-SA v2 est disponible dans les contenus à inclure pour linstant.
Lexécution de la commande précédente produit le fichier presentations/modules_EOLE_envole/Conseil_Départemental/diaporama.tex.
### Construire le contenu dune formation
On peut construire une formation en éditant le fichier maître créé précédemment.
Ce fichier présente la configuration du module skb
```
\documentclass{beamer}
\usepackage{skb}
\skbconfig[
root = ../../../,
rep = content,
pub = presentations,
fig = figures,
sli = slides,
acr = database/acr,
bib = database/bib
]{skblocal.tex}
```
Ces variables sont utilisées pour linclusion des éléments de contenu répartis dans les différents sous-dossier du dépôt.
Le corps du document qui est principalement intéressant est minimaliste au départ
```
\begin{document}
\skbinput[from=sli]{style/title}
% Corps de la formation
%\skbinput[from=sli]{}
\skbinput[from=sli]{licences/license-cc-by-sa-2.0}
\end{document}
```
Pour ajouter du contenu, on ajoute principalement des directives skbinput avec loption from=sli (pour les documents de type beamer) et lemplacement du fichier à partir du répertoire slides (puisque from=sli et sli = slides dans la configuration skb)
On peut également structurer la présentation en intercalant des directives section, subsection, etc.
Ces directives section, subsection, ainsi que le contenu inclu permet ensuite de construire le plan.
Les directives skbinput peuvent pointer vers un fichier inexistant dans un premier temps (une tentative de compilation du document dans cet état échouera bien évidemment).
### Consolider le contenu dune formation (sous-commande update)
Par exemple, avec le corps de document suivant
```
\section{Introduction}
\skbinput[from=sli]{modules_EOLE_envole/commun/intro}
\skbinput[from=sli]{modules_EOLE_envole/commun/nouveautes27}
\skbinput[from=sli]{modules_EOLE_envole/commun/panorama-module}
\skbinput[from=sli]{modules_EOLE_envole/scribe/description}
\section{Outils pédagogique Scribe}
\skbinput[from=sli]{modules_EOLE_envole/scribeAD/eop}
\skbinput[from=sli]{modules_EOLE_envole/scribeAD/eop-pratique}
\skbinput[from=sli]{modules_EOLE_envole/scribeAD/veyon}
\skbinput[from=sli]{modules_EOLE_envole/scribeAD/veyon-pratique}
\section{Les quatre phases}
\skbinput[from=sli]{modules_EOLE_envole/commun/quatre_phases}
\skbinput[from=sli]{modules_EOLE_envole/eolebase/virtualbox}
\skbinput[from=sli]{modules_EOLE_envole/commun/quatre_phases-pratique}
\skbinput[from=sli]{modules_EOLE_envole/commun/configuration-pratique}
\skbinput[from=sli]{modules_EOLE_envole/commun/02-gen_config}
\skbinput[from=sli]{modules_EOLE_envole/commun/instance-pratique}
\skbinput[from=sli]{modules_EOLE_envole/commun/du-contenu-inexistant}
```
La plupart du contenu existe déjà.
Seule la dernière inclusion poserait problème lors de la compilation.
Pour permettre de lancer des compilations sans attendre que tout le contenu soit prêt, le script propose une sous commande qui prépare le terrain en créant les fichiers de contenu manquant.
```
./setup_main_tex_file.py update -d modules_EOLE_envole/Conseil_Départemental
```
Le seul argument de cette sous-commande _update_ permet didentifier le sous-répertoire de _presentations_ contenant le fichier maître _diaporama.tex_.
Cette commande traite toutes les directives skbinput et créer le fichier à inclure sil nexiste pas déjà.
Elle affiche la liste des fichiers créés en retour de commande.
```
$ ./setup_main_tex_file.py update -d modules_EOLE_envole/Conseil_Départemental/
slides/modules_EOLE_envole/commun/du-contenu-inexistant.tex
```
Ce fichier contient du texte permettant de le repérer facilement dans le document généré
```
\begin{frame}
\frametitle{du-contenu-inexistant.tex}
fichier slides/modules\_EOLE\_envole/commun/du-contenu-inexistant.tex à éditer
% contenu (pas trop long) de la diapositive
\end{frame}
```
### Affichage du plan (sous-commande outline)
La sous-commande _outline_ permet de créer un sommaire du diaporama sous la forme de listes imbriquées et de linclure dans le programme.
Il est possible de restreindre le nombre de niveaux de titre utilisé pour le plan avec loption -l.
```
./setup_main_tex_file.py outline -d modules_EOLE_envole/Conseil_Départemental
```
```
Introduction
EOLE
En quatre points
Ce qui caractérise EOLE
Nouveautés 2.7
Modules disponibles en 2.7.0
Modules disponibles à partir de la 2.7.1
Eclair
Zéphir/Sentinelle
Zéphir
Seshat
Thot
Seth
Hapy
Scribe
Outils pédagogique Scribe
EOP
Mise en pratique
Veyon
Les fonctionnalités
Préparation
Mise en pratique
Les quatre phases
La phase d'installation
La phase de configuration
La phase d'instanciation
La phase dinstanciation
les étapes de linstanciation
Les comptes administrateurs locaux
Les mots de passe
La phase d'administration
La phase dadministration
VirtualBox
Configuration de la VM Eolebase
Configuration autonome
Nature dune configuration
Types de variables
Contraintes
Application de configuration du module
Les modes de lapplication de configuration du module
Les informations de debug
sauvegarde et chargement de la configuration
Instance
```
### Génération du document
Comme alternative à la recette Makefile pas encore adaptée pour la compilation de ce nouveau format, on peut utiliser la commande rubber (paquet supplémentaire à installer)
```
rubber --inplace --module=xelatex presentations/modules_EOLE_envole/Conseil_Départemental/CD_Formation_Scribe.tex
```
La sous-commande _compile_ appelle rubber pour compiler les trois documents : diaporama, support et programme.
```
./setup_main_tex_file.py compile -d modules_EOLE_envole/Conseil_Départemental
```
Cette sous-commande nest disponible que si la commande rubber est installé et accessible (test du retour rubber --version).
### Intégration avec git
Le script entreprend des actions complémentaires lorsque il détecte un environnement _git_.
#### Séparation et isolation des formations
La proposition est la suivante : séparer le contenu générique (contenu inclu dans les formations) et les fichiers maîtres spécifiques à des formations.
Une branche (master en loccurence) est utilisée comme pivot et contient les fragments de formations.
Chaque formation spécifique est isolée dans une branche propre.
De fait, le contenu du dossier _presentations_ est commité dans la branche spécifique, tandis que le reste (_content_ et _slides_ notamment) est commité dans _master_. Un hook git local est proposé pour limiter les commits dans les mauvaises branches, basé sur les chemins des fichiers créés ou modifiés.
Le script permet dautomatiser une partie de ce découpage, notamment la création des branches spécifiques et le commit dans les branches appropriées selon les actions entreprises.
#### action dinitialisation
Linitialisation doit être effectué depuis la branche _master_ et exécute les actions suivantes :
- création dune branche nommée daprès le répertoire de destination et suffixée avec _xelatex/_
- création des fichiers propres à la formation (fichiers maîtres pour le diaporama, le support, le programme, etc.)
- commit de ces fichiers dans la branche spécifique.
#### action de mise à jour du programme
Comme tout ce qui implique la mise à jour ou la création de contenu dans le répertoire _presentations_, le produit de la mise à jour du programme est commité dans la branche spécifique.

Binary file not shown.

Binary file not shown.

View File

@ -1 +0,0 @@
*.html

View File

@ -1,37 +0,0 @@
% Introduction à l'hébergement Web
% Sylvain Eliade — S.C.O.P. Cadoles
% Mai 2019
## Introduction
* Qui suis-je ? Développeur web depuis 2003 : agences web, Skyrock, Aéroport d'Auckland, Cadoles… / Administrateur de plusieurs serveurs web depuis 2002.
* Comment fonctionne ce cours ? Présentation d'un sujet, exercice en TP, exercices facultatifs
* Evaluation : bonne réalisation des TP.
---
## Le plan c'est…
1. DNS
2. HTTP et serveur web
3. HTTPS
4. Web dynamique et PHP
5. Sécurité du serveur web
---
## Prérequis
* VirtualBox avec une distribution Linux (Debian ou Ubuntu de préférence)
* Machine virtuelle dispo sur `https://sylvain.eliade.net/cesi/debian.ova`
* Si pas de réseau privé hôte existant, en créer un dans **Fichier > Gestionnaire de réseau hôte**
* Sélectionner le réseau privé hôte dans la config de la VM : **Mode d'accès réseau = réseau privé hôte**
---
## VM Debian
* Login : user / Mot de passe : abcd
* Pour devenir root : `sudo -i`
* Changer de répertoire : `cd /repertoire`
* Éditer un fichier `nano fichier.txt` (puis Ctrl+X pour quitter)

View File

@ -1,402 +0,0 @@
% Introduction au DNS
% Sylvain Eliade — S.C.O.P. Cadoles
% Mai 2019
## Introduction au DNS
* Domain Name System
* Service de base sur Internet
* Permet d'obtenir l'adresse IP d'une machine à partir d'un nom intelligible (résolution de nom)
* Exemple : `www.cesi.fr -> 178.170.102.194`
* Sur le port 53, en UDP (+ TCP pour les réponses de plus de 512 octets) : plus rapide !
---
## Un nom DNS
`www.cesi.fr` comporte trois parties :
* `fr` est le TLD (Top Level Domain)
* `cesi` est le nom de domaine
* `www` est un sous-domaine
Le FQDN (*Fully Qualified Domain Name*) est le nom intégral, suivi d'un point final (= la racine), indiquant que le nom est complet : `www.cesi.fr.`
L'ensemble des enregistrements d'un nom de domaine s'appelle une *zone*.
---
## Les TLD
Plusieurs types :
* pour les pays (`.fr`, `.be`, `.nz`, etc.) = ccTLD (Country-Code)
* génériques (gTLD) : `.com`, `.info`, et les nouveaux : `.paris`, `.ovh` et des centaines d'autres
* infrastructure `.arpa` : ne sert que pour les reverse DNS (trouver un nom à partir d'une IP)
---
### État des TLDs
Plus de 1500 TLD à ce jours. Expansion depuis l'ouverture à la vente des gTLD en 2012 (100.000$ pour déposer un dossier).
TLD réservés : `.example`, `.invalid`, `.localhost`, `.test`, `.local` (multicast), `.onion` (Tor).
Attention à ne pas utiliser des TLD perso en interne : exemple du `.dev` acheté par Google.
---
## Résolution DNS
Le DNS est un système hiérarchique. On commence par la racine (root) et on descend les niveaux.
![](./img/hierarchie_dns.svg)
---
Ainsi pour résoudre le nom `fr.wikipedia.org` on va demander :
* aux serveur racine : quel serveur est responsable du TLD `org` ?
* au serveur responsable de `org` : qui est responsable du domaine `wikipedia.org` ?
* au serveur responsable du domaine `wikipedia.org` : quelle est l'adresse IP de `fr.wikipedia.org` ?
On obtient enfin l'adresse IP du serveur associé à `fr.wikipedia.org`, ou si celui-ci n'existe pas, le serveur DNS renvoie `NXDOMAIN` (Non-eXistent domain).
---
## Les outils d'inspection DNS
* `host` renvoie des réponses courtes et simples. Pratique pour scripter.
* `dig` est plus complet. Mieux pour diagnostiquer des problèmes DNS.
* `nslookup` : simpliste, mais dispo sous Windows et Linux, déconseillé.
Pour leur utilisation : `man dig` et `man host`
```
% host eliade.net
eliade.net has address 91.121.181.110
eliade.net has IPv6 address 2001:41d0:1:f66e::1
eliade.net mail is handled by 10 mail.kd2.org.
```
---
```
% dig eliade.net
;; ANSWER SECTION:
eliade.net. 201 IN A 91.121.181.110
;; Query time: 1 msec
;; SERVER: 192.168.5.253#53(192.168.5.253)
;; WHEN: Mon May 13 10:45:34 CEST 2019
;; MSG SIZE rcvd: 55
```
Attention, par défaut les deux outils utilisent le résolveur configuré dans `/etc/resolv.conf` (ici `192.168.5.253`). Bien utiliser leurs options si on veut faire des requêtes directement sur les serveurs racine, de TLD, ou autoritaires.
---
## Exemple de résolution de domaine : fr.wikipedia.org
On peut reproduire le travail d'un résolveur avec l'outil `dig`.
On demande au serveur racine qui est responsable pour le TLD `org` :
```bash
% dig NS org +short
a0.org.afilias-nst.info.
c0.org.afilias-nst.info.
b0.org.afilias-nst.org.
b2.org.afilias-nst.org.
d0.org.afilias-nst.org.
a2.org.afilias-nst.info.
```
---
On sait que `a0.org.afilias-nst.info` est responsable de la zone `.org`, on va lui demander qui est responsable de la zone `wikipedia.org`
```
% dig wikipedia.org @a0.org.afilias-nst.info
wikipedia.org. 86400 IN NS ns0.wikimedia.org.
wikipedia.org. 86400 IN NS ns2.wikimedia.org.
wikipedia.org. 86400 IN NS ns1.wikimedia.org.
```
---
Reste plus qu'à demander au serveur responsable de `wikipedia.org` quelle est l'adresse de `fr.wikipedia.org` :
```
% dig fr.wikipedia.org @ns0.wikimedia.org
fr.wikipedia.org. 3600 IN CNAME dyna.wikimedia.org.
```
Ah c'est un `CNAME` donc un alias, vers `dyna.wikimedia.org` !
---
Donc il nous faut aller voir à quoi correspond `dyna.wikimedia.org` :
```
% dig dyna.wikimedia.org @ns0.wikimedia.org
dyna.wikimedia.org. 600 IN A 91.198.174.192
```
Et voilà on a notre adresse IP !
(Ici on a pris un raccourci, normalement on aurait dû aller demander quel était le serveur responsable de `wikimedia.org` mais c'est le même que `wikipedia.org`).
---
## Attention au cache !
Évidemment on ne va pas re-demander au serveur racine à chaque fois quels sont les serveurs responsables de chaque TLD, si on a déjà l'information, elle est mise en cache pour un certain temps, à plusieurs niveaux (application, OS, serveur DNS local, etc.).
---
## Syntaxe d'enregistrement
```
dyna.wikimedia.org. 600 IN A 91.198.174.192
```
Chaque enregistrement indique :
* son nom (`dynam.wikimedia.org`)
* son **TTL** (Time-To-Live) : limite de temps avant qu'un résolveur ne doive aller re-demander l'enregistrement au serveur autoritaire (`600` secondes = 10 minutes)
* `IN` pour *INternet*
* le type de l'enregistrement (`A`)
* la valeur (`91.198.174.192`)
---
## Types d'enregistrements
* SOA = Infos sur le domaine (Start of Authority)
* A = Adresse IPv4
* AAAA = Adresse IPv6
* CNAME = Alias vers un autre nom
* MX = Serveur de mail responsable de la zone
* NS = Serveur DNS responsable de la zone
* TXT = Commentaire
Attention : le CNAME ne peut pas être utilisé pour un nom de domaine, seulement pour un sous-domaine ! (car il doit être le seul enregistrement !)
---
## Priorité d'enregistrements
Les enregistrements de type `MX` permettent de spécifier la priorité de chaque enregistrement :
```
% dig MX fastmail.fm +short
20 in2-smtp.messagingengine.com.
10 in1-smtp.messagingengine.com.
```
Ainsi ici les serveurs de mail vont essayer `in1-smtp.messagingengine.com` en premier, et s'il ne répond pas, ils essaieront `in2-smtp.messagingengine.com`.
---
## La syntaxe du SOA
Le SOA est l'enregistrement le plus important avec NS. Il a une syntaxe spécifique : `MNAME RNAME SERIAL REFRESH RETRY EXPIRE TTL`
* MNAME = adresse du serveur DNS primaire (Master)
* RNAME = adresse email du Responsable (en remplaçant le `@` par un point `.`)
* SERIAL = numéro de dernière modification de la zone, doit être incrémenté à chaque modification de la zone (en général on utilise la date du jour + un nombre qui s'incrémente). C'est ce qui indique aux serveurs secondaires qu'ils doivent
---
* REFRESH = nombre de secondes avant que les serveurs secondaires ne doivent aller re-vérifier si le serial a changé. En général c'est 86400 (24 heures).
* RETRY = nombre de secondes avant que les secondaires ne relancent une requête si le primaire ne répond pas (générallement 7200 = 2 heures)
* EXPIRE = nombre de secondes avant que les secondaires doivent arrêter de relayer la zone si le primaire ne répond pas (en général 1000 heures = 41,6 jours)
* TTL = Time To Live = nombre de secondes avant qu'un résolveur doive ré-essayer si le serveur a répondu `NXDOMAIN`
Exemple pour `octopuce.fr` :
```
ubal.octopuce.fr. support.octopuce.fr.
2019051305 21600 3600 604800 3600
```
---
## Les différents types de serveurs DNS
* Serveur racine : 13 serveurs (13 lettres) en Anycast (= 13 adresses IP, mais 600+ serveurs physiques répartis dans le monde), indique le serveur autoritaire d'un TLD
* Serveur responsable de TLD : serveur qui indique le serveur autoritaire d'un nom de domaine
* Serveur autoritaire de nom de domaine
* Serveur récursif : en général celui de votre FAI, ou de votre réseau local, c'est lui qui va faire les requêtes vers les serveurs racine, de TLD et autoritaire et renvoyer directement la réponse finale au client
---
## Le serveur autoritaire
C'est celui qu'on est susceptible de mettre en place en tant que sysadmin, il répond aux requêtes pour un ou plusieurs domaines particuliers.
* C'est lui qui fait autorité sur un/des domaines (`AUTHORITY`)
* Son autorité ne vaut rien si le serveur du TLD n'indique pas ce serveur comme étant responsable du domaine
Donc bien vérifier auprès du registrar (auquel vous avez payé le nom de domaine), que le domaine est bien configuré.
---
## Serveur autoritaire primaire et secondaire
Il est possible de n'avoir qu'un seul serveur autoritaire pour un domaine, mais si celui-ci devient injoignable, tous vos noms de domaines sont aussi injoignables. En général on a donc un serveur primaire et un ou plusieurs serveurs secondaires.
Les serveurs secondaires enregistrent une copie de la zone depuis le serveur primaire. Pour faire cette copie ils envoient une requête `AXFR` au serveur primaire qui leur renvoie tous les enregistrements de la zone.
Les clients eux iront demander à n'importe quel serveur listé comme `NS` pour la zone, au hasard, qu'il soit primaire ou secondaire.
---
## Notification des serveurs secondaires
Il existe deux manières pour un serveur secondaire de savoir s'il a besoin de mettre à jour une zone :
* le serveur primaire notifie les serveurs secondaires (message `NOTIFY`)
* les secondaires vont demander le `SOA` toutes les *x* secondes (spécifié dans le paramètre `REFRESH` du `SOA`), et regarder si le `SERIAL` du `SOA` a changé depuis la dernière fois
De nos jours on utilise plutôt le `NOTIFY` car ça permet d'avoir une répercussion immédiate des changements.
---
## Le serveur récursif (résolveur)
C'est celui à qui on parle en général ! (enfin à qui son OS et ses applications parlent)
Il enregistre dans son cache les réponses qu'il a faites (en fonction )
---
## Exemple pratique : mise en place d'un nom de domaine
* Achat du domaine `miammiammiam.com` auprès d'un registrar (par exemple OVH)
* Configuration du domaine chez le registrar pour pointer sur nos serveurs DNS : `ns1.superboite.fr` et `ns2.superboite.fr`
* Installation d'un serveur DNS sur nos deux serveurs NS1 et NS2
* Configuration de notre zone `miammiammiam.com` sur NS1 en *master*, et configuration de NS2 en *secondaire*
* Vérification du fonctionnement : le SOA renvoyé par NS1 doit être le même que celui envoyé par NS2, et le serveur DNS de `.fr` doit bien indiquer nos deux serveurs DNS
---
## Problèmes courants
* Mauvais serveur DNS indiqué auprès du registrar
* Problème de synchronisation entre le DNS primaire et un ou plusieurs DNS secondaires (le serial du SOA est-il identique ?)
* Problème de cache dans le résolveur de l'entreprise
Le résolveur envoie ses requêtes au hasard sur le DNS primaire ou l'un des DNS secondaires ! Il n'envoie pas déjà sur le primaire et ensuite sur les secondaires, c'est pas comme ça que ça marche !
---
## Serveurs DNS
* Bind (le plus répandu)
* PowerDNS (très puissant et versatile)
Les deux permettent de faire résolveur et/ou serveur autoritaire. Pour 90% des cas, Bind suffit amplement.
Il est conseillé de séparer les deux fonctions toutefois. Je conseille de mettre un serveur résolveur qui n'écoute qu'en local sur `127.0.0.1` (ou sur une IP du réseau interne), et le serveur autoritaire sur l'IP publique (accessible depuis Internet). Perso je met un bind en local, et un PowerDNS (avec MySQL) en public.
---
## Le futur
DNS n'est pas très sécurisé… Plusieurs solutions sont disponibles :
* DNSSEC : signature des zones, permet de valider que la réponse DNS n'a pas été modifiée par le résolveur en cours de route. N'empêche pas d'espionner les requêtes et réponses DNS.
* DNS over TLS, DNS over HTTPS : chiffrement de la connexion entre le client et le résolveur
* DNSCrypt : chiffrement et signature entre résolveur et client
DNSSEC peut être combiné avec DoT, DoH et DNSCrypt.
Comparaison DoH, DoT et DNSCrypt : [https://dnscrypt.info/faq/](https://dnscrypt.info/faq/)
---
## Aller plus loin
* [Problèmes courants de mauvaise configuration DNS](https://www.howtoforge.com/troubleshooting-common-dns-misconfiguration-errors)
---
## Exercice 1
Identifier le parcours DNS d'un résolveur récursif pour `www.cesi.fr` avec `dig`. (Copier/coller chaque étape)
---
## Exercice 2
Identifier les adresses IP du serveur de mail le plus prioritaire pour `gmail.com`.
---
## Exercice 3
J'ai créé un nouveau site web sur `dns1.sylvain.eliade.net` mais il ne marche pas.
Identifier la ou les erreurs commises et indiquer une solution.
---
## Exercice 4
Identifier le reverse DNS de l'adresse IP correspondant au serveur de `www.cesi.fr`
---
## Exercice 5 (facultatif)
Créer une zone Bind pour un domaine fictif avec un A et un AAAA sur le domaine lui-même, deux serveurs DNS, un SOA valide, deux serveurs de mail, et un CNAME de www qui redirige sur le domaine lui-même. Exemple :
```
$TTL 3600
@ IN SOA ns1.domain.tld. hostmaster.domain.tld. (
2017090401 ; SERIAL (DATE+NUMBER)
86400 ; REFRESH (SEC)
3600 ; RETRY (SEC)
3600000 ; EXPIRE (SEC)
300 ) ; MINIMUM (SEC)
@ IN NS ns1.domain.tld.
@ IN NS ns2.domain.tld.
ns1 IN A 10.1.2.2
ns2 IN A 10.1.2.3
@ IN A 127.0.0.1
@ IN AAAA ::1
@ IN MX 10 mx1.domain.tld.
@ IN MX 20 mx2.domain.tld.
mx1 IN A 10.1.1.1
mx2 IN A 10.1.1.2
www IN CNAME domain.tld.
```
Les point-virgules indiquent les commentaires
## Exercice 6 (facultatif)
Installer bind (`apt install bind9`). Par défaut il est configuré comme résolveur récursif local. L'utiliser pour faire des requêtes locales, par exemple : `dig www.cesi.fr @localhost`
## Exercice 7 (facultatif)
Mettre en place la zone bind créée à l'exercice 6 dans l'installation du Bind local. Un tuto utile : [https://www.adrienfuret.fr/2017/09/04/debian-dns-bind/](https://www.adrienfuret.fr/2017/09/04/debian-dns-bind/)
Tester le fonctionnement avec dig : `dig domain.tld @localhost`

View File

@ -1,440 +0,0 @@
% Introduction au HTTP
% Sylvain Eliade — S.C.O.P. Cadoles
% Mai 2019
## Introduction au HTTP
* HyperText Transport Protocol
* Protocole texte
* Client-serveur
* En général sur TCP, port 80
* Stateless, aucun état n'est conservé entre les requêtes
* Très simple
* Requêtes **toujours** initiées par le client
---
## À quoi ça ressemble ?
Un simple `telnet` permet de faire des requêtes HTTP !
```
% telnet sylvain.eliade.net 80
Trying 91.121.181.110...
Connected to eliade.net.
Escape character is '^]'.
GET /resume/ HTTP/1.1
Host: sylvain.eliade.net
```
---
Le serveur nous répond :
```
HTTP/1.1 200 OK
Date: Mon, 13 May 2019 10:02:02 GMT
Server: Apache
Last-Modified: Fri, 19 Apr 2019 07:36:32 GMT
ETag: "2abb-586dd2d7c21de"
Accept-Ranges: bytes
Content-Length: 10939
Vary: Accept-Encoding
Content-Type: text/html
Connection: close
<!DOCTYPE html>
<html>
```
---
Un outil plus pratique est quand même `curl` !
```
% curl -v http://sylvain.eliade.net/resume/
```
---
## Structure d'une requête
Première ligne : `MÉTHODE RESSOURCE PROTOCOLE`
* Méthode (ou verbe) HTTP = action que l'on souhaite utiliser (`GET`, `DELETE`, `POST`, etc.)
* Ressource sur laquelle on souhaite effectuer l'action
* Version du protocole : `HTTP/1.0` ou `HTTP/1.1` (il existe encore des clients HTTP/0.9 mais bon…)
Lignes suivantes : les entêtes. Puis : une ligne vide.
Puis éventuellement (méthodes `POST`, `PUT`, `PATCH`, etc.) : corps (contenu) de la requête.
---
### Méthodes HTTP
* GET : la plus courante, renvoie la ressource demandée (exemple : visualiser une page web)
* POST : envoyer des données liées à la ressource (exemple : envoyer un formulaire web)
Les méthodes suivantes sont rarements utilisées par les navigateurs mais souvent dans les API :
* HEAD : obtenir des infos sur la ressource. En pratique c'est souvent pareil que GET, mais ça ne renvoie que les entêtes et pas le corps.
* PUT : ajouter / remplacer une ressource
* OPTIONS : savoir quelles sont les méthodes supportées par le serveur pour une ressource
---
## Structure d'une réponse
Première ligne : `PROTOCOLE CODE MESSAGE`
* Code = code de réponse du serveur (200 = OK, 404 = Not Found, etc.)
* Message = message de réponse associé au code
Lignes suivantes : les entêtes de réponse.
Puis : une ligne vide.
Puis éventuellement (tout le temps sauf avec requête `HEAD`) : corps de la réponse.
---
### Codes de réponses HTTP
Le premier chiffre indique le type de code :
* 1xx = requête reçue mais son exécution n'est pas terminée
* 2xx = succès
* 3xx = redirection
* 4xx = erreur du client
* 5xx = erreur du serveur
---
### Codes courants
* 200 OK = la plus courante
* 301 Moved Permanently = ressource déplacée définitivement (voir l'entête `Location` pour la nouvelle adresse)
* 302 Found = ressource déplacée temporairement
* 400 Bad Request = erreur dans la requête du client
* 401 Unauthorized = le client n'a pas accès, il lui faut s'authentifier
* 403 Forbidden = accès refusé (par exemple mauvais login/mot de passe)
* 404 Not Found = ressource non trouvée
* 500 Internal Server Error
* 503 Service Unavailable = serveur surchargé
---
## Entêtes
```
Host: sylvain.eliade.net
User-Agent: telnet/1.0
```
Chaque entête est une clé (en général avec une majuscule au début de chaque mot, les mots étant séparés par des tirets), suivi de deux points `:`, d'un espace et de la valeur de l'entête.
Liste des entêtes : [https://en.wikipedia.org/wiki/List_of_HTTP_header_fields](https://en.wikipedia.org/wiki/List_of_HTTP_header_fields)
---
### Entêtes courants pour les requêtes
* `Host` : pour indiquer le nom de domaine que l'on essaye d'atteindre (car le serveur HTTP ne sais pas quelle requête DNS on a fait pour le contacter)
* `Accept-Language` : indique les langues préférées du client (`fr-BE, fr, en-AU, en`)
* `Accept` : les formats de fichier gérés par le client (`text/html, image/jpeg…`)
* `Connection` : pour garder la connexion TCP ouverte pour faire plusieurs requêtes de suite
* `User-Agent` : nom du client utilisé
* `Cookie` : contenu d'un cookie
* `Authorization` : identifiants de connexion HTTP (accès par mot de passe)
---
### Entêtes courants pour les réponses
* `Connection` : état de la connexion TCP
* `Date` : date de réponse
* `Content-Type` : type du contenu (`text/html; charset=utf-8`)
* `Location` : nouvelle adresse du contenu quand il a changé d'adresse
* `Server` : nom du serveur
* `Set-Cookie` : le client doit enregistrer ce cookie
* `WWW-Authenticate` : demande d'authentification
---
## Aparté : les URLs
Uniform Resource Locator (interchangeable avec URI, Uniform Resource Identifier)
`protocol://[user[:password]@]host[:port]path[?query][#fragment]`
Entre crochets les parties facultatives.
---
* protocol : http ou https
* user[:password] : nom d'utilisateur (et éventuellement mot de passe), pour l'authentification HTTP
* host : nom de domaine (ou adresse IP, pour une IPv6 elle doit être entre crochets, exemple : `http://[::1]/page`)
* port : numéro de port optionnel
* path : chemin de la ressource
* query (ou query string) : liste de clés et valeurs, séparées par des `&`
* fragment : identifiant d'une sous-ressource à l'intérieur de la ressource (en pratique, utilisé pour se rendre à une point particulier de la page web, ou en javascript)
---
`https://catalogue.cesi.fr/recherche/?domaine=informatique&niveau=bac4#type`
* protocol: `https`
* host: `catalogue.cesi.fr`
* path: `/recherche/`
* query: `domaine=informatique&niveau=bac4`
* fragment: `type`
---
## Les serveurs HTTP les plus courants
* Apache (29% des serveurs)
* nginx (29%) : plus rapide qu'Apache sur les fichiers statiques, même performance sur le contenu dynamique (PHP)
* Microsoft IIS (19%)
Apache est le plus courant, historiquement le plus utilisé, mais on trouve de plus en plus du nginx aussi. La configuration de nginx est un peu plus lisible que celle d'Apache.
---
## Apache et ses MPM
Apache possède plusieurs MPM (multi-processing module) qui ont des comportements différents :
* prefork : moins performant (sans threads), chaque processus ne peut traiter qu'une seule requête à la fois
* worker ou event : plus performant, chaque processus a plusieurs threads, et peut donc traiter plusieurs requêtes à la fois
Quel MPM choisir ? En production on utilisera *worker* ou *event*, car plus rapides, mais pour tester des trucs rapidement avec PHP on peut utiliser *prefork* qui est plus simple à metter en place.
---
## Un mot sur l'utilisateur www-data
Par défaut Apache est lancé avec l'utilisateur `www-data`. Ça va si on n'a qu'un seul site hébergé sur la machine.
Si on veut héberger plusieurs sites, il vaut mieux pouvoir avoir un utilisateur par site, pour pas qu'un site puisse aller modifier les fichiers d'un autre site.
Pour cela une version de *prefork* appelée **ITK** (`apt install libapache2-mpm-itk`) permet d'avoir des processus Apache qui se lancent avec les droits d'utilisateurs différents.
---
## Installation Apache sous Debian
* Installer le serveur : `apt install apache2`
* Statut du serveur : `apache2ctl status` (permet de voir les requêtes traitées en ce moment, le nombre de *workers* etc.)
* Tester si la config n'a pas d'erreur : `apache2ctl configtest`
* Recharger la configuration après modification : `apache2ctl graceful`
---
## Gérer les modules Apache sous Debian
* Activer un module : `a2enmod NOM_DU_MODULE` (exemple : `a2enmod rewrite`)
* L'outil préviendra s'il y a un conflit entre deux modules incompatibles :)
* Désactiver : `a2dismod NOM_DU_MODULE`
* Même chose pour les MPM : `a2dismod mpm_prefork` puis `a2enmod mpm_worker`
Astuce : lancer `a2enmod` sans argument liste les modules disponibles.
La configuration du module est dans le fichier `/etc/apache2/mods-available/NOM_DU_MODULE.conf`
---
## Configuration Apache
Syntaxe simple. Ce n'est pas du XML !
```
Listen 80
KeepAlive Off # Ne pas autoriser les connexions persistantes
<Directory /var/www/monsite>
Require all granted
Options -Indexes
</Directory>
```
---
## VirtualHost
Apache permet d'héberger plusieurs sites sur le même serveur avec des hôtes virtuels. L'hôte est reconnu avec l'entête "Host". Pour cela on utilise des hôtes virtuels.
```
<VirtualHost *:80>
ServerName cadoles.com
DocumentRoot /var/www/monsite
</VirtualHost>
<VirtualHost *:80>
ServerName mail.cadoles.com
DocumentRoot /var/www/roundcube
</VirtualHost>
```
Le premier vhost de la liste sera utilisé comme vhost "par défaut" si aucun vhost n'est trouvé pour l'hôte demandé.
---
### VirtualHost dans Debian/Ubuntu
Les vhost disponibles sont séparés par fichiers dans `/etc/apache2/sites-available`, triés par ordre alpha-numérique.
Ensuite : `a2ensite nomduvhost` pour activer, ou `a2dissite nomduvhost` pour désactiver.
Ne pas oublier de tester la config et recharger ensuite !
Astuce : lancer `a2ensite` ou `a2dissite` sans argument liste les sites disponibles.
---
## Fichiers .htaccess
Apache permet de configurer des options pour un répertoire donné à l'aide d'un fichier `.htaccess` (en UNIX, les fichiers avec un point au début sont des fichiers "cachés").
C'est pratique, mais attention, cela veut dire qu'Apache sera beaucoup plus lent, car il va chercher ce fichier dans tous les sous-répertoires à chaque requête !
Donc il est recommandé de désactiver ce comportement par défaut, et de ne l'activer que pour les sites qui en ont besoin. Tant que possible il vaut mieux mettre toute la configuration dans les fichiers de configuration Apache du vhost.
---
```
<Directory />
AllowOverride None
</Directory>
<Directory /var/www/wordpress>
AllowOverride All
</Directory>
```
[AllowOverride](https://httpd.apache.org/docs/2.4/mod/core.html#allowoverride) permet de configurer le type de directive autorisée dans le fichier `.htaccess`.
None = aucune directive autorisée = Apache ne va même pas lire les fichier `.htaccess`
---
## Restriction d'accès
Un exemple courant de `.htaccess` est la restriction d'accès par mot de passe. Pour cela il faut dire à Apache de n'autoriser que les utilisateurs connectés avec `Require valid-user` :
```
Require valid-user
AuthType basic
AuthName "Accès restreint"
AuthUserFile /var/www/monsite/secret/.htpasswd
```
---
### Fichier htpasswd
Pour créer le fichier `.htpasswd` qui contiendra la liste de nos utilisateurs autorisés et leurs mots de passe nous devons utiliser l'outil `htpasswd`.
A installer avec `apt install apache2-utils`.
---
* Créer le fichier avec `htpasswd -c /var/www/monsite/secret/.htpasswd NOM_UTILISATEUR` (`-c` comme **Création** du fichier)
* L'outil demande de taper, puis re-taper le mot de passe
* Pour ajouter un utilisateur ou modifier son mot de passe, simplement : `htpasswd /var/www/monsite/secret/.htpasswd NOM_UTILISATEUR` (sans le `-c` donc)
```
sylvain:$apr1$vfxnPOnt$gI7MkAizYirxT/CrUfCqU0
```
---
## Exercice 1
Faire une requête avec `curl` sur `http://www.cesi.fr/`. Quel est le code HTTP retourné ? Quel est le serveur web utilisé ?
---
## Exercice 2
Installation de Apache2. Faire une requête sur `http://localhost/` pour voir si ça fonctionne.
Puis essayer d'accéder à l'IP de la VM depuis un navigateur de la machine hôte pour voir si ça fonctionne bien.
(Pour obtenir l'IP : `ip addr` depuis la console)
---
## Exercice 3
Prérequis : créer un répertoire `/var/www/cesi.test` et un fichier `/var/www/cesi.test/index.html` avec :
```
mkdir /var/www/cesi.test
echo "Hello monde !" > /var/www/cesi.test/index.html
```
Exercice : Mettre en place un VirtualHost `cesi.test` proprement, l'activer.
Pour vérifier son fonctionnement, ajouter la ligne suivante dans `/etc/hosts` : `127.0.0.1 cesi.test`. Puis faire `curl http://cesi.test/`, le message "Hello monde" devrait apparaître.
---
## Exercice 4
Prérequis : créer un répertoire `/var/www/cesi.test/secret` : `mkdir /var/www/cesi.test/secret`
Désactiver les vhosts existants, sauf celui de `cesi.test`. Recharger apache.
Mettre en place une protection par mot de passe du répertoire `/var/www/cesi.test/secret` avec un fichier `.htaccess`.
Vérifier que ça marche correctement en utilisant le navigateur de la machine hôte sur l'IP de la VM.
---
## Exercice 5 (facultatif)
Tester la charge du serveur avec ApacheBench :
* installer `ab` : `apt install apache2-utils`
* dans une première console, lancer `watch -d -n 0.1 sudo apache2ctl status`
* lancer dans une seconde console `ab -n 5000 -c 100 http://localhost/` (va lancer 5000 requêtes, par vagues de 100 en même temps)
* observer l'évolution du nombre de workers, et de la charger serveur (*Server load*)
---
## Exercice 6 (facultatif)
Changer de MPM, passer de *prefork* (celui utilisé par défaut normalement) à *event*.
Répéter le test de l'exercice 5 et observer les différences.
---
## Exercice 7 (facultatif)
On nous demande de faire de la réécriture d'adresse.
Faire en sorte que `http://cesi.test/etu` redirige vers `http://localhost/infos-etudiant` en utilisant la directive `Redirect` dans le vhost créé précédemment (voir la [documentation de Redirect](https://httpd.apache.org/docs/2.4/mod/mod_alias.html#redirect) pour un exemple).
Pour cela il faudra activer le module `alias`.
Il est courant d'utiliser `RewriteRule` pour faire cela (module `rewrite`), mais il est plus lent et complexe ([Documentation](https://httpd.apache.org/docs/2.4/rewrite/intro.html)), mais permet plus de possibilités.
---
## Exercice 8 (facultatif)
Installer `nginx` et créer un virtualhost `cesi.test`.
Un exemple de configuration de virtualhost est dispo dans `/etc/nginx/sites-available/default`.
Pour créer le vhost, créer un fichier `/etc/nginx/sites-available/cesi.test`.
Pour l'activer exécuter `ln -s /etc/nginx/sites-available/cesi.test /etc/nginx/sites-enabled/cesi.test`, cela va créer un lien symbolique (pas de commande comme avec Apache type `a2ensite`).
Puis `nginx -t` pour vérifier la configuration et `service nginx reload` pour recharger.

View File

@ -1,174 +0,0 @@
% Introduction au HTTPS
% Sylvain Eliade — S.C.O.P. Cadoles
% Mai 2019
## Introduction au HTTPS
* HTTP encapsulé dans une connexion chiffrée
* Historiquement avec le protocole SSL
* Aujourd'hui c'est TLS
---
## Chiffrement à clé publique et privée
* La clé publique est distribuée (non secrète) et ne sert qu'à chiffrer
* La clé privée est secrète et sert à déchiffrer
Le serveur possède une clé privée (secrète) et une clé publique (appelée certificat), signée par une *autorité*.
---
## Certificats
* Prouve l'identité du propriétaire du certificat
* Doivent être signés par une autorité reconnue (ou plusieurs)
* Peuvent être signés par soi-même (*self signed*) mais c'est relou (difficile à utiliser), et du coup ça ne prouve pas grand chose
---
## Autorités
* Système hiérarchique (une autorité peut signer des certificats d'une sous-autorité, etc.) : on parle de *chaîne* de certificats
* Combine des acteurs publics (états, ministères, etc.) et privés (entreprises)
* On doit avoir confiance envers ces autorités
* Chaque OS a un « app store » de certificats d'autorités (paquet `ca-certificates` dans Debian/Ubuntu)
* Système centralisé, moyennement sûr (nombreux cas d'autorités qui font n'importe quoi)
* Un peu mieux depuis Let's Encrypt
---
## Phase de négociation (handshake) TLS
![](./img/tls_handshake.gif)
---
En simplifié :
1. Le client se connecte au serveur, lui indique les protocoles cryptographiques qu'il supporte (cipher suite)
2. Le serveur lui répond, en indiquant le protocole choisi, ainsi que son certificat public (signé par une autorité).
3. Le client vérifie le certificat.
4. Échange de clé entre le client et le serveur. Cette clé est spécifique à cette session entre client et serveur.
Ensuite le client et le serveur communiquent en HTTP entre eux, mais tout est chiffré à l'aide des clés échangées.
---
La phase de négociation ne se reproduit pas à chaque requête HTTP : normalement la connexion TLS reste ouverte une ou deux minutes, permettant de faire passer d'autres requêtes.
De même, les étapes 1 à 3 peuvent être ignorées quand le serveur et le client se connaissent déjà et ont encore les infos de chacun en cache.
---
## Vérification OCSP
A l'étape 3, le client peut aller vérifier auprès d'un serveur OCSP (*Online Certificate Status Protocol*) que le certificat du serveur est bien valide.
De nos jours, le serveur peut s'en charger lui-même (*OCSP stapling*), il envoie une certification OCSP (avec la date) au client : évite un aller-retour du client avec le serveur OCSP.
---
## SNI (Server Name Indication)
Rappel du HTTP : le nom d'hôte demandé est transmis dans l'entête `Host` de la requête HTTP.
Donc : l'hôte demandé est dans la requête chiffrée, AVANT que le serveur web ne puisse savoir quel certificat utiliser pour le HTTPS !
Solution : le SNI !
---
* Le nom d'hôte demandé est inscrit dans la connexion TLS par le client
* Très bien supporté de nos jours (si pas supporté : utilisation du vhost par défaut)
* Inconvénient : le nom n'est pas chiffré (possibilité d'interception pour voir quel site vous visitez)
---
## Configuration Apache HTTPS
Attention : il faut créer un vhost différent, car le port est différent.
```
<VirtualHost *:443>
ServerName cesi.test
SSLEngine on
SSLCertificateFile "/var/www/certs/cesi.cert"
SSLCertificateKeyFile "/var/www/certs/cesi.private"
</VirtualHost>
```
Si on a un site en HTTPS il est recommandé que la version HTTP ne fasse que rediriger vers le site en HTTPS (plus simple niveau config serveur).
---
## Let's Encrypt
* Autorité de certification à but non lucratif qui délivre des certificats signés gratuits.
* Avant LE, il fallait payer (en général cher) pour avoir un certificat signé par une autorité !
* Inconvénient : durée du certificat limitée à 90 jours.
* Inconvénient : ne marche pas pour les domaines privés (réseau privé).
* Plusieurs manières de valider qu'on est bien propriétaire d'un domaine : HTTP ou DNS
* Plusieurs clients : certbot, dehydrated, etc.
---
## Let's Encrypt : certbot
* `# apt install certbot python-certbot-apache`
* `# certbot --apache`
C'est tout, il va poser des questions et va tout configurer à votre place… Mais des fois ça ne marche pas trop du coup quand notre configuration est un peu complexe.
---
## Let's Encrypt : [dehydrated](https://github.com/lukas2511/dehydrated)
Plus léger que certbot, un peu plus manuel.
* `# apt install dehydrated dehydrated-apache2`
* Ajouter les noms de domaine dans le fichier `/etc/dehydrated/domains.txt` (un par ligne)
* Lancer `dehydrated -c`
* Configurer son vhost :
```
SSLCertificateFile /var/lib/dehydrated/certs/example.org/fullchain.pem
SSLCertificateKeyFile /var/lib/dehydrated/certs/example.org/privkey.pem
```
Tester la config et recharger Apache.
---
## Attention !
Dans certains cas, `apache2ctl configtest` ne renvoie pas d'erreur s'il y a un problème au niveau des certificats, mais ensuite le `reload` (ou `graceful`) plantera !
Exemple : si on utilise `chain.pem` de Let's encrypt (qui ne contient que la chaîne de certification, et pas le certificat lui-même) à la place de `fullchain.pem`.
Solution : vérifier `/var/log/apache2/error.log` après un reload si on a modifié des trucs dans la config SSL !
---
## Exercice 1
Installer `dehydrated` et le configurer pour le domaine `cesi.sylvain.eliade.net`. Lancer dehydrated.
Il va tenter de vérifier l'appartenance du domaine et échouer (logique). A la place, prendre les fichiers `.pem` fournis et les recopier dans le bon répertoire.
Configurer un vhost Apache pour ce domaine, utilisant les certificats fournis. Ne pas oublier d'activer `mod_ssl` : `a2enmod ssl` et redémarrer Apache.
Dans `/etc/hosts` inscrire une ligne avec `127.0.0.1 cesi.sylvain.eliade.net`.
Tester la config avec curl, et si possible le navigateur de la machine hôte.
## Exercice 2 (facultatif)
Générer un certificat auto-signé :
```
# mkdir /etc/ssl/localcerts/
# openssl req -new -x509 -days 365 -nodes -out /etc/ssl/localcerts/apache.pem -keyout /etc/ssl/localcerts/apache.key
```
Le mettre en place dans Apache, et vérifier que ça fonctionne avec un navigateur (qui affichera un message d'avertissement).

View File

@ -1,271 +0,0 @@
% Introduction au web dynamique
% Sylvain Eliade — S.C.O.P. Cadoles
## Introduction web dynamique
* Dans le web *statique*, le serveur web ne fait que renvoyer le contenu d'un fichier existant
* Dans le web *dynamique*, le serveur web délègue la génération du contenu à un sous-programme
* Ce sous-programme peut réagir aux demandes de l'utilisateur, retourner des données d'une base de données, etc.
---
## Script CGI
À l'origine, le serveur web interagissait avec des scripts CGI (Common Gateway Interface) : il exécutait un programme, auquel il passait les données de la requête HTTP, et retournait ce que le script lui renvoyait.
---
Configuration Apache :
```
<Directory "/var/www/cesi.test">
Options +ExecCGI
AddHandler cgi-script .cgi
</Directory>
```
---
Exemple de script basique `date.cgi`
```
#!/bin/bash
echo "Content-type: text/html"
echo ""
echo "Nous sommes le "
date
```
Résultat :
```
Nous sommes le mercredi 15 mai 2019, 14:38:57 (UTC+0200)
```
---
Exemple d'interaction avec la requête `methode.cgi` :
```
#!/bin/bash
echo "Content-type: text/html"
echo ""
echo "Méthode de requête utilisée : "
echo "$REQUEST_METHOD"
```
Résultat :
```
Méthode de requête utilisée : GET
```
---
Avantage : très simple !
Inconvénient : peu performant, chaque requête crée un nouveau processus qui est détruit à la fin de la requête.
---
## FastCGI
* Un second serveur (FastCGI), qui communique avec le serveur web
* Il garde le processus lancé en permanence
* Il reçoit les requêtes du serveur web
* Il lui envoie des requêtes et reçoit des réponses
* Il renvoie les réponses au serveur web
Ainsi il n'y a plus de création/destruction de processus, plus rapide. De plus le serveur FastCGI peut avoir plusieurs processus lancés en même temps, et répartir les requêtes. C'est un modèle similaire aux *workers* Apache !
---
## Présentation de PHP
* Langage de programmation
* Créé en 1994
* Originellement conçu comme proche de Perl et C
* Pour faire des pages web dynamiques (en CGI !)
* Mal considéré (à tort)
* Utilisé sur 79% des sites web (WordPress sur 32% des sites !)
---
### Les versions
* PHP 7 est 2-3 fois plus rapide que PHP 5.6
* PHP 5 n'est plus supporté (plus de mises à jour de sécurité), PHP 7.0 non plus !
Les versions de PHP sont supportées environ 3 ans (mais les distributions peuvent allonger ce délai en backportant les correctifs).
Moralité : beaucoup de boîtes sont à la ramasse, et se traînent des PHP qui ne sont pas à jour… Et ça peut durer longtemps.
---
### A quoi ça ressemble ?
```
<?php
echo "Aujourd'hui nous sommes le ";
echo date('d/m/Y');
```
---
```
<?php
$colors = ['blue', 'white', 'rainbow', 'yellooooollipop'];
$color = $colors[array_rand($colors)];
?>
<p>My favorite unicorn color is <?=$color?></p>
```
## Installation et configuration de PHP
Il existe plusieurs versions de PHP :
* En ligne de commande : CLI (`apt install php-cli`), utile pour lancer des scripts, tester rapidement avec le serveur web intégré…
* mod_php pour Apache (`apt install libapache2-mod-php`)
* FPM (FastCGI Process Manager) pour serveur web (`apt install php-fpm`)
---
### PHP CLI
Cette version en ligne de commande permet de lancer un script (`php monscript.php`) ou un serveur web de test pour essayer un site, etc. (`php -S localhost:8080 /var/www/monsite` et le site sera joignable sur http://localhost:8080/).
Le serveur web ne peut traiter qu'une seule requête en même temps… pas très indiqué pour un vrai site web !
---
### mod_php
* Très simple à mettre en place
* Nécessite mpm-prefork = pas très rapide
* Convient pour des petits sites
Rien à configurer dans Apache : les fichiers `.php` seront exécutés directement.
---
### Rappel sur MPM-ITK
Pour configurer MPM-ITK sur un vhost pour qu'il se limite à utilisateur :
```
<IfModule mpm_itk_module>
AssignUserId USER GROUP
</IfModule>
```
---
### FPM
* Basé sur FastCGI
* Crée un serveur d'application PHP
* Un peu de configuration à faire
* Permet de créer plusieurs *pools* pour des sites/utilisateurs différents
* Rapide !
---
## Configuration FPM
Création de pool dans `/etc/php/7.0/fpm/pool.d/cesi.conf` :
```
[cesi]
user = cesi
group = cesi
listen = /run/php/php7.0-fpm-cesi.sock
```
---
Configuration du VHost :
```
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php/php7.0-fpm-cesi.sock"
</FilesMatch>
```
---
## Exercice 1
Faire un script PHP qui va afficher la date du jour.
L'exécuter avec `php` en ligne de commande.
---
## Exercice 2
Installer `mod_php`.
Déplacer le script créé dans un répertoire d'un vhost existant.
Vérifier sa bonne exécution avec curl, ou un navigateur.
---
## Exercice 3
Prérequis : avoir au moins deux vhosts actifs différents.
* Créer un utilisateur par vhost avec `useradd -G www-data USER`
* Installer et activer le MPM ITK de Apache.
* Pour chaque vhost, configurer le vhost pour utiliser ITK et l'utilisateur du vhost et le groupe *www-data* (via `AssignUserId`)
Puis :
Dans chaque répertoire de chaque vhost mettre un fichier `compteur.php` dont le contenu est :
```
<?php
if (file_exists('stats.txt')) {
$nb_visites = file_get_contents('stats.txt');
}
else {
$nb_visites = 0;
}
$nb_visites++;
file_put_contents('stats.txt', $nb_visites);
echo "Vous êtes le visiteur n° " . $nb_visites;
```
Vérifier que les permissions de chaque répertoire de chaque vhost sont restreintes à l'utilisateur du vhost ! (et les fichiers du répertoire)
Enfin : visiter le fichier `compteur.php` de chaque vhost. Vérifier les utilisateurs propriétaires des fichiers `stats.txt`.
---
## Exercice 4
Installer `php-fpm`.
Activer avec `a2enmod proxy_fcgi setenvif` et `a2enconf php7.0-fpm`.
Créer un fichier `fcgi.php` contenant `<?php echo php_sapi_name();` et vérifier qu'il renvoie bien `fpm-fcgi` quand il est consulté.
---
## Exercice 5 (facultatif)
Mettre en place au moins deux pools FPM avec deux utilisateurs différents pour deux vhosts différents, comme avec ITK, mais avec FPM.

View File

@ -1,306 +0,0 @@
% Introduction à la sécurité d'un serveur web
% Sylvain Eliade — S.C.O.P. Cadoles
## Introduction à la sécurité d'un serveur web
## Fail2ban
S'il ne faut en retenir qu'un c'est celui-là !
`apt install fail2ban`
Il lit les logs en permanence et détecte les tentatives d'intrusion (mauvais mot de passe SSH, email, HTTP…) et bloque les IP automatiquement !
Activer les filtres dans `/etc/fail2ban/jail.conf` (passer `enabled` à `true`). Normalement la plupart des filtres nécessaires sont activés par défaut, mais ça vaut le coup de regarder si on peut en activer d'autres, ou de faire les siens !
## Mises à jours de sécurité
Ça semble évident, mais ça ne l'est pas pour tout le monde.
Activer les mises à jour automatique de sécurité avec `unattended-upgrades`.
```
apt install unattended-upgrades
```
---
## Pare-feu (firewall)
Sous Linux, les ports sont fermés par défaut si un service n'écoute pas dessus, donc c'est "sécurisé" par défaut. Alors pourquoi un firewall ?
Parce que si un attaquant parvient à ouvrir un port sur votre machine il peut s'en servir pour lui donner des ordres, ou faire des requêtes vers d'autres machines (par exemple transformer votre serveur en attaquant DDoS).
Du coup un firewall est utile pour restreindre le risque en cas d'attaque.
---
## Pare-feu Linux
Le noyau Linux contient déjà un pare-feu, c'est Netfilter, accessible via la commande `iptables`.
Comme elle est un peu complexe, on conseille en général d'utiliser `ufw` (Uncomplicated FireWall), qui est une interface iptables simplifiée.
---
## UFW
Installer avec `apt install ufw`, et activer avec `ufw enable`.
Consulter le statut avec `ufw status verbose`.
```
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip
```
Lister les règles disponibles : `ufw app list`
---
(Dés)Activer le blocage par défaut :
```
ufw default allow incoming
ufw default deny outgoing
```
Activer un service :
```
ufw allow in WWW
ufw allow out VNC
```
---
Autoriser un port :
```
ufw allow 53
ufw allow 25/tcp
```
Bloquer une IP :
```
ufw deny from X.X.X.X to any
```
---
## Restriction par IP
Si on veut restreindre l'accès à un serveur web à certaines IP il y a plusieurs stratégies possibles :
* au niveau du firewall (mieux, car le plus tôt dans la connexion réseau)
* via TCP Wrappers ou systemd
* via le serveur web
---
## Avec UFW
```
ufw deny 80
ufw allow from X.X.X.X to any port 80
```
---
## TCP Wrappers
Mécanisme ancien, simple, mais aujourd'hui on utilise un firewall.
Malgré le nom, il gère aussi UDP.
La configuration se fait dans les fichiers `/etc/hosts.allow` et `/etc/hosts.deny`.
N'est plus supporté par systemd.
---
```
# /etc/hosts.allow
sshd: 192.168.1.0/255.255.255.0
# /etc/hosts.deny
sshd: ALL
````
---
## Restriction avec systemd
Se fait au niveau du fichier `.service` :
```
IPAddressDeny=1.1.1.1
IPAddressAllow=8.8.8.8
```
Encore une fois, mieux vaut préférer un firewall.
---
## Restriction avec Apache
Avantage : peut se faire par répertoire, vhost, fichier…
Tout autoriser sauf une IP :
```
<RequireAll>
Require all granted
Require not ip 10.252.46.165
</RequireAll>
```
---
Tout bloquer sauf si connexion valide OU adresse IP spécifique :
```
<RequireAll>
Require all denied
<RequireAny>
Require ip 192.168.1.12
Require valid-user
</RequireAny>
</RequireAll>
```
---
## Ne pas se tirer une balle dans le pied
* Utiliser PHP 7.2 ou 7.3 ! Abandonnez PHP 5 et PHP 7.0 (plus supportés !) ! Enfin si c'est possible…
* Configurer le serveur web pour n'écouter que sur l'interface / port nécessaire (`/etc/apache2/ports.conf`)
* Ne pas exposer sa version de PHP ou Apache (ou nginx)
* Désactiver le vhost par défaut d'apache, dont la page HTML peut contenir des infos utiles à un attaquant
* Bloquer l'accès aux répertoires .svn et .git !
```
RedirectMatch 404 /\.git
RedirectMatch 404 /\.svn
```
---
## Cacher les versions
Pourquoi ? Contre les bots qui scannent les serveurs pas à jour.
Dans `/etc/apache2/conf-enabled/security.conf` :
```
ServerTokens Prod
ServerSignature Off
```
---
Avant :
`Server: Apache/2.4.25 (Debian)`
Après :
`Server: Apache`
---
Dans `/etc/php/7.0/apache/conf.d/local.ini` ajouter :
```
expose_php = off
```
---
## Restreindre la surface d'attaque (Apache)
Désactiver les index de répertoires, l'exécution de CGI, les liens symboliques et les inclusions :
```
<Directory />
Options -Indexes -ExecCGI -FollowSymLinks -Includes
</Directory>
```
Désactiver les .htaccess si possible.
---
## Restreindre la surface d'attaque (PHP)
Restreindre les répertoires accessibles de PHP (dans le vhost Apache) :
```
php_admin_value open_basedir /var/www/monsite.com
```
Interdire l'exécution de programme externe :
```
disable_functions = exec,passthru,shell_exec,system,proc_open,popen
```
à mettre dans le `/etc/php/7.0/apache/conf.d/local.ini`, ou dans un `php_admin_value` par vhost.
---
## Aller plus loin
Vérifier sa config :
* Audit automatisé : mieux que ne rien faire, mais à ne pas faire en prod, laisse pas mal de traces (logs), peut surcharger le serveur
* Audit manuel : de bonnes connaissances en sécu, ou un bon chéquier !
* Hardening PHP : ça restreint certaines fonctions et attaques, mais c'est bien mais ça peut casser des applis :(
* WAF (Web Application Firewall) : idem, ça détecte des attaques connues, bonne stratégie défensive, mais attention aux effets de bord.
---
* [Auditer son site avec Nikto](https://doc.ubuntu-fr.org/nikto)
* [Hardening PHP : snuffleupagus (Apache)](https://github.com/nbs-system/snuffleupagus)
* [Tester son certificat SSL avec SSL Labs](https://www.ssllabs.com/ssltest/)
* [Mise en place de WAF avec mod_security pour Apache](https://www.it-connect.fr/installation-de-mod_security-devant-un-serveur-web-apache/)
* [WAF pour nginx avec naxsi](https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-naxsi-on-ubuntu-16-04)
---
## Exercice 1
Installer `ufw` et n'autoriser que le port 80 en entrée.
Vérifier avec :
```
nmap -p 80 ADRESSE_IP
nmap -p 443 ADRESSE_IP
```
La première doit renvoyer que le port est ouvert, mais pas la seconde.
---
## Exercice 2
Modifier le `.htaccess` du répertoire `secret` précédemment créé pour autoriser aussi l'adresse IP `127.0.0.1` à y accéder sans mot de passe.
Vérifier avec curl.
---
## Exercice 3
Cacher les versions de PHP et Apache. Vérifier avec Curl.
---
## Exercice 4 (facultatif)
Installer Nikto et scanner les vhosts du serveur web. Nikto est dans les dépôts `non-free` de Debian : https://debian-facile.org/doc:systeme:apt:sources.list:sources.list-non-free

View File

@ -1,11 +0,0 @@
.PHONY: slides pdf all
all: slides pdf
slides:
for i in 0*.md; do pandoc -t s5 -s -o $$i.html $$i; done;
rename 's/.md.html/.html/' *.html
pdf:
for i in 0*.html; do prince $$i; done;
rename 's/.html.pdf/.pdf/' *.pdf

View File

@ -1,37 +0,0 @@
Préparation pour intervenant :
== Partie 1 - DNS
1. Mettre en place un enregistrement CNAME d'un sous-domaine qui pointe sur un autre sous-domaine qui n'existe pas.
2. Bonus si possible : désynchroniser le DNS primaire et les secondaires de la zone pour que seul le primaire ait le CNAME, et que le serial du SOA soit différent entre primaire et secondaire.
== Partie 2 - HTTP
Rien à faire.
== Partie 3 - HTTPS
Faire signer un sous-domaine réel (mais non utilisé) par Let's Encrypt, et recopier le certificat (fullchain.pem et privkey.pem) pour que les étudiants puissent mettre en place ce vhost signé sur leur VM.
== Partie 4 - Web dynamique
== TODO - améliorations et idées à prendre en compte pour prochaine session
- pas assez de schémas visuels dans les slides / supports
- texte (tags pre) qui dépassent des slides
Difficultés rencontrées le 16 mai 2019 :
- DNS : problèmes de DNS menteur sur certains réseaux 4G (Bouygues) qui altèrent les réponses DNS
- mauvaise assimilation / confusion sur différence entre IP et host DNS, confusion entre host DNS et vhost HTTP chez certains étudiants (environ 3-4 sur 17)
- certains recopient de tutos datés du net sans réfléchir…
- certains ne lisent pas les énoncés…
- rythme relativement soutenu, parfois un peu dur pour les élèves de suivre d'une partie à l'autre (beaucoup de sujets abordés)
Idées pour la partie DNS :
- Mettre en place un DNS sur réseau local, avec un TLD virtuel, et pouvoir déléguer des zones NS à chacun des postes des étudiants, pour qu'ils puissent mettre en place leur propre serveur autoritaire et se faire des requêtes entre eux
Pour le web dynamique ça serait bien de leur faire installer un CMS flatfile (pas de base de données, pour simplifier).

View File

@ -1,142 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="951"
height="519"
version="1.1"
id="svg4707"
sodipodi:docname="DNS_schema.svg"
inkscape:version="0.92.1 r15371">
<metadata
id="metadata4713">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs4711" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1918"
inkscape:window-height="1055"
id="namedview4709"
showgrid="false"
inkscape:zoom="0.67893756"
inkscape:cx="752.78408"
inkscape:cy="272.96054"
inkscape:window-x="0"
inkscape:window-y="23"
inkscape:window-maximized="1"
inkscape:current-layer="svg4707"
fit-margin-top="10"
fit-margin-left="10"
fit-margin-right="10"
fit-margin-bottom="10" />
<g
id="g4627"
style="stroke-width:3"
transform="translate(-116.5,-72.5)">
<path
d="m 236,516 h 136 c 7,0 12,5 12,12 v 40 c 0,7 -5,12 -12,12 H 236 c -7,0 -12,-5 -12,-12 v -40 c 0,-7 5,-12 12,-12 z M 140,372 h 136 c 7,0 12,5 12,12 v 40 c 0,7 -5,12 -12,12 H 140 c -7,0 -12,-5 -12,-12 v -40 c 0,-7 5,-12 12,-12 z M 332,228 h 136 c 7,0 12,5 12,12 v 40 c 0,7 -5,12 -12,12 H 332 c -7,0 -12,-5 -12,-12 v -40 c 0,-7 5,-12 12,-12 z m 0,-144 h 136 c 7,0 12,5 12,12 v 40 c 0,7 -5,12 -12,12 H 332 c -7,0 -12,-5 -12,-12 V 96 c 0,-7 5,-12 12,-12 z m 68,64 v 80 m 0,64 -192,80 m 1,65 95,79"
id="path4619"
inkscape:connector-curvature="0"
style="fill:#d8e2c3;stroke:#bd1220" />
<path
d="m 428,516 h 136 c 7,0 12,5 12,12 v 40 c 0,7 -5,12 -12,12 H 428 c -7,0 -12,-5 -12,-12 v -40 c 0,-7 5,-12 12,-12 z m 96,-144 h 136 c 7,0 12,5 12,12 v 40 c 0,7 -5,12 -12,12 H 524 c -7,0 -12,-5 -12,-12 v -40 c 0,-7 5,-12 12,-12 z M 908,228 h 136 c 7,0 12,5 12,12 v 40 c 0,7 -5,12 -12,12 H 908 c -7,0 -12,-5 -12,-12 v -40 c 0,-7 5,-12 12,-12 z m -192,0 h 136 c 7,0 12,5 12,12 v 40 c 0,7 -5,12 -12,12 H 716 c -7,0 -12,-5 -12,-12 v -40 c 0,-7 5,-12 12,-12 z m -192,0 h 136 c 7,0 12,5 12,12 v 40 c 0,7 -5,12 -12,12 H 524 c -7,0 -12,-5 -12,-12 v -40 c 0,-7 5,-12 12,-12 z m -384,0 h 136 c 7,0 12,5 12,12 v 40 c 0,7 -5,12 -12,12 H 140 c -7,0 -12,-5 -12,-12 v -40 c 0,-7 5,-12 12,-12 z M 592,372 400,292 M 496,516 208,436 M 976,228 400,148 m 384,80 -384,-80 m 0,0 192,80 m -384,0 192,-80"
id="path4621"
inkscape:connector-curvature="0"
style="fill:#d3e2ea;stroke:#006ab2"
sodipodi:nodetypes="sssssssssssssssssssssssssssssssssssssssssssssssssssssscccccccccccc" />
</g>
<g
font-size="48"
id="g4705"
style="font-size:48px;font-family:'Liberation Sans';text-anchor:middle;fill:#006ab2"
transform="translate(-116.5,-72.5)">
<text
x="401"
y="134"
font-size="85"
id="text4645"
style="font-size:85px">.</text>
<text
x="208"
y="276"
id="text4647">com</text>
<text
x="400"
y="276"
id="text4649">org</text>
<text
x="592"
y="276"
id="text4651">net</text>
<switch
transform="translate(784,276)"
id="switch4665">
<text
id="text4663">fr</text>
</switch>
<text
x="976"
y="276"
id="text4667">...</text>
<text
x="592"
y="420"
id="text4671">...</text>
<text
x="208"
y="416"
font-size="32"
id="text4673"
style="font-size:32px">wikipedia</text>
<switch
transform="translate(304,564)"
id="switch4701">
<text
systemLanguage="de"
id="text4687">de</text>
<text
systemLanguage="en"
id="text4689">en</text>
<text
systemLanguage="es"
id="text4691">es</text>
<text
systemLanguage="jbo"
id="text4693">jbo</text>
<text
systemLanguage="pl"
id="text4695">pl</text>
<text
systemLanguage="ru"
id="text4697">ru</text>
<text
id="text4699">fr</text>
</switch>
<text
x="496"
y="564"
id="text4703">...</text>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 594 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.9 KiB

View File

@ -1,23 +0,0 @@
/* The following styles size and place the slide components.
Edit them if you want to change the overall slide layout.
The commented lines can be uncommented (and modified, if necessary)
to help you with the rearrangement process. */
div#header, div#footer, div.slide {width: 100%; top: 0; left: 0;}
div#header {top: 0; left: 0; z-index: 1;}
div#footer {top: auto; bottom: 0; width: 100%; z-index: 5;}
div.slide {top: 0; width: 88%; padding: 1em 7% 2em 5%; z-index: 2;}
#footer div#controls {bottom: 1.5em; left: 0; width: 100%; text-align: center; z-index: 1;}
div#controls form {margin: 0; padding: 0;}
#currentSlide {position: absolute; left: 0; bottom: 0.5em; z-index: 10;
width: 100%; text-align: center;}
html>body #currentSlide {position: fixed;}
/*
div#header {background: #FCC;}
div#footer {background: #CCF;}
div#controls {background: #BBD;}
div#currentSlide {background: #FFC;}
*/

View File

@ -1,7 +0,0 @@
/* DO NOT CHANGE THESE unless you really want to break Opera Show */
.slide {
visibility: visible !important;
position: static !important;
page-break-before: always;
}
#slide0 {page-break-before: avoid;}

View File

@ -1,15 +0,0 @@
/* don't change this unless you want the layout stuff to show up in the outline view! */
.layout div, #footer *, #controlForm * {display: none;}
#footer, #controls, #controlForm, #navLinks, #toggle {
display: block; visibility: visible; margin: 0; padding: 0;}
#toggle {float: right; padding: 0.5em;}
html>body #toggle {position: fixed; top: 0; right: 0;}
/* making the outline look pretty-ish */
#slide0 h1, #slide0 h2, #slide0 h3, #slide0 h4 {border: none; margin: 0;}
#slide0 h1 {padding-top: 1.5em;}
.slide h1 {margin: 1.5em 0 0; padding-top: 0.25em;
border-top: 1px solid #888; border-bottom: 1px solid #AAA;}
#toggle {border: 1px solid; border-width: 0 0 1px 1px; background: #FFF;}

View File

@ -1,38 +0,0 @@
/* Following are the presentation styles -- edit away!
Note that the 'body' font size may have to be changed if the resolution is
different than expected. */
body {background: #95A7D4 url(bg-slide.jpg) 100% 100% no-repeat; color: #210; font: 29px Arial, sans-serif;}
a {text-decoration: none; color: #336; border-bottom: 1px dotted;}
h1, h2, h3, h4, h5, h6 {font-size: 1em; margin: 0;}
sup {font-size: 0.75em; font-weight: normal;
vertical-align: 0.5em; line-height: 1px;}
ul {margin-left: 1em; padding-left: 0;}
li {margin-bottom: 0.66em;}
li li {margin: 0.33em 0; font-size: smaller;}
#header {background: url(bg-shade.png); border-bottom: 1px solid #333;
padding-bottom: 2em;}
#footer {background: url(bg-shade.png); color: #BBB; border-top: 1px solid #333;}
#header, #footer {font-size: 0.5em;}
#footer h1, #footer h2 { padding: 0.5em 0.75em;
font-weight: normal; font-style: italic;}
#footer h1 {left: 0; font-size: 1em; letter-spacing: 1px;}
#footer h2 {position: absolute; bottom: 0; right: 0;}
#controls a {display: none;}
#controls select {visibility: hidden;}
#controls div:hover select {visibility: visible;}
#currentSlide {font-size: 0.5em;}
#currentSlide span {font-size: 13px; color: rgb(49%,47%,66%);}
#currentSlide #csSep {display: none;}
#currentSlide #csHere {font-weight: bold;}
#currentSlide #csHere:before {content: "#"; font-weight: normal;}
#currentSlide #csTotal:before {content: " of ";}
.slide h1 {font-size: 1.66em; line-height: 1; letter-spacing: -1px;
margin: 0 -15% 1em 0; padding: 0.25em 15% 0.06125em 0; border-bottom: 0.06125em solid rgb(90,94,120);}
#slide0 h1 {border: none; font-size: 2.25em; letter-spacing: 0; margin: 3em 0 1.5em;}
#slide0 h3 {margin-bottom: 0;}
#slide0 h4 {margin-top: 0; font-size: smaller;}

View File

@ -1 +0,0 @@
/* The following rule is necessary to have all slides appear in print! DO NOT REMOVE IT! */ .slide, ul {page-break-inside: avoid; visibility: visible !important;} h1 {page-break-after: avoid;} body {font-size: 12pt; background: white;} * {color: black;} #slide0 h1 {font-size: 200%; border: none; margin: 0.5em 0 0.25em;} #slide0 h3 {margin: 0; padding: 0;} #slide0 h4 {margin: 0 0 0.5em; padding: 0;} #slide0 {margin-bottom: 3em;} h1 {border-top: 2pt solid gray; border-bottom: 1px dotted silver;} .extra {background: transparent !important;} div.extra, pre.extra, .example {font-size: 10pt; color: #333;} ul.extra a {font-weight: bold;} p.example {display: none;} #header {display: none;} #footer h1 {margin: 0; border-bottom: 1px solid; color: gray; font-style: italic;} #footer h2, #controls {display: none;} /* The following rule keeps the layout stuff out of print. Remove at your own risk! */ .layout, .layout * {display: none !important;} img { max-width: 95%; }

View File

@ -1,9 +0,0 @@
/* Do not edit or override these styles! The system will likely break if you do. */
div#header, div#footer, div.slide {position: absolute;}
html>body div#header, html>body div#footer, html>body div.slide {position: fixed;}
div.slide {visibility: hidden;}
#slide0 {visibility: visible;}
div#controls {position: absolute;}
#footer>div#controls {position: fixed;}
.handout {display: none;}

View File

@ -1,5 +0,0 @@
@import url("s5-core.css"); /* required to make the slide show run at all */
@import url("framing.css"); /* sets basic placement and size of slide components */
@import url(pretty.css); /* stuff that makes the slides look better than blah */
img { max-height: 25rem; }

View File

@ -1,553 +0,0 @@
// S5 v1.1 slides.js -- released into the Public Domain
//
// Please see http://www.meyerweb.com/eric/tools/s5/credits.html for information
// about all the wonderful and talented contributors to this code!
var undef;
var slideCSS = '';
var snum = 0;
var smax = 1;
var incpos = 0;
var number = undef;
var s5mode = true;
var defaultView = 'slideshow';
var controlVis = 'visible';
var isIE = navigator.appName == 'Microsoft Internet Explorer' && navigator.userAgent.indexOf('Opera') < 1 ? 1 : 0;
var isOp = navigator.userAgent.indexOf('Opera') > -1 ? 1 : 0;
var isGe = navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('Safari') < 1 ? 1 : 0;
function hasClass(object, className) {
if (!object.className) return false;
return (object.className.search('(^|\\s)' + className + '(\\s|$)') != -1);
}
function hasValue(object, value) {
if (!object) return false;
return (object.search('(^|\\s)' + value + '(\\s|$)') != -1);
}
function removeClass(object,className) {
if (!object) return;
object.className = object.className.replace(new RegExp('(^|\\s)'+className+'(\\s|$)'), RegExp.$1+RegExp.$2);
}
function addClass(object,className) {
if (!object || hasClass(object, className)) return;
if (object.className) {
object.className += ' '+className;
} else {
object.className = className;
}
}
function GetElementsWithClassName(elementName,className) {
var allElements = document.getElementsByTagName(elementName);
var elemColl = new Array();
for (var i = 0; i< allElements.length; i++) {
if (hasClass(allElements[i], className)) {
elemColl[elemColl.length] = allElements[i];
}
}
return elemColl;
}
function isParentOrSelf(element, id) {
if (element == null || element.nodeName=='BODY') return false;
else if (element.id == id) return true;
else return isParentOrSelf(element.parentNode, id);
}
function nodeValue(node) {
var result = "";
if (node.nodeType == 1) {
var children = node.childNodes;
for (var i = 0; i < children.length; ++i) {
result += nodeValue(children[i]);
}
}
else if (node.nodeType == 3) {
result = node.nodeValue;
}
return(result);
}
function slideLabel() {
var slideColl = GetElementsWithClassName('*','slide');
var list = document.getElementById('jumplist');
smax = slideColl.length;
for (var n = 0; n < smax; n++) {
var obj = slideColl[n];
var did = 'slide' + n.toString();
obj.setAttribute('id',did);
if (isOp) continue;
var otext = '';
var menu = obj.firstChild;
if (!menu) continue; // to cope with empty slides
while (menu && menu.nodeType == 3) {
menu = menu.nextSibling;
}
if (!menu) continue; // to cope with slides with only text nodes
var menunodes = menu.childNodes;
for (var o = 0; o < menunodes.length; o++) {
otext += nodeValue(menunodes[o]);
}
list.options[list.length] = new Option(n + ' : ' + otext, n);
}
}
function currentSlide() {
var cs;
if (document.getElementById) {
cs = document.getElementById('currentSlide');
} else {
cs = document.currentSlide;
}
cs.innerHTML = '<span id="csHere">' + snum + '<\/span> ' +
'<span id="csSep">\/<\/span> ' +
'<span id="csTotal">' + (smax-1) + '<\/span>';
if (snum == 0) {
cs.style.visibility = 'hidden';
} else {
cs.style.visibility = 'visible';
}
}
function go(step) {
if (document.getElementById('slideProj').disabled || step == 0) return;
var jl = document.getElementById('jumplist');
var cid = 'slide' + snum;
var ce = document.getElementById(cid);
if (incrementals[snum].length > 0) {
for (var i = 0; i < incrementals[snum].length; i++) {
removeClass(incrementals[snum][i], 'current');
removeClass(incrementals[snum][i], 'incremental');
}
}
if (step != 'j') {
snum += step;
lmax = smax - 1;
if (snum > lmax) snum = lmax;
if (snum < 0) snum = 0;
} else
snum = parseInt(jl.value);
var nid = 'slide' + snum;
var ne = document.getElementById(nid);
if (!ne) {
ne = document.getElementById('slide0');
snum = 0;
}
if (step < 0) {incpos = incrementals[snum].length} else {incpos = 0;}
if (incrementals[snum].length > 0 && incpos == 0) {
for (var i = 0; i < incrementals[snum].length; i++) {
if (hasClass(incrementals[snum][i], 'current'))
incpos = i + 1;
else
addClass(incrementals[snum][i], 'incremental');
}
}
if (incrementals[snum].length > 0 && incpos > 0)
addClass(incrementals[snum][incpos - 1], 'current');
ce.style.visibility = 'hidden';
ne.style.visibility = 'visible';
jl.selectedIndex = snum;
currentSlide();
number = 0;
}
function goTo(target) {
if (target >= smax || target == snum) return;
go(target - snum);
}
function subgo(step) {
if (step > 0) {
removeClass(incrementals[snum][incpos - 1],'current');
removeClass(incrementals[snum][incpos], 'incremental');
addClass(incrementals[snum][incpos],'current');
incpos++;
} else {
incpos--;
removeClass(incrementals[snum][incpos],'current');
addClass(incrementals[snum][incpos], 'incremental');
addClass(incrementals[snum][incpos - 1],'current');
}
}
function toggle() {
var slideColl = GetElementsWithClassName('*','slide');
var slides = document.getElementById('slideProj');
var outline = document.getElementById('outlineStyle');
if (!slides.disabled) {
slides.disabled = true;
outline.disabled = false;
s5mode = false;
fontSize('1em');
for (var n = 0; n < smax; n++) {
var slide = slideColl[n];
slide.style.visibility = 'visible';
}
} else {
slides.disabled = false;
outline.disabled = true;
s5mode = true;
fontScale();
for (var n = 0; n < smax; n++) {
var slide = slideColl[n];
slide.style.visibility = 'hidden';
}
slideColl[snum].style.visibility = 'visible';
}
}
function showHide(action) {
var obj = GetElementsWithClassName('*','hideme')[0];
switch (action) {
case 's': obj.style.visibility = 'visible'; break;
case 'h': obj.style.visibility = 'hidden'; break;
case 'k':
if (obj.style.visibility != 'visible') {
obj.style.visibility = 'visible';
} else {
obj.style.visibility = 'hidden';
}
break;
}
}
// 'keys' code adapted from MozPoint (http://mozpoint.mozdev.org/)
function keys(key) {
if (!key) {
key = event;
key.which = key.keyCode;
}
if (key.which == 84) {
toggle();
return;
}
if (s5mode) {
switch (key.which) {
case 10: // return
case 13: // enter
if (window.event && isParentOrSelf(window.event.srcElement, 'controls')) return;
if (key.target && isParentOrSelf(key.target, 'controls')) return;
if(number != undef) {
goTo(number);
break;
}
case 32: // spacebar
case 34: // page down
case 39: // rightkey
case 40: // downkey
if(number != undef) {
go(number);
} else if (!incrementals[snum] || incpos >= incrementals[snum].length) {
go(1);
} else {
subgo(1);
}
break;
case 33: // page up
case 37: // leftkey
case 38: // upkey
if(number != undef) {
go(-1 * number);
} else if (!incrementals[snum] || incpos <= 0) {
go(-1);
} else {
subgo(-1);
}
break;
case 36: // home
goTo(0);
break;
case 35: // end
goTo(smax-1);
break;
case 67: // c
showHide('k');
break;
}
if (key.which < 48 || key.which > 57) {
number = undef;
} else {
if (window.event && isParentOrSelf(window.event.srcElement, 'controls')) return;
if (key.target && isParentOrSelf(key.target, 'controls')) return;
number = (((number != undef) ? number : 0) * 10) + (key.which - 48);
}
}
return false;
}
function clicker(e) {
number = undef;
var target;
if (window.event) {
target = window.event.srcElement;
e = window.event;
} else target = e.target;
if (target.getAttribute('href') != null || hasValue(target.rel, 'external') || isParentOrSelf(target, 'controls') || isParentOrSelf(target,'embed') || isParentOrSelf(target,'object')) return true;
if (!e.which || e.which == 1) {
if (!incrementals[snum] || incpos >= incrementals[snum].length) {
go(1);
} else {
subgo(1);
}
}
}
function findSlide(hash) {
var target = null;
var slides = GetElementsWithClassName('*','slide');
for (var i = 0; i < slides.length; i++) {
var targetSlide = slides[i];
if ( (targetSlide.name && targetSlide.name == hash)
|| (targetSlide.id && targetSlide.id == hash) ) {
target = targetSlide;
break;
}
}
while(target != null && target.nodeName != 'BODY') {
if (hasClass(target, 'slide')) {
return parseInt(target.id.slice(5));
}
target = target.parentNode;
}
return null;
}
function slideJump() {
if (window.location.hash == null) return;
var sregex = /^#slide(\d+)$/;
var matches = sregex.exec(window.location.hash);
var dest = null;
if (matches != null) {
dest = parseInt(matches[1]);
} else {
dest = findSlide(window.location.hash.slice(1));
}
if (dest != null)
go(dest - snum);
}
function fixLinks() {
var thisUri = window.location.href;
thisUri = thisUri.slice(0, thisUri.length - window.location.hash.length);
var aelements = document.getElementsByTagName('A');
for (var i = 0; i < aelements.length; i++) {
var a = aelements[i].href;
var slideID = a.match('\#slide[0-9]{1,2}');
if ((slideID) && (slideID[0].slice(0,1) == '#')) {
var dest = findSlide(slideID[0].slice(1));
if (dest != null) {
if (aelements[i].addEventListener) {
aelements[i].addEventListener("click", new Function("e",
"if (document.getElementById('slideProj').disabled) return;" +
"go("+dest+" - snum); " +
"if (e.preventDefault) e.preventDefault();"), true);
} else if (aelements[i].attachEvent) {
aelements[i].attachEvent("onclick", new Function("",
"if (document.getElementById('slideProj').disabled) return;" +
"go("+dest+" - snum); " +
"event.returnValue = false;"));
}
}
}
}
}
function externalLinks() {
if (!document.getElementsByTagName) return;
var anchors = document.getElementsByTagName('a');
for (var i=0; i<anchors.length; i++) {
var anchor = anchors[i];
if (anchor.getAttribute('href') && hasValue(anchor.rel, 'external')) {
anchor.target = '_blank';
addClass(anchor,'external');
}
}
}
function createControls() {
var controlsDiv = document.getElementById("controls");
if (!controlsDiv) return;
var hider = ' onmouseover="showHide(\'s\');" onmouseout="showHide(\'h\');"';
var hideDiv, hideList = '';
if (controlVis == 'hidden') {
hideDiv = hider;
} else {
hideList = hider;
}
controlsDiv.innerHTML = '<form action="#" id="controlForm"' + hideDiv + '>' +
'<div id="navLinks">' +
'<a accesskey="t" id="toggle" href="javascript:toggle();">&#216;<\/a>' +
'<a accesskey="z" id="prev" href="javascript:go(-1);">&laquo;<\/a>' +
'<a accesskey="x" id="next" href="javascript:go(1);">&raquo;<\/a>' +
'<div id="navList"' + hideList + '><select id="jumplist" onchange="go(\'j\');"><\/select><\/div>' +
'<\/div><\/form>';
if (controlVis == 'hidden') {
var hidden = document.getElementById('navLinks');
} else {
var hidden = document.getElementById('jumplist');
}
addClass(hidden,'hideme');
}
function fontScale() { // causes layout problems in FireFox that get fixed if browser's Reload is used; same may be true of other Gecko-based browsers
if (!s5mode) return false;
var vScale = 22; // both yield 32 (after rounding) at 1024x768
var hScale = 32; // perhaps should auto-calculate based on theme's declared value?
if (window.innerHeight) {
var vSize = window.innerHeight;
var hSize = window.innerWidth;
} else if (document.documentElement.clientHeight) {
var vSize = document.documentElement.clientHeight;
var hSize = document.documentElement.clientWidth;
} else if (document.body.clientHeight) {
var vSize = document.body.clientHeight;
var hSize = document.body.clientWidth;
} else {
var vSize = 700; // assuming 1024x768, minus chrome and such
var hSize = 1024; // these do not account for kiosk mode or Opera Show
}
var newSize = Math.min(Math.round(vSize/vScale),Math.round(hSize/hScale));
fontSize(newSize + 'px');
if (isGe) { // hack to counter incremental reflow bugs
var obj = document.getElementsByTagName('body')[0];
obj.style.display = 'none';
obj.style.display = 'block';
}
}
function fontSize(value) {
if (!(s5ss = document.getElementById('s5ss'))) {
if (!isIE) {
document.getElementsByTagName('head')[0].appendChild(s5ss = document.createElement('style'));
s5ss.setAttribute('media','screen, projection');
s5ss.setAttribute('id','s5ss');
} else {
document.createStyleSheet();
document.s5ss = document.styleSheets[document.styleSheets.length - 1];
}
}
if (!isIE) {
while (s5ss.lastChild) s5ss.removeChild(s5ss.lastChild);
s5ss.appendChild(document.createTextNode('body {font-size: ' + value + ' !important;}'));
} else {
document.s5ss.addRule('body','font-size: ' + value + ' !important;');
}
}
function notOperaFix() {
slideCSS = document.getElementById('slideProj').href;
var slides = document.getElementById('slideProj');
var outline = document.getElementById('outlineStyle');
slides.setAttribute('media','screen');
outline.disabled = true;
if (isGe) {
slides.setAttribute('href','null'); // Gecko fix
slides.setAttribute('href',slideCSS); // Gecko fix
}
if (isIE && document.styleSheets && document.styleSheets[0]) {
document.styleSheets[0].addRule('img', 'behavior: url(ui/default/iepngfix.htc)');
document.styleSheets[0].addRule('div', 'behavior: url(ui/default/iepngfix.htc)');
document.styleSheets[0].addRule('.slide', 'behavior: url(ui/default/iepngfix.htc)');
}
}
function getIncrementals(obj) {
var incrementals = new Array();
if (!obj)
return incrementals;
var children = obj.childNodes;
for (var i = 0; i < children.length; i++) {
var child = children[i];
if (hasClass(child, 'incremental')) {
if (child.nodeName == 'OL' || child.nodeName == 'UL') {
removeClass(child, 'incremental');
for (var j = 0; j < child.childNodes.length; j++) {
if (child.childNodes[j].nodeType == 1) {
addClass(child.childNodes[j], 'incremental');
}
}
} else {
incrementals[incrementals.length] = child;
removeClass(child,'incremental');
}
}
if (hasClass(child, 'show-first')) {
if (child.nodeName == 'OL' || child.nodeName == 'UL') {
removeClass(child, 'show-first');
if (child.childNodes[isGe].nodeType == 1) {
removeClass(child.childNodes[isGe], 'incremental');
}
} else {
incrementals[incrementals.length] = child;
}
}
incrementals = incrementals.concat(getIncrementals(child));
}
return incrementals;
}
function createIncrementals() {
var incrementals = new Array();
for (var i = 0; i < smax; i++) {
incrementals[i] = getIncrementals(document.getElementById('slide'+i));
}
return incrementals;
}
function defaultCheck() {
var allMetas = document.getElementsByTagName('meta');
for (var i = 0; i< allMetas.length; i++) {
if (allMetas[i].name == 'defaultView') {
defaultView = allMetas[i].content;
}
if (allMetas[i].name == 'controlVis') {
controlVis = allMetas[i].content;
}
}
}
// Key trap fix, new function body for trap()
function trap(e) {
if (!e) {
e = event;
e.which = e.keyCode;
}
try {
modifierKey = e.ctrlKey || e.altKey || e.metaKey;
}
catch(e) {
modifierKey = false;
}
return modifierKey || e.which == 0;
}
function startup() {
defaultCheck();
if (!isOp)
createControls();
slideLabel();
fixLinks();
externalLinks();
fontScale();
if (!isOp) {
notOperaFix();
incrementals = createIncrementals();
slideJump();
if (defaultView == 'outline') {
toggle();
}
document.onkeyup = keys;
document.onkeypress = trap;
document.onclick = clicker;
}
}
window.onload = startup;
window.onresize = function(){setTimeout('fontScale()', 50);}

View File

@ -1,2 +0,0 @@
*.pdf
Slides/*.html

View File

@ -1,238 +0,0 @@
# Initiation à NoSQL
## Sylvain Eliade, Cadoles
------
## C'est quoi NoSQL ?
* Désigne toutes les bases de données non-relationnelles
* Base relationnelle (RDBMS) = généralement SQL
* Mais on peut faire du SQL non-relationnel !
* Donc maintenant, NoSQL = "Not Only SQL"
* Au final, un mot un peu trop vague, comme "Web 2.0"
---
## Rappel : RDBM
<figure>
<img src="Images/rdbm.svg" alt="" />
</figure>
---
## Rappel : ACID
* Atomique = tout changement (transaction) à la BDD doit fonctionner ou échouer en entier (mais pas être exécuté à moitié et échouer à moitié !)
* Consistant = toutes les règles imposées doivent être valides (clés, triggers, contraintes, etc.) pour empêcher la corruption de la BDD
* Isolation = les transactions pouvant être exécutées en même temps, une requête concurrente ne doit pas avoir accès à un état transitoire de la BDD
* Durabilité = une transaction écrite dans la BDD doit le rester en cas de crash logiciel ou coupure du serveur
---
## Différences entre RDBMS et NoSQL
* Généralement pas ACID (Atomicity, Consistency, Isolation, Durability)
* Mais parfois oui (CouchDB), parfois partiellement
* Théoriquement plus facile à dimensionner horizontalement
* En pratique les RDBMS se dimensionnent très bien aussi
* La plus grosse différence et intérêt : non relationnel ! :)
---
### Quand utiliser une BDD noSQL ?
* Besoin de très grosses performances
* … ou stockage de très gros volume de données
* Données très spécifiques et non-relationnelles
* Et surtout : pas de besoins relationnels !
---
### Quand utiliser une BDD noSQL ?
* … mais même dans ces cas, un RDBM est souvent plus simple et rapide à mettre en œuvre
* Et un RDBM supporte aussi de très grandes quantités de données et de bonnes performances… si vous savez bien l'utiliser :)
* Vous n'êtes pas Google, Amazon ou Alibaba !
* Une solution SQL (Postgre, MySQL, SQL Server, Oracle…) sera adaptée à 95% des besoins
* Sinon : petit projet, "pour tester", qui ne sera pas amené à évoluer, car changer de BDD est lourd !
---
## NoSQL : une solution parmi d'autres
* Les bases NoSQL ont été créées pour répondre à des besoins de très gros acteurs
* Besoins qui sont rarement atteints ailleurs
* NoSQL est une solution, pas LA solution
* Bien évaluer le problème avant de choisir la ou les solutions :)
* Le bon côté : NoSQL a initié une modernisation des RDBMs
---
## Google abandonne NoSQL
* Google, à l'origine de BigTable et MapReduce, premières solutions NoSQL
* … sont repassés à SQL avec [Spanner et le "Standard SQL"](https://blog.timescale.com/blog/why-sql-beating-nosql-what-this-means-for-future-of-data-time-series-database-348b777b847a/) commun à plusieurs outils internes.
* Car SQL facilite l'arrivée de nouveaux développeurs et la possibilité de communiquer avec des outils différents mais avec le même langage.
* Résultat : solutions NoSQL requêtables en SQL :)
---
## NoSQL dans SQL, le meilleur des deux mondes ?
* Stockage JSON dans PostgreSQL (depuis la version 9.2), MySQL (5.7.8), SQLite (3.9.0), SQL Server
* Recherche plein texte, index sur les données JSON, jointures !
* Implémentation légèrement différente dans SQLite
* Performance : pas forcément lent
* PostgreSQL est plus rapide avec JSONB que MongoDB par exemple (mais nécessite plus d'optimisation de la configuration)
---
## Les familles de bases NoSQL
* Clé-valeur (Berkeley DB, memcached, Redis, Apache Ignite, etc.)
* Document (MongoDB, Apache CouchDB, etc.)
* Colonnes ou "wide column" (Cassandra, HBase, etc.)
* Graph (Neo4j, Apache Giraph…)
---
## Bases de données clé-valeur
* Aussi vieilles que l'informatique !
* On référence une valeur à l'aide d'une clé pour aider à retrouver la valeur
* La valeur ne fait pas de différence pour le moteur de BDD (opaque)
* On ne peut donc pas trouver une entrée juste avec une partie de la valeur
* Du plus simple (memcached, Berkeley DB) au plus évolué (Redis)
* Rapide, simple, efficace
---
## Bases de données clé-valeur
<figure>
<img src="Images/kv.png" alt="" />
</figure>
---
### Quand utiliser une BDD clé-valeur ?
* Données simples et à une seule dimension
* Données qui peuvent expirer
* Pas forcément besoin de persistance
* Exemples : cache, queue, statistiques…
---
### Quand ne pas utiliser une BDD clé-valeur ?
* Données structurées sur plusieurs niveaux (2D+)
* Besoins de jointures entre les données
* Besoin d'index sur le contenu des valeurs
* Besoin de chercher dans les valeurs
* Besoin de lister toutes les clés (lent)
* Données très grandes (selon le moteur de BDD, par exemple si les données sont stockées en RAM)
---
## Bases de données document
* Évolution du modèle clé-valeur (document = valeur)
* Sauf que le contenu de la valeur peut être indexé / référencé
* Plutôt adapté à un modèle où les documents sont indépendants et n'ont pas de relation entre eux
* Exemples : MongoDB, CouchDB, etc.
---
## Bases de données document
<figure>
<img src="Images/document.png" alt="" />
</figure>
---
### Quand utiliser une BDD document ?
* Données structurées ou complexes
* Structure des données très variable
* Données non relationnelles
* Pas de schéma
* Exemple : fiches produit d'un site ecommerce
---
## Base de données orientée colonnes
* Comme une BDD clé-valeur, mais en 2D !
* On retrouve une donnée à l'aide d'une clé (ligne) et d'un nom de colonne
* Toutes les lignes n'ont pas forcément les même colonnes (contrairement à une table dans un RDBM)
* Les colonnes sont donc indépendantes d'une ligne à l'autre
* Exemples : Cassandra, HBase (historiquement : Google BigTable)
---
### Quand utiliser une BDD orientée colonnes ?
* Beaucoup d'écritures (ajouts)
* Grand volume de données
* Besoins de réplication
* Données peu structurées
* Données en 2D uniquement (clé d'accès + colonnes)
* Exemple idéal : statistiques, messageries temps réel
---
### Quand ne pas utiliser une BDD orientée colonnes ?
* Beaucoup de mises à jour / suppression de lignes
* Besoin de transactions, de rollbacks, de triggers, joins, etc.
* Besoin ACID : ce n'est pas du tout fait pour
* Besoin de parcourir toutes les données stockées : lent !
---
## Base de données graph
* Documents (= nœuds) liés ensemble par des relations (= arcs ou graphs)
* Les relations peuvent disposer de propriétés selon le contexte
* On peut accéder aux nœuds via leurs relations
---
## Base de données graph
<figure>
<img src="Images/graph.png" alt="" />
</figure>
---
### Quand utiliser une BDD graph ?
* Données non structurées (pas de schéma)
* Liées ensemble de manière non ordonnée
* Exemples : graph d'amis (réseau social), recommandations de produits, détection de fraude…
---
### Quand ne pas utiliser une BDD graph ?
* Données non liées
* Données séquentielles
* Pas de besoin de lire les données
* Données dans un schéma fixe
* Besoin de stocker beaucoup de données dans les propriétés
---
### Exemples de NoSQL chez Skyrock
* Skyrock : 20+ millions d'utilisateurs, 4+ milliards de commentaires, 500.000 articles / jour, 2 millions de commentaires / jour… 2ème site de France 2007-2010
* [Sharedance](https://github.com/jedisct1/sharedance) (clé-valeur, ancêtre de memcached) : stockage de sessions PHP dans un système de fichier en ramdisk
* Topy : serveur de statistiques en RAM (avec autodump sur disque). Exemple : utilisateurs les plus actifs, blogs les plus consultés, etc.
* [Fluxy](http://zmoo.fr/fluxy.php) : serveur de newsfeed en RAM (avec autodump). Liste des événements liés à un utilisateur. 2 serveurs pour 20+ millions d'utilisateurs
* memcached puis Redis : cache de résultats MySQL, liste des utilisateurs connectés, cache des images uploadées en cours de traitement…
* MongoDB : application mobile de chat Smax

View File

@ -1,46 +0,0 @@
# Introduction à Redis
## Sylvain Eliade, Cadoles
---
## Redis
* Stockage en mémoire
* Mais pas que… Stockage persistant optionnel
* Base de données, cache, pub-sub
* Réplication, transactions, partitionnement…
* Nombreux types de structures de données, majoritairement clé-valeur
* Très très rapide
* Un seul thread, mais c'est pas grave, c'est pas le CPU qui limite
* Scriptable avec Lua
---
## Types de structures de données
* Chaînes de caractère
* Listes simples
* Jeux de données uniques non-ordonnées (sets)
* Dictionnaires (hashes)
* Liste triée (sorted set)
---
## Le protocole de Redis
* Protocole texte simple (utilisable par telnet !)
* Commandes texte suivies d'arguments : `SET clé valeur`
* Réponse texte : `OK`, chaînes, etc.
---
## Commandes de base
* [Commandes Redis](https://redis.io/commands)
* [Types Redis](https://redis.io/topics/data-types)
* Redis-cli !
* `SET test coucou``OK`
* `GET test``"coucou"`
* `DEL test``(integer) 1` = une clé supprimée, c'est bon !
* `KEYS *` = lister toutes les clés

View File

@ -1,83 +0,0 @@
# Exercices Redis
* Utiliser redis-cli et copier/coller le résultat de chaque exercice (commandes et retours de Redis) dans un fichier texte.
* [Installer Redis sous Windows](https://www.supinfo.com/articles/single/8843-redis-installation-windows)
---
## Exercice 1
* créer une clé "normale" avec sa valeur
* récupérer le résultat
* supprimer la clé
---
## Exercice 2 : expiration
* créer une clé
* lui donner une expiration courte (quelques secondes)
* vérifier que la clé "disparaît" toute seule
---
## Exercice 3 : compteurs
* Créer une clé contenant un numéro
* L'incrémenter et le décrementer avec les commandes Redis adaptées
---
## Exercice 4 : liste unique non ordonnée
* Créer une liste unique non ordonnée (set, `SADD`)
* Y insérer plusieurs entrées
* Insérer des entrées en double
* Vérifier que la liste ne contient pas de doublons
* Supprimer des entrées
---
## Exercice 5 : liste ordonnée par ordre d'insertion
* Créer une liste ordonnée (`LPUSH`)
* Ajouter des entrées par la gauche et la droite (`LPUSH` et `RPUSH`)
* Récupérer une partie de la liste
* Supprimer des éléments par la gauche, la droite (pop) et arbitrairement (rem)
---
## Exercice 6 : hashes
* Créer un hash avec plusieurs sous-clés et sous-valeurs (`HSET` et `HMSET`)
* Récupérer toutes les sous-valeurs du hash
* Modifier une seule sous-valeur
* Récupérer une seule sous-valeur
---
## Exercice 7 : liste ordonnée par score
* Enregistrer les scores de 10 joueurs de Tetris dans une liste ordonnée (`ZADD`), avec leurs noms et leurs scores
* Récupérer la liste des 5 meilleurs joueurs (`ZRANGE`)
* Récupérer le score du joueur Bob
---
## Mini-projet : newsfeed de réseau social
* Note : tout le monde doit utiliser le même serveur Redis au final !
* Travail en équipe (groupes et classe).
* Prérequis avant de coder : se mettre d'accord avec le reste de la classe de la structure des données à stocker dans Redis (types, noms des clés, etc.) !
* Pour rendre les choses plus faciles : la base Redis contiendra une liste unique non ordonnée "utilisateurs" contenant la liste des noms/pseudo des utilisateurs du réseau social.
* L'application doit permettre d'ajouter des posts à sa propre timeline
* Les posts doivent contenir : date, nom de l'utilisateur, contenu du post
* Chaque utilisateur a une timeline différente selon qui il veut suivre
* Mais le contenu des posts ne doit être stocké qu'une seule fois !
* L'application doit propager ces posts aux utilisateurs inscrits à sa propre timeline
* L'application doit permettre de lire les derniers posts des utilisateurs auxquels on s'est inscrit
* Note : l'implémentation de la gestion des utilisateurs et de l'inscription aux timelines des autres utilisateurs est facultative (création d'utilisateur et inscription aux timelines sont possibles à la main avec redis-cli).
* Note 2 : certaines données associatives peuvent être doublonnées (présence dans plusieurs clés) si nécessaire.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

View File

@ -1,31 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="195.79131" height="40.452461" id="svg3780" version="1.1" inkscape:version="0.48.3.1 r9886" sodipodi:docname="logo.svg">
<defs id="defs3782"/>
<sodipodi:namedview id="base" pagecolor="#ffffff" bordercolor="#666666" borderopacity="1.0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:zoom="4.2416268" inkscape:cx="45.753768" inkscape:cy="19.200676" inkscape:document-units="px" inkscape:current-layer="layer1" showgrid="true" fit-margin-top="0" fit-margin-left="0" fit-margin-right="0" fit-margin-bottom="0" inkscape:window-width="1366" inkscape:window-height="744" inkscape:window-x="0" inkscape:window-y="24" inkscape:window-maximized="1">
<inkscape:grid type="xygrid" id="grid3015" empspacing="5" visible="true" enabled="true" snapvisiblegridlinesonly="true" originx="-8.39956px" originy="-37.93714px"/>
</sodipodi:namedview>
<metadata id="metadata3785">
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
<dc:title/>
</cc:Work>
</rdf:RDF>
</metadata>
<g inkscape:label="Calque 1" inkscape:groupmode="layer" id="layer1" transform="translate(-335.39956,-499.83558)">
<path style="fill:#078eb5;fill-opacity:1;stroke:none;display:inline;enable-background:new" d="m 356.56825,499.83558 c -13.23043,0 -21.16869,13.23042 -21.16869,23.81477 l 2.64609,0 0,10.58433 c 5.29217,7.93824 32.07212,8.20297 37.04519,0 l 0,-10.58433 2.64607,0 c 0,-4.29058 -1.30219,-9.01755 -3.73483,-13.12018 l -2.99063,3.03198 0,7.12513 1.61247,2.21885 -2.39802,2.31533 -2.43937,-2.31533 1.72272,-2.14993 -0.0688,-7.71776 3.87264,-3.6108 c -0.97461,-1.47147 -2.10693,-2.84403 -3.37655,-4.0656 l -4.87871,5.18192 0,7.13891 1.61245,2.21886 -2.41179,2.31532 -2.43936,-2.31532 1.73648,-2.16374 -0.0826,-7.71774 5.37486,-5.63672 c -1.29755,-1.09094 -2.7222,-2.03518 -4.27232,-2.77012 l -5.59538,5.93992 0,7.12513 1.62625,2.23264 -2.4118,2.31532 -2.43936,-2.31532 1.73649,-2.16373 -0.0826,-7.71774 5.88478,-5.95371 c -2.05509,-0.79293 -4.29761,-1.24034 -6.72546,-1.24034 z m 6.72545,1.24034 1.2817,0.53749 z m 5.55403,3.30761 1.08875,0.97851 z m 4.46526,5.04411 0.68909,1.10253 z M 352,526.57486 l 8.85806,-0.11137 0.0557,10.43027 -8.91375,0.1018 z" id="path3773" inkscape:connector-curvature="0" sodipodi:nodetypes="scccccccccccccccccccccccccccccccccscccccccccccccc"/>
<g style="font-size:40px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:condensed;line-height:0%;letter-spacing:0px;word-spacing:0px;fill:#777777;fill-opacity:1;stroke:none;font-family:Liberation Sans Narrow;-inkscape-font-specification:Liberation Sans Narrow Bold Condensed" id="text2983" transform="translate(42.28018,-8.4690297)">
<path d="m 374.16131,539.65491 1.40625,0.95703 c -1.35419,1.86198 -3.07294,3.33333 -5.15625,4.41406 -2.08335,1.06771 -4.32945,1.60156 -6.73828,1.60156 -2.00522,0 -3.91928,-0.39062 -5.74219,-1.17187 -1.82292,-0.78125 -3.39193,-1.83594 -4.70703,-3.16406 -1.31511,-1.32812 -2.36328,-2.91015 -3.14453,-4.7461 -0.78125,-1.83592 -1.17188,-3.76301 -1.17188,-5.78125 0,-2.01821 0.39063,-3.94529 1.17188,-5.78125 0.78125,-1.83591 1.82942,-3.41794 3.14453,-4.74609 1.3151,-1.3281 2.88411,-2.38279 4.70703,-3.16406 1.82291,-0.78122 3.73697,-1.17185 5.74219,-1.17188 2.39581,3e-5 4.63539,0.5469 6.71875,1.64063 2.08331,1.08075 3.80857,2.55862 5.17578,4.43359 l -1.40625,1.03516 c -1.21096,-1.62758 -2.7344,-2.91013 -4.57031,-3.84766 -1.82294,-0.95049 -3.79559,-1.42575 -5.91797,-1.42578 -2.36981,3e-5 -4.5573,0.58596 -6.5625,1.75781 -1.9922,1.1719 -3.56772,2.76695 -4.72656,4.78516 -1.15886,2.00522 -1.73829,4.19923 -1.73828,6.58203 -10e-6,1.77084 0.33853,3.46355 1.01562,5.07812 0.6901,1.61459 1.61458,3.00782 2.77344,4.17969 1.15884,1.17188 2.54556,2.10938 4.16015,2.8125 1.61457,0.69011 3.30728,1.03516 5.07813,1.03516 2.12238,0 4.09503,-0.47526 5.91797,-1.42578 1.83591,-0.95052 3.35935,-2.24609 4.57031,-3.88672" style="font-weight:normal;font-stretch:normal;fill:#777777;fill-opacity:1;font-family:Sawasdee;-inkscape-font-specification:Sawasdee" id="path2997" inkscape:connector-curvature="0"/>
<path d="m 435.4735,526.29553 c 1.36717,2e-5 2.67576,0.26695 3.92578,0.80078 1.24998,0.53388 2.33071,1.25653 3.24218,2.16797 0.91144,0.91148 1.6341,1.99872 2.16797,3.26172 0.53383,1.26303 0.80076,2.58465 0.80078,3.96484 -2e-5,1.39324 -0.26695,2.72137 -0.80078,3.98438 -0.53387,1.26303 -1.25653,2.35026 -2.16797,3.26172 -0.91147,0.89844 -1.9922,1.62109 -3.24218,2.16797 -1.25002,0.53385 -2.55861,0.80078 -3.92578,0.80078 -2.79949,0 -5.18881,-0.99609 -7.16797,-2.98828 -1.97917,-1.99219 -2.96876,-4.40104 -2.96875,-7.22657 -10e-6,-1.84894 0.44921,-3.55467 1.34765,-5.11718 0.91146,-1.57551 2.14192,-2.81248 3.69141,-3.71094 1.56249,-0.91144 3.26171,-1.36717 5.09766,-1.36719 m -8.39844,10.19531 c -1e-5,2.33074 0.82031,4.32944 2.46094,5.9961 1.65363,1.65365 3.64582,2.48047 5.97656,2.48047 2.33071,0 4.31639,-0.82682 5.95703,-2.48047 1.65362,-1.66666 2.48045,-3.66536 2.48047,-5.9961 -2e-5,-2.31769 -0.82685,-4.30337 -2.48047,-5.95703 -1.64064,-1.65362 -3.62632,-2.48045 -5.95703,-2.48047 -2.33074,2e-5 -4.32293,0.82685 -5.97656,2.48047 -1.64063,1.65366 -2.46095,3.63934 -2.46094,5.95703" style="font-weight:normal;font-stretch:normal;fill:#777777;fill-opacity:1;font-family:Sawasdee;-inkscape-font-specification:Sawasdee" id="path3003" inkscape:connector-curvature="0"/>
<path d="m 451.22209,546.41272 -1.75781,0 0,-29.18754 1.75781,0 0,29.18754" style="font-weight:normal;font-stretch:normal;fill:#777777;fill-opacity:1;font-family:Sawasdee;-inkscape-font-specification:Sawasdee" id="path3005" inkscape:connector-curvature="0"/>
<path d="m 456.99022,534.83069 14.39453,0 c -0.3646,-1.96613 -1.22398,-3.58723 -2.57812,-4.86328 -1.35419,-1.27603 -2.90366,-1.91405 -4.64844,-1.91407 -1.73178,2e-5 -3.27475,0.63804 -4.62891,1.91407 -1.34115,1.27605 -2.1875,2.89715 -2.53906,4.86328 m 16.30859,1.66015 -16.58203,0 c 0,2.33074 0.72916,4.30991 2.1875,5.9375 1.45833,1.62761 3.18359,2.44141 5.17578,2.44141 1.31509,0 2.60416,-0.35156 3.86719,-1.05469 1.263,-0.70312 2.22655,-1.64713 2.89063,-2.83203 l 1.54296,0.87891 c -0.79429,1.41927 -1.96616,2.58464 -3.51562,3.49609 -1.54949,0.89844 -3.14455,1.34766 -4.78516,1.34766 -1.65365,0 -3.17709,-0.46224 -4.57031,-1.38672 -1.38021,-0.92448 -2.46745,-2.16797 -3.26172,-3.73047 -0.78125,-1.57551 -1.17188,-3.27473 -1.17187,-5.09766 -1e-5,-1.80988 0.39713,-3.49608 1.1914,-5.05859 0.80729,-1.56248 1.90755,-2.80597 3.30078,-3.73047 1.40625,-0.93748 2.93619,-1.40623 4.58985,-1.40625 1.56248,2e-5 3.01431,0.4232 4.35547,1.26953 1.35415,0.83335 2.44789,1.95966 3.28125,3.37891 0.83331,1.41928 1.32159,2.97527 1.46484,4.66797 l 0.0391,0.8789" style="font-weight:normal;font-stretch:normal;fill:#777777;fill-opacity:1;font-family:Sawasdee;-inkscape-font-specification:Sawasdee" id="path3007" inkscape:connector-curvature="0"/>
<path d="m 487.66068,530.10413 -1.62109,0.5664 c -0.27345,-0.87238 -0.73569,-1.53644 -1.38672,-1.99219 -0.65105,-0.46873 -1.34767,-0.7031 -2.08984,-0.70312 -0.85939,2e-5 -1.59506,0.27346 -2.20703,0.82031 -0.59897,0.54689 -0.89845,1.28908 -0.89844,2.22656 -10e-6,0.49481 0.13671,0.94403 0.41015,1.34766 0.27344,0.40366 0.63151,0.73569 1.07422,0.99609 0.4427,0.26043 0.94401,0.52736 1.50391,0.80079 0.57291,0.27345 1.15233,0.52735 1.73828,0.76171 0.58593,0.23439 1.15884,0.52736 1.71875,0.87891 0.5729,0.35157 1.08072,0.72918 1.52344,1.13281 0.44269,0.40366 0.80076,0.92449 1.07422,1.5625 0.27342,0.63803 0.41014,1.35418 0.41015,2.14844 -1e-5,1.8099 -0.64454,3.28125 -1.93359,4.41406 -1.28908,1.1198 -2.78647,1.67969 -4.49219,1.67969 -0.74219,0 -1.45183,-0.11719 -2.1289,-0.35156 -0.67709,-0.2474 -1.30209,-0.60547 -1.875,-1.07422 -0.57293,-0.46875 -1.06121,-1.09375 -1.46485,-1.875 -0.40365,-0.78125 -0.66406,-1.67317 -0.78125,-2.67578 l 1.73828,-0.25391 c 0.18229,1.48438 0.69661,2.60417 1.54297,3.35938 0.85937,0.75521 1.86197,1.13281 3.00781,1.13281 1.21093,0 2.28515,-0.40364 3.22266,-1.21094 0.93749,-0.82031 1.40624,-1.86848 1.40625,-3.14453 -1e-5,-0.70312 -0.17579,-1.32161 -0.52734,-1.85547 -0.35158,-0.54686 -0.80731,-0.98957 -1.36719,-1.32812 -0.54689,-0.33854 -1.15887,-0.65755 -1.83594,-0.95703 -0.67709,-0.29947 -1.35417,-0.60546 -2.03125,-0.91797 -0.67709,-0.31249 -1.29558,-0.65103 -1.85547,-1.01563 -0.54688,-0.37759 -0.9961,-0.86587 -1.34765,-1.46484 -0.35157,-0.61197 -0.52735,-1.30858 -0.52735,-2.08985 0,-1.45831 0.48177,-2.61716 1.44532,-3.47656 0.97655,-0.85935 2.12889,-1.28904 3.45703,-1.28906 1.09374,2e-5 2.11587,0.33205 3.0664,0.99609 0.95051,0.65106 1.62759,1.60158 2.03125,2.85157" style="font-weight:normal;font-stretch:normal;fill:#777777;fill-opacity:1;font-family:Sawasdee;-inkscape-font-specification:Sawasdee" id="path3009" inkscape:connector-curvature="0"/>
<g style="font-weight:normal;fill:#777777;fill-opacity:1;font-family:Sans" id="text3011">
<path d="m 377.53329,536.50769 c 0,-2.8203 0.99577,-5.22622 2.98731,-7.21777 1.99153,-1.99152 4.39127,-2.98729 7.19922,-2.98731 2.8203,2e-5 5.22622,0.99579 7.21777,2.98731 0.38344,0.39585 0.73598,0.81023 1.05762,1.24316 l 0,-2.5791 1.66992,0 0,18.2207 -1.66992,0 0,-3.71093 c -0.32164,0.43294 -0.67418,0.84733 -1.05762,1.24316 -1.99155,1.99154 -4.39747,2.9873 -7.21777,2.9873 -2.80795,0 -5.20769,-0.99576 -7.19922,-2.9873 -1.99154,-1.99153 -2.98731,-4.39127 -2.98731,-7.19922 m 1.7627,0 c 0,2.32553 0.82259,4.31088 2.46777,5.95606 1.64518,1.63281 3.63053,2.44922 5.95606,2.44921 2.3255,10e-6 4.31085,-0.82259 5.95605,-2.46777 1.23696,-1.23697 2.01007,-2.66568 2.31934,-4.28613 l 0,-3.30274 c -0.30927,-1.6328 -1.08238,-3.06769 -2.31934,-4.30468 -1.6452,-1.64517 -3.63055,-2.46776 -5.95605,-2.46778 -2.32553,2e-5 -4.31088,0.82261 -5.95606,2.46778 -1.64518,1.64519 -2.46777,3.63054 -2.46777,5.95605" style="font-size:38px;font-variant:normal;font-stretch:normal;letter-spacing:-1.11000001000000004px;fill:#777777;fill-opacity:1;font-family:Caviar Dreams;-inkscape-font-specification:Caviar Dreams" id="path3018" inkscape:connector-curvature="0"/>
<path d="m 401.65767,536.50769 c 0,-2.8203 0.99576,-5.22622 2.9873,-7.21777 1.99153,-1.99152 4.39127,-2.98729 7.19922,-2.98731 2.8203,2e-5 5.22622,0.99579 7.21778,2.98731 0.38344,0.39585 0.73598,0.81023 1.05761,1.24316 l 0,-14.0459 1.66993,0 0,29.6875 -1.66993,0 0,-3.71093 c -0.32163,0.43294 -0.67417,0.84733 -1.05761,1.24316 -1.99156,1.99154 -4.39748,2.9873 -7.21778,2.9873 -2.80795,0 -5.20769,-0.99576 -7.19922,-2.9873 -1.99154,-1.99153 -2.9873,-4.39127 -2.9873,-7.19922 m 1.76269,0 c 0,2.32553 0.82259,4.31088 2.46778,5.95606 1.64517,1.63281 3.63052,2.44922 5.95605,2.44921 2.32551,10e-6 4.31086,-0.82259 5.95606,-2.46777 1.23696,-1.23697 2.01007,-2.66568 2.31933,-4.28613 l 0,-3.30274 c -0.30926,-1.6328 -1.08237,-3.06769 -2.31933,-4.30468 -1.6452,-1.64517 -3.63055,-2.46776 -5.95606,-2.46778 -2.32553,2e-5 -4.31088,0.82261 -5.95605,2.46778 -1.64519,1.64519 -2.46778,3.63054 -2.46778,5.95605" style="font-size:38px;font-variant:normal;font-stretch:normal;letter-spacing:-1.11000001000000004px;fill:#777777;fill-opacity:1;font-family:Caviar Dreams;-inkscape-font-specification:Caviar Dreams" id="path3020" inkscape:connector-curvature="0"/>
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 12 KiB

View File

@ -1,76 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg
PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg viewBox="135 125 577 535" width="442px" height="410px" xmlns="http://www.w3.org/2000/svg" version="1.1">
<line x1="288" y1="170" x2="298" y2="170" style="stroke:#333;stroke-width:1;"/>
<line x1="420" y1="170" x2="430" y2="170" style="stroke:#333;stroke-width:1;"/>
<line x1="298" y1="170" x2="420" y2="170" style="stroke:#333;stroke-width:1;"/>
<line x1="295.5" y1="170" x2="291.96446609407" y2="173.53553390593" style="stroke:#333;stroke-width:2;"/>
<line x1="295.5" y1="170" x2="291.96446609407" y2="166.46446609407" style="stroke:#333;stroke-width:2;"/>
<line x1="425" y1="170" x2="421.46446609407" y2="173.53553390593" style="stroke:#333;stroke-width:2;"/>
<line x1="425" y1="170" x2="421.46446609407" y2="166.46446609407" style="stroke:#333;stroke-width:2;"/>
<line x1="328" y1="290" x2="338" y2="290" style="stroke:#333;stroke-width:1;"/>
<line x1="420" y1="170" x2="430" y2="170" style="stroke:#333;stroke-width:1;"/>
<line x1="338" y1="290" x2="420" y2="170" style="stroke:#333;stroke-width:1;"/>
<line x1="335.5" y1="290" x2="331.96446609407" y2="293.53553390593" style="stroke:#333;stroke-width:2;"/>
<line x1="335.5" y1="290" x2="331.96446609407" y2="286.46446609407" style="stroke:#333;stroke-width:2;"/>
<line x1="425" y1="170" x2="421.46446609407" y2="173.53553390593" style="stroke:#333;stroke-width:2;"/>
<line x1="425" y1="170" x2="421.46446609407" y2="166.46446609407" style="stroke:#333;stroke-width:2;"/>
<rect width="138" height="20" x="430" y="140" style="fill:#007;stroke:black;"/>
<text width="138" height="20" x="435" y="154" style="fill:#fff;" font-family="Arial" font-size="16px"> product</text>
<rect width="138" height="20" x="430" y="160" style="fill:#aea;stroke:black;"/>
<text width="138" height="20" x="435" y="174" style="fill:black;" font-family="Arial" font-size="16px">id</text>
<rect width="138" height="20" x="430" y="180" style="fill:none;stroke:black;"/>
<text width="138" height="20" x="435" y="194" style="fill:black;" font-family="Arial" font-size="16px">name</text>
<rect width="138" height="20" x="430" y="200" style="fill:none;stroke:black;"/>
<text width="138" height="20" x="435" y="214" style="fill:black;" font-family="Arial" font-size="16px">seo_name</text>
<rect width="138" height="20" x="430" y="220" style="fill:none;stroke:black;"/>
<text width="138" height="20" x="435" y="234" style="fill:black;" font-family="Arial" font-size="16px">slug</text>
<rect width="138" height="20" x="430" y="240" style="fill:none;stroke:black;"/>
<text width="138" height="20" x="435" y="254" style="fill:black;" font-family="Arial" font-size="16px">reference</text>
<rect width="138" height="20" x="430" y="260" style="fill:none;stroke:black;"/>
<text width="138" height="20" x="435" y="274" style="fill:black;" font-family="Arial" font-size="16px">short_description</text>
<rect width="138" height="20" x="430" y="280" style="fill:none;stroke:black;"/>
<text width="138" height="20" x="435" y="294" style="fill:black;" font-family="Arial" font-size="16px">seo_description</text>
<rect width="138" height="20" x="430" y="300" style="fill:none;stroke:black;"/>
<text width="138" height="20" x="435" y="314" style="fill:black;" font-family="Arial" font-size="16px">position</text>
<rect width="138" height="20" x="430" y="320" style="fill:none;stroke:black;"/>
<text width="138" height="20" x="435" y="334" style="fill:black;" font-family="Arial" font-size="16px">weight</text>
<rect width="138" height="20" x="430" y="340" style="fill:none;stroke:black;"/>
<text width="138" height="20" x="435" y="354" style="fill:black;" font-family="Arial" font-size="16px">created</text>
<rect width="138" height="20" x="430" y="360" style="fill:none;stroke:black;"/>
<text width="138" height="20" x="435" y="374" style="fill:black;" font-family="Arial" font-size="16px">updated</text>
<rect width="138" height="20" x="430" y="380" style="fill:none;stroke:black;"/>
<text width="138" height="20" x="435" y="394" style="fill:black;" font-family="Arial" font-size="16px">long_description</text>
<rect width="138" height="20" x="430" y="400" style="fill:none;stroke:black;"/>
<text width="138" height="20" x="435" y="414" style="fill:black;" font-family="Arial" font-size="16px">details</text>
<rect width="138" height="20" x="430" y="420" style="fill:none;stroke:black;"/>
<text width="138" height="20" x="435" y="434" style="fill:black;" font-family="Arial" font-size="16px">ingredients</text>
<rect width="138" height="20" x="430" y="440" style="fill:none;stroke:black;"/>
<text width="138" height="20" x="435" y="454" style="fill:black;" font-family="Arial" font-size="16px">status</text>
<rect width="138" height="20" x="430" y="460" style="fill:none;stroke:black;"/>
<text width="138" height="20" x="435" y="474" style="fill:black;" font-family="Arial" font-size="16px">tva</text>
<rect width="138" height="20" x="430" y="480" style="fill:none;stroke:black;"/>
<text width="138" height="20" x="435" y="494" style="fill:black;" font-family="Arial" font-size="16px">label</text>
<rect width="138" height="20" x="430" y="500" style="fill:none;stroke:black;"/>
<text width="138" height="20" x="435" y="514" style="fill:black;" font-family="Arial" font-size="16px">description_comp</text>
<rect width="138" height="20" x="150" y="140" style="fill:#007;stroke:black;"/>
<text width="138" height="20" x="155" y="154" style="fill:#fff;" font-family="Arial" font-size="16px"> product_categories</text>
<rect width="138" height="20" x="150" y="160" style="fill:#aea;stroke:black;"/>
<text width="138" height="20" x="155" y="174" style="fill:black;" font-family="Arial" font-size="16px">product_id</text>
<rect width="138" height="20" x="150" y="180" style="fill:#aea;stroke:black;"/>
<text width="138" height="20" x="155" y="194" style="fill:black;" font-family="Arial" font-size="16px">category_id</text>
<rect width="138" height="20" x="190" y="240" style="fill:#007;stroke:black;"/>
<text width="138" height="20" x="195" y="254" style="fill:#fff;" font-family="Arial" font-size="16px"> product_price</text>
<rect width="138" height="20" x="190" y="260" style="fill:#aea;stroke:black;"/>
<text width="138" height="20" x="195" y="274" style="fill:black;" font-family="Arial" font-size="16px">id</text>
<rect width="138" height="20" x="190" y="280" style="fill:none;stroke:black;"/>
<text width="138" height="20" x="195" y="294" style="fill:black;" font-family="Arial" font-size="16px">product_id</text>
<rect width="138" height="20" x="190" y="300" style="fill:none;stroke:black;"/>
<text width="138" height="20" x="195" y="314" style="fill:black;" font-family="Arial" font-size="16px">price</text>
<rect width="138" height="20" x="190" y="320" style="fill:none;stroke:black;"/>
<text width="138" height="20" x="195" y="334" style="fill:black;" font-family="Arial" font-size="16px">context_id</text>
<rect width="138" height="20" x="190" y="340" style="fill:none;stroke:black;"/>
<text width="138" height="20" x="195" y="354" style="fill:black;" font-family="Arial" font-size="16px">price_ttc</text>
</svg>

Before

Width:  |  Height:  |  Size: 7.2 KiB

View File

@ -1,14 +0,0 @@
.PHONY: all slides
.ONESHELL:
all: pdf
slides:
for i in *.md; do php Slides/make.php "$$i" > "Slides/$${i##.md}.html"; done;
pdf: slides
cd Slides; for i in *.html; do prince -o "../$${i##.html}.pdf" "$$i"; done;
clean:
rm -f Slides/*.html
rm -f *.pdf

View File

@ -1 +0,0 @@
../Images

View File

@ -1,99 +0,0 @@
<?php
if (empty($argv[1])) {
die("Usage: make.php SOURCE_MARKDOWN > DESTINATION_HTML\n");
}
$lines = file($argv[1]);
$out = '';
$in_list = $in_section = false;
$section_class = null;
function escape($str) {
$str = htmlspecialchars($str);
$str = str_replace('&lt;!--', '<sup>', $str);
$str = str_replace('--&gt;', '</sup>', $str);
$str = preg_replace_callback('/`(.*?)`/', function ($match) {
return '<code>' . $match[1] . '</code>';
}, $str);
$str = preg_replace_callback('/\[(.*?)\]\((.*?)\)/', function ($match) {
return sprintf('<a href="%s">%s</a>', $match[2], $match[1]);
}, $str);
return $str;
}
foreach ($lines as $line)
{
if (preg_match('/^---+(?:\s*=(\w+))?$/', $line, $match)) {
if ($in_section) {
if ($in_list) {
$out .= ' </ul>' . PHP_EOL;
$in_list = false;
}
$out .= '</section>' . PHP_EOL . PHP_EOL;
$in_section = false;
}
$section_class = !empty($match[1]) ? $match[1] : null;
continue;
}
if ('' === trim($line)) {
continue;
}
if (!$in_section) {
$out .= sprintf('<section class="%s">', $section_class) . PHP_EOL;
$in_section = true;
}
if (preg_match('/^(#+)\s+/', $line, $match)) {
$size = strlen($match[1]);
$title = trim(substr($line, strlen($match[0])));
$out .= sprintf(' <h%d>%s</h%d>', $size, escape($title), $size) . PHP_EOL;
}
elseif (preg_match('/^\*\s+/', $line)) {
if (!$in_list) {
$out .= ' <ul>' . PHP_EOL;
$in_list = true;
}
$out .= sprintf(' <li>%s</li>', escape(trim(substr($line, 2)))) . PHP_EOL;
}
else {
$out .= ' ' . trim($line) . PHP_EOL;
}
}
if ($in_section) {
if ($in_list) {
$out .= ' </ul>' . PHP_EOL;
$in_list = false;
}
$out .= '</section>' . PHP_EOL . PHP_EOL;
$in_section = false;
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Slides</title>
<link rel="stylesheet" type="text/css" href="style.css" media="screen,presentation" />
<link rel="stylesheet" type="text/css" href="print.css" media="print" />
<script type="text/javascript" src="slides.js"></script>
</head>
<body>
<?=$out?>
</body>
</html>

View File

@ -1,11 +0,0 @@
body {
color: #000;
}
sup {
vertical-align: baseline;
font-size: 1.2em;
display: block;
font-style: italic;
color: #000;
}

View File

@ -1,148 +0,0 @@
var slides;
var current_slide = 0;
var current_slide_items;
var current_item = 0;
var slide_window;
var clock;
var timer;
var timer_interval;
var slideCounter;
var planned_duration = 30;
function changeSlide(i, hide_items) {
if (current_slide + i < 0 || current_slide + i >= slides.length)
{
return true;
}
if (slide_window)
{
slide_window.window.changeSlide(i, hide_items);
}
slides[current_slide].classList.remove('current');
current_slide += i;
// Change URL
window.location.hash = "#" + current_slide;
// Get all items in a list
current_slide_items = slides[current_slide].getElementsByTagName('li');
current_item = 0;
for (var i = 0; i < current_slide_items.length; i++)
{
if (hide_items)
{
current_slide_items[i].classList.remove('shown');
}
else
{
current_slide_items[i].classList.add('shown');
}
}
slides[current_slide].classList.add('current');
slideCounter.innerHTML = current_slide + 1;
return true;
}
function progressSlide() {
if (current_item + 1 > current_slide_items.length || current_slide_items[current_item].classList.contains('shown'))
{
return changeSlide(1, true);
}
current_slide_items[current_item++].classList.add('shown');
if (slide_window)
{
slide_window.window.progressSlide();
}
return true;
}
function addTime() {
if (!clock)
{
clock = document.createElement('div');
clock.className = 'clock';
document.body.appendChild(clock);
}
function zerofill(v) {
return ("0" + v).slice(-2);
}
timer = 0;
window.clearInterval(timer_interval);
timer_interval = window.setInterval(function () {
timer += 1;
clock.style.width = Math.round(timer / (planned_duration * 60) * 100) + '%';
}, 1000);
}
function initSlides () {
slides = document.getElementsByTagName('section');
var current = window.location.hash.substr(1);
if (current > 0)
{
current_slide = parseInt(current, 10);
}
slides[current_slide].classList.add('current');
current_slide_items = slides[current_slide].getElementsByTagName('li');
slideCounter = document.createElement('div');
slideCounter.className = 'counter';
document.body.appendChild(slideCounter);
document.onkeydown = function (e) {
var prevent = false;
if (e.key == " ")
{
prevent = progressSlide();
}
else if (e.key == "ArrowRight" || e.key == "ArrowDown" || e.key == "PageDown")
{
prevent = changeSlide(1, false);
}
else if (e.key == "ArrowLeft" || e.key == "ArrowUp" || e.key == "PageUp")
{
prevent = changeSlide(-1, false);
}
else if (e.key == "Home")
{
prevent = changeSlide(-(current_slide), false);
}
else if (e.key == "End")
{
prevent = changeSlide(slides.length - 1, false);
}
else if (e.key == "o")
{
slide_window = window.open(document.location.href);
document.body.className = "notes";
prevent = true;
}
else if (e.key == "s")
{
addTime();
}
if (prevent)
{
e.preventDefault();
return false;
}
return true;
};
}
window.onload = initSlides;

View File

@ -1,158 +0,0 @@
html, body {
height: 100%;
}
body, section, h1, h2, h3, h4, h5, h6, p, ol, ul, li {
margin: 0;
padding: 0;
}
h1 {
font-size: 400%;
}
h2 {
font-size: 250%;
font-weight: normal;
}
h3 {
font-size: 200%;
font-weight: normal;
}
h1, h2, h3 {
margin-bottom: 1rem;
}
ul, ol {
margin-left: 2em;
font-size: 200%;
}
li {
margin: 1rem 0;
}
ul ul, ul ol, ol ul, ol ol {
font-size: 100%;
}
body {
background: #000;
font-family: "Eras Medium ITC", sans-serif;
overflow: hidden;
color: #fff;
font-size: 16pt;
}
section {
width: 90%;
opacity: 0;
transition: all .7s ease-in-out;
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
padding: 5%;
background: #000;
display: flex;
flex-direction: column;
justify-content: space-around;
text-shadow: 0px 0px 10px #000;
visibility: hidden;
}
section.current {
transform: translate(0);
opacity: 1;
visibility: visible;
}
a {
color: inherit;
cursor: pointer;
text-decoration: none;
border-bottom: 2px dashed darkblue;
line-height: .8em;
display: inline-block;
transition: all .5s;
border-radius: .2em;
padding: 0 .1em;
}
a:hover {
border-color: #fff;
background: darkblue;
}
.companyLogo {
margin-top: 3rem;
}
section {
background: linear-gradient(to bottom, rgba(0,0,0,0) 0%,rgba(0,0,0,0.7) 70%), url("Images/logo.svg") no-repeat center bottom;
background-size: contain;
}
li {
transform: translateX(-500px);
opacity: 0;
transition: all .5s;
}
li.shown {
transform: translate(0);
opacity: 1;
}
sup {
display: none;
}
.notes sup {
display: block;
background: #fff;
padding: .2em;
color: #000;
}
.notes {
font-size: 12pt;
}
.clock {
position: absolute;
bottom: 0px;
left: 0px;
right: 0px;
font-size: 2em;
background: #333;
height: 5px;
width: 0px;
transition: width 1s linear;
}
.counter {
position: absolute;
right: 5px;
bottom: 5px;
font-size: 1.5em;
}
figure {
margin: 0;
border-radius: .5em;
padding: 1em;
background: rgba(255, 255, 255, 0.3);
text-align: center;
height: 70%;
}
figure img {
height: 95%;
background: #fff;
padding: .5em;
border-radius: .5em;
}

View File

@ -1,7 +0,0 @@
\skbheading{Explorer la structure dun dictionnaire Creole}
Un dictionnaire Creole est une description de la configuration à laide du format de fichier \emph{xml}.
fichier content/modules\_EOLE\_envole/exercices/creole-dictionnaire-structure.tex à éditer
\inputminted[]{xml}{./content/modules_EOLE_envole/exercices/creole.dtd}

View File

@ -1,237 +0,0 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!-- ===================================================================== -->
<!-- Definition de la DTD du fichier creole -->
<!-- ===================================================================== -->
<!--
# Conception :
# Eole (http://eole.orion.education.fr)
# Copyright (C) 2005-2018
# distribue sous la licence GPL-2
# En attendant une traduction officielle de la GPL, la notice de
# copyright demeure en anglais.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
# Se reporter a la documentation envoyee avec le programme pour la notice.
-->
<!--================ -->
<!-- root element -->
<!-- =============== -->
<!ELEMENT creole (containers | files | family_action | variables | constraints | help)*>
<!-- ============== -->
<!-- files element -->
<!-- ============== -->
<!ELEMENT family_action (action)>
<!ATTLIST family_action name CDATA #REQUIRED>
<!ATTLIST family_action description CDATA #IMPLIED>
<!ATTLIST family_action color CDATA #IMPLIED>
<!ATTLIST family_action image CDATA #IMPLIED>
<!ELEMENT action ((input* | profile* | ewtapp* | tag* | saltaction*)*)>
<!ATTLIST action type (form|custom|external|reader|apache) "custom">
<!ATTLIST action title CDATA #REQUIRED>
<!ATTLIST action description CDATA #REQUIRED>
<!ATTLIST action rewrite CDATA #IMPLIED>
<!ATTLIST action image CDATA #IMPLIED>
<!ATTLIST action actionlist CDATA #IMPLIED>
<!-- for apache action -->
<!ATTLIST action apache_path CDATA #IMPLIED>
<!ATTLIST action apache_path_type (FilenameOption|SymLinkOption) "FilenameOption">
<!-- for external action -->
<!ATTLIST action url CDATA #IMPLIED>
<!ATTLIST action url_type (URLOption|SymLinkOption) "URLOption">
<!-- for form action -->
<!ATTLIST action save (True|False) "False">
<!ELEMENT files ((service* | service_access* | service_restriction* | package* | file*)*)>
<!ELEMENT containers ((container* | all*)*)>
<!ELEMENT container ((service* | service_access* | service_restriction* | interface* | package* | file* | disknod* | host* | fstab*)*) >
<!ATTLIST container name CDATA #REQUIRED >
<!ATTLIST container id CDATA #IMPLIED >
<!ATTLIST container group CDATA #IMPLIED >
<!ELEMENT all ((service* | interface* | package* | file* | disknod* | host* | fstab*)*) >
<!ELEMENT service (#PCDATA)>
<!ATTLIST service servicelist CDATA #IMPLIED >
<!ATTLIST service instance_mode (when_container|when_no_container|always) "always">
<!ATTLIST service method (systemd|upstart|apache|network|restartonly) "systemd">
<!ATTLIST service redefine (True|False) "False">
<!ELEMENT input (#PCDATA)>
<!ELEMENT profile (#PCDATA)>
<!ELEMENT ewtapp (#PCDATA)>
<!ELEMENT tag (#PCDATA)>
<!ELEMENT saltaction (#PCDATA)>
<!ELEMENT service_access ((port | tcpwrapper)*)>
<!ATTLIST service_access service CDATA #REQUIRED >
<!ELEMENT port (#PCDATA)> <!--port_type-->
<!ATTLIST port port_type (PortOption|SymLinkOption) "PortOption">
<!ATTLIST port service_accesslist CDATA #IMPLIED >
<!ATTLIST port protocol (tcp|udp) "tcp">
<!ELEMENT tcpwrapper (#PCDATA)> <!--tcpwrapper_type-->
<!ATTLIST tcpwrapper tcpwrapper_type (UnicodeOption|SymLinkOption) "UnicodeOption">
<!ATTLIST tcpwrapper service_accesslist CDATA #IMPLIED >
<!ELEMENT service_restriction (ip*)>
<!ATTLIST service_restriction service CDATA #REQUIRED >
<!ELEMENT ip (#PCDATA)> <!--ip_type-->
<!ATTLIST ip service_restrictionlist CDATA #IMPLIED >
<!ATTLIST ip ip_type (NetworkOption|SymLinkOption) "NetworkOption">
<!ATTLIST ip interface_type (UnicodeOption|SymLinkOption) "UnicodeOption">
<!ATTLIST ip interface CDATA #REQUIRED> <!--interface_type-->
<!ATTLIST ip netmask_type (NetmaskOption|SymLinkOption) "NetmaskOption">
<!ATTLIST ip netmask CDATA "255.255.255.255"> <!--netmask_type-->
<!ELEMENT interface (#PCDATA)>
<!ATTLIST interface interfacelist CDATA #IMPLIED >
<!ATTLIST interface linkto CDATA #REQUIRED >
<!ATTLIST interface ip CDATA #REQUIRED> <!--SymLinkOption-->
<!ATTLIST interface ip_type (SymLinkOption) "SymLinkOption">
<!ATTLIST interface mask CDATA #REQUIRED> <!--SymLinkOption-->
<!ATTLIST interface mask_type (SymLinkOption) "SymLinkOption">
<!ATTLIST interface bcast CDATA #IMPLIED> <!--SymLinkOption-->
<!ATTLIST interface bcast_type (SymLinkOption) "SymLinkOption">
<!ATTLIST interface gateway CDATA #IMPLIED> <!--SymLinkOption-->
<!ATTLIST interface gateway_type (SymLinkOption) "SymLinkOption">
<!ATTLIST interface method (bridge|macvlan) "macvlan" >
<!ATTLIST interface redefine (True|False) "False">
<!ELEMENT host EMPTY >
<!ATTLIST host hostlist CDATA #IMPLIED >
<!ATTLIST host name CDATA #REQUIRED > <!--SymLinkOption-->
<!ATTLIST host name_type (SymLinkOption) "SymLinkOption">
<!ATTLIST host ip CDATA #REQUIRED > <!--SymLinkOption-->
<!ATTLIST host ip_type (SymLinkOption) "SymLinkOption">
<!ATTLIST host crossed (True|False) "True" >
<!ATTLIST host instance_mode (when_container|when_no_container|always) "always">
<!ATTLIST host comment CDATA #IMPLIED >
<!ELEMENT fstab EMPTY >
<!ATTLIST fstab name CDATA #REQUIRED> <!--name_type-->
<!ATTLIST fstab name_type (FilenameOption|SymLinkOption) "FilenameOption">
<!ATTLIST fstab type (bind|normal) "bind">
<!ATTLIST fstab fstype (auto|ext3|ext4|nfs|smb) "auto">
<!ATTLIST fstab mount_point CDATA #IMPLIED> <!--mount_point_type-->
<!ATTLIST fstab mount_point_type (FilenameOption|SymLinkOption) "FilenameOption">
<!ATTLIST fstab options CDATA #IMPLIED>
<!ATTLIST fstab checks CDATA #IMPLIED>
<!ATTLIST fstab fstablist CDATA #IMPLIED>
<!ATTLIST fstab instance_mode (when_container|when_no_container|always) "when_container">
<!ELEMENT package (#PCDATA)>
<!ATTLIST package instance_mode (when_container|when_no_container|always) "always">
<!ELEMENT disknod (#PCDATA)>
<!ELEMENT file EMPTY>
<!ATTLIST file name CDATA #REQUIRED >
<!ATTLIST file name_type (UnicodeOption|SymLinkOption) "UnicodeOption">
<!ATTLIST file source CDATA #IMPLIED>
<!ATTLIST file mode CDATA #IMPLIED >
<!ATTLIST file owner CDATA #IMPLIED >
<!ATTLIST file group CDATA #IMPLIED >
<!ATTLIST file filelist CDATA #IMPLIED >
<!ATTLIST file mkdir (True|False) "False">
<!ATTLIST file instance_mode (when_container|when_no_container|always) "always">
<!ATTLIST file rm (True|False) "False">
<!ATTLIST file del_comment CDATA #IMPLIED >
<!ATTLIST file redefine (True|False) "False">
<!ELEMENT variables (family*, separators*)>
<!ELEMENT family (#PCDATA | variable)*>
<!ATTLIST family name CDATA #REQUIRED>
<!ATTLIST family description CDATA #IMPLIED>
<!ATTLIST family mode (basic|normal|expert) "basic">
<!ATTLIST family icon CDATA #IMPLIED>
<!ATTLIST family hidden (True|False) "False">
<!ATTLIST family dynamic CDATA #IMPLIED>
<!ELEMENT variable (#PCDATA | value)*>
<!ATTLIST variable name CDATA #REQUIRED>
<!ATTLIST variable type CDATA #IMPLIED>
<!ATTLIST variable description CDATA #IMPLIED>
<!ATTLIST variable hidden (True|False) "False">
<!ATTLIST variable disabled (True|False) "False">
<!ATTLIST variable multi (True|False) "False">
<!ATTLIST variable redefine (True|False) "False">
<!ATTLIST variable exists (True|False) "True">
<!ATTLIST variable mandatory (True|False) "False">
<!ATTLIST variable auto_freeze (True|False) "False">
<!ATTLIST variable auto_save (True|False) "False">
<!ATTLIST variable mode (basic|normal|expert) "normal">
<!ATTLIST variable remove_check (True|False) "False">
<!ATTLIST variable remove_condition (True|False) "False">
<!ELEMENT separators (separator*)>
<!ELEMENT separator (#PCDATA)>
<!ATTLIST separator name CDATA #REQUIRED>
<!ATTLIST separator never_hidden CDATA #IMPLIED>
<!ELEMENT value (#PCDATA)>
<!ELEMENT constraints ((fill* | check* | condition* | auto* | group*)*)>
<!ELEMENT fill (param*)>
<!ATTLIST fill name CDATA #REQUIRED>
<!ATTLIST fill target CDATA #REQUIRED>
<!ELEMENT check (param*)>
<!ATTLIST check name CDATA #REQUIRED>
<!ATTLIST check target CDATA #REQUIRED>
<!ATTLIST check level (error|warning) "error">
<!ELEMENT auto ((param)*)>
<!ATTLIST auto name CDATA #REQUIRED>
<!ATTLIST auto target CDATA #REQUIRED>
<!ELEMENT condition ((target | param)+ )>
<!ATTLIST condition name CDATA #REQUIRED>
<!ATTLIST condition source CDATA #REQUIRED>
<!ATTLIST condition fallback (True|False) "False">
<!ELEMENT group (slave+)>
<!ATTLIST group master CDATA #REQUIRED>
<!ATTLIST group description CDATA #IMPLIED>
<!ELEMENT param (#PCDATA)>
<!ATTLIST param type (string|eole|number|container|context|python) "string">
<!ATTLIST param name CDATA #IMPLIED>
<!ATTLIST param hidden (True|False) "True">
<!ATTLIST param optional (True|False) "False">
<!ELEMENT target (#PCDATA)>
<!ATTLIST target type (family|filelist|servicelist|interfacelist|variable|service_accesslist|service_restrictionlist|hostlist|fstablist|actionlist) "variable">
<!ATTLIST target optional (True|False) "False">
<!ELEMENT slave (#PCDATA)>
<!ELEMENT help ((variable* | family*)*)>

View File

@ -1,2 +0,0 @@
\skbheading{vnstat-activation.tex}
fichier content/modules\_EOLE\_envole/exercices/vnstat-activation.tex à éditer

View File

@ -1,2 +0,0 @@
\skbheading{vnstat-contrainte.tex}
fichier content/modules\_EOLE\_envole/exercices/vnstat-contrainte.tex à éditer

View File

@ -1,2 +0,0 @@
\skbheading{vnstat-documentation.tex}
fichier content/modules\_EOLE\_envole/exercices/vnstat-documentation.tex à éditer

View File

@ -1,2 +0,0 @@
\skbheading{vnstat-gestion-reseau.tex}
fichier content/modules\_EOLE\_envole/exercices/vnstat-gestion-reseau.tex à éditer

View File

@ -1,2 +0,0 @@
\skbheading{vnstat-gestion-service.tex}
fichier content/modules\_EOLE\_envole/exercices/vnstat-gestion-service.tex à éditer

View File

@ -1,2 +0,0 @@
\skbheading{vnstat-template.tex}
fichier content/modules\_EOLE\_envole/exercices/vnstat-template.tex à éditer

View File

@ -1,16 +0,0 @@
#!/bin/bash
#set -e
. /usr/lib/eole/diagnose.sh
EchoGras "*** Service de statistique réseau"
if [ "$(CreoleGet activer_vnstat)" = "oui" ]; then
TestPid vnStat vnstatd
echo
vnstat
else
Inactif vnStat
fi
echo
exit 0

View File

@ -1,40 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<creole>
<files>
<file filelist='vnstat' name='etc/vnstat.conf'/>
<service servicelist='vnstat'>vnstat</service>
<service_access service='vnstat'>
<port>8888</port>
<tcpwrapper>vnstat</tcpwrapper>
</service_access>
<service_restriction service='vnstat'>
<ip interface='auto' netmask='255.255.255.0'>192.168.56.101</ip>
</service_restriction>
</files>
<variables>
<family name='services'>
<variable name='activer_vnstat' type='oui/non' description='Activer le service vnStat'>
<value>oui</value>
</variable>
</family>
<family name='vnstat'>
<variable name='vnstat_interface' type='string' description='Numéro de linterface par défaut de vnStat' mandatory='True' multi='True'/>
<variable name='vnstat_user' type='unix_user' description='Nom dutilisateur' mode='expert'/>
<variable name='vnstat_group' type='unix_user' description='Nom du groupe' mode='expert'/>
</family>
</variables>
<constraints>
<check name='valid_enum' target='vnstat_interface'>
<param>['0', '1', '2', '3', '4']</param>
</check>
<fill name='calc_val' target='vnstat_group'>
<param type='eole' name='valeur'>vnstat_user</param>
</fill>
<condition name='disabled_if_in' source='activer_vnstat'>
<param>non</param>
<target type='family'>vnstat</target>
<target type='filelist'>vnstat</target>
<target type='servicelist'>vnstat</target>
</condition>
</constraints>
</creole>

View File

@ -1,16 +0,0 @@
#!/bin/bash
#set -e
. /usr/lib/eole/diagnose.sh
EchoGras "*** Service de statistique réseau"
if [ "$(CreoleGet activer_vnstat)" = "oui" ]; then
TestPid vnStat vnstatd
echo
vnstat
else
Inactif vnStat
fi
echo
exit 0

View File

@ -1,170 +0,0 @@
# vnStat 1.18 config file
##
# default interface
%set %%interfaces = []
%for interface in %%vnstat_interface
%set %%zone = 'nom_zone_eth' + interface
%silent %%interfaces.append(%%getVar(%%zone))
%end for
Interface "%%custom_join(%%interfaces,'+']"
# location of the database directory
DatabaseDir "/var/lib/vnstat"
# locale (LC_ALL) ("-" = use system locale)
Locale "-"
# on which day should months change
MonthRotate 1
# date output formats for -d, -m, -t and -w
# see 'man date' for control codes
DayFormat "%x"
MonthFormat "%b '%y"
TopFormat "%x"
# characters used for visuals
RXCharacter "%"
TXCharacter ":"
RXHourCharacter "r"
TXHourCharacter "t"
# how units are prefixed when traffic is shown
# 0 = IEC standard prefixes (KiB/MiB/GiB/TiB)
# 1 = old style binary prefixes (KB/MB/GB/TB)
UnitMode 0
# how units are prefixed when traffic rate is shown
# 0 = IEC binary prefixes (Kibit/s...)
# 1 = SI decimal prefixes (kbit/s...)
RateUnitMode 1
# output style
# 0 = minimal & narrow, 1 = bar column visible
# 2 = same as 1 except rate in summary and weekly
# 3 = rate column visible
OutputStyle 3
# used rate unit (0 = bytes, 1 = bits)
RateUnit 1
# number of decimals to use in outputs
DefaultDecimals 2
HourlyDecimals 1
# spacer for separating hourly sections (0 = none, 1 = '|', 2 = '][', 3 = '[ ]')
HourlySectionStyle 2
# try to detect interface maximum bandwidth, 0 = disable feature
# MaxBandwidth will be used as fallback value when enabled
BandwidthDetection 1
# maximum bandwidth (Mbit) for all interfaces, 0 = disable feature
# (unless interface specific limit is given)
MaxBandwidth 1000
# interface specific limits
# example 8Mbit limit for eth0 (remove # to activate):
#MaxBWeth0 8
# how many seconds should sampling for -tr take by default
Sampletime 5
# default query mode
# 0 = normal, 1 = days, 2 = months, 3 = top10
# 4 = exportdb, 5 = short, 6 = weeks, 7 = hours
QueryMode 0
# filesystem disk space check (1 = enabled, 0 = disabled)
CheckDiskSpace 1
# database file locking (1 = enabled, 0 = disabled)
UseFileLocking 1
# how much the boot time can variate between updates (seconds)
BootVariation 15
# log days without traffic to daily list (1 = enabled, 0 = disabled)
TrafficlessDays 1
# vnstatd
##
# switch to given user when started as root (leave empty to disable)
DaemonUser "%%vnstat_user"
# switch to given user when started as root (leave empty to disable)
DaemonGroup "%%vnstat_group"
# how many minutes to wait during daemon startup for system clock to
# sync time if most recent database update appears to be in the future
TimeSyncWait 5
# how often (in seconds) interface data is updated
UpdateInterval 30
# how often (in seconds) interface status changes are checked
PollInterval 5
# how often (in minutes) data is saved to file
SaveInterval 5
# how often (in minutes) data is saved when all interface are offline
OfflineSaveInterval 30
# how often (in minutes) bandwidth detection is redone when
# BandwidthDetection is enabled (0 = disabled)
BandwidthDetectionInterval 5
# force data save when interface status changes (1 = enabled, 0 = disabled)
SaveOnStatusChange 1
# enable / disable logging (0 = disabled, 1 = logfile, 2 = syslog)
UseLogging 2
# create dirs if needed (1 = enabled, 0 = disabled)
CreateDirs 1
# update ownership of files if needed (1 = enabled, 0 = disabled)
UpdateFileOwner 1
# file used for logging if UseLogging is set to 1
LogFile "/var/log/vnstat/vnstat.log"
# file used as daemon pid / lock file
PidFile "/var/run/vnstat/vnstat.pid"
# vnstati
##
# title timestamp format
HeaderFormat "%x %H:%M"
# show hours with rate (1 = enabled, 0 = disabled)
HourlyRate 1
# show rate in summary (1 = enabled, 0 = disabled)
SummaryRate 1
# layout of summary (1 = with monthly, 0 = without monthly)
SummaryLayout 1
# transparent background (1 = enabled, 0 = disabled)
TransparentBg 0
# image colors
CBackground "FFFFFF"
CEdge "AEAEAE"
CHeader "606060"
CHeaderTitle "FFFFFF"
CHeaderDate "FFFFFF"
CText "000000"
CLine "B0B0B0"
CLineL "-"
CRx "92CF00"
CTx "606060"
CRxD "-"
CTxD "-"

View File

@ -1,170 +0,0 @@
# vnStat 1.18 config file
##
# default interface
%set %%interfaces = []
%for interface in %%vnstat_interface
%set %%zone = 'nom_zone_eth' + interface
%silent %%interfaces.append(%%getVar(%%zone))
%end for
Interface "%%custom_join(%%interfaces,'+']"
# location of the database directory
DatabaseDir "/var/lib/vnstat"
# locale (LC_ALL) ("-" = use system locale)
Locale "-"
# on which day should months change
MonthRotate 1
# date output formats for -d, -m, -t and -w
# see 'man date' for control codes
DayFormat "%x"
MonthFormat "%b '%y"
TopFormat "%x"
# characters used for visuals
RXCharacter "%"
TXCharacter ":"
RXHourCharacter "r"
TXHourCharacter "t"
# how units are prefixed when traffic is shown
# 0 = IEC standard prefixes (KiB/MiB/GiB/TiB)
# 1 = old style binary prefixes (KB/MB/GB/TB)
UnitMode 0
# how units are prefixed when traffic rate is shown
# 0 = IEC binary prefixes (Kibit/s...)
# 1 = SI decimal prefixes (kbit/s...)
RateUnitMode 1
# output style
# 0 = minimal & narrow, 1 = bar column visible
# 2 = same as 1 except rate in summary and weekly
# 3 = rate column visible
OutputStyle 3
# used rate unit (0 = bytes, 1 = bits)
RateUnit 1
# number of decimals to use in outputs
DefaultDecimals 2
HourlyDecimals 1
# spacer for separating hourly sections (0 = none, 1 = '|', 2 = '][', 3 = '[ ]')
HourlySectionStyle 2
# try to detect interface maximum bandwidth, 0 = disable feature
# MaxBandwidth will be used as fallback value when enabled
BandwidthDetection 1
# maximum bandwidth (Mbit) for all interfaces, 0 = disable feature
# (unless interface specific limit is given)
MaxBandwidth 1000
# interface specific limits
# example 8Mbit limit for eth0 (remove # to activate):
#MaxBWeth0 8
# how many seconds should sampling for -tr take by default
Sampletime 5
# default query mode
# 0 = normal, 1 = days, 2 = months, 3 = top10
# 4 = exportdb, 5 = short, 6 = weeks, 7 = hours
QueryMode 0
# filesystem disk space check (1 = enabled, 0 = disabled)
CheckDiskSpace 1
# database file locking (1 = enabled, 0 = disabled)
UseFileLocking 1
# how much the boot time can variate between updates (seconds)
BootVariation 15
# log days without traffic to daily list (1 = enabled, 0 = disabled)
TrafficlessDays 1
# vnstatd
##
# switch to given user when started as root (leave empty to disable)
DaemonUser "%%vnstat_user"
# switch to given user when started as root (leave empty to disable)
DaemonGroup "%%vnstat_group"
# how many minutes to wait during daemon startup for system clock to
# sync time if most recent database update appears to be in the future
TimeSyncWait 5
# how often (in seconds) interface data is updated
UpdateInterval 30
# how often (in seconds) interface status changes are checked
PollInterval 5
# how often (in minutes) data is saved to file
SaveInterval 5
# how often (in minutes) data is saved when all interface are offline
OfflineSaveInterval 30
# how often (in minutes) bandwidth detection is redone when
# BandwidthDetection is enabled (0 = disabled)
BandwidthDetectionInterval 5
# force data save when interface status changes (1 = enabled, 0 = disabled)
SaveOnStatusChange 1
# enable / disable logging (0 = disabled, 1 = logfile, 2 = syslog)
UseLogging 2
# create dirs if needed (1 = enabled, 0 = disabled)
CreateDirs 1
# update ownership of files if needed (1 = enabled, 0 = disabled)
UpdateFileOwner 1
# file used for logging if UseLogging is set to 1
LogFile "/var/log/vnstat/vnstat.log"
# file used as daemon pid / lock file
PidFile "/var/run/vnstat/vnstat.pid"
# vnstati
##
# title timestamp format
HeaderFormat "%x %H:%M"
# show hours with rate (1 = enabled, 0 = disabled)
HourlyRate 1
# show rate in summary (1 = enabled, 0 = disabled)
SummaryRate 1
# layout of summary (1 = with monthly, 0 = without monthly)
SummaryLayout 1
# transparent background (1 = enabled, 0 = disabled)
TransparentBg 0
# image colors
CBackground "FFFFFF"
CEdge "AEAEAE"
CHeader "606060"
CHeaderTitle "FFFFFF"
CHeaderDate "FFFFFF"
CText "000000"
CLine "B0B0B0"
CLineL "-"
CRx "92CF00"
CTx "606060"
CRxD "-"
CTxD "-"

View File

@ -6,6 +6,6 @@
%\fancyhead[R]{ }
\fancyfoot[L]{{\tiny \@title \\ \numeroversion}}
\fancyfoot[C]{{\tiny {\scriptsize \textbf{\cadoles}} \\ {\adresse,~\codepostal~\ville} }}
\fancyfoot[C]{{\tiny {\scriptsize \textbf{\cadoles}} \\ {\adresse \codepostal \ville} }}
\fancyfoot[R]{{\tiny \thepage / \pageref{LastPage} \\ \telephone }}

View File

@ -46,7 +46,6 @@
\usepackage{graphicx}
\usepackage{pdfpages}
\usepackage{menukeys}
\usepackage{minted}
\makeindex
%

View File

@ -1,203 +0,0 @@
\usepackage{ifxetex}
\ifxetex
\usepackage{fontspec}
%\usepackage{microtype}
%\usepackage{xunicode}
\usepackage{polyglossia}
\usepackage{xltxtra}
\setdefaultlanguage{french}
\setotherlanguage{english}
\defaultfontfeatures{Mapping=tex-text} % To support LaTeX quoting style
%\setmainfont{Caviar Dreams}
\newfontfamily\headingfont[]{Caviar Dreams}
\usepackage{titlesec}
\defaultfontfeatures{Ligatures=TeX}
% Set sans serif font to Calibri
\setsansfont{LiberationSans}
% Set serifed font to Cambria
\setmainfont{LiberationSans}
\else
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{amsfonts}
\usepackage[english, francais]{babel}
\fi
\usepackage{pifont}
\usepackage{geometry}
\usepackage{fancybox}
\usepackage{verbatim}
\usepackage{eurosym}
%\usepackage{color}
\usepackage[svgnames,table]{xcolor}
\usepackage{listings}
\usepackage{graphicx}
\usepackage{hyperref}
\usepackage{titlesec}
\usepackage{fancyhdr}
\usepackage{lastpage}
%\usepackage{enumitem}
\usepackage{makeidx}
\usepackage{tocbibind}
\usepackage[backend=biber,hyperref=true,backref=true]{biblatex}
\addbibresource{biblio.bib}
\usepackage{url}
\renewcommand{\baselinestretch}{1.3}
\addto\captionsfrench{\renewcommand{\contentsname}{Sommaire}}
\usepackage{graphicx}
\usepackage{pdfpages}
\makeindex
%
% Tableaux
%
\usepackage{array}
\usepackage{booktabs}
\usepackage{colortbl}
% Default
\newcolumntype{1}{l}
\newcolumntype{2}{l}
\newcolumntype{3}{l}
\newcolumntype{4}{l}
\newcolumntype{5}{l}
\newcolumntype{6}{l}
\newcolumntype{7}{l}
\newcolumntype{8}{l}
\newcommand*\heading{}
\newcommand*\beforeheading{}
\newcommand*\afterheading{}
\newcommand*\normalline{}
\newcommand*\lastline{}
%\renewcommand*\toprule{\arrayrulecolor{red}{\hline}}
% Nice looking rules, centered cells
\newcolumntype{1}{c}
\newcolumntype{2}{c}
\newcolumntype{3}{c}
\newcolumntype{4}{c}
\newcolumntype{5}{c}
\newcolumntype{6}{c}
\newcolumntype{7}{c}
\newcolumntype{8}{c}
\renewcommand*\heading[1]{\chapterfont\MakeUppercase{#1}}
\renewcommand*\beforeheading{\arrayrulecolor{CadolesBlue}\toprule}
\renewcommand*\afterheading{\midrule}
\renewcommand*\normalline{}
\renewcommand*\lastline{\bottomrule}
\definecolor{CadolesBlue}{rgb}{.16,.50,.69}
\definecolor{CadolesLightBlue}{rgb}{.31,.506,.741}
\newfontfamily\cadolesfont{Caviar Dreams}
\newfontfamily\chapterfont[Color=CadolesBlue]{Caviar Dreams}
\newfontfamily\sectionfont[Color=CadolesBlue]{Caviar Dreams}
\newfontfamily\subsectionfont[Color=CadolesLightBlue]{Caviar Dreams}
\newfontfamily\subsubsectionfont[Color=CadolesLightBlue]{Caviar Dreams}
\newcommand{\tickYes}{\color{Green}\checkmark}
\newcommand{\tickNo}{\color{red}{\hspace{1pt}\ding{55}}}
\newcommand{\wlink}[1]{\textcolor{CadolesBlue}{\underline{#1}}}
\newcommand{\classname}[1]{\texttt{\textbf{#1}}}
%\newcommand{\cadoles}{\chapterfont{Cadoles}}
\newcommand{\cadoles}{\cadolesfont\textcolor{black}{Cad}\textcolor{CadolesBlue}{ole}\textcolor{black}{s}}
\newcommand{\TitleRule}{\rule[0.5ex]{12cm}{0.5mm}}
\newcommand\espace{\vrule height 20pt width 0pt}
\newcommand{\titre}[1]{{\color{DarkBlue}\normalfont\LARGE\bfseries #1\smallskip\hrule height 1pt}\bigskip}
\renewcommand*\abstractname{Summary}
%\renewcommand{\FrenchLabelItem}{\color{DarkBlue}{\ding{68}}}
\let\oldfootnoterule\footnoterule
\renewcommand\footnoterule{\vspace*{-3pt}%
\noindent\rule{3in}{0.4pt}\vspace*{2.6pt}}% -3 + 0.4 + 2.6 = 0
%\pagestyle{headings}
\makeatletter
\renewcommand{\thesection}{}
\titleformat{\chapter}{\LARGE\chapterfont}{\thesection}{0ex}{}[\color{CadolesBlue}\hrule height 1pt]
\titleformat{\section}{\Large\sectionfont}{\thesection}{0ex}{}[\color{CadolesBlue}\hrule height 1pt]
\titleformat{\subsection}{\large\subsectionfont}{\thesection}{0ex}{}
\titleformat{\subsubsection}{\itshape\subsubsectionfont}{\thesection}{0ex}{}
\skbinput[from=rep]{style/00-entete-pied-de-page}
\def\maketitle{
\skbfigure[center]{logos/Cadoles}
\vspace{4.5cm}
\begin{flushleft}
\textbf{\Huge \cadolesfont\textcolor{CadolesBlue}{\@title}}
\end{flushleft}
\begin{center}
\color{CadolesBlue}\TitleRule
\end{center}
\begin{flushright}
\vspace{-1.5ex}
\textbf{\huge \cadolesfont\textcolor{DarkGrey}{\departement}}
\end{flushright}
\vspace{2.5cm}
\pagebreak
}
\def\origine{
\vspace{1.5cm}
\begin{flushleft}
\begin{minipage}[l]{8cm}
\skbinput[from=rep]{style/00-Coordonnees}
\end{minipage}
\end{flushleft}
}
%
% Itemize avec la petite cadoles
%
%\newenvironment{citemize}{\renewcommand{\labelitemi{$\odot$}}}
%\newenvironment{citemize}{\renewcommand{\labelitemi{\includegraphics[height=1.6ex]{inc/cadole.png}}}}
\newenvironment{citemize}{\renewcommand
\labelitemi{\includegraphics[height=1ex]{inc/cadole.png}}\begin{itemize}}{\end{itemize}}
%
% Box pour citations
%
\newsavebox{\fmbox}
\newenvironment{fmpage}[1]
{\begin{lrbox}{\fmbox}\begin{minipage}{#1}}
{\end{minipage}\end{lrbox}\fbox{\usebox{\fmbox}}}
\hypersetup{
backref=true, % Permet d'ajouter des liens dans
pagebackref=true, % les bibliographies
hyperindex=true, % Ajoute des liens dans les index.
colorlinks=true, % Colorise les liens.
breaklinks=true, % Permet le retour à la ligne dans les liens trop longs.
urlcolor= CadolesBlue, % Couleur des hyperliens.
linkcolor= CadolesBlue, % Couleur des liens internes.
bookmarks=true, % Créé des signets pour Acrobat.
bookmarksopen=true, % Si les signets Acrobat sont créés,
% les afficher complètement.
pdftitle={\@title}, % Titre du document.
% Informations apparaissant dans
pdfauthor={Cadoles}, % dans les informations du document
pdfsubject={Proposition Commerciale} % sous Acrobat.
}
%\topmargin 0in
%\leftmargin 2.5cm
%\rightmargin 2.5cm
\setlength{\hoffset}{-18pt}
\setlength{\oddsidemargin}{0pt} % Marge gauche sur pages impaires
\setlength{\evensidemargin}{9pt} % Marge gauche sur pages paires
\setlength{\marginparwidth}{54pt} % Largeur de note dans la marge
%\setlength{\textwidth}{481pt} % Largeur de la zone de texte (17cm)
\setlength{\voffset}{-18pt} % Bon pour DOS
\setlength{\marginparsep}{7pt} % Séparation de la marge
\setlength{\topmargin}{0pt} % Pas de marge en haut
\setlength{\headheight}{13pt} % Haut de page
\setlength{\headsep}{10pt} % Entre le haut de page et le texte
\setlength{\footskip}{27pt} % Bas de page + séparation
\setlength{\textheight}{708pt} % Hauteur de la zone de texte (25cm)

View File

@ -1,2 +0,0 @@
*.pdf
*.zip

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

View File

@ -1,8 +1,3 @@
---
marp: true
---
<style>
pre { font-size: 0.5em !important; }
table { font-size: 0.6em !important; }
@ -406,8 +401,6 @@ export default class Clock extends React.Component {
Les événements du DOM sont interceptés par le passage de "callbacks" sur les propriétés `on<Event>` des composants.
---
```jsx
// my-app/src/components/counter.js
@ -538,8 +531,8 @@ https://reactjs.org/docs/react-component.html
### Séquence de montage
1. `constructor(nextProps, currentState)`
2. `static getDerivedStateFromProps(nextProps, currentState)`
1. `constructor(props)`
2. `componentWillMount()`
3. `render()`
4. `componentDidMount()`
@ -547,11 +540,11 @@ https://reactjs.org/docs/react-component.html
### Séquence de mise à jour
1. `static getDerivedStateFromProps(nextProps, currentState)`
1. `componentWillReceiveProps(nextProps)`
2. `shouldComponentUpdate(nextProps, nextState)`
3. `render()`
4. `getSnapshotBeforeUpdate(prevProps, prevState)`
5. `componentDidUpdate(prevProps, prevState, snapshot)`
3. `componentWillUpdate(nextProps, nextState)`
4. `render()`
5. `componentDidUpdate(prevProps, prevState)`
---
@ -845,10 +838,10 @@ https://redux.js.org/
---
![bg right:75% contain](./img/redux_flow.png?1)
## Flot des données
![center 100%](./img/redux_flow.png?1)
---
## `store`, `actions` et `reducers`
@ -912,7 +905,7 @@ export default const rootReducer = (state, action) => {
---
## Création du `store`
```javascript
```
// store.js
import { createStore } from 'redux'
@ -928,8 +921,9 @@ export function configureStore(initialState = { products: [] }) {
---
## Tester
```js
```
// store.test.js
/* globals test, expect, jest */
import { addProduct, removeProduct } from './actions'
import { configureStore } from './store'
@ -1105,146 +1099,6 @@ export default connect(mapStateToProps)(App)
---
## Redux-Saga
ou comment gérer les **"effets de bord"**
---
![bg right:75% contain](./img/reduxsaga_flow.png?1)
## Flot des données
---
### Cas d'usage
React-Redux permet d'intégrer au sein du "flux de travail" Redux la gestion des opérations asynchrones.
**Exemple** _Appels à des API distantes, opérations liées au passage du temps, messages websockets..._
Notamment, il offre une gestion de la **synchronisation d'opérations asynchrones** i.e. je dois attendre que l'opération A et l'opération B soient terminées pour effectuer l'opération C.
---
### Installation de la dépendance
```bash
npm install --save redux-saga
```
---
### Ajout du middleware
```js
// src/store/store.js
import { createStore, applyMiddleware, combineReducers, compose } from 'redux'
import myReducer from '../reducers/my'
import rootSaga from '../sagas/root'
import createSagaMiddleware from 'redux-saga'
const sagaMiddleware = createSagaMiddleware()
const rootReducer = combineReducers({
my: myReducer,
});
export function configureStore(initialState = {}) {
const store = createStore(
rootReducer,
initialState,
compose(
applyMiddleware(sagaMiddleware)
)
)
sagaMiddleware.run(rootSaga);
return store;
}
```
---
## Création de la saga "racine"
_Avec une saga "factice" d'authentification_
```js
// src/sagas/root.js
import { all, takeLatest } from 'redux-saga/effects';
import { LOGIN_REQUEST } from '../actions/auth';
import { loginSaga } from './auth';
export default function* rootSaga() {
yield all([
takeLatest(LOGIN_REQUEST, loginSaga),
]);
}
```
---
## Définition des actions
```js
// src/actions/auth.js
export const LOGIN_REQUEST = 'LOGIN_REQUEST'
export const LOGIN_SUCCESS = 'LOGIN_SUCCESS';
export const LOGIN_FAILURE = 'LOGIN_FAILURE';
export function login(username, password) {
return { type: LOGIN_REQUEST, username, password }
}
export function loginFailure(username, error) {
return { type: LOGIN_FAILURE, username, error }
}
export function loginSuccess(username) {
return { type: LOGIN_SUCCESS, username }
}
```
---
## Création de ma saga d'authentification
```js
// src/sagas/auth.js
import { call, put } from 'redux-saga/effects';
import { loginFailure, loginSuccess } from '../actions/auth';
export default function* loginSaga(action) {
let result;
try {
result = yield call(doLogin, action.username, action.password);
} catch(err) {
yield put(loginFailure(action.username, err));
}
if ('error' in result) {
yield put(loginFailure(action.username, result.error));
return
}
yield put(loginSuccess(action.username));
}
function doLogin(username, password) {
return fetch('http://my-backend.org/login', {
method: 'POST',
body: JSON.stringify({
Username: username,
Password: password
}),
mode: 'cors',
credentials: 'include'
}).then(res => res.json())
}
```
---
## Mise en application
---

View File

@ -1,251 +0,0 @@
---
marp: true
---
<style>
pre { font-size: 0.5em !important; }
table { font-size: 0.6em !important; }
</style>
# React Native - Découverte
## William Petit - S.C.O.P. Cadoles
---
## Amorçage d'un projet
---
<!-- page_number: true -->
## Méthode simplifiée: `create-react-native-app`
```bash
npm install -g create-react-native-app # Installation du générateur d'application
create-react-native-app my-app # Génération de l'application
cd my-app # Se placer dans le répertoire
npm start # Lancer le serveur de développement
```
https://github.com/react-community/create-react-native-app
---
### Avantages
- Configuration requise minimale pour démarrer un projet
- Client Expo pour le test des applications
- Plateforme de build des applications pour Android et iOS.
### Inconvénients
- Limité aux éléments React de base et à ceux de la librairie ExpoKit
- Dépendant du pipeline de build d'Expo si on ne souhaite pas "s'ejecter" et contruire son application soi même.
---
## Méthode manuelle
### Installation des dépendances systèmes
- Java Development Kit 8
- Android SDK
---
### Installation du SDK via Android Studio
1. Télécharger [Android Studio](https://developer.android.com/studio/index.html)
2. Suivre [les instructions](https://facebook.github.io/react-native/docs/getting-started.html) de la documentaiton officielle pour télécharger la configuration du SDK Android.
3. Configurer son environnement shell en ajoutant dans son fichier de profil (`.profile`) les exports suivants:
```
export ANDROID_HOME=$HOME/Android/Sdk
export PATH=$PATH:$ANDROID_HOME/tools
export PATH=$PATH:$ANDROID_HOME/platform-tools
```
---
### Amorçage d'un projet
```
npm install -g react-native
react-native init my-project
```
---
### Configurer et/ou activer le débogage sur son téléphone Android
1. Activer le débogage USB sur son téléphone Android
2. Autoriser les opérations USB via l'ajout d'une règle `udev`:
```
echo "SUBSYSTEM==usb, ATTR{idVendor}==<id_vendor>, MODE=0666, GROUP=plugdev" \
>> /etc/udev/rules.d/51-android-usb.rules
```
_Il est possible que vous ayez à redémarrer votre machine après cette étape._
3. Vérifier que votre téléphone est correctement configuré:
```
adb devices
```
---
### Lancer votre application
```
cd my-project
react-native start # Lancer le serveur de développement
react-native run-android # Déployer l'application sur votre appareil
```
---
## Debugging
### Afficher le menu de développement sur l'appareil
```
adb shell input keyevent 82
```
### Activer la console Javascript distante
Ouvrir le menu de développement sur l'appareil et sélectionner "Enable Remote JS Debugging".
Ouvrir ensuite dans votre navigateur la page http://localhost:8081/debugger-ui/
---
## Composants de base
### Quelques exemples
- [View](https://facebook.github.io/react-native/docs/view.html)
- [Button](https://facebook.github.io/react-native/docs/button.html)
- [TextInput](https://facebook.github.io/react-native/docs/textinput.html)
- [Image](https://facebook.github.io/react-native/docs/image.html)
- [WebView](https://facebook.github.io/react-native/docs/webview.html)
[Voir le reste des composants standards sur la documentation officielle](https://facebook.github.io/react-native/)
---
## API
### Quelques exemples
- [Geolocation](https://facebook.github.io/react-native/docs/geolocation.html) - Accéder aux informations de géolocalisation
- [NetInfo](https://facebook.github.io/react-native/docs/netinfo.html) - Accéder aux informations de connectivité
- [CameraRoll](https://facebook.github.io/react-native/docs/cameraroll.html) - Accéder à la caméra/librairie d'images de l'appareil
- [Alert](https://facebook.github.io/react-native/docs/alert.html) - Afficher des fenêtres d'alerte
- [AsyncStorage](https://facebook.github.io/react-native/docs/asyncstorage.html) - Stocker des données persistentes sur l'appareil.
[Voir le reste de l'API standard sur la documentation officielle](https://facebook.github.io/react-native/)
---
### Gérer les différences de code entre Android et iOS
https://facebook.github.io/react-native/docs/platform-specific-code.html
---
## Mutualisation des styles
https://facebook.github.io/react-native/docs/stylesheet.html
---
## Générer un APK signé
1. Créer un `keystore`
```
keytool -genkey -v \
-keystore my-release-key.keystore \
-alias my-key-alias -keyalg RSA \
-keysize 2048 -validity 10000
```
2. Placer ce keystore dans `android/app`
3. Éditer le fichier `android/gradle.properties` et ajouter/modifier les lignes suivantes:
```
RELEASE_STORE_FILE=my-release-key.keystore
RELEASE_KEY_ALIAS=my-key-alias
RELEASE_STORE_PASSWORD=*****
RELEASE_KEY_PASSWORD=*****
```
---
4. Éditer le fichier `android/app/build.gradle`
```
...
android {
...
defaultConfig { ... }
signingConfigs {
release {
if (project.hasProperty('RELEASE_STORE_FILE')) {
storeFile file(RELEASE_STORE_FILE)
storePassword RELEASE_STORE_PASSWORD
keyAlias RELEASE_KEY_ALIAS
keyPassword RELEASE_KEY_PASSWORD
}
}
}
buildTypes {
release {
...
signingConfig signingConfigs.release
}
}
}
...
```
5. Lancer la génération de votre fichier APK
```
cd android && ./gradlew assembleRelease
```
Si la compilation fonctionne, votre fichier APK signé devrait se trouver à l'emplacement `android/app/build/outputs/apk/app-release.apk`
---
6. Installer son APK signé sur son téléphone
```
adb install app/build/outputs/apk/app-release.apk
```
_Plus d'informations sur le site de [react-native](https://facebook.github.io/react-native/docs/signed-apk-android.html) et [Android](https://developer.android.com/studio/publish/app-signing.html)_
---
## Projets communautaires d'interêt
- [NativeBase](https://docs.nativebase.io/) - Librairie de composants natifs pour Android et iOS
- [React - Sensitive Info](https://github.com/mCodex/react-native-sensitive-info) - Stockage d'informations sensibles sur l'appareil
- [React Native FS](https://github.com/itinance/react-native-fs) - Accès au système de fichiers de l'appareil.
- [React Native Navigation](https://wix.github.io/react-native-navigation/#/) - Navigation native sur iOS et Android
- [React Router - Native](https://reacttraining.com/react-router/native/guides/philosophy) - "Routage" des vues pour iOS et Android
---
## Exercice
Implémenter une première micro application avec React Native. Idées de sujet:
- Une application de micro-blogging géolocalisé
- Une application de liaison entre une collectivité et ses citoyens avec sondage, flux d'articles, etc
- Un application de gestion de stock (entrée/sortie des produits, synchronisation avec un backend)
- Une application de suivi des valeurs des crypto-monnaies...
---
# Licence
## CC BY-NC-SA 3.0 FR
[Creative Commons - Attribution - Pas dUtilisation Commerciale - Partage dans les Mêmes Conditions 3.0 France](https://creativecommons.org/licenses/by-nc-sa/3.0/fr/)

View File

@ -1,182 +0,0 @@
# Logomotion 2017 - Formations
## Sessions prévues
- Remise à niveau Symfony pour 3 personnes - 2 jours
- Introduction aux frameworks javascript pour le développement web - 1 jour
- Formation framework web (ex: Angular 2) - 3 jours
- Sécurité des applications web - 2 jours
- Démarche audit de sécurité des applications web - 2 jours
## Plans de formation
### Remise à niveau Symfony
#### Jour 1: Rappels des fonctionnalités
- Les principales nouveautés de Symfony 3
- Structure d'un projet, générateurs et "bundles"
- Notion de bundles
- Configuration d'un bundle
- Creation & utilisation des commandes
- Le générateur
- Le routage et les contrôleurs
- Filtrage des verbes HTTP
- Routage vers les actions de contrôleurs
- Authentification et autorisation
- Firewall & ACL
- Gestion des rôles utilisateur
- Méthode d'authentification personnalisée
- Les vues et le moteur de templating Twig
- Syntaxe Twig
- Notion d'héritage
- Gestion de la sécurité
- Étendre Twig
- Les formulaires
- Création et traitement de formulaires
- Validation des données
- Les évènements
- L'ORM Doctrine et le modèle de données
- Concept d'ORM
- Entité & Dépôt
- Les évènements
- Mise en production
- Gestion des environnements
- Cache applicatif
#### Jour 2: Mise en application
Le 2ème jour est dédié à la mise en pratique des concepts vus pendant le jour précédent.
Un cahier des charges d'une application prévue pour exploiter l'ensemble des éléments traités par la formation sera proposé aux apprenants.
Le formateur les accompagnera durant l'ensemble des travaux.
### Introduction aux frameworks javascript pour le développement web
#### Jour 1: Frontend
- Angular 2 (3 heures)
- Présentation générale et historique
- Structuration d'un projet et générateurs
- Concepts principaux
- Travaux pratiques
- React/Redux (3 heures)
- Présentation générale et historique
- Concepts généraux de React
- L'architecture "Flux" et Redux
- Travaux pratiques
#### Jour 2: Backend
- ExpressJS (3 heures)
- Présentation générale et historique
- Routage
- Intégration de moteurs de templates
- Gestion des formulaires
- Travaux pratiques
- Sails (3 heures)
- Présentation générale et historique
- Structuration d'un projet et générateurs
- Concepts principaux
- Travaux pratiques
### Formation framework web (plan généraliste)
### Jour 1: Concepts principaux et prise en main
- Présentation du framework et historique
- Structure d'un projet et générateurs
- Gestion du routage applicatif
- Modèle de données
- "Templating" et modèle de données
### Jour 2: Fonctionnalités avancées et communauté
- Création et gestion des "composants" et mutualisation
- Tests unitaires et fonctionnels
- Gestion de l'authentification
- Gestion de l'autorisation
- Mise en production
### Jour 3: Mise en application
Le 3ème jour est dédié à la mise en pratique des concepts vus pendant les deux jours précédents.
Un cahier des charges d'une application prévue pour exploiter l'ensemble des éléments traités par la formation sera proposé aux apprenants. Le formateur les accompagnera durant l'ensemble des travaux.
La réalisation nécessitera l'implémentation de fonctionnalités récurrentes dans le domaine applicatif web, notamment:
- Routage applicatif
- Authentification
- Gestion des autorisations
- Opérations CRUD sur des entités métier
- Téléversement de fichiers
- Communication AJAX/Websockets
### Sécurité des applications web
#### Jour 1: Sécurité de l'applicatif
- Présentation du collectif OWASP (15 minutes)
- Le "top 10" des failles des applicatifs Web (4 heures)
- Injections
- Contexte et scénarios d'exploitation
- Techniques de mitigation
- Authentification faillible et mauvaise gestion de la session
- Contexte et scénarios d'exploitation
- Techniques de mitigation
- Cross Site Scripting (XSS)
- Contexte et scénarios d'exploitation
- Techniques de mitigation
- Mauvaise contrôle des accès
- Contexte et scénarios d'exploitation
- Techniques de mitigation
- Problèmes de configuration
- Contexte et scénarios d'exploitation
- Techniques de mitigation
- Fuite d'informations sensibles
- Contexte et scénarios d'exploitation
- Techniques de mitigation
- Cross Site Request Forgery (CSRF)
- Contexte et scénarios d'exploitation
- Techniques de mitigation
- Mauvaise politique de maintenance des composants techniques
- Contexte et scénarios d'exploitation
- Techniques de mitigation
- Supervision applicative (2 heures 30)
- Installation et configuration de Prometheus
- Métrologie de l'applicatif et des processus métiers
- Création d'alertes
#### Jour 2: Sécurité de l'infrastructure
- Configuration des serveurs HTTP - Apache2 et Nginx (3 heures)
- Prévention de la fuite d'informations
- Configuration des connexion SSL/TLS
- Supervision et détection d'intrusion (3 heures)
- Supervision du systèmes avec Monit
- Installation
- Configuration et usage
- Détection et prévention des intrusions
- Apache2 - mod_security
- fail2ban - NIDS simplifié
### Démarche audit de sécurité des applications web
#### Jour 1: Principes et concepts de l'audit de sécurité
- Les différents types d'audit (30m)
- "Black Box"
- "Grey Box"
- "White Box"
- La démarche en mode "white box" avec le référentiel OWASP (5 heures 30)
- Identification du périmètre
- Récupération des informations d'amorçage de l'action
- Verrouillage de l'environnement
- Audit
- Création du rapport
- Accompagnement post-audit
#### Jour 2: Étude de cas
Mise en application des éléments vu le jour précédent sur une application Web sélectionnée pour illustrer les différentes problématiques de la procédure d'audit (6 heures)

View File

@ -1,33 +0,0 @@
# Formation "Conception, implémentation et sécurisation d'API pour les applications multi plateformes"
## Durée prévue
2 jours
## Plan de formation
### Jour 1: Découvertes des concepts théoriques
- Mutualisation de l'infrastructure pour les applications multi-plateformes
- Enjeux et problématiques
- Comprendre l'impact des spécificités de chaque plateforme
- Web
- Mobile
- Bureau
- Service applicatif
- Points d'attention
- Cycle de développement et déploiement
- Authentification
- Autorisation
- Modèle de données et sérialisation
- Cache et stockage local
- Gestion des spécificités des plateformes
- Synchronisation des données entre les plateformes
### Jour 2: Mise en pratique
La journée suivante est dédiée à la mise en pratique des concepts vus pendant le jour précédent.
Deux squelettes (web, mobile) d'une même application seront fournis aux apprenants. Ceux ci devront utiliser les concepts et mettre en application les bonnes pratiques vues le jour précédent pour concevoir et implémenter une API sécurisée répondant au cahier des charges fourni par le formateur.
Le formateur accompagnera les apprenants durant l'ensemble des travaux.

View File

@ -1,45 +0,0 @@
# Formation "Intégration et déploiement continue"
## Durée prévue
1.5 jours
## Plan de formation
### Jour 1: Découverte des pratiques d'intégration et déploiement continu
- Comprendre les enjeux
- Cycle de développement et processus d'intégration
- Apports et contraintes pour les équipes
- Intégration / Déploiement continu: quelles différences ?
- Anatomie d'un processus d'intégration
- Notions d'évènement et "pipeline"
- Évènements déclencheurs
- Étapes clés
- Retour d'information
- Automatisation du processus
- Analyse de l'existant et migration progressive
- Problématique de la fréquence de construction et temps global d'exécution
- Reproducibilité
- Conception du processus d'intégration continue
- Modularisation et enjeux de la gestion des dépendances
- Parallélisation et cascade de processus
- Infrastructure d'intégration et déploiement continu
- L'outil de gestion des sources
- Le serveur d'intégration continue
- Livrables et plateformes de diffusion
- Environnements de déploiement et approvisionnement
- Exemple: Gitlab et Gitlab CI
- Mise en place d'une instance virtualisée
- Conception et implémentation d'un pipeline
- Déploiement automatisé avec Docker
### Jour 2: Mise en pratique
La demi journée suivante est dédiée à la mise en pratique des concepts vus pendant le jour précédent.
Les apprenants doivent concevoir et implémenter un pipeline d'intégration continue correspondant à un cahier des charges fourni par le formateur.
Une infrastructure virtualisée d'intégration continue est fournie par le formateur.
Le formateur les accompagne durant l'ensemble des travaux.

View File

@ -1,32 +0,0 @@
# Formation "React/Redux - Perfectionnement"
## Durée prévue
5 jours
## Plan de formation
### Jour 1: Rappels et découverte des fonctionnalités avancées
- Présentation générale et historique
- Concepts généraux de React
- L'architecture "Flux" et Redux
- Routage côté client
- Concepts avancés
- Les "hooks" React
- Gestion des "effets de bord" avec Redux Saga
- Modèles d'authentification
- Communication client/serveur
- API REST
- GraphQL
- Websocket
- Gestion des thèmes
- Rendu côté serveur
### Jour 2 à 5: Mise en pratique
Les jours 2 à 5 sont dédiés la réalisation d'un projet court mais couvrant l'ensemble des concepts avancés présentés pendant la première journée.
Le formateur founit un squelette applicatif ainsi que le cahier des charges décrivant les objectifs de réalisation.
Le formateur accompagne les apprenants durant l'ensemble des travaux.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 129 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 142 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

View File

@ -1,213 +0,0 @@
\documentclass{beamer}
%\usertheme{Madrid}
\setbeamercovered{transparent}
\setcounter{tocdepth}{2}
\usepackage[french]{babel}
%\usepackage[utf8,utf8x]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{xunicode} %Unicode extras!
\usepackage{xltxtra} %Fixes
\setmainfont{CaviarDreams}
\usepackage{multicol}
%\usepackage{colortbtl}
\usepackage{graphicx}
\usepackage{verbatim} % Pour l'insertion de fichier en mode verbatim
\usepackage{ucs}
\usepackage{tabto}
\usepackage{xcolor}
\usepackage{hyperref}
\usepackage{hyperxmp}
\hypersetup{%
colorlinks=true,linkcolor=blue,urlcolor=blue,pdfpagemode=UseNone,
pdftitle={Formation interne TC1},
pdfkeywords={distribution, GNU, linux, eole, éducation, nationale, ubuntu},
pdfauthor={Emmanuel Garette},
pdflang={fr-FR},
pdfcopyright={Copyright © 2011-2014 Cadoles}, % Nécessite XeTeX
pdflicenseurl={http://creativecommons.org/licenses/by-nc-sa/2.0/fr/},
}
%\usecolortheme{crane}
\definecolor{UniBlue}{RGB}{83,121,180}
\definecolor{CleanWhite}{RGB}{255,255,255}
\setbeamercolor{title}{fg=UniBlue}
\setbeamercolor{frametitle}{fg=CleanWhite}
\setbeamercolor{structure}{fg=UniBlue}
\newcommand{\eolesmall}{
\begin{minipage}[c]{0.10\textwidth}
\includegraphics[width=1cm]{beamer-skel/img/logo-eole.png}
\end{minipage}
}
\newcommand{\eolebig}{\includegraphics[width=2cm]{beamer-skel/img/logo-eole.png}}
\newcommand{\eolefull}{\includegraphics{beamer-skel/img/logo-eole.png}}
%\setmonofont[Scale=0.86]{Andale Mono}
%\usepackage{colortab}
\setbeamertemplate{background}{\includegraphics[width=128mm]{beamer-skel/img/banner01.png}}
\title[]{Formation interne tronc commun 1}
\subtitle{Formation interne}
\author[Equipe Auteur]{Vincent FEBVRE}
\institute[Cadoles]{\includegraphics[width=2cm]{beamer-skel/img/logo-cadoles-01.png}}
\date{{\small \today}}
\subject{Talks}
\AtBeginSubsection[]
{
\begin{frame}<beamer>
\frametitle{}
\tableofcontents[currentsection,currentsubsection]
\end{frame}
}
\logo{
% \includegraphics[width=1cm]{beamer-skel/img/logo-ecologie.png}~
\hspace{120pt}
\includegraphics[width=2cm]{beamer-skel/img/logo-cadoles-01.png}~
\hspace{113pt}
\includegraphics[width=1cm]{beamer-skel/img/logo_en.jpg}~
}
\begin{document}
% Page de titre
\begin{frame}
\titlepage
\end{frame}
\section{Introduction}
\begin{frame}{Plan}
\begin{columns}[t]
\begin{column}{5cm}
\tableofcontents[sections={1-6},currentsection, hideothersubsections]
\end{column}
\begin{column}{5cm}
\tableofcontents[sections={7-12},currentsection,hideothersubsections]
\end{column}
\end{columns}
\end{frame}
\include{modules_EOLE_envole/commun/00-intro}
\include{modules_EOLE_envole/commun/01-nouveaute23}
\include{modules_EOLE_envole/amon/00-description}
\include{modules_EOLE_envole/sphynx/00-description}
\include{modules_EOLE_envole/scribe/00-description}
\include{modules_EOLE_envole/horus/00-description}
\include{modules_EOLE_envole/tronc-commun-1/00-panorama-module}
\section{Les quatre phases}
\begin{frame}{Plan}
\begin{columns}[t]
\begin{column}{5cm}
\tableofcontents[sections={1-6},currentsection, hideothersubsections]
\end{column}
\begin{column}{5cm}
\tableofcontents[sections={7-12},currentsection,hideothersubsections]
\end{column}
\end{columns}
\end{frame}
\include{modules_EOLE_envole/commun/02-quatre_phases}
\include{modules_EOLE_envole/scribe/00-virtualbox}
\include{modules_EOLE_envole/commun/02-quatre_phases-pratique}
\include{modules_EOLE_envole/tronc-commun-1/01-config-texte}
\section{Administration commune}
\begin{frame}{Plan}
\begin{columns}[t]
\begin{column}{5cm}
\tableofcontents[sections={1-6},currentsection, hideothersubsections]
\end{column}
\begin{column}{5cm}
\tableofcontents[sections={7-12},currentsection,hideothersubsections]
\end{column}
\end{columns}
\end{frame}
\include{modules_EOLE_envole/commun/02-instance-reconfigure}
\include{modules_EOLE_envole/commun/03-mise-a-jour}
\include{modules_EOLE_envole/commun/04-diagnose}
\include{modules_EOLE_envole/commun/04-diagnose-pratique}
\include{modules_EOLE_envole/tronc-commun-1/05-conteneurs}
\include{modules_EOLE_envole/tronc-commun-1/05-conteneurs-pratique}
\include{modules_EOLE_envole/tronc-commun-1/06-firewall}
\include{modules_EOLE_envole/tronc-commun-1/06-schedule}
\include{modules_EOLE_envole/tronc-commun-1/06-zpratique}
\include{modules_EOLE_envole/tronc-commun-1/07-onduleur}
\include{modules_EOLE_envole/tronc-commun-1/07-onduleur-pratique}
\include{modules_EOLE_envole/tronc-commun-1/08-trouver}
\section{Interfaces d'administration EOLE}
\begin{frame}{Plan}
\begin{columns}[t]
\begin{column}{5cm}
\tableofcontents[sections={1-6},currentsection, hideothersubsections]
\end{column}
\begin{column}{5cm}
\tableofcontents[sections={7-12},currentsection,hideothersubsections]
\end{column}
\end{columns}
\end{frame}
\include{modules_EOLE_envole/tronc-commun-1/30-ead}
\include{modules_EOLE_envole/tronc-commun-1/31-interface-semi-graphique}
\section{GNU/Linux}
\begin{frame}{Plan}
\begin{columns}[t]
\begin{column}{5cm}
\tableofcontents[sections={1-6},currentsection, hideothersubsections]
\end{column}
\begin{column}{5cm}
\tableofcontents[sections={7-12},currentsection,hideothersubsections]
\end{column}
\end{columns}
\end{frame}
\include{modules_EOLE_envole/tronc-commun-1/20-gnu_linux}
\include{modules_EOLE_envole/tronc-commun-1/21-lire-ecrire}
\include{modules_EOLE_envole/tronc-commun-1/22-commande-distance}
\section{Application Zéphir 1}
\begin{frame}{Plan}
\begin{columns}[t]
\begin{column}{5cm}
\tableofcontents[sections={1-6},currentsection, hideothersubsections]
\end{column}
\begin{column}{5cm}
\tableofcontents[sections={7-12},currentsection,hideothersubsections]
\end{column}
\end{columns}
\end{frame}
\include{modules_EOLE_envole/tronc-commun-1/10-application-zephir}
\section{Application Zéphir 2}
\begin{frame}{Plan}
\begin{columns}[t]
\begin{column}{5cm}
\tableofcontents[sections={1-6},currentsection, hideothersubsections]
\end{column}
\begin{column}{5cm}
\tableofcontents[sections={7-12},currentsection,hideothersubsections]
\end{column}
\end{columns}
\end{frame}
\include{modules_EOLE_envole/tronc-commun-1/11-application-zephir2}
\subject{Talks}
\begin{frame}
\frametitle{Licence}
Cette œuvre est mise à disposition sous licence \href{http://creativecommons.org/licenses/by-nc-sa/2.0/fr/}{\textsc{cc-by-nc-sa-2.0}}
\begin{itemize}
\item Attribution
\item Pas dUtilisation Commerciale
\item Partage dans les Mêmes Conditions 2.0
\item France
\end{itemize}
Pour voir une copie de cette licence, visitez
\href{http://creativecommons.org/licenses/by-nc-sa/2.0/fr/}{http://creativecommons.org/licenses/by-nc-sa/2.0/fr/}
ou écrivez à Creative Commons, 444 Castro Street, Suite 900,
Mountain View, California, 94041, USA.
\end{frame}
\end{document}

View File

@ -1,220 +0,0 @@
\documentclass{beamer}
%\usertheme{Madrid}
\setbeamercovered{transparent}
\setcounter{tocdepth}{2}
\usepackage[french]{babel}
%\usepackage[utf8,utf8x]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{xunicode} %Unicode extras!
\usepackage{xltxtra} %Fixes
\setmainfont{CaviarDreams}
\usepackage{multicol}
%\usepackage{colortbtl}
\usepackage{graphicx}
\usepackage{verbatim} % Pour l'insertion de fichier en mode verbatim
\usepackage{ucs}
\usepackage{tabto}
\usepackage{xcolor}
\usepackage{hyperref}
\usepackage{hyperxmp}
\hypersetup{%
colorlinks=true,linkcolor=blue,urlcolor=blue,pdfpagemode=UseNone,
pdftitle={Tronc commun 2},
pdfkeywords={distribution, GNU, linux, eole, éducation, nationale, ubuntu},
pdfauthor={Philippe Caseiro},
pdflang={fr-FR},
pdfcopyright={Copyright © 2013 Cadoles}, % Nécessite XeTeX
pdflicenseurl={http://creativecommons.org/licenses/by-nc-sa/2.0/fr/},
}
%\usecolortheme{crane}
\definecolor{UniBlue}{RGB}{83,121,180}
\definecolor{CleanWhite}{RGB}{255,255,255}
\setbeamercolor{title}{fg=UniBlue}
\setbeamercolor{frametitle}{fg=CleanWhite}
\setbeamercolor{structure}{fg=UniBlue}
\newcommand{\eolesmall}{
\begin{minipage}[c]{0.10\textwidth}
\includegraphics[width=1cm]{beamer-skel/img/logo-eole.png}
\end{minipage}
}
\newcommand{\eolebig}{\includegraphics[width=2cm]{beamer-skel/img/logo-eole.png}}
\newcommand{\eolefull}{\includegraphics{beamer-skel/img/logo-eole.png}}
%\setmonofont[Scale=0.86]{Andale Mono}
%\usepackage{colortab}
\setbeamertemplate{background}{\includegraphics[width=128mm]{beamer-skel/img/banner01.png}}
\title[]{Formation personnalisée}
\subtitle{Académie de la Martinique}
\author[Equipe Auteur]{Philippe Caseiro}
\institute[Cadoles]{\includegraphics[width=2cm]{beamer-skel/img/logo-cadoles-01.png}}
\date{{\small \today}}
\subject{Talks}
\AtBeginSubsection[]
{
\begin{frame}<beamer>
\frametitle{}
\tableofcontents[currentsection,currentsubsection]
\end{frame}
}
\logo{
% \includegraphics[width=1cm]{beamer-skel/img/logo-ecologie.png}~
\hspace{120pt}
\includegraphics[width=2cm]{beamer-skel/img/logo-cadoles-01.png}~
\hspace{113pt}
\includegraphics[width=1cm]{beamer-skel/img/logo_en.jpg}~
}
\begin{document}
% Page de titre
\begin{frame}
\titlepage
\end{frame}
\section{Introduction}
\begin{frame}{Plan}
\begin{columns}[t]
\begin{column}{5cm}
\tableofcontents[sections={1-6},currentsection, hideothersubsections]
\end{column}
\begin{column}{5cm}
\tableofcontents[sections={7-12},currentsection,hideothersubsections]
\end{column}
\end{columns}
\end{frame}
%Intro
\include{modules_EOLE_envole/commun/00-intro}
\include{modules_EOLE_envole/commun/01-nouveaute23}
%méta-paquet EOLE description
\include{modules_EOLE_envole/amon/00-description}
\include{modules_EOLE_envole/sphynx/00-description}
\include{modules_EOLE_envole/scribe/00-description}
\include{modules_EOLE_envole/horus/00-description}
\include{modules_EOLE_envole/tronc-commun-1/00-panorama-module}
%méta-paquet EOLE install
\begin{frame}
\frametitle{Les différents méta-paquets EOLE}
\begin{itemize}
\item amon-pkg ;
\item scribe-pkg ;
\item amonecole-pkg ;
\item horus-pkg ;
\item seshat-pkg ;
\item sphynx-pkg ;
\item zephir-pkg.
\end{itemize}
\end{frame}
%Les conteneurs intro (voir suite dans personnalisation creole
\include{modules_EOLE_envole/tronc-commun-1/05-conteneurs}
\include{modules_EOLE_envole/tronc-commun-1/05-conteneurs-pratique}
\section{Personnalisation du serveur}
\begin{frame}{Plan}
\begin{columns}[t]
\begin{column}{5cm}
\tableofcontents[sections={1-6},currentsection, hideothersubsections]
\end{column}
\begin{column}{5cm}
\tableofcontents[sections={7-12},currentsection,hideothersubsections]
\end{column}
\end{columns}
\end{frame}
\include{modules_EOLE_envole/tronc-commun-2/01-personnalisation-creole}
\include{modules_EOLE_envole/tronc-commun-2/01-personnalisation-creole2}
%\section{Application Zéphir}
%\begin{frame}{Plan}
% \begin{columns}[t]
% \begin{column}{5cm}
% \tableofcontents[sections={1-6},currentsection, hideothersubsections]
% \end{column}
% \begin{column}{5cm}
% \tableofcontents[sections={7-12},currentsection,hideothersubsections]
% \end{column}
% \end{columns}
%\end{frame}
%\include{modules_EOLE_envole/tronc-commun-2/02-zephir}
%\include{modules_EOLE_envole/tronc-commun-2/03-zephir_script}
\section{API Python}
\begin{frame}{Plan}
\begin{columns}[t]
\begin{column}{5cm}
\tableofcontents[sections={1-6},currentsection, hideothersubsections]
\end{column}
\begin{column}{5cm}
\tableofcontents[sections={7-12},currentsection,hideothersubsections]
\end{column}
\end{columns}
\end{frame}
\include{modules_EOLE_envole/tronc-commun-2/20-api}
\section{API Bash}
\begin{frame}{Plan}
\begin{columns}[t]
\begin{column}{5cm}
\tableofcontents[sections={1-6},currentsection, hideothersubsections]
\end{column}
\begin{column}{5cm}
\tableofcontents[sections={7-12},currentsection,hideothersubsections]
\end{column}
\end{columns}
\end{frame}
\include{modules_EOLE_envole/tronc-commun-2/30-api_bash}
\section{Administration avancée}
\begin{frame}{Plan}
\begin{columns}[t]
\begin{column}{5cm}
\tableofcontents[sections={1-6},currentsection, hideothersubsections]
\end{column}
\begin{column}{5cm}
\tableofcontents[sections={7-12},currentsection,hideothersubsections]
\end{column}
\end{columns}
\end{frame}
\include{modules_EOLE_envole/tronc-commun-2/04-diagnose}
\include{modules_EOLE_envole/tronc-commun-2/05-script-instance-reconfigure}
\include{modules_EOLE_envole/tronc-commun-2/06-montage-conteneur}
\include{modules_EOLE_envole/tronc-commun-2/07-eole-firewall}
\include{modules_EOLE_envole/tronc-commun-2/08-schedule}
\include{modules_EOLE_envole/tronc-commun-2/09-host}
\include{modules_EOLE_envole/tronc-commun-2/11-mysql}
\include{modules_EOLE_envole/tronc-commun-2/12-interface}
\include{modules_EOLE_envole/tronc-commun-2/13-disknod}
\include{modules_EOLE_envole/tronc-commun-2/14-sso}
\include{modules_EOLE_envole/tronc-commun-2/15-script-ead}
\include{modules_EOLE_envole/tronc-commun-2/16-sauvegarde}
\include{modules_EOLE_envole/tronc-commun-2/17-conteneur_groupe_conteneur}
\include{modules_EOLE_envole/tronc-commun-2/18-cert}
\include{modules_EOLE_envole/scribe/31-scripts-user-scribe}
\subject{Talks}
\begin{frame}
\frametitle{Licence}
Cette œuvre est mise à disposition sous licence \href{http://creativecommons.org/licenses/by-nc-sa/2.0/fr/}{\textsc{cc-by-nc-sa-2.0}}
\begin{itemize}
\item Attribution
\item Pas dUtilisation Commerciale
\item Partage dans les Mêmes Conditions 2.0
\item France
\end{itemize}
Pour voir une copie de cette licence, visitez
\href{http://creativecommons.org/licenses/by-nc-sa/2.0/fr/}{http://creativecommons.org/licenses/by-nc-sa/2.0/fr/}
ou écrivez à Creative Commons, 444 Castro Street, Suite 900,
Mountain View, California, 94041, USA.
\end{frame}
\end{document}

View File

@ -1,218 +0,0 @@
\documentclass{beamer}
%\usertheme{Madrid}
\setbeamercovered{transparent}
\setcounter{tocdepth}{2}
\usepackage[french]{babel}
%\usepackage[utf8,utf8x]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{xunicode} %Unicode extras!
\usepackage{xltxtra} %Fixes
\setmainfont{CaviarDreams}
\usepackage{multicol}
%\usepackage{colortbtl}
\usepackage{graphicx}
\usepackage{verbatim} % Pour l'insertion de fichier en mode verbatim
\usepackage{ucs}
\usepackage{tabto}
\usepackage{xcolor}
\usepackage{hyperref}
\usepackage{hyperxmp}
\hypersetup{%
colorlinks=true,linkcolor=blue,urlcolor=blue,pdfpagemode=UseNone,
pdftitle={Amon Sphynx},
pdfkeywords={distribution, GNU, linux, eole, éducation, nationale, ubuntu},
pdfauthor={Emmanuel Garette},
pdflang={fr-FR},
pdfcopyright={Copyright © 2011-2014 Cadoles}, % Nécessite XeTeX
pdflicenseurl={http://creativecommons.org/licenses/by-nc-sa/2.0/fr/},
}
%\usecolortheme{crane}
\definecolor{UniBlue}{RGB}{83,121,180}
\definecolor{CleanWhite}{RGB}{255,255,255}
\setbeamercolor{title}{fg=UniBlue}
\setbeamercolor{frametitle}{fg=CleanWhite}
\setbeamercolor{structure}{fg=UniBlue}
\newcommand{\eolesmall}{
\begin{minipage}[c]{0.10\textwidth}
\includegraphics[width=1cm]{beamer-skel/img/logo-eole.png}
\end{minipage}
}
\newcommand{\eolebig}{\includegraphics[width=2cm]{beamer-skel/img/logo-eole.png}}
\newcommand{\eolefull}{\includegraphics{beamer-skel/img/logo-eole.png}}
%\setmonofont[Scale=0.86]{Andale Mono}
%\usepackage{colortab}
\setbeamertemplate{background}{\includegraphics[width=128mm]{beamer-skel/img/banner01.png}}
\title[]{Formation EOLE}
\subtitle{Versailles}
\author[Equipe Auteur]{Emmanuel Garette}
\institute[Cadoles]{\includegraphics[width=2cm]{beamer-skel/img/logo-cadoles-01.png}}
\date{{\small \today}}
\subject{Talks}
\AtBeginSubsection[]
{
\begin{frame}<beamer>
\frametitle{}
\tableofcontents[currentsection,currentsubsection]
\end{frame}
}
\logo{
% \includegraphics[width=1cm]{beamer-skel/img/logo-ecologie.png}~
\hspace{120pt}
\includegraphics[width=2cm]{beamer-skel/img/logo-cadoles-01.png}~
\hspace{113pt}
\includegraphics[width=1cm]{beamer-skel/img/logo_en.jpg}~
}
\begin{document}
% Page de titre
\begin{frame}
\titlepage
\end{frame}
\section{Introduction}
\begin{frame}{Plan}
\begin{columns}[t]
\begin{column}{5cm}
\tableofcontents[sections={1-6},currentsection, hideothersubsections]
\end{column}
\begin{column}{5cm}
\tableofcontents[sections={7-12},currentsection,hideothersubsections]
\end{column}
\end{columns}
\end{frame}
\include{modules_EOLE_envole/commun/00-intro}
\include{modules_EOLE_envole/commun/01-nouveaute23}
\include{modules_EOLE_envole/commun/01-nouveaute24}
\section{Panorama des modules}
\begin{frame}{Plan}
\begin{columns}[t]
\begin{column}{5cm}
\tableofcontents[sections={1-6},currentsection, hideothersubsections]
\end{column}
\begin{column}{5cm}
\tableofcontents[sections={7-12},currentsection,hideothersubsections]
\end{column}
\end{columns}
\end{frame}
\include{modules_EOLE_envole/amon/00-description}
\include{modules_EOLE_envole/sphynx/00-description}
\include{modules_EOLE_envole/scribe/00-description}
\include{modules_EOLE_envole/horus/00-description}
\include{modules_EOLE_envole/amonecole/00-description}
\include{modules_EOLE_envole/tronc-commun-1/00-panorama-module}
\section{Les quatre phases}
\begin{frame}{Plan}
\begin{columns}[t]
\begin{column}{5cm}
\tableofcontents[sections={1-6},currentsection, hideothersubsections]
\end{column}
\begin{column}{5cm}
\tableofcontents[sections={7-12},currentsection,hideothersubsections]
\end{column}
\end{columns}
\end{frame}
\include{modules_EOLE_envole/commun/02-quatre_phases}
\include{modules_EOLE_envole/scribe/00-virtualbox}
\include{modules_EOLE_envole/commun/02-quatre_phases-pratique}
\include{modules_EOLE_envole/tronc-commun-1/01-config-texte}
\section{Administration commune}
\begin{frame}{Plan}
\begin{columns}[t]
\begin{column}{5cm}
\tableofcontents[sections={1-6},currentsection, hideothersubsections]
\end{column}
\begin{column}{5cm}
\tableofcontents[sections={7-12},currentsection,hideothersubsections]
\end{column}
\end{columns}
\end{frame}
\include{modules_EOLE_envole/commun/02-instance-reconfigure}
\include{modules_EOLE_envole/commun/03-mise-a-jour}
\include{modules_EOLE_envole/commun/04-diagnose}
\include{modules_EOLE_envole/commun/04-diagnose-pratique}
\include{modules_EOLE_envole/tronc-commun-1/05-conteneurs}
%\include{modules_EOLE_envole/tronc-commun-1/05-conteneurs-pratique}
\include{modules_EOLE_envole/tronc-commun-1/06-firewall}
\include{modules_EOLE_envole/tronc-commun-1/06-schedule}
\include{modules_EOLE_envole/tronc-commun-1/06-zpratique}
%\include{modules_EOLE_envole/tronc-commun-1/07-onduleur}
%\include{modules_EOLE_envole/tronc-commun-1/07-onduleur-pratique}
\include{modules_EOLE_envole/tronc-commun-1/08-trouver}
\section{GNU/Linux}
\begin{frame}{Plan}
\begin{columns}[t]
\begin{column}{5cm}
\tableofcontents[sections={1-6},currentsection, hideothersubsections]
\end{column}
\begin{column}{5cm}
\tableofcontents[sections={7-12},currentsection,hideothersubsections]
\end{column}
\end{columns}
\end{frame}
\include{modules_EOLE_envole/tronc-commun-1/20-gnu_linux}
\include{modules_EOLE_envole/tronc-commun-1/20-tcpdump-tshark}
\include{modules_EOLE_envole/tronc-commun-1/20-ziptraf}
\include{modules_EOLE_envole/tronc-commun-1/21-lire-ecrire}
\include{modules_EOLE_envole/tronc-commun-1/22-commande-distance}
\section{Sauvegarde}
\begin{frame}{Plan}
\begin{columns}[t]
\begin{column}{5cm}
\tableofcontents[sections={1-6},currentsection, hideothersubsections]
\end{column}
\begin{column}{5cm}
\tableofcontents[sections={7-12},currentsection,hideothersubsections]
\end{column}
\end{columns}
\end{frame}
\include{modules_EOLE_envole/scribe/20-sauvegarde}
\section{Poste de travail}
\begin{frame}{Plan}
\begin{columns}[t]
\begin{column}{5cm}
\tableofcontents[sections={1-6},currentsection, hideothersubsections]
\end{column}
\begin{column}{5cm}
\tableofcontents[sections={7-12},currentsection,hideothersubsections]
\end{column}
\end{columns}
\end{frame}
\include{modules_EOLE_envole/scribe/10-windows-distance}
\include{modules_EOLE_envole/scribe/12-machine-diagnostic}
\include{modules_EOLE_envole/scribe/14-esu-diagnostic}
\subject{Talks}
\begin{frame}
\frametitle{Licence}
Cette œuvre est mise à disposition sous licence \href{http://creativecommons.org/licenses/by-nc-sa/2.0/fr/}{\textsc{cc-by-nc-sa-2.0}}
\begin{itemize}
\item Attribution
\item Pas dUtilisation Commerciale
\item Partage dans les Mêmes Conditions 2.0
\item France
\end{itemize}
Pour voir une copie de cette licence, visitez
\href{http://creativecommons.org/licenses/by-nc-sa/2.0/fr/}{http://creativecommons.org/licenses/by-nc-sa/2.0/fr/}
ou écrivez à Creative Commons, 444 Castro Street, Suite 900,
Mountain View, California, 94041, USA.
\end{frame}
\end{document}

View File

@ -6,6 +6,6 @@
%\fancyhead[R]{ }
\fancyfoot[L]{{\tiny \@title \\ \numeroversion}}
\fancyfoot[C]{{\tiny {\scriptsize \textbf{\cadoles}} \\ {\adresse,~\codepostal~\ville} }}
\fancyfoot[C]{{\tiny {\scriptsize \textbf{\cadoles}} \\ {\adresse \codepostal \ville} }}
\fancyfoot[R]{{\tiny \thepage / \pageref{LastPage} \\ \telephone }}

Some files were not shown because too many files have changed in this diff Show More