Jeu en ligne multijoueurs basé sur le célèbre Dynablaster. React coté navigateur avec Nodejs coté serveur.
mardi 10 octobre 2023
Un petit jeu Pong multijoueurs tournant sur un serveur Nodejs. L'espace de jeu s'agrandit au fur et à mesure que les utilisateurs se connectent.
jeudi 9 juin 2022
Petit script Python pour flouter les visages sur une photo.
Le programme utilise la librairie mtcnn pour la détection.
Entrez l'URL d'une image dans le champ dédié.
Le notebook Jupyter.
lundi 9 novembre 2020
Une rivière, une barge ne pouvant contenir que 2 individus maximum.
Sur la rive droite, 3 humains et 3 orques.
Le but, que les 3 humains traversent sur la rive gauche sachant qu'ils ne doivent jamais être en infériorité numérique par rapport aux orques.
Le programme écrit en Python :
import random from copy import copy """Modèle""" class JeuDeJose: def __init__(self): self.coups = [] self.rive_gauche = [] self.rive_droite = ['humain', 'humain', 'humain', 'orque', 'orque', 'orque'] self.barge = 'droite' self._nombre_tentatives_max = 100 self._nombre_tentatives = 1 def __str__(self): chaine = str(len(self.coups) - 1) + " coups\n" for coup in self.coups: chaine += "Traverse vers " + str(coup[0]) + " --------> " + str(coup[1]) + "\n" return chaine def _nombre(self, categorie, rive): return rive.count(categorie) def equipage_disponible(self, equipage, rive): copie_rive = copy(rive) for membre in equipage: try: copie_rive.remove(membre) except: return False return True def _test_viabilite(self, rive): if self._nombre('humain', rive) > 0: return self._nombre('orque', rive) <= self._nombre('humain', rive) else: return True def _a_gagne(self): return self._nombre('humain', self.rive_gauche) == 3 def _transfert_vers(self, rive1, rive2, equipage): for membre in equipage: try: rive1.remove(membre) rive2.append(membre) except: pass def traverse_vers(self, rive1, rive2, equipage): copie_rive1 = copy(rive1) copie_rive2 = copy(rive2) self._transfert_vers(copie_rive1, copie_rive2, equipage) if self._test_viabilite(copie_rive1) and self._test_viabilite(copie_rive2): self._transfert_vers(rive1, rive2, equipage) if self.barge == 'gauche': self.barge = 'droite' else: self.barge = 'gauche' self.coups.append(((self.barge, equipage), (copy(self.rive_gauche), copy(self.rive_droite)))) self._nombre_tentatives += 1 def strategie(self): if random.choice([1, 2]) == 1: equipage = [random.choice(['humain', 'orque'])] else: equipage = [random.choice(['humain', 'orque']), random.choice(['humain', 'orque'])] if self.barge == 'droite': if self.equipage_disponible(equipage, self.rive_droite): self.traverse_vers(self.rive_droite, self.rive_gauche, equipage) else: if self.equipage_disponible(equipage, self.rive_gauche): self.traverse_vers(self.rive_gauche, self.rive_droite, equipage) def run(self): self.coups = [((), ([], ['humain', 'humain', 'humain', 'orque', 'orque', 'orque']))] while not(self._a_gagne()) and self._nombre_tentatives < self._nombre_tentatives_max: self.strategie() """Calcul""" random.seed(1) nombre_tentatives_max = 1000 meilleur_jeu = JeuDeJose() meilleur_jeu.run() nombre_tentatives = 1 while nombre_tentatives < nombre_tentatives_max: j = JeuDeJose() j.run() if len(j.coups) < len(meilleur_jeu.coups): meilleur_jeu = j nombre_tentatives += 1 print(meilleur_jeu)
lundi 26 octobre 2020
Un petit programme Windows maison écrit
en
Windev 19 pour faire défiler une image sur autant d'écrans que l'on veut. Pour cela il
suffit de
copier le programme dans un dossier partagé et lancer l'exécutable depuis les différents
postes
dans l'ordre où l'on souhaite voir défiler l'image. Enjoy !
vendredi 3 janvier 2020
AngularJs est un framework javascript
pour
développer des applications Web, en l'ocurrence des SPA (Single Page Application). Les sites
Web
conçut avec Angular ne contiennent qu'une seule page.
D'ordinaire, un site renvoie au travers du serveur différentes pages HTML en fonction des
demandes du client, le navigateur. Avec Angular, la démarche est différente, la page fournit
par
le serveur contient déjà la logique du site. Le rôle du serveur se limite alors à fournir
les
données à l'application chargée dans le navigateur.
Cette technologie est devenue possible depuis l'optimisation des moteurs d'exécution
javascript
dans les navigateurs. Dans une application Angular, c'est donc principalement le client qui
travaille.
Pour cela, Angular offre un modèle de développement orienté MVC (modèle-vue-contrôleur),
c'est à
dire que les données, leur affichage et leur traitement sont codées de manière séparés.
Avec ces techniques, on peut se rapprocher des applications traditionnelles dites riches, à
la
différence qu'elle s'exécute dans un navigateur Web et donc à priori partout.
Voici un exemple maison qui m'a permis de me faire la main avec cette techno. Cette
application
présente des radiographies numériques effectuées sur des pièces de fonderie. Les photos de
pièces ont été remplacées par des photos quelconques par souci de confidentialité, et pour
les
mêmes raisons, les radios ont été floutées :
Défauthèque
Le code source est disponible sur Github
Pour cet exemple, afin d'établir la liaison entre l'application cliente AngularJs et la base de données MySql sur le serveur, j'ai utilisé l'api php-crud-api. Simple et efficace, je remercie les auteurs. Celle-ci permet de créer un service Web de type REST afin de communiquer avec la base de données. Ainsi la requête GET api.php/alliage renvoie sous forme de tableau javascript les lignes de la table "alliage" de la base de données.
dimanche 12 février 2017
Voici un petit lecteur audio multipistes avec visualisation du spectre. Il fonctionne en HTML5 et comprend les fonctions lecture aléatoire, pause, morceau précédent, suivant, boucle, volume... Bref idéal pour ce site.
Je me suis inspiré des travaux de Arun Kumar Sekar pour la partie lecteur, et de Wayou Liu pour l'afficheur spectral. Le lecteur complet est téléchargeable ici : player-audio-visualizer.zip.
dimanche 1er mai 2016
Intelligence artificielle conversationnelle d'OpenAI
Exemple de conversation avec ChatGPT
vendredi 2 décembre 2022
Thibault Neveu nous explique les concepts et type d'apprentissage en jeu dans cette intelligence artificielle
Une vidéo très instructive pour appréhender l'apprentissage automatique à travers l'outil dédié TensorFlow. Le code source est ouvert, interfaçable en langage Python. A vos claviers !
Tensorflow et l'apprentissage profond, sans les équations différentielles (Martin Görner)
vendredi 29 juin 2018
Le 5 décembre 2017, l'équipe de DeepMind publie un article dans laquelle elle explique avoir créé une intelligence artificielle capable de battre le meilleur programme de jeu d'échecs actuel. Son nom, AlphaZero. La particularité, les règles du jeux définies, la machine a appris à jouer toute seule contre elle-même en s'améliorant au fil des parties.
décembre 2017
En octobre 2015, AlphaGo conçut par la société DeepMind fait le "buzz" en devenant le premier logiciel d'IA
à gagner au jeu de Go contre un joueur professionnel. Pourtant ce jeu nécessite
d'autres facultés que la "simple" exploration des combinaisons de solutions.
Pour ce faire, le programme utilise la
méthode de Monte-Carlo (méthode probabiliste, utilisée notamment pour les
recherches sur la fabrication de la bombe atomique) et
deux réseaux
de neurones profonds. Ces derniers sont une avancée technologique majeure car ils
permettent la modélisation de données abstraites et la faculté d'auto apprentissage.
Le domaine de l'IA est de ce fait en plein essor. La reconnaissance vocale,
faciale, les prédictions financières sont autant de domaines qui motivent la
recherche sur ces nouvelles technologies. L'évolution est telle que le célèbre
physicien
Stephen Hawking
s'inquiète : « L'intelligence artificielle pourrait
mettre fin à l'humanité ».
Pour ma part, en tant que passionné d'informatique, de nouveaux territoires à
explorer... Le robot Atlas de Boston Dynamics préfigure peut-être cette
révolution :
samedi 27 février 2016
C'est en arpentant cette rue improbable de la capitale que je découvrais le
Monde en Tique, petite librairie informatique où j'allais sans le savoir
rencontrer la passion. Je ne suis pas particulièrement croyant, mais est-ce
l'atmosphère quasi spirituelle du lieu, ce que je découvris ici allait
m'élever dans la quête d'absolu. Feuilletant un livre de programmation je lu ceci :
(require srfi/41)
(define (flot-nb-entiers-a-partir-de n)
(stream-cons n (flot-nb-entiers-a-partir-de (+ n 1))))
(define (non-divisible-par? k)
(lambda (n) (not (zero? (remainder n k)))))
(define (crible flot)
(stream-cons (stream-car flot)
(crible (stream-filter
(non-divisible-par? (stream-car flot))
(stream-cdr flot)))))
(define flot-nb-premiers (crible (flot-nb-entiers-a-partir-de 2)))
(stream->list 5000 flot-nb-premiers)
Après enquête, il s'avère que cette
langue mystérieuse s'appelle Scheme,
un dialecte de Lisp. Ce passage où fleurissent parenthèses et autres
curiosités syntaxiques pourrait s'écrire en français :
en
utilisant la librairie des listes infinies (flots)
definir
flot-nb-entiers-a-partir-de n comme l'association de n avec
flot-nb-entiers-a-partir-de
n+1
definir le predicat non-divisible-par?
definir la fonction crible qui
construit un flot constitue de chacun de ces entiers restant apres
avoir supprime les multiples des entiers inferieurs
on obtient le flot des nombres premiers
en partant de n >= 2
on affiche les 5000 premiers nombres premiers
C'est en fait une traduction du crible d'Eratosthène
pour énumérer les nombres premiers.
Vous vous demandez peut-être ce qui a pu retenir mon attention. Si vous vous
penchez sur la ligne :
"définir flot-nb-entiers-a-partir-de n comme l'association de n avec flot-nb-entiers-a-partir-de n+1"
Vous entreverrez peut-être une fenêtre sur l'infini.
Quand je suis sorti, la lumière d'une fin d'hiver se faufilait dans la rue Maître Albert, pourtant étroite. J'ai voulu crier ma découverte, la proférer aux âmes errantes de la capitale. Les mots se sont tus à peine germés, les passants de ce samedi ne semblant pas particulièrement réceptifs. Il y a des joies solitaires, celle-ci m'éclaire, une question me vient : et si notre créateur parlait Scheme ? Aurait-t-il préparé ce qu'il allait advenir à l'univers dans des petits carnets griffonnés de parenthèses et de fonctions récursives ?
Depuis ce jour, ma bibliothèque se peuple de traités sur la programmation fonctionnelle, la récursivité, la logique propositionnelle. Cette langue est d'une pureté, d'une élégance et d'une puissance qui dépasse de loin ce que ma culture impérative me laissait imaginer. Où va-t-elle maintenant m'emmener ?
Je remercie les créateurs Gerald Jay Sussman et Guy L. Steele pour m'inviter à prendre le large à bord de leur bateau étrange. Le pavillon est hissé, le symbole lambda flotte dans le vent. Que vogue notre imagination en quête de paysages symboliques exotiques. L'horizon reste à inventer. Dans mon carnet de voyage, à la première page, j'ai recopié ce poème de Shriram Krishnamurthi :
((I m a g i n e) (shriram@cs.rice.edu) (((Imagine there's no FORTRAN) (It's easy if you try) (No SML below us) (Above us only Y) (Imagine all the people) (Living for their Chez)) ((Imagine there's no memory leaks) (It isn't hard to do) (Nothing to malloc(3) or free(3) for) (And no (void *) too) (Imagine all the people) (Living in parentheses)) ((You may say I'm a Schemer) (But I'm not the only one) (I hope someday you'll join us) (And the world will be as (lambda (f) (lambda (x) (f x))))) ((Imagine those continuations) (I wonder if you can) (No need for C or pointers) (A brotherhood of Dan) (Imagine all the people) (GCing all the world)) ((You may say I'm a Schemer) (But I'm not the only one) (I hope someday you'll join us) (And the world will be as (lambda (f) (lambda (x) (f x))))))) 'shriram
Après plusieurs mois de navigation au large, porté par un souffle nouveau, grisé par l'ivresse de la découverte, j'aperçu une île. Situé dans l'océan Informatique, l'archipel des Achetehemelles est immense. On ne cesse de recenser de nouveaux sites, autant d'îlots de données à explorer. Je m'apprêtais donc à accoster, émerveillé par les couleurs du lagon, l'atmosphère paradisiaque de ce petit bout de terre et intrigué par ce panneau érigé sur la plage . Cette île s'appelle Hop. Elle est peuplée d'une poignée de chercheurs s'intéressant à la programmation diffuse. Et oui, on est bien loin du continent désormais. Lorsque j'amarrai le bateau, je fus surpris par la taille du port en proportion de la faible superficie de l'île. J'appris plus tard le rôle majeur que constituait les communications au sein des systèmes diffus. Aussi, les voyageurs qui transitent dans cette région parlent tous un dialecte du Scheme, appelé Hop comme cette île. Les premiers mots que j'appris pour dire bonjour :
(define-service (hello/world)
(<HTML>
(<BODY>
"Hello World!")))
(define (say-hello)
(<HTML>
(<BODY>
(<A> :href "/hop/hello/world" "click
me"))))
(define-service (hello)
(say-hello))
(say-hello)
Voici les explications dispensées par une des plus éminentes personnalités insulaire :
Expériences
Intrigué par les possibilités de ce nouveau langage et surtout son approche originale de la programmation web, je fus bien sur tenté par quelques expérimentations...
En levant les yeux vers le ciel, je découvrais bientôt une autre implémentation de Scheme pour le web. WeScheme s'exécute quelque part dans les nuages (les spécialistes parlent de cloud computing). Impossible de résister à un premier vol.
De retour
sur terre, je vous invite dans l'espace lambda
où
je m'amuse à concocter des programmes en langage Racket, dialecte de
Scheme, implémentation pour le moins géniale.
hop - wescheme - racket - e^(i.pi)+1=0
page 20