mrqqn.net

Aller au contenu | Aller au menu | Aller à la recherche

Sous-catégories

mardi 21 mai 2013

Outil de décryptage

La semaine dernière j'ai acheté le comic d'Adventure Time et à l'intérieur il y avait 2 messages codés dans un alphabet étrange.

Je fait la liste des caractères, il y en a 26 différents : ça a tout l'air d'être une simple transposition d'alphabet. J'assigne donc à chaque caractère une lettre au pif afin de pouvoir écrire le texte sur ordinateur. Le challenge maintenant est de transposer cet alphabet vers un autre pour donner un sens au message.

  1. Technique 1 : faire du brute-force par dictionnaire, mais ça va foirer s'il y a des noms propres et je n'ai aucune idée si message a été traduit ou pas, ce qui voudrait dire brute-force soit anglais soit français. Bref, ça aurait pris une plombe.
  2. Technique 2 : chercher des mots spécifiques manuellement et affiner le résultat au fur et à mesure.

J'ai donc fait un outil qui trouve les différentes transpositions possibles de l'alphabet afin de trouver des mots spécifiques dans le message codé. L'algorithme utilisé est tout simplement un genre d'adaptation du parcours d'arbre.

Le plus dur est d'abord de trouver le premier mot ou la première séquence de mots (heureusement qu'il y avait un indice). Et une fois trouvé le reste est tout simplement de la déduction et une bonne dose d'essais. :)

L'outil est ici : http://mrqqn.net/decypher/

Pour ceux qui veulent essayer, le message codé était :

amobwozegirkezmepexxzarpwgkrimtmquezzwm-kfijmxetm
eu'ztejmuraflmfdiemtcorwstrpez
fxpfozcrpturifgpeuaorw-kfijmxetm

mardi 12 février 2013

Ouverture des sources

J'avais ouverts les dépôts il y a moment, mais je n'avais jamais diffusé les liens. Donc tant que j'y pense, voici les sources de 2 de mes anciens projets :

  1. Koto : https://bitbucket.org/mr_qqn/koto (Scala)
  2. Yokai's Song : https://bitbucket.org/mr_qqn/yokai-... (Haxe)

Et en bonus, une implémentation de parseur de fichiers SDL pour Haxe : https://bitbucket.org/mr_qqn/hxsdl. C'était un test pour faire du parsing en mode "fonctionnel", mais les performances sont catastrophiques.

J'ouvrirai les sources du moteur que je suis en train de développer une fois qu'il sera un peu plus avancé et stable, et qu'il sera bien détaché du jeu, même si je doute de son utilité à côté de libGDX.

mardi 8 février 2011

Arguments implicites en scala

Le langage scala (que j'utilise pour développer Koto) propose quelques nouvelles fonctionnalités plutôt intéressantes que n'ont pas les langages objet "classiques" et entre autres les arguments implicites.

Un argument implicite est un argument qui n'est pas obligé d'être spécifié dans l'appel de la méthode et qui va à la place être recherché dans le scope de la méthode appelante. Ca peut paraitre pour une fonctionnalité crade, et utilisé à mauvais escient ca peut donner un code totalement incompréhensible, mais ça peut aussi le rendre plus lisible. L'utilité que j'en ai fait pour l'instant est pour implémenter l'agrégation d'objets.

J'ai une classe Program (un shader opengl) et contenant plusieurs Uniform (les paramètres du shader).

Sans arguments implicites, je spécifie l'instance de Program à utiliser pour chaque Uniform :

class Program 

class Uniform(val name: String, val program: Program)

object ShaderTexture extends Program {
  val texture = new Uniform("texture", this)
}

Etant donné que les uniforms ne seront initialisé qu'à l'intérieur d'un programme et qu'ils seront liés à ce même programme, autant simplifier leur initialisation en rendant l'argument programme implicite. :

class Program {
  // chaque sous classe de Program aura automatiquement 
  // une valeur implicite de type Program
  protected implicit val _me = this
} 

class Uniform(val name: String)(implicit val program: Program)

object ShaderTexture extends Program {
  // Le constructeur de Uniform cherche une variable de type Program
  // dans le scope courant : _me
  val texture = new Uniform("texture")
}

De cette manière l'initialisation des Uniform est légèrement simplifiée en n'étant plus obligé de mettre le paramètre redondant this.

Ici l'intérêt des implicits est un peu limité, mais ce n'est qu'une utilisation parmi d'autres et je ne voulais parler que d'utilisations que je rencontre actuellement.