J’avais besoin, pour le robot, d’une classe permettant de générer des logs. Le problème est qu’elle doit être disponible dans toutes les autres classes dans n’importe quel contexte (sans avoir recours à une variable globale). Là intervient le design pattern Singleton :
require 'logger'
require 'singleton'
class Logger
include Singleton
@@old_initialize = Logger.instance_method :initialize
def initialize
@@old_initialize.bind(self).call(STDERR)
end
end
Logger est une classe founie par défaut avec Ruby, il suffit juste d’inclure Singleton. Ainsi partout dans le code, on pourra faire, après avoir inclus cette classe :
log = Logger.instance
log.level = Logger::WARN
log.debug("Created logger")
log.info("Program started")
log.warn("Nothing to do!")
Note : « @@old_initialize.bind(self).call(STDERR) » permet d’utiliser le constructeur original.


Coupe de France de Robotique
INTech a fini 9ème du classement général avec un peu plus de 4 000 points.
Quelques photos,
Le robot est codé en Ruby (~5000 lignes), les cartes électroniques sont à base d’Arduino. Le pathfinding utilise l’algorithme de Dijkstra. Il n’a jamais réussi en match à effectuer la séquence initialement prévue.. On y travaille encore ! Coté mécanique, il est doté de 2 bras pour attraper les oranges et d’un rouleau pour aspirer les tomates. Il peut contenir jusqu’à 6 éléments de jeu (4 oranges + 2 tomates = 1500 points).
Prochain rendez-vous, la Coupe d’Ile de France
PS : ARM ? Milkymist ? Et si on changeait l’année prochaine ?