GTK+ en Haskell

Bonjour,

M'étant mis à Haskell depuis quelques temps (principalement grâce au désormais fameux Real World Haskell), je me suis dis qu'il était temps que je regarde un peu du côté des bibliothèques pour interfaces utilisateurs. Hé bien, je n'ai pas été déçu. Il y a notamment Gtk2Hs qui fournit un bon binding de GTK+, compatible avec Glade (le designer) et qui permet donc de charger des interfaces depuis du XML.

Gtk2Hs en action

Read the rest of this entry »

, , ,

3 022 Comments

Robot wifi terminé

Voici deux nouvelles vidéos de notre projet de robot wifi que nous venons de terminer. On peut encore l'améliorer, mais avons atteint notre but initial et développé toutes les fonctionnalités que nous souhaitions implémenter :)
Vous pouvez retrouver plus d'info sur notre robot sur mon site.

5 407 Comments

Challenge Tower Bloxx

Certains d'entre vous connaissent probablement le jeu Tower Bloxx sur téléphone portable. Pour résumer, le jeu consiste à construire une petite agglomération en plaçant des immeubles sur une grille carrée de taille n x n. Chaque immeuble est créé en empilant un à un les étages à l'aide d'une grue qui balance d'un bout à l'autre de l'écran. A chaque fois qu'un étage est ajouté, des habitants viennent peupler l'immeuble. Plus les étages sont alignés, plus l'immeuble abrite d'habitants et moins l'immeuble balance pour placer de nouveaux étages. Il existe plusieurs types d'immeubles (m), avec un nombre de points et une population croissants : résidentiel (bleu), commercial (rouge), industriel (vert) et hôtel de luxe (jaune). Les règles de placement des immeubles sont les suivantes :

  • Un immeuble bleu peut être placé partout.
  • Un immeuble rouge doit posséder au moins un immeuble bleu dans son voisinage.
  • Un immeuble vert doit posséder au moins un immeuble bleu et rouge dans son voisinage.
  • Un immeuble jaune doit posséder au moins un immeuble bleu, rouge et vert dans son voisinage.

On considère ici un voisinage en 4-connexités. Dans le jeu original, il est possible de détruire des tours voisines afin de placer davantage de tours de plus grande importance (loophole). Dans un souci de simplicité, j'ignore ici cette possibilité. L'image ci-dessous donne un exemple d'agglomération qui respecte les règles énoncées précédemment.

Exemple d'agglomération

Exemple d'agglomération

Read the rest of this entry »

, , ,

2 616 Comments

Détournement de Nabaztag et reverse engineering

Nabaztag

Nabaztag

J'ai reçu à Noël dernier une jolie petite bestiole. Un bon gadget de geek :) Le Nabaztag.

Très bonne idée à la base, le concept est intéressant, c'est typiquement le genre de truc qui m'intéresse. Sauf ... que ce Nabaztag est finalement un peu trop inutile à mon goût et surtout bien trop contrôlé par la société qui le vend, à savoir la société Violet. Déjà, qu'est-ce que cette petite bestiole ? Il s'agit en fait d'un terminal connecté à Internet en wifi par lui même et qui peut interagir à la fois avec du contenu sur Internet et avec l'utilisateur. Il est alors possible de lire la météo, suivre ses emails, écouter la radio, écouter des podcast, lire des flux en streaming, suivre des flux RSS, etc. Notre ami lapin clignote de partout et bouge les oreilles dans tous les sens et peut même lire des puces RFID. Bref une bonne idée dans l'absolu, mais finalement ce lapin m'a plus énervé que servi pour l'instant. J'écoute beaucoup de webradio sur Internet, on peut charger des radios sans problème ... sauf que notre ami lapin lit comme un abruti les trames METADATA (titres des musiques entre autres) des flux http des radios. Du coup on a droit à des gros parasites aléatoires dans la musique, parce que le lapin essaye de faire lire du texte au lieu du flux mp3... ahah bien joué !

Read the rest of this entry »

, , , , ,

4 450 Comments

Récupération et parsing d'un flux Atom XML en Haskell

Bonsoir,

Il y a peu, on m'a demandé d'écrire un programme qui récupère un flux Atom XML et qui ne récupère que le titre et l'url des éléments (qui en l'occurence sont des billets aggrégés sur Planet OCaml).

J'ai hésité entre OCaml, C++ et Haskell. Plutôt tenté par du fonctionnel, mon choix s'est vite porté sur Haskell grâce au nombre impressionnant de paquets présents sur Hackage.
J'ai donc opté pour le paquet feed pour la gestion d'Atom et download pour la récupération du XML distant, qui se situe ici).

Haskell Logo

Haskell Logo

Read the rest of this entry »

, , , ,

3 501 Comments

OCaml et la 3D : CamlGL & LablGL

Bonsoir,

Comme demandé récemment par l'un des membres, il est tout à fait possible de faire de la 3D avec OpenGL en OCaml. Il y a principalement 2 bindings.

Exemple d'utilisation de GlCaml

Exemple d'utilisation de GlCaml


Inutile de commencer à donner un cours sur OpenGL, la plupart d'entre vous connaissant déjà, qui plus est il y a tout le nécessaire pour OpenGL en C & C++. Ces deux bibliothèques OCaml ne sont que des bindings, c'est à dire qu'elles appellent les fonctions C classiques en interfaçant par le biais de fonctions OCaml.

Juste pour vous donner une idée, voici un extrait du code correspondant au screenshot ci-dessus. Il s'agissait ici de montrer que ça existe, à quoi ça ressemble et où trouver le nécessaire pour s'y mettre.

let draw_gl_scene () =
    glClear  (gl_color_buffer_bit lor gl_depth_buffer_bit) ;		 (* Clear The Screen And The Depth Buffer *)
    glLoadIdentity  () ;				 (* Reset The View*)
 
    glTranslatef 0.0 0.0 !z ;                   (* move z units out from the screen. *)
 
    glRotatef !xrot 1.0 0.0 0.0 ;		 (* Rotate On The X Axis *)
    glRotatef !yrot 0.0 1.0 0.0 ;		 (* Rotate On The Y Axis *)
 
    glBindTexture gl_texture_2d  texture.(!filter) ;    (* choose the texture to use. *)
 
    glBegin gl_quads ;		                 (* begin drawing a cube *)
 
     (* Front Face  note that the texture's corners have to match the quad's corners  *)
    glNormal3f  0.0  0.0  1.0 ;                               (* front face points out of the screen on z. *)
    glTexCoord2f 0.0  0.0 ; glVertex3f (-.1.0)  (-.1.0)   1.0 ;	 (* Bottom Left Of The Texture and Quad *)
    glTexCoord2f 1.0  0.0 ; glVertex3f  1.0  (-.1.0)   1.0 ;	 (* Bottom Right Of The Texture and Quad *)
    glTexCoord2f 1.0  1.0 ; glVertex3f  1.0   1.0   1.0 ;	 (* Top Right Of The Texture and Quad *)
    glTexCoord2f 0.0  1.0 ; glVertex3f (-.1.0)   1.0   1.0 ;	 (* Top Left Of The Texture and Quad *)
 
     (* Back Face *)
    glNormal3f  0.0  0.0 (-.1.0) ;                               (* back face points into the screen on z. *)
    glTexCoord2f 1.0  0.0 ; glVertex3f (-.1.0)  (-.1.0)  (-.1.0) ;	 (* Bottom Right Of The Texture and Quad *)
    glTexCoord2f 1.0  1.0 ; glVertex3f (-.1.0)   1.0  (-.1.0) ;	 (* Top Right Of The Texture and Quad *)
    glTexCoord2f 0.0  1.0 ; glVertex3f  1.0   1.0  (-.1.0) ;	 (* Top Left Of The Texture and Quad *)
    glTexCoord2f 0.0  0.0 ; glVertex3f  1.0  (-.1.0)  (-.1.0) ;	 (* Bottom Left Of The Texture and Quad *)
 
     (* Top Face *)
    glNormal3f  0.0  1.0  0.0 ;                               (* top face points up on y. *)
    glTexCoord2f 0.0  1.0 ; glVertex3f (-.1.0)   1.0  (-.1.0) ;	 (* Top Left Of The Texture and Quad *)
    glTexCoord2f 0.0  0.0 ; glVertex3f (-.1.0)   1.0   1.0 ;	 (* Bottom Left Of The Texture and Quad *)
    glTexCoord2f 1.0  0.0 ; glVertex3f  1.0   1.0   1.0 ;	 (* Bottom Right Of The Texture and Quad *)
    glTexCoord2f 1.0  1.0 ; glVertex3f  1.0   1.0  (-.1.0) ;	 (* Top Right Of The Texture and Quad *)
 
     (* Bottom Face   *)     
    glNormal3f  0.0  (-.1.0)  0.0 ;                              (* bottom face points down on y.  *)
    glTexCoord2f 1.0  1.0 ; glVertex3f (-.1.0)  (-.1.0)  (-.1.0) ;	 (* Top Right Of The Texture and Quad *)
    glTexCoord2f 0.0  1.0 ; glVertex3f  1.0  (-.1.0)  (-.1.0) ;	 (* Top Left Of The Texture and Quad *)
    glTexCoord2f 0.0  0.0 ; glVertex3f  1.0  (-.1.0)   1.0 ;	 (* Bottom Left Of The Texture and Quad *)
    glTexCoord2f 1.0  0.0 ; glVertex3f (-.1.0)  (-.1.0)   1.0 ;	 (* Bottom Right Of The Texture and Quad *)
 
     (* Right face *)
    glNormal3f  1.0  0.0  0.0 ;                               (* right face points right on x. *)
    glTexCoord2f 1.0  0.0 ; glVertex3f  1.0  (-.1.0)  (-.1.0) ;	 (* Bottom Right Of The Texture and Quad *)
    glTexCoord2f 1.0  1.0 ; glVertex3f  1.0   1.0  (-.1.0) ;	 (* Top Right Of The Texture and Quad *)
    glTexCoord2f 0.0  1.0 ; glVertex3f  1.0   1.0   1.0 ;	 (* Top Left Of The Texture and Quad *)
    glTexCoord2f 0.0  0.0 ; glVertex3f  1.0  (-.1.0)   1.0 ;	 (* Bottom Left Of The Texture and Quad *)
 
     (* Left Face *)
    glNormal3f (-.1.0)  0.0  0.0 ;                               (* left face points left on x. *)
    glTexCoord2f 0.0  0.0 ; glVertex3f (-.1.0)  (-.1.0)  (-.1.0) ;	 (* Bottom Left Of The Texture and Quad *)
    glTexCoord2f 1.0  0.0 ; glVertex3f (-.1.0)  (-.1.0)   1.0 ;	 (* Bottom Right Of The Texture and Quad *)
    glTexCoord2f 1.0  1.0 ; glVertex3f (-.1.0)   1.0   1.0 ;	 (* Top Right Of The Texture and Quad *)
    glTexCoord2f 0.0  1.0 ; glVertex3f (-.1.0)   1.0  (-.1.0) ;	 (* Top Left Of The Texture and Quad *)
 
    glEnd  ();                                     (* done with the polygon. *)
 
    xrot := !xrot +. !xspeed;		                 (* X Axis Rotation	 *)
    yrot := !yrot +. !yspeed		                 (* Y Axis Rotation *)

PS : aucun des deux ne semble être encore maintenu, toutefois GlCaml prend en charge les versions d'OpenGL jusqu'à 2.1 + extensions ARB et spécifiques aux vendeurs. GlCaml embarque un binding minimal de la SDL, moins complet que OCamlSDL que j'ai présenté dans un post précédent.

, , , , ,

5 107 Comments

Bouncing Ball en OCaml avec OCamlSDL

Bonsoir,

J'ai écrit un petit programme OCaml de Boucing Ball, une balle qui rebondit contre les bords de la fenêtre, où l'on peut augmenter la vitesse en X et en Y avec les touches du clavier.
Il utilise OCamlSDL, un binding de la désormais célèbre bibliothèque SDL pour le langage OCaml.

Voici ce que cela donne.

Boucing Ball en action

Boucing Ball en action

Si vous voulez tester et/ou améliorer ce programme, qui peut soit dit en passant servir de base pour un Pong ou autre jeu de ce genre, vous trouverez le code source ici : bbsdl.tar.gz.

Enjoy.

, , , , ,

2 039 Comments

La programmation fonctionnelle n'est pas un jouet pour académiciens

Bonjour,

Cela fait maintenant un moment que j'apprends et pratique la programmation fonctionnelle, aussi bien sur le point de vue théorique en m'intéressant à ses relations avec la théorie des catégories (mathématiques) entre autres, que sur le point de vue pratique, c'est à dire que j'ai mené quelques projets (de petite envergure... oui, c'est proportionnel au temps que je peux passer dessus) à bien.

Quand on dit "langage fonctionnel" ou "programmation fonctionnelle", les gens s'imaginent (pour ceux qui ne connaissent pas) des programmes avec tout un tas de fonctions, c'est tout. Ce n'est pas ça la programmation fonctionnelle. Enfin biensûr il y a des fonctions, mais la programmation fonctionnelle ne s'arrête pas là.

Déjà, la programmation fonctionnelle, c'est une toute autre façon de concevoir des programmes. Détailler toutes les différences avec la programmation impérative serait pire que les 12 travaux d'Hercules et c'est pourquoi je ne le ferai pas. Je vais toutefois vous parler des points qui font que je suis désormais adepte de ce style de programmation.


Read the rest of this entry »

, , , ,

1 026 Comments

Les sujets en rapport avec OCaml qui vous intéresseraient

Salut,

Étant tombé amoureux du langage OCaml, et comptant propulser cette activité de blog sur Coder-Studio, j'aimerais savoir ce que vous, amateur du langage OCaml, de la programmation fonctionnelle en général ou tout simplement curieux, vous souhaiteriez lire en rapport avec OCaml sur notre site préféré ;)

Alors ?
Quelques grandes lignes qui pourraient intéresser :
- OCaml et les maths (comme mon billet précédent)
- OCaml et les GUIs
- OCaml et le multimédia (OCamlSDL, OCaml/OpenGL, ...)
- OCaml et la conception de compilateurs/interpréteurs (lexing, parsing, etc)
- ...

Merci de donner votre avis !

, ,

1 759 Comments

Mon premier robot - Premier prototype

Je réalise mon rêve d'enfance en ce moment, la réalisation d'un robot de A à Z. Je regrette de finir mes études à l'UTT dans 2 mois, ça commence à devenir vraiment passionnant ! Donc en fait je travaille sur un robot wifi commandé par manette de wii. J'ai réussi à caser ça comme projet dans mon cursus, au lieu de faire un cours bouche trou pour finir ma 5eme année, bah je me suis lancé avec un autre étudiant dans le développement d'un chti robot :) Il ne s'agit pour l'instant que de notre premier prototype, comme vous pouvez le voir il n'est pas entièrement autonome. On doit encore travailler sur l'alimentation du système embarqué (Carte Fox), du routeur wifi et des servomoteurs. Pour l'instant on a des gros fils rattachés au robot. On cherche des batteries adaptées pour alimenter tout ça. C'est que ça pompe du courant ce ptit machin.

Il reste encore du boulot, le robot a la fâcheuse tendance à se mettre en mode autiste et à faire n'importe quoi. On a écarté un problème lié au wifi, donc ça doit venir du code qui marche paaaas bien :P Reste ensuite à faire marcher la pince, qui n'a pas encore été implémentée dans le code. Ensuite on pourra utiliser OpenCV pour faire un peu de traitement d'image et donner la possibilité au robot de repérer un certain nombre de choses.

Je suis en train de me préparer un blog perso exprès pour présenter l'avancement de mes projets de robotique, et de programmation en générale. Je posterai de temps en temps sur Coder-Studio mon avancement du projet ;) et donnerai à l'occasion l'adresse pour compléter mes billets sur mes robots. Sinon, désolé pour la vidéo, elle est assez courte et on ne voit pas trop la manette de wii. En fait je n'avais plus de place sur ma carte mémoire...

Voilà donc c'est un premier aperçu très rapide du projet. Je ferai une vidéo plus complète au prochain épisode avec un billet contenant plus de détails sur le robot ;)

, , , ,

4 858 Comments