Projet du weekend : Angry Birds-like en Python

Il n’y a pas plus fun et amusant dans la programmation que la programmation des jeux vidéo, le but étant de créer un univers vidéoludique dans lequel les joueurs peuvent s’amuser, et même parfois apprendre, ou être projeté dans un univers imaginaire et suivre une histoire, ou faire la connaissance et socialiser avec d’autres joueurs. Malgré son aspect jovial, la programmation des jeux vidéo n’est pas une tâche si facile. Contrairement à d’autres types d’application, la programmation des jeux vidéo nécessite la maitrise de nombreux aspects très différents les des autres. Comme par exemple, la programmation procédurale, la programmation objet, la programmation événementielle, la programmation concurrentielle, la simulation physique comme sur le tutoriel en bas, la programmation réseaux, la maitrise de quelques notions en algèbre et en géométrie, l’intelligence artificielle, systèmes d’exploitation pour le portage et la distribution sur différentes plateformes, une bonne base d’algorithmes et de structures de données, et surtout l’infographie (ou en Anglais computer graphics)…etc. 

Simulation physique sur Python

Sur la vidéo en haut, de l’excellente chaîne Youtube Tech With Tim, il est possible de suivre un petit tutoriel sur comment on peut développer avec Python une simulation physique similaire à la simulation utilisée dans le jeu Angry Birds. La vidéo ne se focalise pas réellement sur l’aspect jeu vidéo, mais plutôt sur l’aspect simulation physique. Il y a beaucoup de jeux dont leur gameplay se base sur la physique, mais dans la plupart du temps, ce n’est pas si facile pour un étudiant ou un débutant avec des connaissances basiques de la programmation de passer à la programmation des jeux vidéo utilisant la physique. En réalité, ce que vous allez voir sur la vidéo est une petite introduction au framework graphique PyGame, qui est utilisée le plus souvent pour le développement de petits jeux vidéo (dit jeux indé). Il est utilisé conjointement avec une autre bibliothèque appelée PyMunk dédiée à assurer la simulation physique du jeu. Normalement pour maîtriser le tout, le développeur doit investir beaucoup de son temps, mais la vidéo ici représente juste une petite introduction pour ce type de programmation pour avoir un pas de départ. 

Les arbres binaires comme structure de données

Il est évident que les structures de données en informatique font partie des mécanismes de programmation les plus importantes à maîtriser pour la programmation. Une structure de données est la manière d’organiser la donnée à l’intérieur d’un programme pour que celle-ci soit le plus efficacement possible facile à accéder et à utiliser. Les structures de données, il y en a de tous genre, du plus simple au plus compliqué, comme les tableaux, les vecteurs, les listes chaînées, les piles, les files, les anneaux, les arbres, les graphes…etc.

Cours sur les Arbres Binaires

Sans surprise, les arbres binaires (appelées en Anglais Binary Tree, Bi-Tree ou B-Tree) s’inspirent d’une schématisation arborescente, qui est considérée comme une structure de données relativement plus ou moins complexe. On peut l’imaginer simplement comme une arborescence généalogique d’une famille avec plusieurs générations. Il y a le nœud qui représente l’individu, chaque individu peut posséder plusieurs enfants, les enfants ont leurs propres enfants, et ainsi de suite. Et l’arrière-grand-père le plus haut dans la hiérarchie est appelé la racine de l’arbre, c’est celui qui représente l’arbre. Pour les arbres dits binaires, un individu ne peut posséder plus de 2 enfants. Les arbres binaires sont très utilisés, peut-être le cas le plus probable est celui de la recherche dichotomique. C’est un algorithme très efficace pour la recherche de données dans une grande base de données.

La vidéo en haut de la chaîne YouTube du site web éducatif www.freecodecamp.org illustre cette structure de donnée sous format d’un tutoriel de courte durée pour espérant apprendre à l’intégrer dans ses propres programmes. 

Le premier code de Wozniak pour Apple-1

Pour ceux qui ne le savent pas encore, Steve Wozniak avec Steve Jobs sont les cofondateurs de la célèbre firme technologique Apple. Avant la création de cette firme, Steve Wozniak à l’aide de son ami Steve Jobs, ont conçu dans un garage leur première machine Apple-1. Et on soupçonne que le premier code que Wozniak a développé pour cette machine soit son Monitor System. Au tout début, Apple-1 n’avait pas de système d’exploitation (même que Apple-1 officiellement n’a jamais reçu de Système d’Exploitation), ainsi Wozniak a imaginé le développement d’un petit moniteur pour cette machine, appelé Woz Monitor. Par principe, le moniteur est un outil de débogage et de configuration matérielle, en sachant que son principal rôle est de donner la capacité à l’utilisateur d’accéder et de modifier directement la mémoire et les périphériques de la machine. Le moniteur que Wozniak a développé est très simple, il se comporte que de 256 octets, écrit en assembleur 6502, et son code est entièrement disponible et bien expliqué sur Internet (sur cette page) et sur GitHub. Le code du moniteur est très populaire pour les machines faite maison.

Woz Monitor source code

La vidéo en haut et celle de Ben Eater. Personnellement, moi j’en raffole des vidéos de Ben Eater, parce qu’ils sont très académiques, bien clairs, et très bien expliquées. Sur la vidéo, il explique l’utilisation du moniteur pour sa propre machine faite maison. 

La programmation d’un émulateur

Étant actuellement un enseignant en architecture des ordinateurs, et un enseignant de programmation et structures de données dans le passé. Je peux sereinement suggérer aux étudiants en informatique, que le meilleur exercice pour maitriser les 2 disciplines est de développer soi-même un émulateur. Alors c’est quoi un émulateur ? L’émulateur par définition est un logiciel qui va reproduire ou répliquer exactement le même comportement d’une machine donnée sur une machine hôte différente. Vous pouvez par exemple émuler une console du type Nintendo sur un PC de bureau. L’émulateur va se comporter exactement comme une console Nintendo le ferait réellement. Vous aurez ainsi l’équivalent d’une console installé sur un PC et vous pourrez jouer à cette console. 

Le fait de programmer un émulateur est très enrichissant pour un étudiant. Ça va premièrement, le faire investir en programmation sur un projet relativement de grande envergure, à la différence des petits exercices et travaux pratiques qu’il a l’habitude de faire dans lequel il doit planifier au préalable et construire une architecture logicielle qu’il doit suivre et soutenir tout au long du projet. Et deuxièmement, il doit bien maîtriser l’architecture de la machine à émuler. Il doit effectivement reproduire en logiciel les composantes hardwares de la machine. Ainsi, il va reconstruire le processeur avec toutes ses instructions et ses caractéristiques, il doit aussi reproduire les mémoires de la machine, le système vidéo, le système de son, les entrées/sorties… etc. Sur la vidéo en bas de la chaîne YouTube Computerphile, un émulateur pour la célèbre machine Atari 2600 est grossièrement décrit par le docteur Steve Bagley.

L’émulateur de machines

Il faut savoir que les consoles de jeux sont principalement les émulateurs les plus connus parmi les émulateurs de toutes les machines. Pour la simple raison que ça va permettre aux utilisateurs de jouer à ces machines sur leurs propres ordinateurs. Malheureusement, ces consoles de jeux sont parmi les machines les plus dures à émuler, en raison de la complexité de leur système graphique. Cependant, pour un étudiant avec un bon niveau en programmation et en architecture des ordinateurs, Il lui est possible de développer des émulateurs jusqu’à la 4e génération des consoles de jeux, même si que pour faire tourner de simple démo ou homebrew, incluant ainsi des consoles comme la Nintendo NES, SNES, Sega Mega Drive, Master System…etc. Ce qu’on appelle les consoles à 16 bits. À partir de la 5e génération, ou les consoles dites 32 bits, ça devient difficile pour un simple étudiant de développer tout seul un émulateur pour une machine de ce type, en raison que ces machines sont devenues beaucoup plus puissantes que les précédentes, principalement à cause de l’intégration de la technologie 3D. On peut compter parmi ces consoles, la Sony Playstation 1, La Sega Saturn, La Nintendo 64. Jusqu’aux dernières générations de consoles. 

Brève introduction à l’électronique

Les bienfaits de l’électricité dans notre vie quotidienne sont énormes et innombrables. Pour beaucoup de monde l’électricité est l’invention la plus marquante pour l’être humain tout au long de son existence. Au tout début de son appréhension par l’humain, ça a été surtout utilisées comme un moyen de transmission d’énergie. Ça permettait, et ça permet jusqu’à nos jours, d’alimenter les systèmes d’éclairage et à être une source d’énergie pour les différents appareils et moteurs se trouvant dans les dispositifs électroménagers, comme les réfrigérateurs ou les machines à laver, ou même les moteurs se trouvant dans les usines et les ateliers d’industrie. Mais plus que ça, et c’est ça ce qui nous intéresse en informatique, l’électricité est utilisée comme un moyen de transmission de l’information. L’exemple le plus concret est sans doute l’internet. Mais aussi à l’intérieur de nos ordinateurs car l’information est transmise sous forme d’impulsion électrique en utilisant les différents circuits électroniques composant l’essentiel du hardware informatique. Et tout ça principalement pour sa simplicité d’utilisation, sa disponibilité, et sa rapidité de transmission. Peut-être un jour la lumière va remplacer l’électricité pour le traitement automatique de l’information, mais pour l’instant la lumière est suffisamment plus difficile à manier en comparaison à l’électricité.

Le courant électrique

La vidéo en haut est celle de la chaîne YouTube Engineering Mindset, est une simple introduction au courant électronique. Le contenu de cette chaîne est excellent pour comprendre comment fonctionnent les circuits électroniques, que normalement tout étudiant en informatique doit au moins maîtriser les bases de cette discipline d’ingénierie magnifique.

Les processeurs RISC vs CISC

Toute personne parcourant l’évolution historique des processeurs à travers le temps, serait sûrement appelée sur une période dans le début des années 80, concernant un débat dans la communauté scientifique et industrielle autour l’évolution des processeurs dans les années à venir. Il y avait pratiquement 2 camps, un camp qui pensait que les avancées en électronique permettraient de créer des processeurs plus évolués et plus capables et que les processeurs devraient être plus complexes et plus riches. Le 2-ième camp n’approuvait pas cette idée, et suggérait que les processeurs devraient rester plus simples, et que la complexité des applications doit être léguer au Software. Après plusieurs débats houleux, il s’est avéré que c’est le 2-ième camp malgré un nombre d’adhérents réduit et un raisonnement semblant contre intuitif, les années à la suite leur ont donné raison.

RISC vs CISC selon David Patterson

Ce 2-ième camp est principalement représenté par les 2 figures bien connu dans le domaine des architectures des ordinateurs, David Patterson et John L. Hennessy, ils sont actuellement désignés comme les parrains de l’architecture des ordinateurs. Ils sont très célèbres dans le domaine académique par leurs 2 livres références Computer Organization and Design et Computer Architecture: A Quantitative Approach. Ils ont eux aussi l’honneur d’avoir le prix équivalant au prix Nobel en informatique qui est le prix Turing en 2017. David Patterson se charge actuellement du développement du très prometteur nouveau processeur open source RISC-V, et John L. Hennessy est bien connu pour être le cofondateur du célèbre processeur MIPS. Sur la vidéo en haut, on a une partie de l’interview de David Patterson par le célèbre académicien Lex Fridman, sur laquelle David Patterson va relater les faits et les événements qui se sont déroulés à cette époque. 

Le moteur de jeu Godot 4.0

Pour un programmeur en quête de créer des jeux vidéo, Il aura à choisir entre plusieurs solutions. La première, est l’utilisation des bibliothèques bas niveau, ou les API, comme par exemple OpenGL, DirectX, ou Vulkan. Malgré que l’utilisation de ces bibliothèques offre une puissance énorme pour le jeu, ils restent rarement utilisés pour ce cas car ils sont très difficiles à utiliser. C’est comme l’assembleur, c’est un langage bas niveau très puissant, mais trop difficile pour être utilisé dans la programmation quotidienne. Ils sont généralement réservés pour des applications plus spécifiques, ou la création de plateformes graphiques ou les moteurs de jeux vidéo.

Le 2-ième choix est les frameworks ou les plateformes. Ils sont généralement vus comme une conglomération de bibliothèques visant à faciliter la programmation des jeux. Ils sont très populaires parmi les développeurs, puisque contrairement aux API, ils offrent une certaine aisance pour l’utilisation directe des fonctions et des routines Intrinsèques aux jeux vidéo. Comme par exemple le dessin direct sur l’écran, le chargement des images et des objets en 3D et des fichiers son, la capture de l’interface utilisateur comme le clavier ou la souris ou la manette, le scrolling, le bit blitting,le clipping, les sprites, le networking…etc. Ça peut Inclure les plateformes comme, SDL, Allegro, PyGame, SFML, ou Raylib.

Godot 4.0 introduction

Et dernièrement, les moteurs de jeux vidéo. Ces derniers sont totalement différents des 2 précédents dans le sens où ils ne tournent pas autour d’un langage de programmation qui va les utiliser comme des bibliothèques comme pour les solutions précédentes. Dans les moteurs de jeu, généralement le langage de programmation est, comme parmi d’autres, un simple outil utilisé pour la création de jeux vidéo. Ainsi le plus souvent les objets créés à l’extérieur du langage de programmation, sont utilisés pas plusieurs outils du moteur. Les outils sont concrètement des petits logiciels de haut niveau destinés à l’implémentation des opérations beaucoup plus complexes que de simples opérations graphiques. Comme par exemple les éditeurs de niveaux, les éditeurs de maps, moteurs physiques, éditeurs d’animation, éditeurs de particules…etc. On peut citer quelques moteurs de jeux les connus comme Godot, Unity, Unreal Engine, ou encore Game Maker. La vidéo en haut est une introduction au moteur Godot, et plus précisément sa nouvelle version 4 qui offre beaucoup d’améliorations par rapport aux versions précédentes.

Le modèle OSI dans l’internet

Internet aujourd’hui est considéré comme un outil banal de communication. Mais sous cette forme de simplicité et de commodité se cache la forme la plus avancée et la plus sophistiquée de télécommunication que l’être humain n’a pu concevoir jusqu’à maintenant. L’internet d’aujourd’hui englobe des milliards de machines et d’appareils étalés sur toute la planète, Ils communiquent entre eux en utilisant des millions de kilomètres de fibre optique, des câbles en cuivre, des liaisons sans fil et satellitaires. Pour pouvoir organiser et structurer la communication dans cette structure hyper complexe et massivement connectée, les ingénieurs en songeaient à utiliser un modèle universel appelé OSI qui va garantir la connectivité, la fiabilité, et la sécurité pour la communication des différents nœuds de ce qu’on appelle aujourd’hui le web ou plus spécifiquement le WWW (World Wide Web).

Modèle OSI

La vidéo suivante de la chaîne ByteByteGo permet d’une manière simplifiée à faire comprendre le fonctionnement du modèle OSI. Le plus important dans la compréhension de ce modèle est de visualiser le processus d’encapsulation de l’information sur plusieurs couches, en sachant que l’idée globale de transmission de l’information sur internet est de découper l’information en plusieurs paquets (processus d’encapsulation), et de les déverser sur internet en les laissant libres de prendre le chemin qui jugent le plus optimal vers leurs destinations. C’est le plus simple moyen que Les ingénieurs ont trouvé pour faire transmettre l’information dans un réseau si complexe et si hétérogène. 

Chaque couche dans le modèle OSI est responsable d’une partie ou d’une fonctionnalité bien précise dans la communication à travers internet. Ainsi, la couche une est responsable d’encoder et de décoder les bits en signaux physiques, que ça soit en impulsions électriques, faisceaux photoniques, ou ondes électromagnétiques. La 2e couche est responsable de la communication point à point entre 2 nœuds sur le même médium physique de communication, que ça soit fil électrique, fibre optique, ou ondes radio. La 3e couche est responsable de la transmission des paquets d’un réseau à l’autre parcourant les réseaux hétérogènes à la recherche de la destination. La 4e couche est responsable de la reconstruction de l’ensemble du flux d’informations initial, à partir des paquets transmis. La 5e et la 6e et la 7e couche sont le plus souvent amalgamées pour représenter la partie lorsque 2 applications entrent en communication en utilisant un protocole bien précis, comme HTTP, FTP, SMTP…etc. 

10 compétences à maitriser par un informaticien

Tout au long de sa carrière, l’informaticien aurait besoin d’apprendre plusieurs compétences. C’est dans la plupart des cas des compétences qu’aurait à utiliser presque au quotidien. Ils ne sont pas totalement obligatoires mais il serait pour lui difficile de les contourner.

1. L’algorithmique et structure de données : cette partie concerne beaucoup plus les développeurs, mais la compréhension de comment un ordinateur fonctionne est indispensable. Il faut se rappeler qu’un ordinateur est une machine comme une autre, sa particularité est de traiter l’information à la place de la matière comme les autres machines. Ainsi les structures de données permettent la compréhension de l’organisation de l’information. Et l’algorithmique, la manière dont les données sont traitées par la machine. 

2. Le hardware et matériel physique : dans cette partie l’informaticien doit avoir une perception globale de la composition physique hardware d’un ordinateur. Entre autres, les composantes essentielles d’un ordinateur, comme par exemple, le processeur, la RAM, le disque dur, la carte mère, la carte graphique…etc. De comprendre leurs caractéristiques et de pouvoir les remplacer et changer leurs paramètres. 

3. Les outils de bureautique : ou autrement appelés, les outils office en référence à Microsoft Office. C’est généralement les outils qui vous permettent d’écrire et formater du texte et de l’imprimer avec Microsoft Word par exemple. De remplir des tableaux avec des fonctions basiques de statistiques et de diagrammes avec Microsoft Excel. De préparer des présentations pour les exposer dans des réunions avec Microsoft PowerPoint. Ou rédiger des rapports techniques bien structuré avec Latex.

4. Langages de programmation : Cette partie aussi concerne principalement les développeurs, mais généralement un informaticien aurait au moins à maîtriser un ou deux langages de programmation. Pour la maîtrise totale d’un langage de programmation, beaucoup de temps et d’expérience sont nécessaires. Appréhendé de fond en comble un langage de programmation est relativement difficile. 

5. Linux : Linux n’est pas un système d’exploitation comme les autres, on peut dire qu’il est spécifique et bien taillé aux informaticiens. Contrairement à Windows qui est un système d’exploitation grand public, Linux est plus technique. Il permet à son utilisateur aguerri de faire ce qu’il veut avec ce système d’exploitation. Il peut le modifier comme il lui semble, dans le sens où il peut changer la structure interne du système pour s’adapter au hardware et au besoin de l’application. Il est aussi très adapté au processus intrinsèque à l’administration et le contrôle des machines, comme l’automatisation, la sauvegarde et le backup, la sécurité, le monitoring…etc.

6. Le Web : savoir utiliser le web comme un simple utilisateur. Et surtout reconnaître les bases de fonctionnement du web, comme les protocoles (html, http, ftp, ssl, tls…etc). Les serveurs (serveur web, serveurs de base de données, serveurs d’authentification, serveurs de clés de chiffrement…etc.). Les langages de programmation (html, css, php, javascript, ruby…etc.). La pile de développement des applications web avec ses 2 parties principales le front-end et le back-end. Les API et les services web…etc. 

7. Les réseaux informatiques : comprendre le fonctionnement d’un réseau informatique et aussi très importante pour l’informaticien. Comprendre les bases sur le fonctionnement d’un réseau que ça soit filaire ou sans fil. Que ça soit un simple réseau local à la maison, ou un réseau plus grand envergure englobant toute une entreprise. Reconnaître les protocoles utilisés et le processus de l’encapsulation de l’information à travers les couches OSI…etc. 

8. La sécurité informatique : dans un monde presque entièrement digitalisé l’information fait face à plusieurs menaces, dont le vol, la substitution, la corruption, la destruction…etc. Ainsi, il devient indispensable pour un informaticien de savoir protéger l’information, c’est comme installer des systèmes de sécurité dans sa maison. Dans ce domaine l’informaticien doit savoir comment sécuriser ses machines et son réseau, comment créer des mots de passe robustes, ne pas tomber dans les pièges des pirates, reconnaître les liens ou les emails ou les messages à risque…etc. 

9. L’administration des serveurs et le cloud : savoir contrôler les serveurs ou des machines distantes fait aussi partie des compétences inhérentes à un informaticien. Dans ce cas de figure, les machines sont souvent assez puissantes, ce sont généralement des serveurs à plusieurs milliers de kilomètres de distance. Qui sont uniquement accessibles par la voie du réseau, ce qui rend leur utilisation particulière et différente d’un simple PC. Le cloud c’est pratiquement la même chose mais au lieu de contrôler des serveurs vous aurez à contrôler tout un système logiciel et matériel interconnecté, ce qui rend le processus encore plus complexe.

10. Les outils de communication et les réseaux sociaux : pour les outils de communication il y en a du plus simple comme les emails et les logiciels de messagerie instantanée (Skype, Messenger, WhatsApp ou Viber), au plus sophistiqués comme Discord et mIRC. Les réseaux sociaux de l’autre côté sont à double tranchant, ils peuvent être néfastes par leurs addictions et le bafouillage des meurs et de la vie privée. Et de l’autre côté, le plus simple moyen actuel de s’ouvrir au monde et d’accéder à des milliers voire des millions de personnes. 

On a pu voir sur ces points quelques connaissances indispensables pour un informaticien tout au long de sa vie professionnelle. On pourrait aussi rajouter la maîtrise des outils de l’intelligence artificielle, néanmoins ça reste un domaine assez récent et pas encore mature. Dans tous les cas, il faut savoir que les connaissances de l’informaticien ne se résument pas à ces quelques points, à vrai dire, tout au long de sa carrière l’informaticien ne va pas cesser d’apprendre. 

Podcast du fondateur d’OpenAI et la création de ChatGPT

Tout le monde ces temps-ci parle de ChatGPT, c’est l’intelligence artificielle (IA) qui fait actuellement couler beaucoup d’encre et qui sollicite l’intrigue et la curiosité de beaucoup de monde, que çà soit dans le monde de la technologie ou des personnes lambda. Et franchement il y en a de quoi, j’ai personnellement pu tester cette intelligence et sincèrement ça m’a bluffé. C’est la première fois où personnellement je peux communiquer avec une intelligence artificielle sans avoir l’impression que c’est une machine. ChatGPT arrive aisément à comprendre la pensée humaine, j’ai même essayé de lui formuler des requêtes un peu obscures et difficiles à comprendre, qu’elle a réussi à déchiffrer facilement. On arrive aisément à construire un dialogue constant, claire, et soutenu comme si vous discutez avec un humain normal. 

Podcast avec le CEO de la firme créatrice de ChatGPT

Pour beaucoup, c’est la première fois qu’une IA atteint ce niveau avancé d’intelligence. Il y a même certains chercheurs qui la qualifient d’enfant AGI, l’AGI étant une intelligence totalement indépendante avec sa propre conscience et son libre arbitre. Bien sûr tout cela fait peur, on ne s’attendait pas à de tels progrès en si peu de temps. D’après l’intelligence elle-même beaucoup de professions pourrait facilement être remplacé par l’intelligence artificielle, comme le métier d’enseignant, avocat, comptable, médecin…etc. 

Vous pourrez vous-même facilement tester cette intelligence si vous le souhaitez. À mon avis le moyen le plus simple de le faire et d’utiliser le moteur de recherche Bing et le navigateur Edge de Microsoft, vous aurez la possibilité d’engager une conversation avec le bot Bing, qui représente selon Microsoft une variante de ChatGPT 4, la version la plus récente. Vous pourrez même aussi tester une autre intelligence artificielle pour générer des images d’une façon automatique à partir de texte, appeler DALL-E conçu aussi par OpenAI. Il faut savoir qu’il y a un partenariat entre Microsoft et OpenAI, les créateurs de ChatGPT, ce qui permet à Microsoft d’utiliser leurs produits. À la base OpenAI était une firme lancée par Elon Musk en personne pour contrer le monopole de Google sur le domaine de l’intelligence artificielle avec son intelligence DeepMind. Sur la vidéo en haut Le CEO OpenAI Sam Altman s’exprime sur le podcast de Lex Fridman sur les produits de OpenAI en exposant les grands dilemmes de l’intelligence artificielle sur l’humanité et les implications importantes qu’elle apporterait aux humains au futur probablement proche.