Ce cours est le premier en lien avec l'algorithmique présente les algorithmes et fonctions récursives ainsi que le type abstrait de données arbre. La première partie revient sur les notions de problème, algorithhme et spécification. La deuxième partie présente la récursion et de nombreux exemples. Enfin, la troisième partie présente le type abstrait de données arbre qui permet d'organiser des données de manière hiérarchique. Le cours se termine avec une introduction aux notions de backtracking et lookahead.
Cours en C++ de la programmation procédurale à la POO.
Partie 1: La Programmation Procédurale.
Partie 2: La Programmation Orientée Objet.
Partie 3: Les Exceptions, Entrées/Sorties, Structures, Unions, Énumérations…
Partie 4: Les interfaces Graphiques avec Qt.
Si vous avez des remarques ou des suggestions afin d'améliorer ce support du cours merci de me contacter via pr.azizdarouichi@gmail.com
Ce cours présente le notion de qualité de code et quels sont les critères et pratiques à adopter pour produire du code de qualité. Il présente les erreurs de programmation les plus fréquentes auprès des apprentis programmeurs. La deuxième partie du cours présente la notion de convention de codage et en particulier le PEP 0008 qui décrit des conventions à adopter lorsqu'on programme en Python.
C'est le chapitre 1 sur le langage Python qui est une introduction à ce langage.
Si vous avez des remarques ou des suggestions pour l’améliorer n’hésitez pas à m’écrire via ce courriel:
pr.azizdarouichi@gmail.com
Bonne lecture.
Ce premier cours avancé sur Python concerne les deux structures de données avancées que sont les ensembles et les dictionnaires. Ces derniers sont notamment utilisés pour construire des bases de données orientées document.
Ce cours présente ce qu'est l'internet des objets (IoT), un réseau parallèle au web connectant entre eux des dispositifs physiques. Les différences majeures entre l'IoT et le web sont mises en avant, ainsi que les grands défis auxquels le monde de l'IoT est confronté. Le cours présente ensuite brièvement comment on peut gérer un système embarqué à distance, notamment pour la maintenance, le monitoring, le disaster recovery, notamment à l'aide d'un watchdog. Enfin, pour conclure, plusieurs architectures réseaux possibles sont présentées, pour inter-connecter des systèmes embarqués et les relier au web.
Ce cours présente comment définir de nouveaux objets en définissant des classes. Un objet est une instance d'une classe qui définit les variables d'instances (attributs) et méthodes (fonctionnalités) que les objets créés à partir de la classe auront.
Cours en C++ de la programmation procédurale à la POO.
Partie 1: La Programmation Procédurale.
Partie 2: La Programmation Orientée Objet.
Partie 3: Les Exceptions, Entrées/Sorties, Structures, Unions, Énumérations…
Partie 4: Les interfaces Graphiques avec Qt.
Si vous avez des remarques ou des suggestions afin d'améliorer ce support du cours merci de me contacter via pr.azizdarouichi@gmail.com
Ce cours présente le notion de qualité de code et quels sont les critères et pratiques à adopter pour produire du code de qualité. Il présente les erreurs de programmation les plus fréquentes auprès des apprentis programmeurs. La deuxième partie du cours présente la notion de convention de codage et en particulier le PEP 0008 qui décrit des conventions à adopter lorsqu'on programme en Python.
C'est le chapitre 1 sur le langage Python qui est une introduction à ce langage.
Si vous avez des remarques ou des suggestions pour l’améliorer n’hésitez pas à m’écrire via ce courriel:
pr.azizdarouichi@gmail.com
Bonne lecture.
Ce premier cours avancé sur Python concerne les deux structures de données avancées que sont les ensembles et les dictionnaires. Ces derniers sont notamment utilisés pour construire des bases de données orientées document.
Ce cours présente ce qu'est l'internet des objets (IoT), un réseau parallèle au web connectant entre eux des dispositifs physiques. Les différences majeures entre l'IoT et le web sont mises en avant, ainsi que les grands défis auxquels le monde de l'IoT est confronté. Le cours présente ensuite brièvement comment on peut gérer un système embarqué à distance, notamment pour la maintenance, le monitoring, le disaster recovery, notamment à l'aide d'un watchdog. Enfin, pour conclure, plusieurs architectures réseaux possibles sont présentées, pour inter-connecter des systèmes embarqués et les relier au web.
Ce cours présente comment définir de nouveaux objets en définissant des classes. Un objet est une instance d'une classe qui définit les variables d'instances (attributs) et méthodes (fonctionnalités) que les objets créés à partir de la classe auront.
Slides du cours "JAVA1001 : Introduction à la programmation Java" de la formation "Apprendre Java et la Programmation Orientée-Objets" du learning center de http://www.ukonline.be
Présentation du projet de transmission numérique dans lequel les étudiants sont amenés, en équipes mixtes électroniciens - informaticiens, à développer une application qui, sur base de données collectées par des senseurs, propose une analyse de ces dernières pour fournir un service.
Ce deuxième cours aborde la programmation réseau, c'est-à-dire le développement d'applications avec plusieurs composants qui communiquent entre eux via la réseau. Après une rapide présentation des protocoles UDP et TCP, le cours aborde la notion de socket et présente le module Python de même nom. Le cours présente deux applications concrètes : une application de chat (basé sur UDP) et une application echo (basé sur TCP). Le cours se termine par la découverte de la notion de protocole de communication et de la définition du format des messages échangés.
Ce premier cours introduit la notion de système embarqué en commençant par en donner une définition. Il les caractérise ensuite sur base de plusieurs critères : type d'application, de fonction visé, taille, fiabilité, efficacité. Il présente ensuite plusieurs aspects hardware (unité de calcul, architecture matérielle, composants clés) et software (niveau de programmation, processus de développement). Enfin, il conclut en discutant sur ce qu'est un ingénieur en systèmes embarqués.
Ce deuxième cours concerne les tuples, séquences non modifiables d'éléments. On peut les étendre en tuples nommés en ajoutant un nom à chacune des entrées du tuple, appelées alors champs. Enfin, on peut aller plus loin et définir des objets en associant des fonctions à des données. Cette seconde partie introduit à la programmation orientée objet.
Ce cours présente comment réaliser des interfaces graphiques avec Python en utilisant la librairie Kivy. La première partie rappelle les principes de la programmation évènementielle puis présente la séparation interface/comportement à l'aide de fichiers KV et Python. La deuxième partie présente comment réaliser des dessins avec les composants Canvas. On y voit comment dessiner des formes, appliquer des transformations et on termine avec un exemple de composants déplaçables.
Ce premier cours présente les notions d'objet et de classe, et le lien entre elles. Il présente aussi le premier concept clé de la programmation orientée objet, à savoir l'encapsulation des données. Les exemples sont fournis dans plusieurs langages (Python, C#, Java, C++ et PHP).
Ce cours présente la programmation fonctionnelle et montre comment il est possible de programmer avec ce paradigme en utilisant Python. La première partie présente la notion d'objet de type fonction, les fonctions lambda, le type callable et les closures. La deuxième partie présente les décorateur et montre comment ajouter du comportement à une fonction à l'aide d'un décorateur. La troisième partie présente les itérateurs et les générateurs qui, grâce à l'instruction yield, génère les données à la demande.
Ce cours présente ce qu'est Internet et son fonctionnement. En partant de l'ordinateur personnel ou smartphone connectés en un réseau local, le cours remonte petit à petit vers le fournisseur d'accès et l'Internet complet. Le cours présente ensuite plusieurs protocoles qui assurent le bon fonctionnement d'Internet et des services qu'il permet d'offrir. Enfin, la dernière partie concerne l'internet des objets.
Cette présentation concerne la mesure des distances entre la Terre et les étoiles. Elle présente notamment la technique du l'écho radar et celle de la parallaxe.
Ce cours présente le langage UML qui permet notamment de modéliser des logiciels programmés en orienté objet. Ce cours présente les diagrammes de classes qui permettent de décrire la structure d'un logiciel et les diagrammes d'activité qui permettent de décrire les aspects dynamiques de l'exécution.
Ce cours concerne les arbres, structure de données organisant les données de manière hiérarchique dans de nœuds reliés entre eux par une relation parent-enfant. Le cours présente les arbres généraux et ensuite les arbres binaires, où chaque nœud possède 0 ou 2 enfants. Enfin, le cours termine en présentant des algorithmes de recherche et en particulier l'arbre binaire de recherche.
Ce premier cours introduit à plusieurs aspects liés au développement informatique. Le cours présente comment versioner son code avec le système Git et comment le déployer avec Heroku. Il présente ensuite comment débugguer avec le module pdb et comment profiler son code avec les modules timeit et profile. Enfin, le cours termine en présentant le concept de tests unitaires que l'on peut construire avec les modules doctest et unittest.
Cette présentation montre plusieurs outils gratuits qui peuvent être utilisés pour gérer plusieurs aspects de la gestion de projets, en particulier informatique, de manière collaborative. On y voit comment versioner son code avec Git, déployer son code avec Heroku, tester son code avec Travis, gérer et planifier son temps et ses tâches avec Trello, FreedCamp et Tom'splanner, comment communiquer avec Slack et comment rédiger sa documentation avec Read the Docs.
Ce cours concerne la manipulation des chaines de caractères et les expressions régulières. La première partie présente la classe str Python ainsi que les opérations qu'il est possible de faire sur des objets str. La seconde partie concerne les expressions regulières qui permettent de valider des chaines de caractères ou d'en extraire des sous-chaines qui satisfont un motif donné. On y voit finalement comment utiliser le module re Python.
Ce cours aborde la gestion d'erreurs en programmation, c'est-à-dire comment gérer les situations où une erreur se produit. Après avoir présenté le principe des spécifications et de la programmation défensive avec l'instruction assert, ce cours présente l'instruction try/except qui permet de capturer des erreurs. Enfin, le cours termine en présentant comment définir ses propres erreurs et les générer avec l'instruction raise.
Cette présentation concerne le développement piloté par les tests (TDD, Test-Driven Development). Cette méthodologie se base sur des tests unitaires qui testent de manière indépendante des unités de code (module, procédure/fonction, classe...). En particulier, cette présentation utilise la librairie CUnit utilisée pour le langage C.
Algorithmes récursifs : une introduction pragmatique pour un enseignement au ...RichardTerrat1
Le calcul récursif est fondé sur la composition des algorithmes (un algorithme peut invoquer le résultat calculé par un autre algorithme),utilisant la propriété que, sous certaines conditions, un algorithme peut, dans sa définition même, se composer avec lui-même.
Cet article n’aborde pas les aspects théoriques relevant de cette problématique et se veut une introduction par l’exemple aux possibilités calculatoires qu’elle offre. Il est destiné aux étudiants de niveau Licence ou Master en Informatique, notamment à ceux préparant un CAPES d’informatique, comme aux enseignants du secondaire qui souhaitent accompagner l’apparition de la discipline Informatique au lycée.
En particulier, après avoir discuté la composition d’un algorithme avec lui-même dans deux exemples aux résultats contradictoires et proposé une démarche pragmatique de conception et de première ana-lyse d’algorithmes récursifs, cet article présente une dizaine d’exemples pouvant inspirer des exercices à traiter sous forme de cours ou de séances de travaux dirigés
Objectif général : Acquérir les connaissances nécessaires à la programmation avec le langage Python
Objectifs opérationnels :
- Mémoriser des données primitives
- Traiter des données
- Communiquer avec l’extérieur
- Contrôler le flux d’exécution des instructions
- Mémoriser des données composites
- Découper et réutiliser du code
Quelques pages intéressantes sur Python avec des exemples, et en particulier en 1.4 le programme de calcul d'une intégrale par la méthode des rectangles, des trapèzes et de Simpson.
(1) Ce document provient de : https://www.apprendre-en-ligne.net/pymath/support.pdf (au 27 mars 2019)
(2) Il est extrait du site : https://www.apprendre-en-ligne.net/index.php
Ce second cours d'algorithmique présente des techniques utilisées en intelligence artificielle pour trouver une solution à un problème de recherche. La première partie définit un problème de recherche : état, action, arbre d'exécution, espace d'états, cout, objectif et formalisation. La deuxième partie présente plusieurs algorithmes de recherche : non informé (BFS, UCS, DFS, DLS, ID-DFS, BS), informé (BFS, A*) et avec adversaire (Minimax, Alpha-Beta Pruning). Enfin, la troisième partie présente deux librairies Python qui implémentent des algorithmes de recherche.
Kevin Olivier Avignon: Une introduction à la pensée fonctionnelle avec F#MSDEVMTL
29 février 2016 - Groupe .NET/ASP.NET
Sujet: F#
Conférencier: Kevin Olivier Avignon
Pour ceux qui ne le connaissent pas, F# fait parti des langages .NET les plus récents du monde .NET. Il tire ses racines principalement du langage OCaml. Il ne faut pas se méprendre sur sa nature; il ne s'agit pas d'un langage purement fonctionnel. F# est en fait un langage hybride dans lequel il est possible de s'exprimer de façon impérative ou aussi, avec des objets. La présentation introduira comment s'immerger dans la pensée fonctionnelle et bâtir des applications avec les rudiments de F#.
Objectif général : Acquérir les bases méthodologiques de la résolution d'un problème conduisant à la réalisation d'un programme informatique
Objectifs spécifiques :
Connaître les étapes de résolution d’un problème
Stocker et traiter des données simples
Permettre à un programme de communiquer avec l’extérieur
Contrôler le flux d’exécution des instructions
Traiter des données composites
Définir et utiliser des procédures et des fonctions
Introduction à la partie technique de la formation Digitalent mise en place par l'équipe ECAM. Cette formation couvre l'impression 3D, la programmation et l'électronique embarquée.
Ce cours présente la notion de système embarqué temps-réel et comment il est possible de gérer cela au niveau software avec un Linux embarqué. Plusieurs solutions sont présentées : OS temps-réel, linux préemptif et support hardware. Enfin, le cours présente le PRU-ICSS, dont est dotée la BeagleBone Black, une unité de calcul spécialisée pour les applications temps réel. Le cours présente comment programmer le PRU et notamment comment compiler un code à sa destination à l'aide d'un langage d'assemblage.
Ce cours présente les principaux moyens de communications que l'on peut déployer au sein d'un système embarqué. Après un rappel sur les différents types de communication (série/parallèle, synchrone/asynchrone, half-duplex/full-duplex), le cours présente le port série ainsi que l'implémentation UART. Vient ensuite le bus USB et les deux modes en hôte ou périphérique. Après cela, le cours présente les protocoles I2C et puis SPI. Enfin, il termine avec le simple bus 1-Wire. Tous ces différents moyens de communication sont disponibles sur la BeagleBone Black et le cours illustre comment les manipuler à l'aide du Linux embarqué.
Ce cours présente la notion de système d'exploitation et en particulier les Linux embarqués qui sont spécialement conçus pour des systèmes embarqués de haut niveau avec des processeurs à usage général (GPP) comme unité de calcul principale. Il explique ensuite comment Linux embarqué démarre, quelles sont les différentes phases et modalités de stockage du système d'exploitation. Enfin, il présente la BeagleBone Black, ses caractéristiques et comment la programmer. Le cours conclut en expliquant la notion de driver de périphérique et comment ils sont conçus sous Linux à l'aide de fichiers.
Cette conférence présente le framework Johnny-Five qui permet de programmer des cartes embarquées à l'aide d'un module Node.js. Après un tour rapide du JavaScript et de son fonctionnement, en particulier la programmation fonctionnelle et l'exécution pilotée par les évènements, la présentation décrit Node.js et aborde rapidement son fonctionnement. La troisième partie présente Johnny-Five et plusieurs exemples simples de contrôle d'une LED et de l'utilisation des entrées/sorties numériques et analogiques.
Cette conférence présente LaTeX, un outil permettant de réaliser des documents de haute qualité typographique et professionnelle. Après avoir présenté quelques règles de typographie de la langue française, la présentation fait découvrir les bases de LaTeX et montre comment réaliser son premier document. Elle présente ensuite plusieurs constructions de base comme les listes, l'inclusion d'images et de tableaux, les mathématiques, les listings de code source. Enfin, elle termine avec des constructions plus avancées, comme la notion de figure et références croisées.
Ce cours introduit à l'intelligence artificielle. La première partie du cours présente et définit ce qu'est l'intelligence et décrit les notions d'agent rationnel et d'environnement et leurs propriétés. Ces deux concepts permettent d'offrir un cadre de réflexion sur l'intelligence. La fin de la première partie présente les neufs formes d'intelligence selon Howard Gardner. La seconde partie du cours présente et définit l'intelligence artificielle, initiée par Marvin Minsky et John McCarthy au MIT. Elle présente également le test de Turing, test permettant de déterminer si une machine peut penser. Cette partie se termine en présentant les six grands domaines de l'intelligence artificielle.
Ce cours présente les techniques que l'on peut utiliser pour effectuer des calculs parallèles avec une machine. La première partie introduit à la notion de parallélisme et de processus. Elle présente ensuite comment lancer et manipuler des processus avec les modules subprocess et multiprocessing. On y voit également comment communiquer entre processus avec des Queue et des Pipe. La deuxième partie présente les threads et leur utilisation avec le module threading. On y voit également comment créer un pool de workers/executors pour exécuter des jobs. Enfin, la dernière partie présente le framework dispy qui permet de facilement faire du calcul distribué et exploiter le parallélisme de données.
Ce cours présente la notion de qualité de code et comment il est possible de l'évaluer grâce à des métriques mesurables. Après avoir présenté plusieurs métriques standards, il se concentrer sur des aspects de qualité de code spécifique à l'orienté objet et présente les cinq concepts de l'orienté objet. La deuxième partie du cours présente plusieurs bonnes pratiques à avoir en programmation orientée objet, sur base d'exemples concrets.
Ce cours introduit aux trois langages de programmation du Web que sont l'HTML, le CSS et le Javascript. L'HTML est un langage de balisage qui permet de décrire un document et sa structure. Le CSS est un langage qui permet de définir des règles de style à appliquer à un document. Enfin, Javascript est un langage permettant d'ajouter un aspect dynamique à une page web.
Ce cours introduit à la notion de type abstrait de données (TAD). On commence par y découvrir les principes de complexité temporelle et spatiale permettant d'analyser les performances d'une structure de données et d'algorithmes. Ensuite, le cours présente plusieurs TAD : la pile, la file, le deque et le vecteur. Enfin, il présente comment implémenter des TAD avec des structures chainées.
Dans ce cours, on découvre comment lire et écrire des fichiers à l'aide de Python. Il est possible de créer des fichiers texte ou des fichiers binaires. Pour manipuler un fichier, il faut d'abord l'ouvrir, puis on peut faire les opérations et enfin on doit le refermer.
Ce cours concerne le polymorphisme, c'est-à-dire la capacité pour une variable de prendre plusieurs types de donnée durant le temps de sa vie. Le cours présente aussi la notion de classe abstraite et d'interface qui est une classe abstraite pure.
Dans ce cours, on découvre comment construire une interface graphique en Python en utilisant la librairie Tk. Après avoir vu les différents composants de base, ce cours présente la programmation évènementielle qui permet d'écrire du code qui réagit à des évènements comme le clic sur un bouton, par exemple.
Ce cours présente la notion d'héritage entre classes qui permet de construire une relation de type "is-a". On crée une sous-classe à partir d'une super-classe, pour en hériter une partie de ses membres. On peut ensuite y ajouter des membres spécifiques. Ce cours présente également la redéfinition de méthodes, et comment utiliser les modificateurs de visibilité des membres.
L'IA connaît une croissance rapide et son intégration dans le domaine éducatif soulève de nombreuses questions. Aujourd'hui, nous explorerons comment les étudiants utilisent l'IA, les perceptions des enseignants à ce sujet, et les mesures possibles pour encadrer ces usages.
Constat Actuel
L'IA est de plus en plus présente dans notre quotidien, y compris dans l'éducation. Certaines universités, comme Science Po en janvier 2023, ont interdit l'utilisation de l'IA, tandis que d'autres, comme l'Université de Prague, la considèrent comme du plagiat. Cette diversité de positions souligne la nécessité urgente d'une réponse institutionnelle pour encadrer ces usages et prévenir les risques de triche et de plagiat.
Enquête Nationale
Pour mieux comprendre ces dynamiques, une enquête nationale intitulée "L'IA dans l'enseignement" a été réalisée. Les auteurs de cette enquête sont Le Sphynx (sondage) et Compilatio (fraude académique). Elle a été diffusée dans les universités de Lyon et d'Aix-Marseille entre le 21 juin et le 15 août 2023, touchant 1242 enseignants et 4443 étudiants. Les questionnaires, conçus pour étudier les usages de l'IA et les représentations de ces usages, abordaient des thèmes comme les craintes, les opportunités et l'acceptabilité.
Résultats de l'Enquête
Les résultats montrent que 55 % des étudiants utilisent l'IA de manière occasionnelle ou fréquente, contre 34 % des enseignants. Cependant, 88 % des enseignants pensent que leurs étudiants utilisent l'IA, ce qui pourrait indiquer une surestimation des usages. Les usages identifiés incluent la recherche d'informations et la rédaction de textes, bien que ces réponses ne puissent pas être cumulées dans les choix proposés.
Analyse Critique
Une analyse plus approfondie révèle que les enseignants peinent à percevoir les bénéfices de l'IA pour l'apprentissage, contrairement aux étudiants. La question de savoir si l'IA améliore les notes sans développer les compétences reste débattue. Est-ce un dopage académique ou une opportunité pour un apprentissage plus efficace ?
Acceptabilité et Éthique
L'enquête révèle que beaucoup d'étudiants jugent acceptable d'utiliser l'IA pour rédiger leurs devoirs, et même un quart des enseignants partagent cet avis. Cela pose des questions éthiques cruciales : copier-coller est-il tricher ? Utiliser l'IA sous supervision ou pour des traductions est-il acceptable ? La réponse n'est pas simple et nécessite un débat ouvert.
Propositions et Solutions
Pour encadrer ces usages, plusieurs solutions sont proposées. Plutôt que d'interdire l'IA, il est suggéré de fixer des règles pour une utilisation responsable. Des innovations pédagogiques peuvent également être explorées, comme la création de situations de concurrence professionnelle ou l'utilisation de détecteurs d'IA.
Conclusion
En conclusion, bien que l'étude présente des limites, elle souligne un besoin urgent de régulation. Une charte institutionnelle pourrait fournir un cadre pour une utilisation éthique.
Ouvrez la porte ou prenez un mur (Agile Tour Genève 2024)Laurent Speyser
(Conférence dessinée)
Vous êtes certainement à l’origine, ou impliqué, dans un changement au sein de votre organisation. Et peut être que cela ne se passe pas aussi bien qu’attendu…
Depuis plusieurs années, je fais régulièrement le constat de l’échec de l’adoption de l’Agilité, et plus globalement de grands changements, dans les organisations. Je vais tenter de vous expliquer pourquoi ils suscitent peu d'adhésion, peu d’engagement, et ils ne tiennent pas dans le temps.
Heureusement, il existe un autre chemin. Pour l'emprunter il s'agira de cultiver l'invitation, l'intelligence collective , la mécanique des jeux, les rites de passages, .... afin que l'agilité prenne racine.
Vous repartirez de cette conférence en ayant pris du recul sur le changement tel qu‘il est généralement opéré aujourd’hui, et en ayant découvert (ou redécouvert) le seul guide valable à suivre, à mon sens, pour un changement authentique, durable, et respectueux des individus! Et en bonus, 2 ou 3 trucs pratiques!
Le Comptoir OCTO - Qu’apporte l’analyse de cycle de vie lors d’un audit d’éco...OCTO Technology
Par Nicolas Bordier (Consultant numérique responsable @OCTO Technology) et Alaric Rougnon-Glasson (Sustainable Tech Consultant @OCTO Technology)
Sur un exemple très concret d’audit d’éco-conception de l’outil de bilan carbone C’Bilan développé par ICDC (Caisse des dépôts et consignations) nous allons expliquer en quoi l’ACV (analyse de cycle de vie) a été déterminante pour identifier les pistes d’actions pour réduire jusqu'à 82% de l’empreinte environnementale du service.
Vidéo Youtube : https://www.youtube.com/watch?v=7R8oL2P_DkU
Compte-rendu :
Le Comptoir OCTO - Équipes infra et prod, ne ratez pas l'embarquement pour l'...OCTO Technology
par Claude Camus (Coach agile d'organisation @OCTO Technology) et Gilles Masy (Organizational Coach @OCTO Technology)
Les équipes infrastructure, sécurité, production, ou cloud, doivent consacrer du temps à la modernisation de leurs outils (automatisation, cloud, etc) et de leurs pratiques (DevOps, SRE, etc). Dans le même temps, elles doivent répondre à une avalanche croissante de demandes, tout en maintenant un niveau de qualité de service optimal.
Habitué des environnements développeurs, les transformations agiles négligent les particularités des équipes OPS. Lors de ce comptoir, nous vous partagerons notre proposition de valeur de l'agilité@OPS, qui embarquera vos équipes OPS en Classe Business (Agility), et leur fera dire : "nous ne reviendrons pas en arrière".
MongoDB in a scale-up: how to get away from a monolithic hell — MongoDB Paris...Horgix
This is the slide deck of a talk by Alexis "Horgix" Chotard and Laurentiu Capatina presented at the MongoDB Paris User Group in June 2024 about the feedback on how PayFit move away from a monolithic hell of a self-hosted MongoDB cluster to managed alternatives. Pitch below.
March 15, 2023, 6:59 AM: a MongoDB cluster collapses. Tough luck, this cluster contains 95% of user data and is absolutely vital for even minimal operation of our application. To worsen matters, this cluster is 7 years behind on versions, is not scalable, and barely observable. Furthermore, even the data model would quickly raise eyebrows: applications communicating with each other by reading/writing in the same MongoDB documents, documents reaching the maximum limit of 16MiB with hundreds of levels of nesting, and so forth. The incident will last several days and result in the loss of many users. We've seen better scenarios.
Let's explore how PayFit found itself in this hellish situation and, more importantly, how we managed to overcome it!
On the agenda: technical stabilization, untangling data models, breaking apart a Single Point of Failure (SPOF) into several elements with a more restricted blast radius, transitioning to managed services, improving internal accesses, regaining control over risky operations, and ultimately, approaching a technical migration when it impacts all development teams.
2. Ce(tte) œuvre est mise à disposition selon les termes de la Licence Creative Commons
Attribution – Pas d’Utilisation Commerciale – Pas de Modification 4.0 International.
3. Objectifs
Découverte de l’algorithmique
Définition et principe
Programmation récursive
Le type abstrait de données arbre
Type abstrait de données
Arbre, propriétés et implémentation récursive
Backtracking
3
5. Algorithme
Un algorithme est un ensemble d’opérations à effectuer
Décrit un processus qu’il est possible d’exécuter
Nom provenant de al-Khw¯arizm¯ı
Mathématicien, astronome, géographe et savant Perse
Plusieurs applications
Calcul
Traitement de données
Raisonnement automatique
5
6. Description d’algorithme
Méthode effective pour calculer une fonction
Décrite dans un langage formel bien défini
Plusieurs façons de décrire un algorithme
Langue naturelle
Pseudo-code
Langage de programmation
Formalisme mathématique
6
7. Problème
Un algorithme a pour but de résoudre un problème
Qui est exprimé sous la forme d’une fonction à calculer
Implémentation dans un langage de programmation
Permet de résoudre concrètement des instances du problème
Problème
Instance
Algorithme
Programme
instanciation
résout
implémentation
calcule une solution
7
8. Spécification d’un problème (1)
Quatre éléments à identifier pour spécifier un problème
Entrées : données à fournir qui sont nécessaires au problème
Sorties : résultat produit qui est solution du problème
Effet de bord : modification de l’environnement et des paramètres
Situations exceptionnelles où une exception est levée
1 def factorial(n):
2 """ Calcule la factorielle d’un nombre naturel.
3
4 Input: n, un nombre naturel.
5 Output: n!, la factorielle de n.
6 Raise: ArithmeticError lorsque n < 0
7 """
8 pass
8
9. Spécification d’un problème (2)
Quatre éléments à identifier pour spécifier un problème
Précondition : conditions qui doivent être satisfaites sur
l’environnement et les paramètres avant de pouvoir faire l’appel
Sorties : conditions qui sont satisfaites sur l’environnement, la
valeur renvoyée et les paramètres après l’appel, si les préconditions
étaient satisfaites
Situations exceptionnelles où une exception est levée
1 def factorial(n):
2 """ Calcule la factorielle d’un nombre naturel.
3
4 Pre: n > 0.
5 Post: La valeur renvoyée contient la factorielle de n.
6 Raise: ArithmeticError lorsque n < 0
7 """
8 pass
9
10. Implémentation
Plusieurs implémentations possibles pour un algorithme
Langages et choix d’implémentation différents
Plusieurs algorithmes possibles pour un problème
Approches et structures de données différentes
10
11. Exemple : Recherche dans une liste
Étant donné une liste, rechercher si un élément en fait partie
Attention, la liste peut être vide
Spécification du problème
1 def contains(data , elem):
2 """ Recherche un élément donné dans une liste de données.
3
4 Pre: -
5 Post: La valeur renvoyée est
6 True si elem apparait au moins une fois dans la liste
7 et False sinon.
8 """
9 pass
11
12. Algorithme en langue naturelle
1 Si la liste est vide, on renvoie directement False et
l’algorithme se termine
2 Pour chaque élément de la liste
1 Si l’élément parcouru est égal à celui recherché, on renvoie
directement True et l’algorithme se termine
3 L’élément recherché n’est pas dans la liste, on renvoie False
12
13. Algorithme en pseudo-code
Le pseudo-code est une façon de décrire un algorithme
De manière indépendante de tout langage de programmation
Pas de réelle convention pour le pseudo-code
Les opérations sont de haut niveau
Algorithm 1: Recherche si un élément se trouve dans une liste
if n = 0 then
return false
foreach e ∈ L do
if e = elem then
return true
return false
13
14. Optimisation de l’algorithme
Possibilité d’optimisation d’un algorithme
Diminution du nombre d’opérations à effectuer
Simplification de l’algorithme
Le cas n = 0 ne doit pas être traité séparément
Algorithm 2: Recherche si un élément se trouve dans une liste
foreach e ∈ L do
if e = elem then
return true
return false
14
15. Algorithme en langage de programmation
Implémentation effective dans un langage de programmation
Utilisation des caractéristiques spécifiques du langage
Peut être fait par traduction du pseudo-code
Traduction des constructions de haut niveau dans le langage
1 def contains(data , elem):
2 for e in data:
3 if e == elem:
4 return True
5 return False
15
16. Optimisation du programme
Possibilité d’optimisation d’un programme
Utilisation de constructions spécifiques au langage
Exploitation de la librairie standard
Python possède un opérateur in pour tester l’appartenance
1 def contains(data , elem):
2 return elem in data
16
18. Récursion
Processus de récursion découpe en sous-problèmes
Dont la structure est la même que le problème original
Plus simples à résoudre
Décompositions successives du problème original
Jusqu’à avoir un sous-problème qui se résout directement
Classe des algorithmes récursifs
Algorithme qui exploite la récursion pour résoudre le problème
18
19. Collecte de fonds (1)
Politicien doit trouver $1000 pour sa campagne
Collecte de $1 auprès de 1000 supporters
Algorithme itératif (boucle)
On demande successivement $1 aux 1000 supporters
1 def collect1000 ():
2 for i in range (1000):
3 # collect $1 from person i
19
20. Collecte de fonds (2)
Sous-traiter la recherche d’argent à des intermédiaires
Trouver 10 personnes qui vont chercher $100
Algorithme récursif (récursion)
On délègue à des intermédiaires qui vont eux-mêmes déléguer...
1 def collect(n):
2 if n == 1:
3 # donne $1 au supérieur
4 else:
5 for i in range(n): # délégation à n personnes
6 collect(n // 10)
7 # donne l’argent récoltée au supérieur
20
21. Concepts
Stratégie de diviser pour régner (divide-and-conquer)
Décomposition du problème original en sous-problèmes
Cas de base simple et cas récursif à décomposer
Représentation graphique avec un arbre de solution
$1000
$100
...
... $100
$10
...
... $10
$1 ... $1 $1
$10
...
$100
...
21
22. Caractérisation
Suivre l’approche de diviser pour régner
Plusieurs instances du même problème plus simples à résoudre
Problème candidat à une solution récursive
1 On peut décomposer le problème original en instances plus
simples du même problème
2 Les sous-problèmes doivent finir par devenir suffisamment
simples que pour être résolus directement
3 On peut combiner les solutions des sous-problèmes pour
produire la solution du problème original
22
23. Terminaison
Un processus récursif peut ne pas se terminer
Équivalent des boucles infinies pour les itérations
Le cas de base doit toujours finir par être atteint
Collecte de fonds avec un délégué pour rechercher les $1000
Le processus ne se termine pas, cas de base jamais atteint
1 def collect(n):
2 if n == 1:
3 # donne $1 au supérieur
4 else:
5 collect(n) # délégation à une personne
6 # donne l’argent récoltée au supérieur
23
24. Penser récursivement
Achilles I will be glad to indulge both of you, if you will first oblige
me, by telling me the meaning of these strange
expressions, “holism” and “reductionism.”
Crab Holism is the most natural thing in the world to grasp. It’s
simply the belief that “the whole is greater than the sum
of its parts.” No one in his right mind could reject holism.
Anteater Reductionism is the most natural thing in the world to
grasp. It’s simply the belief that “a whole can be
understood completely if you understand its parts, and the
nature of their ‘sum.”’ No one in her left brain could reject
reductionism.
“Gödel, Escher, Bach : an Eternal Golden Braid”, Douglas R. Hofstadter, 1999.
24
25. Fonction récursive
Résolution du problème original et des sous-problèmes générés
Les résolutions peuvent se faire avec la même fonction
Les paramètres permettent d’identifier les sous-problèmes
Ces paramètres sont utilisés pour gérer les cas de base et récursif
25
26. Exemple : Factorielle (1)
Factorielle d’un nombre naturel
n! = n × (n − 1) × ... × 1 et 0! par convention
Deux visions possibles pour calculer cette fonction
Vision itérative et vision récursive
fact(0) = = 1
fact(1) = 1 = 1
fact(2) = 2 x 1 = 2
fact(3) = 3 x 2 x 1 = 6
fact(0) = 1
fact(1) = 1 x fact(0)
fact(2) = 2 x fact(1)
fact(3) = 3 x fact(2)
26
27. Exemple : Factorielle (2)
Récursion sur n
Cas de base 0! = 1
Factorielle de 0 vaut 1 par convention
Cas récursif n! = n · (n − 1)!
Factorielle de n se calcule à partir de celle de n − 1
1 def fact(n):
2 if n == 0:
3 return 1
4 return n * fact(n - 1)
27
28. Exemple : Factorielle (3)
La fonction fact est appelée plusieurs fois
Une récursion produit également une boucle
fact(3)
fact(2)
fact(1)
fact(0)
appel
appel
appel
renvoie 1
renvoie 1 × (1)
renvoie 2 × (1 × 1)
renvoie 3 × (2 × 1 × 1)
28
29. Exemple : Fibonacci
Récursion sur n
Cas de base F1 = 1 et F2 = 1
1er et 2e nombres de Fibonacci en cas de base
Cas récursif Fn = Fn−1 + Fn−2
ne nombre de Fibonacci dépend des deux précédents
1 def fibo(n):
2 if n == 1 or n == 2:
3 return 1
4 return fibo(n - 1) + fibo(n - 2)
29
30. Exemple : Recherche dans une liste
Récursion sur la taille de la liste
Cas de base La liste est vide ou contient un élément
On peut rechercher immédiatement l’élément recherché
Cas récursif Recherche dans la liste sans le premier élément
La recherche se fait sur une liste plus courte
1 def contains(data , value):
2 if len(data) == 0:
3 return False
4 if data [0] == value:
5 return True
6 return contains(data [1:] , value)
30
31. Exemple : Tri d’une liste par fusion
Récursion sur la taille de la liste
Cas de base La liste est vide ou contient un élément
Une telle liste est déjà triée
Cas récursif Tri séparé de deux listes (on coupe l’originale)
Ensuite, fusion des deux listes triées
1 def sort(data):
2 def merge(l1 , l2):
3 # ...
4 n = len(data)
5 if n <= 1:
6 return data
7 return merge(sort(data [:n//2]) , sort(data[n//2:]))
31
33. Type abstrait de données
Type abstrait de données (TAD) spécifie mathématiquement
Un ensemble de données
Les opérations qu’on peut effectuer
Correspond à un cahier des charges
Implémentation du CDC par une structure de données
Plusieurs implémentations possibles pour un même TAD
Se différencient par la complexité calculatoire et spatiale
33
34. File
Séquence de type First-in First-out (FIFO)
Le premier élément qui a été ajouté sera le premier à sortir
Opérations possibles
size donne la taille de la file
isEmpty teste si la file est vide
front récupère l’élément en début de file
enqueue ajoute un élément en fin de file
dequeue retire l’élément en début de file
0 1 2 3 4
dequeue enqueue
fin
de file
début
de file
34
35. Pile
Séquence de type Last-in First-out (LIFO)
Le dernier élément qui a été ajouté sera le premier à sortir
Opérations possibles
size donne la taille de la pile
isEmpty teste si la pile est vide
top récupère l’élément en haut de la pile
push ajoute un élément en haut de la pile
pop retire l’élément en haut de la pile
0 1 2 3 4
pop
push
haut
de pile
35
36. Arbre
Éléments d’un arbre organisés de manière hiérarchique
Un arbre est un ensemble de nœuds (qui contiennent les valeurs)
Chaque nœud possède un parent et zéro ou plusieurs enfants
Sauf la racine de l’arbre qui n’a pas de parent
Bière
Trappiste
Rochefort 8
Trappe
Quadruple
Abbaye
Leffe Rituel
Autre
Maes Raedler CaraPils
36
37. Définition récursive
Deux cas possibles pour définir un arbre
Un arbre vide (sans enfants)
Un nœud avec un élément et une liste de sous-arbres
Opérations possibles
size donne la taille de l’arbre
value récupère la valeur stockée à la racine de l’arbre
children récupère la liste des sous-arbres enfants de la racine
addChild ajoute un sous-arbre comme enfant à la racine
37
38. Classe Tree (1)
Classe Tree possède deux variables d’instance
Une valeur (racine) et une liste de sous-arbres (enfants)
1 import copy
2
3 class Tree:
4 def __init__(self , value , children =[]):
5 self.__value = value
6 self.__children = copy.deepcopy(children)
7
8 @property
9 def value(self):
10 return self.__value
11
12 @property
13 def children(self):
14 return copy.deepcopy(self.__children)
15
16 def addChild(self , tree):
17 self.__children.append(tree)
18
19 # ...
38
39. Classe Tree (2)
11
25
-9
12 14
1 t1 = Tree (-9)
2 t2 = Tree (25, [t1])
3 t3 = Tree (12)
4 t4 = Tree (14)
5
6 t = Tree (11, [t2 , t3 , t4])
39
40. Taille d’un arbre
Calcul de la taille d’un arbre de manière récursive
1 + somme des tailles des sous-arbres enfants
Cas de base Aucun enfant
Cas récursif Appel récursif pour chaque enfant
1 # ...
2
3 @property
4 def size(self):
5 result = 1
6 for child in self.__children:
7 result += child.size
8 return result
9
10 # ...
40
41. Redéfinition de l’opérateur []
Définition de l’opérateur [] pour les objets de type Tree
Il faut redéfinir la méthode __getitem__(self, index)
1 # ...
2
3 def __getitem__(self , index):
4 return self.__children[index]
5
6 # ...
7
8 t = Tree (78, [Tree (14) , Tree (9) ])
9 for i in range(len(t.children)):
10 print(t[i]. value)
14
9
41
42. Représentation textuelle d’un arbre (1)
Représentation textuelle de manière récursive
Valeur concaténée avec les représentations de chaque sous-abre
Cas de base Aucun enfant
Cas récursif Appel récursif pour chaque enfant
Utilisation d’une fonction auxiliaire pour gérer le niveau
1 # ...
2
3 def __str__(self):
4 def _str(tree , level):
5 result = ’[{}]n’.format(tree.__value)
6 for child in tree.children:
7 result += ’{}|--{}’.format(’ ’ * level , _str(
child , level + 1))
8 return result
9 return _str(self , 0)
42
43. Représentation textuelle d’un arbre (2)
1 c1 = Tree (25, [Tree (-9)])
2 c2 = Tree (12)
3 c3 = Tree (14)
4
5 t = Tree (11, [c1 , c2 , c3])
6 print(t)
7
8 t[2]. addChild(Tree (8))
9 print(t)
[11]
|--[25]
|--[-9]
|--[12]
|--[14]
[11]
|--[25]
|--[-9]
|--[12]
|--[14]
|--[8]
43
44. Backtracking
Récursion beaucoup utilisée en intelligence artificielle
Recherche choix optimal dans un ensemble de possibilités
Faire une tentative de séquences de choix
Possibilité de faire marche arrière par rapport à un choix
Exploration de nouvelles décisions
La récursion permet de faire facilement du backtracking
44
45. “The Turk”
Canular d’un automate joueur d’échecs
Construit et dévoilé en 1770 par Johann Wolfgang von Kempelen
45
46. Lookahead
Explorer un maximum de coups possibles à l’avance
Sélectionner le coup qui mène à la meilleure situation
Pas toujours possible d’explorer tous les coups
Trouver le moins pire étant donné une contrainte temporelle
Deux notions clés
L’état du jeu représente la situation de ses joueurs
Un coup fait la transition entre deux états
46
47. Jeu de Nim
Le jeu de Nim se joue à deux joueurs
Le joueur choisit une rangée et retire autant de pièces qu’il veut
Le joueur qui retire la dernière pièce a gagné
Rangée 1
Rangée 2
Rangée 3
47
48. Arbre complet du jeu
(3,4,5)
(2,4,5)
(1,1)
(1,4,5)
(1,2)
... (3,4,0)
... (1,4,0)
... (1,1,0)
(0,1,0)
(0,0,0)
(2,1)
(1,1)
(1,0,0)
(0,0,0)
(1,1)
(2,1)
(2,3)
...
(1,2)
...
(3,5)
Joueur A
Joueur B
48
49. Trouver le meilleur coup (1)
Deux fonctions utilitaires
Tester si le jeu est fini (il ne reste plus de pièces)
Générer la liste des coups possibles
1 def isgameover(state):
2 for n in state:
3 if n > 0:
4 return False
5 return True
6
7 def getmoves(state):
8 moves = []
9 for i in range(len(state)):
10 moves += [(i, n) for n in range (1, state[i] + 1)]
11 return moves
49
50. Trouver le meilleur coup (2)
Deux fonctions récursives (récursion mutuelle)
Tester si un état est mauvais (mène à une perte du jeu)
Trouver un bon coup (qui ne mène pas à un mauvais état)
1 def isbadposition (state):
2 if isgameover(state):
3 return True
4 return findgoodmove (state) is None
5
6 def findgoodmove (state):
7 for move in getmoves(state):
8 nextstate = tuple(state[i] - move [1] if i == move [0] else
state[i] for i in range(len(state)))
9 if isbadposition (nextstate):
10 return move
11 return None
50