IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Caml Discussion :

Choix de structure de données


Sujet :

Caml

  1. #1
    Membre régulier
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    102
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2010
    Messages : 102
    Points : 110
    Points
    110
    Par défaut Choix de structure de données
    Bonjour,

    Jusqu'à maintenant je n'ai écris que de petits programmes bien souvent "à but mathématique" que je faisais tourner dans l'interpréteur, et jamais de "vrai" programme indépendant, avec une interface graphique, etc.

    Aujourd'hui j'aurais besoin d'un logiciel à première vue absolument inintéressant niveau programmation, mais qui me serait très utile.

    Etant donné plusieurs éléments (notamment le fait que je suis sur Ubuntu avec Gnome...), le langage le plus adapté pour faire ça simplement semblait Python combiné avec du GTK+. En plus ça m'aurait fait une bonne excuse pour m'y mettre un peu sérieusement. Mais je me suis dit "pourquoi ne pas en profiter pour essayer LablGTK ?". Aussi l'objet de mon message est de savoir si OCaml est adapté à mon programme, et de demander un peu d'aide sur comment m'y prendre car j'avoue que je ne sais pas trop par où commencer.

    Ce logiciel sera un logiciel d'aide à l'apprentissage "bête". En gros il devra y avoir deux modes :

    1. Un mode "approvisionnement de la base de donnée", où on demande à l'utilisateur d'entrer une question, la réponse correspondante et les mots clefs devant figurer dans une réponse pour qu'elle soit comptée comme bonne.

    2. Un mode "interrogation" où on pose à l'utilisateur diverses questions au hasard. Si sa réponse comporte les mots clefs, elle est comptée comme bonne, sinon non et la réponse à la question est affichée.

    Si déjà j'arrive à faire ça je pourrai ensuite raffiner de façon à ce que les questions soient classées par thèmes et que l'utilisateur puisse choisir sur quel thème il désire être interroger, etc.

    Vous allez sans doute vous demander quel est l'intérêt d'un tel truc. Eh bien il se trouve que j'ai pas mal de trucs à apprendre "bêtement" cette année et que je suis censé retenir pour le long terme. Ca serait un excellent moyen d'empécher que j'oublie tout quelques mois après l'avoir appris. Exemple : "diamètre microtubule ? -> 25 nm"

    En résumé :

    Python ? Caml ?

    Quelle structure de données utiliser ? J'avoue que je n'en ai aucune idée. Autant en Python je crois qu'il existe des "dictionnaires" qui pourraient peut-être faire l'affaire, autant en Caml je ne connais que les listes, les tableaux, ... Pour l'instant la partie la plus mystérieuse pour moi est l'approvisionnement de la base de donnée : je ne vois pas du tout comment faire (les "questions-réponse" par contre je pense que même si ça sera probablement très merdique j'arriverai sans doute à me débrouiller...)

    Voilà, merci d'avance pour votre aide et vos suggestions !

  2. #2
    Membre éprouvé
    Avatar de Cacophrene
    Homme Profil pro
    Biologiste
    Inscrit en
    Janvier 2009
    Messages
    535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Biologiste

    Informations forums :
    Inscription : Janvier 2009
    Messages : 535
    Points : 1 125
    Points
    1 125
    Par défaut
    Bonsoir,

    Diamètre d'un microtubule... un biologiste !
    Bon, OCaml, Python et tous les autres permettent de faire ça. On peut utiliser des tables de hachage par exemple, pour stocker les couples questions/réponses. Si tu rencontres des problèmes concrets, et que tu les exposes ici, il sera plus facile de t'aider.

    Cordialement,
    Cacophrène

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    832
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 832
    Points : 1 104
    Points
    1 104
    Par défaut
    Est-ce que tu as regardé ce qui existait déjà avant de décider de te lancer dans l'implémentation ? Il me semble qu'il y a de nombreux logiciels sur ce créneau, par exemple mnemosyne.

  4. #4
    Membre régulier
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    102
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2010
    Messages : 102
    Points : 110
    Points
    110
    Par défaut
    Citation Envoyé par Cacophrene Voir le message
    Diamètre d'un microtubule... un biologiste !
    Eh oui, personne n'est parfait !

    Pour les tables de hachage, j'avais déjà lu des trucs dessus à un moment ou on m'avait suggérer d'en employer, malheureusement même si le manuel de référence d'Objective Caml explique comment utiliser les tables de hachage, il n'explique pas ce que c'est. J'avais aussi lu l'article de Wikipédia histoire de comprendre l'idée générale mais malgré ça les tables de hachage restent une boîte noire pour moi (d'ailleurs la dernière fois je m'étais lamentablement rabattu sur une liste associative. Au moins je comprenais comment ça marchait )

    La le principal problème est qu'il faut qu'une fois que l'utilisateur ajoute une question à la base de donnée, celle ci soit y soit stockée de façon définitive, de façon à être utilisable après redémarrage du programme.

    Or j'ai jamais fait ce genre de trucs, et j'ai aucune idée de comment on est censé faire. Et le manuel Caml est pas super pour démarrer je trouve.

    Donc si vous aviez quelques liens utiles ça serait super, je pourrais lire tout ça, essayer un truc et vous dire ce que ça donne. Mais là je vois même pas dans quelle direction partir

    Ah, tant que j'y suis, aucun rapport, mais je tenais à te dire que tes billets sur LablGTK sont super Cacophrène ! Franchement heureusement qu'ils sont là parce que s'il n'y avait que là doc officielle, pour commencer, ça serait l'enfer...

  5. #5
    Membre régulier
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    102
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2010
    Messages : 102
    Points : 110
    Points
    110
    Par défaut
    Citation Envoyé par bluestorm Voir le message
    Est-ce que tu as regardé ce qui existait déjà avant de décider de te lancer dans l'implémentation ? Il me semble qu'il y a de nombreux logiciels sur ce créneau, par exemple mnemosyne.
    Oups, j'avais pas vu ton message parce que tu n'avais pas encore répondu quand j'ai commencé ma réponse et puis j'étais aller bouffer entre le début et la fin de mon message donc j'avais pas fait gaffe !

    Ce logiciel à l'air d'être exactement ce qu'il me faut à vrai dire ! En plus il pose plus souvent les questions pour lesquelles on se trompe, bref, il a l'air parfait. Bon, je vais sans doute l'installer et essayer.

    M'enfin j'aimerais bien savoir comment faire pour stocker des données de façon "durable" (ie de façon à ce qu'elle soient toujours là après redémarrage du programme), et puis j'ai jamais fait de "vrai" logiciel indépendant etc, donc j'aimerai bien essayer. Enfin si ça ne vous semble pas trop ambitieux pour une première (j'avoue que ça m'a l'air assez simple parce qu'à première vue ça ne nécessite pas d'algorithme complexe, mais je n'en sais rien !)

    EDIT :

    Argh, en plus Mnemosyne est dans la logithèque Ubuntu ! Honte à moi qui avais mal cherché !

    EDIT 2 :

    Waow, merci bluestorm, ce logiciel est exactement ce qu'il me fallait !

    Bon ben du coup je pense que je vais directement passer au "projet-vacances n°2", inutile de me casser la tête pour faire un truc qui sera forcément 1000 fois moins bien.

    En revanche, je suis toujours intéressé par d'éventuels liens, j'en ai un peu marre de faire des programmes qui tournent dans l'interpréteur. (Si vous avez des codes sources c'est encore mieux car je préfère pour apprendre)

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    832
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 832
    Points : 1 104
    Points
    1 104
    Par défaut
    La fonctionnalité que tu recherches s'appelle la "persistence". Il faut faire attention car c'est un nom un peu surchargé, et il est aussi employé pour parler des "structures de données persistantes" que sont les structures de données immutables, qui ne changent jamais de valeur au cours de l'exécution du programme. Le premier style de persistence est parfois appelé "cross-program persistence" pour préciser qu'on parler bien de persister même après la mort du programme.
    Il n'y a pas de concept de persistence dans le langage Caml lui-même, alors il faut nécessairement interagir avec le système d'exploitation pour obtenir ce "service" : communiquer avec le système de fichiers, ou d'autres programmes, etc.


    Il y a de nombreux outils pour faire ça. Le plus simple du point de vue du programme est simplement de "sérialiser" ses données en les écrivant dans un fichier, pour les recharger ensuite. Mais rien que ça, ça demande du soin et ça de l'impact sur l'architecture de ton programme. Par exemple, il faudra prendre soin de sauvegarder aussi toutes les variables globales du programme, et en pratique il vaut mieux donc minimiser les variables globales et essayer d'avoir des données "auto-contenues", qui ne dépendent pas d'un contexte extérieur.
    Pour prendre un exemple concret, si tu as déjà été dans la situation de la personne qui a codé un petit jeu vidéo tout simple (pong, sokoban, etc.) et qui décide de sauvegarder l'état des parties pour les recharger à l'identique, tu t'es rendu compte que ce n'est pas si évident que cela, parce que beaucoup de choses qui étaient "implicites" dans le programme doivent être explicitement sauvegardées.

    Après il y a différentes manières de stocker des données. Tu peux utiliser les fonctions de "marshalling" de OCaml pour écrire directement tes données en format binaire. Il faut faire un peu attention car tu peux casser le typage si tu n'es pas soigneux (quand tu charges les données, il leur donne le type que tu lui dis, même si elles avaient en réalité un autre type, et ça peut donner lieu à des erreurs graves si tu te trompes de type), mais c'est la méthode la plus simple.
    Tu peux aussi choisir un autre format de donnée et utiliser des outils pour transformer tes données dans ce format et inversement. On peut stocker de l'information avec un format texte standard (genre les fichiers .INI) ou personnel (ce que tu veux), sous forme XML, JSON, Sexp... Pour certains formats il existe des bibliothèques prêtes à te simplifier le travail.

    Enfin, une méthode très populaire pour les applications web est l'utilisation d'une base de données relationnelles, typiquement SQL (par exemple MySQL ou PostGreSQL, ma préférence allant à la seconde). C'est encore une autre façon d'organiser tes données et ça peut avoir des impacts importants sur ton programme (par exemple il faut choisir entre maintenir en permanence la BDD à jour, ou bien interagir avec elle seulement à des moments précis (chargement et sauvegarde) et le reste du temps maintenir seulement une version "en mémoire vive" de tes données), mais ça peut aussi avoir des avantages comme la disponibilité d'un langage de requêtes riche, et l'interopérabilité avec d'autres langages. C'est le moment de faire de la pub pour mon propre outil (qui manque d'utilisateurs), Macaque.

    Pour des raisons de simplicité, je pense qu'il vaut mieux commencer par les solutions mentionnées en premier (marshalling), et évoluer ensuite vers autre chose selon ses besoins.

  7. #7
    Membre éprouvé
    Avatar de Cacophrene
    Homme Profil pro
    Biologiste
    Inscrit en
    Janvier 2009
    Messages
    535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Biologiste

    Informations forums :
    Inscription : Janvier 2009
    Messages : 535
    Points : 1 125
    Points
    1 125
    Par défaut
    Bonsoir,

    Citation Envoyé par drunkskater
    Eh oui, personne n'est parfait !
    Il y a d'autres biologistes ici.

    Cordialement,
    Cacophrène

  8. #8
    Membre régulier
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    102
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2010
    Messages : 102
    Points : 110
    Points
    110
    Par défaut
    Il y a d'autres biologistes ici.
    Damned, qui l'eu cru ?

    Plus sérieusement, merci pour vos réponses, et désolé de ne pas avoir répondu plutôt : j'étais parti en vacances, et je n'avais pas Internet. Néanmoins, j'avais mon ordinateur et le manuel de référence d'Objective Caml ainsi que quelques autres textes, et j'ai pu faire un peu d'info.

    Tout d'abord, j'ai lu le passage du bouquin "Le langage Caml" (de Pierre Weis et Xavier Leroy) sur les tables de hachage, et je crois avoir bien compris. J'ai pas encore eu l'occasion de tester sur de vrais exemples (j'ai juste fait deux trois trucs proches des exemples donnés en Camllight dans le bouquin), mais je pense que ça devrait aller.

    Pour ce qui est de la persistance, j'avais rien trouvé de très clair dans les manuels, mais j'ai trouvé comment écrire dans des fichiers textes (j'ai découvert les in_channel, out_channel et compagnie) Et donc j'avais trouvé une solution pourrie consistant à écrire "let bidule = truc ;;" dans un fichier .ml puis à le charger avec "include ficher.ml", seulement j'ai été confronté à plusieurs problèmes (notamment le fait que quand j'écrivais dans le fichier, tout ce qu'il y avait d'écrit s'effaçait (j'étais sur Camllight et j'utilisais "open_out" et "output_string"). Du coup j'étais obligé de faire des trucs bêtement compliqués pour sauvegarder ce qu'il y avait dans le fichier et tout réécrire d'un coup.)

    Bref, je vais me renseigner un peu sur le Marshalling, essayer de comprendre comment ça marche et si j'y comprend rien je reprendrai mon truc à base de output_string

    En attendant, Mnemosyne est géniale et donc j'abandonne complètement ce projet. Je me lance donc sur autre chose et je met ce topic en résolu (puis j'en ouvre un autre car j'ai déjà commencé et j'ai pas mal de problèmes )

    EDIT :

    Bon en fait je me rend compte que mes questions pour mon nouveau projets sont très hétéroclites (certaines concernent le module Graphics, d'autres le module Unix et d'autres sont des problèmes d'algorithmique) : est il préférable que je fasse un topic par problème pour faciliter la recherche dans le forum ou vaut-il mieux que je démarre un seul topic regroupant toutes mes questions histoire de ne pas démarrer trop de nouveaux topics ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. choix de structure de données
    Par totoche dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 03/12/2010, 11h12
  2. aide en choix de structures des données
    Par siempre dans le forum C
    Réponses: 0
    Dernier message: 13/02/2010, 00h28
  3. choix de structure de données
    Par 3dsman dans le forum Traitement d'images
    Réponses: 6
    Dernier message: 16/09/2009, 23h46
  4. Choix d'une structure de donnés ?
    Par ThE_LaSt dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 16/03/2008, 13h18
  5. choix s'une structure de données
    Par fabaroulettes dans le forum Langage
    Réponses: 3
    Dernier message: 08/02/2007, 10h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo