DocAide Modules d'exercices OEF

Comment créer un module d'exercices OEF

Vous avez déjà développé des exercices dans votre classe sur un même thème et vous désirez en faire votre premier module : ce document est pour vous.
Mettez-vous en version imprimable (Version imprimable dans la barre de menu) si vous voulez avoir une vue d'ensemble ou faire une recherche sur un mot.

Démarrage

Prenez d'abord contact avec l'administrateur du serveur WIMS sur lequel vous travaillez et demandez-lui un compte développeur : il vous donnera un login et un mot de passe.
Pour accéder alors à votre compte, cliquez dans la page d'accueil sur Modtool et identifiez-vous. Vous pouvez aussi vous connecter à partir de votre classe. Le mot de passe sera alors enregistré.
Vous pouvez alors créer votre premier module en cliquant sur le lien créer un nouveau module.

Propriétés

À la création, on vous demande de choisir les propriétés du module. Certaines sont irréversibles, d'autres pourront être changées plus tard.

Le choix irréversible à bien faire : le type

Le Type doit être bien choisi dès le départ car il conditionne le type de fichiers auquel vous aurez droit. Pour ce qui nous concerne ici, vous devez cocher la case OEF. Donnons cependant une description rapide des autres choix possibles.

Les autres choix

Ils n'ont pas tous besoin d'explication ... Une fois ces choix faits, cliquez sur Enregistrer les changements.

Ajout d'un exercice OEF

Pour mettre un nouvel exercice dans le module : Attention : src est en fait un nom de répertoire dans lequel doivent être toutes les sources d'exercices OEF : il est important que le nom du fichier se termine par .oef et qu'il se trouve dans le répertoire src, c'est-à-dire que l'adresse soit src/xxx.oef
Vous pouvez alors tester votre exercice en cliquant Tester le module.

Finaliser le module

Modifier le menu d'introduction

Modifier le bas de page des exercices

Le fichier endhook.phtml : Pour faire apparaître des lignes à la fin de tous les exercices du module, vous pouvez rajouter du texte ici. Une utilisation courante est de mettre un lien sur les outils pouvant être utilisés.
 !if $status=waiting
   !read tool.phtml linear/vector linear/matrix linear/linsolver
   !href module=U2/analysis/docstokes.fr Un document
 !endif
Ce lien n'apparaîtra ici que lorsque l'exercice est en cours. Il disparaîtra lorsque l'exercice est terminé et résolu ( status est une variable prédéfinie utilisée dans le module qui attend qu'on réponde (=waiting) et qui change de valeur lorsqu'on a répondu à l'exercice. )

Modifier l'à propos

Lorsque vous cliquez sur A propos dans un module d'exercices OEF, c'est le contenu du fichier about.phtml :
!changeto oef/$module_language/about.phtml
Cette ligne permet de faire de manière automatique le tableau donnant l'adresse, le nom de l'auteur ... Si vous rajoutez une ligne de texte AVANT, elle apparaîtra. Vous pouvez donc y mettre les références que vous avez utilisées, vos remerciements etc !

Compte rendu de mise à jour

Le fichier NEWS sert à informer des mises à jours successives du module. Par défaut, il contient les lignes suivantes
# This file registers changes to the module.
# Please write in reverse order: the last version first.

Version 1.00: First publication.

Vous pouvez enlever les deux premières lignes, ... mais retenir le conseil. Ce que vous écrirez là apparaîtra à la fin de l'A propos. Si vous le remplissez, il permettra rapidement à l'utilisateur de voir que vous avez rajouté un exercice, que vous avez corrigé un bogue dans tel exercice.
Mais, nous reverrons cela plus tard.

Modifier le fichier var.proc

# Change to 0 if you don't want the choice `I don't know'
idontknow=1

# Change to 1 of you want all choices to be present allchoices=0
# Computational precisions: you can change the defaults here. # pari_precision=18 # maxima_precision=8 # print_precision=8
# Change to no if you don't want classes to import exercises in this module. # A typical situation is that these exercises use common resources of the module. class_importation=yes
# Change to yes if you want to put images in common (images/) to all exercises. # If you do so, you must disable class_importation. common_images=no
!changeto oef/var.proc
Les lignes commençant par # sont des commentaires. Vous voyez que vous pouvez, en décommentant la ligne pari_precision=18 et en changeant le nombre, augmenter la précision des calculs (bien sûr ne le faites que si nécessaire).
Si vous utilisez des images qui doivent être communes à plusieurs exercices, mettez common_images=yes.
Il ne doit rien y avoir après la dernière ligne du fichier d'origine.

Ajouter des métadonnées pour chaque exercice

Pour les versions supérieures à 4.10, renseigner les instructions \keywords{}, \description{} et \observation{} dans le source d'un exercice aidera à la recherche d'exercices et permettra de compléter les champs Description et Commentaires lors de l'insertion de l'exercice dans une feuille (voir la documentation de Createxo).

Publication

Le système de publication des modules permet aux auteurs ayant corrigé des erreurs de mettre très vite leurs corrections à la disposition de tous les serveurs.
Publier un module signifie le rendre public et utilisable par d'autres enseignants.
Il y a plusieurs sortes de publication possibles. Dans le premier cas, pour pouvoir faire la publication, il faut demander un compte en envoyant un mail à publishcenter@wimsedu.info. Si c'est votre premier module, vous serez mis en contact avec une personne qui a déjà publié des modules qui pourra vous aider, vérifier le bon fonctionnement du module et le publier à votre place. Ensuite, lorsque vous avez un compte, il n'y a de vérification que par le public ou les collègues.
Dans le second cas, l'autorisation est à demander au gestionnaire du serveur. Le module devra alors avoir comme zone local.
A mon avis, il ne faut pas considérer la zone local comme un purgatoire pour la publication centralisée. En effet, la zone du module changera alors nécessairement et il y aura double module. Ma politique en tant que gestionnaire sera d'effacer tout module dans la zone local qui est publié ensuite. Avec comme inconvénient de couper les liens qui auraient été faits de l'extérieur sur ce module.

Modification après publication

Ça y est, vous avez publié votre module. Et bien sûr, deux jours après, vous y découvrez une erreur (ne vous inquiétez pas, c'est toujours comme ça).
Il ne vous reste plus qu'à la corriger. Pour cela,
Les serveurs WIMS ayant activé la mise à jour automatique récupéreront le module modifié à leur prochaine mise à jour automatique. S'ils ne l'ont pas fait, écrivez au gestionnaire ...

Règles de bonne conduite

Avant de publier :

Présentation générale

Conseils typographiques

Les quelques conseils suivants sont des conseils de type éditorial. Ils concernent les mathématiques mais aussi les autres disciplines et sont finalement simplement de bon sens : D'autres styles css sont prédéfinis. Il dépendent alors du thème de WIMS choisi. Nous essayons de les rendre cohérents. Utilisez-les de préférence si vous pouvez. Ils permettent d'avoir une meilleure unité dans les exercices.
Exemples de styles css prédéfinis
Il est recommandé de garder l'esprit de ces styles (ne pas utiliser par exemple oef_indgood pour un autre emploi que celui indiqué)
Maintenant l'exercice proprement dit : un intérêt majeur de WIMS est d'avoir des exercices aléatoires. Donc vérifiez bien que vous avez tiré le meilleur parti possible de cette possibilité.

Aide commune à plusieurs exercices

Vous désirez écrire une aide commune à plusieurs exercices de votre module. Pour cela, Vous pouvez bien sûr écrire plusieurs aides que vous mettrez soit dans des fichiers différents soit dans le même mais sous la forme
:bla bla bla
etc
: blo blo blo
etc
et selon les exercices, vous irez chercher la première aide (entre le premier : et le second) ou la seconde aide
\text{monaide=wims(record 1 of aide)}
\help{\monaide}
ou
\text{monaide=wims(record 2 of aide)}
\help{\monaide}

Paramètres supplémentaires

Vous désirez avoir le même exercice avec des difficultés différentes venant de la taille des données. Par exemple, un exercice sur des matrices d'ordre 2 et un exercice sur des matrices d'ordre 5.
Il faut alors créer un fichier introhook.phtml, par exemple
  <tr><th class="wimscenter">Niveau de difficulté</th>
  <td>
    !formbar confparm1 from 1 to 3
    Taille du graphe
    </th></tr>
voir une autre méthode sans table dans la partie sur la création du fichier, il faut alors adapter les exemples qui suivent.
L'utilisateur voit un formulaire lui demandant la "Taille du graphe'', et peut répondre un entier compris entre 1 et 3. Il n'est pas obligé de rentrer une valeur. (On se trouve dans un tableau HTML, dont on vient de définir une ligne.) Attention les seuls noms autorisés pour ces variables sont les mots confparm1, confparm2, confparm3, confparm4, confparm5.
Dans les sources de l'exercice, on peut alors définir certaines des données à l'aide de confparm1. Ne pas oublier de les définir aussi si confparm1 n'a pas de valeur. Par exemple dans le fichier toto.oef
    \integer{ n = \confparm1=1? randint(3..4):randint(3..4) }
    \integer{ n = \confparm1=2? randint(5..7) }
    \integer{ n = \confparm1=3? randint(10..12)}
On peut utiliser d'autres types de paramètres. Par exemple,
    <tr><td class="wimscenter">Choix d'animal</td>
    <td>
      !formradio confparm1 list A,B,C prompt Loup, Chèvre, Mouton
    </td></tr>
Le paramètre vaut ici A, B ou C. En remplaçant formradio par formcheckbox, on autorise la sélection de plusieurs animaux.
On peut même faire entrer à l'utilisateur une variable. Voici un exemple pris dans l'exercice Classification périodique
   <tr>
     <th></th>
     <td><input size="3" name="confparm3" value="54" id="confparm3" /></td>
  </tr>
  <tr>
    <th>:</th>
    <td><input size="40" name="confparm4" id="confparm4" /></td>
  </tr>
  
Dns chaque fichier oef, ne pas oublier de donner une valeur par défaut à tous les paramètres confparm1, ... et surtout une valeur par défaut à toutes les variables aléatoires qui en dépendent.
\if{\confparm1=}{\text{confparm1=1}}
Si vous désirez présenter les options en liste par exemple, il est fortement conseillé pour l'accessibilité de procéder de la manière suivante :
!set wims_html_mode=li
 <ul>
!formradio confparm1 list 1,2 prompt xxx, yyy
 </ul>
La variable wims_html_mode peut aussi prendre la valeur <div> ou <span>, mais cela est a priori moins utile.

Utiliser des fichiers de données

On peut stocker des données dans un fichier que nous appellerons ici tableau et les utiliser ensuite dans un ou plusieurs exercices. Prenons l'exemple de l'exercice de grammaire suivant.
	\title{Choix et/est/ai}
	\language{fr}

\text{tableau =randomrow( Je suis grand ??et,est,ai?? brun. Le café ??est,et,ai?? chaud. La fleur ??est,et,ai?? rouge. Le soleil ??est,et,ai?? chaud J'??ai,est,et?? chaud)}
	\matrix{A = slib(text/cutchoices \tableau)}
	\text{good=\A[2;]}
	\text{cnt = items(\good)}
	\text{mix = shuffle(\cnt)}
	\matrix{good= \good[\mix]}
	\text{rep = position(1,\mix)}
	\statement{
	Faire le bon choix :
	<div class="wimscenter"> \A[1;] \embed{reply 1} \A[3;] </div>
	}
	\answer{}{\rep[1];\good}{type=menu}

Plutôt que d'avoir les phrases dans le fichier d'exercice, créez un fichier d'adresse tableau (attention, cette fois-ci ne pas mettre src). Et mettez-y le texte suivant
:Je suis grand ??et,est,ai?? brun.
Le café ??est,et,ai?? chaud.
La fleur ??est,et,ai?? rouge.
Le soleil ??est,et,ai?? chaud
J'??ai,est,et?? chaud

:L'élève ??est,et?? sérieux ??et,est?? appliqué. Paul se ramasse ??et,est?? se relève. Le pull ??est,et?? chaud ??et,est?? léger. La rue ??est,et?? étroite ??et,est?? en pente. Pierre ??est,et?? fort en mathématiques ??et,est?? en français. La lumière sur le vieux port ??est,et?? très belle en hiver ??et,est?? en été.
Remarquez le signe de ponctuation : que nous avons un peu grossi. Il va être possible maintenant dans un exercice de charger ces données soit en entier, soit sélectivement pour la partie entre deux signes : consécutifs.
Donnons les premières commandes permettant cette utilisation et qui donneront un exercice équivalent au précédent :
\text{Tableau = wims(record 1 of tableau)}
\text{a = randomrow(\Tableau)}
record 1 chargera les cinq premières lignes du tableau, plus exactement celles entre le premier : et le second.
\text{Tableau = wims(record 2 of tableau)}
\text{a = randomrow(\Tableau)}
record 2 chargera les six dernières lignes du tableau (il faudra bien sûr changer la suite de l'exercice qui ne fonctionnera plus)
\text{Tableau = wims(record 0 of tableau)}
\text{a = randomrow(\Tableau)}
record 0 chargera toutes les lignes du fichier tableau
\integer{m = wims(recordcnt tableau)}
\matrix{Tableau = }
\for{ i = 1 to \m}{
  \text{Tableau = \tableau
  randrow(wims(record \i of tableau))}
Ici, on compte le nombre de record (ici 2, mais il pourrait y en avoir plus). Et on prend une ligne par type. On pourra donc poser une question de chaque type.
Un exemple d'exercice complet
\author{Ambali}
\integer{m = randint(1..wims(recordcnt tableau))}
\matrix{Tableau = }
\text{Tableau= randrow(wims(record \m of tableau))}
\matrix{A= slib(text/cutchoices \Tableau)}
\text{cntrow=rows(\A)}
\integer{cntQ=(\cntrow-\cntrow%2)/2}
\matrix{good1=}
\text{rep= }
\for{i= 1 to \cntQ}{
  \text{good=\A[2*\i;]}
  \text{cnt= items(\good)}
  \text{mix= shuffle(\cnt)}
  \matrix{good1=\good1
  \good[\mix]}
  \text{rep= \rep, position(1,\mix)}
}
\text{rep=wims(nonempty items \rep)}
\text{STEP= wims(makelist r x for x = 1 to \cntQ)}
\steps{\STEP}
\statement{<div style="text-align:center;
background-color:#faffe6;
padding:1%;
margin:5% 20%;">
\for{k = 1 to \cntQ}{\A[2*\k-1;]  \embed{r \k} }
   \A[2*\cntQ+1;]
<div/>}
\answer{}{\rep[1];\good1[1;]}{type=menu}
\answer{}{\rep[2];\good1[2;]}{type=menu}
\answer{}{\rep[3];\good1[3;]}{type=menu}

Donnons un autre exemple d'utilisation de tableau extérieur aux exercices. Il s'agit de tableau de type "dictionnaire" de la forme suivante :
azote:.....
hydrogene:....
On peut alors aller chercher la ligne associée à azote avec la commande lookup
\text{ligne= wims(lookup azote in tableau)}
et récupérer ensuite les informations qui suivent et dont vous avez besoin.

Utilisation de cpp

Un exemple d'utilisation de cette "technique" est le suivant :
Vous avez un exercice avec certaines variables A et B et des relations entre A et B et vous voulez faire un exercice où vous donnez A et demandez B et un exercice où vous donnez B et vous demandez A. La première solution envisagée est de faire un copier-coller et de changer juste l'énoncé. Et puis, vous vous apercevez que vous auriez dû fixer autrement l'aléatoire de vos variables, ou qu'il y a une erreur dans vos calculs.
Et vous devez faire attention de corriger toutes les erreurs dans tous les exercices (et si vous êtes arrivé à en faire 6 avec les mêmes données de départ, c'est du travail ... )
Une solution (meilleure) est alors de regrouper les parties communes dans un fichier que vous appellerez src/cpp/toto.cpp
La première ligne de ce fichier contiendra le nom des exercices que vous voulez créer :
target=toto1 toto2 toto3 toto4
Ensuite, chaque exercice aura un titre différent
#if defined TARGET_toto1
 \title{Premier exercice}
#endif
#if defined TARGET_toto2
 \title{Second exercice}
#endif
#if defined TARGET_toto3
 \title{Troisième exercice}
#endif
#if defined TARGET_toto4
\title{Quatrième exercice}
#endif
Etc ...
Vous pouvez tirer partie des commandes cpp :
Les directives #if, #ifdef, #ifndef, #else, #elif et #endif peuvent être utilisées pour la compilation conditionnelle (tiré de voir ici).
Montrons un exemple tiré de nouveau de la grammaire française et emprunté à Jean-Baptiste Frondas.
Fichier principal L'exercice pour fonctionner demande qu'il ait été créé des fichiers tableau_et, tableau_ou...
target= et_est ou_ou la_la
#define TITLE Choix
#if defined #TARGET_et_est
 \title{TITLE et/est}
 \text{Type=tableau_et}
#endif
#if defined #TARGET_ou_ou
\title{TITLE ou/où}
 \text{Type=tableau_ou}
#endif
#if defined #TARGET_la_la
\title{TITLE la/là/l'a}
 \text{Type=tableau_la}
#endif

#include "commun.inc"
\text{tableau = wims(record 0 of \Type)} \text{a = randomrow(\tableau)} teste si le premier champ est une question \text{testa= wims(nospace \a)} \text{first = wims(replace internal ? by | in wims(char 1 of \testa))} \text{u= \first issametext | ? 1 : 0} \text{u1 = \u = 0 ? -1:1} \matrix{A = slib(text/cutchoices \a)} \text{cntrow = rows(\A)} \integer{cntQ = (\cntrow+\u1*\cntrow%2)/2} \matrix{good1 = } \text{rep = } \for{i= 1 to \cntQ}{ \text{good=\A[2*\i -\u;]} \text{cnt = items(\good)} \text{mix = shuffle(\cnt)} \matrix{good1=\good1 \good[\mix]} \text{rep = \rep, position(1,\mix)} } \text{rep =wims(nonempty items \rep)} \text{STEP = wims(makelist r x for x = 1 to \cntQ)} \steps{\STEP}
\statement{
<div class="wimscenter moncss">
 \for{k = 1 to \cntQ}{
   \A[2*\k-1-\u;] \embed{r \k}
 }
 \A[2*\cntQ+1-\u;]
<p/>}

\answer{}{\rep[1];\good1[1;]}{type=menu}
\answer{}{\rep[2];\good1[2;]}{type=menu}
\answer{}{\rep[3];\good1[3;]}{type=menu}
\answer{}{\rep[4];\good1[4;]}{type=menu}
\answer{}{\rep[5];\good1[5;]}{type=menu}
\answer{}{\rep[6];\good1[6;]}{type=menu}
\answer{}{\rep[7];\good1[7;]}{type=menu}
\answer{}{\rep[8];\good1[8;]}{type=menu}


Fichier inclus nommé common.inc [non-disponible]
A suivre...

Liens sur d'autres modules

Si vous désirez faire un lien sur un autre module dans la page d'introduction, par exemple sur un document explicatif ou sur un autre module d'exercices plus facile ou plus difficile, rajoutez dans le fichier intro.phtml avant la ligne !tail :
!set wims_ref_target=wims_internal
!href module=adresse_du_module nom du lien
par exemple
 Vous pouvez aller voir le document
!set wims_ref_target=wims_internal
!href module=H2/algebra/docpuissance.fr Tout sur les puissances
pour réviser le cours.
Pour rajouter un tel lien en bas de chaque exercice, voir Finaliser le module .

Module multilangage

(Version préliminaire valable pour la version plus grande que 4.09) Si vous désirez faire ou faire faire une traduction dans une autre langue, il faudra séparer un peu le code du langage. Une manière de procéder est la suivante. Même si cela parait au départ un peu compliqué, cela est facile à mettre en oeuvre si on y pense dès le début. Dans ce qui suit, on suppose que la langue du module est fr et que l'on désire faire une traduction en anglais (en), mais bien sûr toutes les configurations sont possibles ! (it, nl, es, ca, etc.)
  1. Copier tous les exercices *.oef qui ne sont pas créés par des fichiers cpp dans le répertoire src/cpp en changeant l'extension : src/toto.oef devient src/cpp/toto.cpp (tous les fichiers dont il sera parlé ensuite devront être créés dans le répertoire src/cpp). Pour un tel fichier, ajouter en haut du fichier
    target=toto
    
    (toto est le nom du fichier sans extension). Tous les fichiers à créer dans la suite seront dans src/cpp . Bien sûr, si vous avez déjà utilisé les fonctionnalités de cpp pour mutualiser des données communes à plusieurs exercices, cette étape est à passer.
  2. Créer un fichier "common.inc" avec la ligne
    \text{lang=slib(oef/env lang)}
    
    On peut y mettre pour commodité des instructions communes à tous les exercices comme \author{} \precision{}. L'inclure dans toto.cpp
    #include "common.inc"
    
  3. Créer un fichier lang_fr.inc et mettre dans ce fichier ce qui dépend de la langue en créant des variables contenant ce texte et en ce texte par la variable dans l'exercice toto.cpp. Les variables sont par exemple du type name_xxx de manière à bien les distinguer des variables déjà définies. Essayez de ne mettre que du texte et le moins d'environnement de styles possibles (ceux-ci doivent être dans le fichier principal toto.cpp). Bien sûr, les définitions de langage vont dépendre de l'exercice, vous devez donc certainement faire des tests sur l'exercice.
    #if defined TARGET_toto
     \text{name_instruction= Instruction de l'exercice toto}
    #endif
    #if defined TARGET_tata
     \text{name_instruction= Instruction de l'exercice tata}
    #endif
    
  4. Créer les fichiers lang_en.inc (ou tout autre langage) correspondants.
  5. Créer le fichier lang.inc et indiquer quelque chose comme
    #include "lang_fr.inc"
    \if{\lang=en}{
    #include "lang_en.inc"
    }
    
    Cela dépend bien sûr des langues traduites. Attention, il faut toujours qu'il y ait un défaut: si la langue n'est pas traduite, la version originelle (ici française) doit y être.
  6. Dans le fichier toto.cpp, écrire quelque part
    #include "lang.inc"
    
    L'endroit dépend de ce qu'on met dedans (s'il y des variables de l'auteur, il faut bien sûr que ces variables soient connues lorsque le fichier lang.inc est inclus).
  7. Faire un fichier lang_title_fr.inc dans lequel on mettra les titres français des exercices sous la forme
    #if defined TARGET_toto
    # define TITLE Titre de l'exercice toto
    #endif
    #if defined TARGET_tata
    # define TITLE Titre de l'exercice tata
    #endif
    
    et un fichier similaire par exemple lang_title_en.inc pour le langage traduit.
    #if defined TARGET_toto
    # define TITLE_en Title of the exercise toto
    #endif
    #if defined TARGET_tata
    # define TITLE_en Title of the exercise tata
    #endif
    
    Créer le fichier lang_titles.inc et indiquer quelque chose comme
    #include "lang_title_fr.inc"
    #include "lang_title_en.inc"
    \title{TITLE}
    \title_en{TITLE_en}
    
    Dans le fichier toto.cpp, écrire
    #include "lang_titles.inc"
    
    On peut bien sûr faire pareil pour toutes les langues.
  8. Dans les propriétés, dans la partie Langue (onglet Langue), rajouter en dans le champ Autres langues, sauver, puis y revenir : un bouton Propriétés (Anglais) est apparu, cliquer dessus, remplir les propriétés relatif au module (si les mots clés ont été écrits en anglais technique, inutile de les répéter). Regarder l'aide pour les mots clés.
A partir de la version 4.09, un choix des langues apparait dans l'introduction du module.

Vous pouvez faire des variantes, par exemple créer plusieurs fichiers du type lang_toto_fr.inc selon les exercices. C'est dans le fichier lang.inc que vous indiquerez quel fichier doit être lu avec les directives cpp #if defined TARGET_toto || defined TARGET_tata.

Si vous mettez des mots clés dans un exercice, utilisez les mots clés en anglais technique, ce qui évite une traduction. Les champs keywords, credits, description, observation ne sont pas multilangage (ils sont de toute facon destinés uniquement aux enseignants). Ils ne peuvent pas non plus être définis de manière multiple conditionnée par un test.

document d'aide pour passer de Createxo à Modtool.
: wimshelp, interactive mathematics, interactive math, server side interactivity


Cette page n'est pas dans son apparence habituelle parce que WIMS n'a pas pu reconnaître votre navigateur web.
Afin de tester le navigateur que vous utilisez, veuillez taper le mot wims ici : puis appuyez sur ``Entrer''.

Veuillez noter que les pages WIMS sont générées interactivement; elles ne sont pas des fichiers HTML ordinaires. Elles doivent être utilisées interactivement EN LIGNE. Il est inutile pour vous de les ramasser par un programme robot.