01101


Metablaster

Jeu en ligne multijoueurs basé sur le célèbre Dynablaster. React coté navigateur avec Nodejs coté serveur.


mardi 10 octobre 2023


Metapong

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


Floutage de visages

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


Le jeu de José

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


Scroll Screens

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


Angular

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

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


Lecteur audio HTML5

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


ChatGPT

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

TensorFlow, le deep learning à portée de main

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


DeepMind récidive

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


Intelligence artificielle, une nouvelle étape ?

Le jeu de Go

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


Découverte au Monde en Tique

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.



Île en vue

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 HOP. 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...


Dans les nuages

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.