初めに
e-Learning のコンテンツを作成するツール(オーサリングツール)の解説です。このツールは数式自動採点や自由記述を対象とした手動採点,動画で回答する等のコンテンツの作成に利用します。こちらに受講生向けのコンテンツの解説があります。このサイトの方が作成されるコンテンツのイメージは分かりやすいと思います。自動採点よりも手動採点の方が優先されて,数式の自動採点の結果を手動で上書き修正することも可能です。コンテンツはSCORM対応で,どのLMSでも利用できます。
今回の Version 5.10 は,採点サーバーの機能を二つに分けました。ひとつは採点を差配し結果を記録するサーバー(kanaike),もう一つは採点のみを担当するサーバー(デフォルトは egret)です。
採点のみを担当するサーバーを用意する時の作業は,こちらに概要をまとめてみました(採点サーバーを開発する際の VirtualBox イメージがあります)。採点のみ担当するサーバーを分けて立てることで,教師は採点処理を自身が自由に制御可能な近くのサーバーに戻すことができます。それによって,それぞれの教師が自由に採点処理を組み立てることが可能となります。下記に各サーバーの採点処理の分担を示します。手動採点はすべての採点を上書きできますが,必ずやらなければならないわけではありません。
以下,下記の順で利用方法の説明を書いてみます。
- (a) 各タブの概説
- (b1) コンテンツ作成のチュートリアル(乱数の利用)
- (b2) コモンソースの利用例
- (b3) 自由記述と数式による解答の例
- (b4) 実験等の測定値を利用する教材
- (c) 他の解答方法
- (d) その他,修正変更点など
注:アプリはサーバー上にテンポラリーフォルダーを作成します。そのフォルダーの有効期限は最短24時間となっています。
オーサリングツール は,3つのタブと仕上がりイメージを表示するパネルで構成されています。簡単に,各タブの機能の解説を記します。
(1) メイン タブ
メインタブには,タイトルの決定,採点サーバーの指定,キーワードの指定(現在はとくに利用していません),以前作成したSCORMファイルの読み込み,SCORMファイルの書き出しの機能があります。右側には問いの内容や各問いに共通するコード,正解や乱数等の設定状況が表示されます。「Account」ボタンは,利用者のパスワードやメイル等の設定をするためのものです(利用の仕方はこちら)。
「server」は,解答の保存や採点の差配をするもので,現在 kanaike.susi.oita-u.ac.jp のみです。コンテンツを置く LMS サーバーが(WebClassやブラックボード,Moodleのあるサーバーが),httpsであれば https://kanaike.susi.oita-u.ac.jp を,httpであれば http://kanaike.susi.oita-u.ac.jp を指定してください。keyword には現在機能を持たせていません(将来的に問題バンクでの検索に利用したいと考えています)。
「SCORM File」は以前に作成したSCORMファイルをローカルからアップロードして,再編集する時に使用します。作成するSCORMファイル自体がコンテンツの保存ファイルとなっています。
「SCORM作成」ボタンを押すと,SCORMファイル(zipファイル)が作成され,ボタンの右側にリンクが表示されます。リンクをクリックして,ファイルをダウンロードしてください。
右側のテキストを表示しているエリアは,問題の構成情報が表示されています。採点サーバー,採点スクリプト,解答の設定内容などが表示されています。これは SCORM コンテンツに含まれる configfile.xml の内容を表示しています。ただし,実際の configfile.xml では,正解等のいくつかの要素が暗号化されます。
プレビューボタンを押すと,仕上がりのコンテンツが(ブラウザの設定によりますが)別なタブか窓で表示されます。下図は数式で解答する問題タイプのプレビューです。
数式で解答する問題では,実際に解答して,採点の機能を試すこともできます。コンテンツを開く際に,「SCORMと接続されていません」等の警告がありますが,これはコンテンツがLMSに配置されていない為で,問題ありません。乱数が使用されていれば,置き換えられて表示されます。再度プレビューを開いて表示させても,乱数の部位の表示は変化しませんが,これは乱数を決定する際に,コンテンツのIDと解答者のIDを合わせたものを利用するためです。プレビューではコンテンツのIDしか利用できませんが,そのため常に同じ乱数の値が採用されます。具体的には,コンテンツのIDと解答者のIDを文字として結合したものをMD5にかけて,そこに現れた数字をもとに乱数の値を決定しています。Moodle 等のLMSにコンテンツが配置されたときには解答者のIDが利用できます。その場合の乱数の値は,解答者の側から見ると,それぞれのコンテンツで固定されます。つまり再度コンテンツを開いた際にも同じ乱数の値が使用されます。また解答者は同じ乱数となるグループに分かれますが,このグループ分けは,コンテンツが変われば変化します。
(2) 問題文 タブ
問題文タブでは,問題文章の作成をします。HTMLによる文の記述,問題文の縦サイズの変更,利用する各種メディアファイルのアップロードなどの機能があります。
左側のテキスト記入のエリアに,問題文を,HTMLで記入します。下方にある「更新」ボタンをクリックすると真ん中の問題文イメージの表示エリアが更新されます。問題文の横サイズは 640px です。縦は,ラジオボタンで変更できます。
問題文中で数式を記入する場合には,Mathjax の機能を使用します。$\frac{1}{2}$ と記入すれば \(\frac{1}{2}\) と表示されます。独立した数式を記入する時は \[ c^2 = a^2 + b^2 \]
などと記入すると下記のように表示されます。
\[ c^2 = a^2 + b^2 \]
文中で使用する画像は,右側にある「登録」の機能を利用して,サーバーにアップロードし,使用します。画像や動画ファイルはコンテンツ内に含まれるので,サイズの大きなファイルを利用するとコンテンツのサイズも大きくなります。送信したファイルは問題文がある(index.html がある)フォルダーと同じ場所にコピーされます。それで特にパスを指定することはなく,ファイル名だけで使用できます。音声は mp3,動画は mp4 が利用できます。アップロードしたファイルはチェックして削除することも可能です。
一般的にブラウザの音声制御用のコントローラーはサイズが大きいです。そのためデフォルトのコントローラーは表示せず,小さなサイズの画像に制御の機能を持たせたほうが場所をとりません。それで,制御用のボタン画像を用意しています。オーサリングツールを最初に開いたときのHTML記述を参考にして,ご利用ください。images というフォルダー内に置いてあります。動画用のコントローラーはブラウザのものを使用しても場所をとらず,そのまま使用しても良いと思います。
アップロードしたファイルは右側の枠内にリスト表示されます。これをチェックして「Delete」ボタンを押すと消去されます。
上方にある青い「定型句表示」をクリックすると数式などの記入例が現れます。
version 5 から,乱数的な要素を取り入れました。@rand[0]@ 等の記述をすることで,受講生に対していくつかの異なる値を表示することが可能です。どんな値を表示するかは,次の解答欄タブで設定しますが,数値に限らず自然言語の利用も可能です。
(3) 解答欄 タブ
解答欄タブでは,解答欄を追加して正解をセットします。下図は数式で解答する問い(タイプはAlgEquiv)を作成している画面です。問いのタイプに応じて,設定を入力するパネル(右側)は変化します。左側には解答欄の追加と削除をするボタンや乱数の設定,また受講者の回答を maxima で処理するか, Python で処理するかの決定(自由記述や動画の場合にはこのラジオボタンに関わらずPythonのみ),各回答の処理において共通するソースコードを記入するエリアが並んでいます。共通するコードは,関数や定数の定義に利用することを想定しています。右側のエリアには各問いに関する設定が並びます。採点サーバー(Marking Server)の指定,採点タイプ(AnswerTestType)の選択,採点の際のオプション(AT Option),正解(TAns:teacher answer),受講生の回答を処理するコード(Operation)等の設定をします。Operation に適当なコードを記入して,受講生にメッセージを返すことも可能です。数式の採点であれば,この Operation の処理の後,自動採点の処理が入ります。
問いを作成する時には,最初に回答を処理する言語を選びます(Maxima か Python)。この後「解答欄を追加」ボタンをクリックして,解答欄を問題上に配置します。最初は真ん中に配置されるので,ドラッグするか,座標欄(x,y,w,h)に数値を記入して位置の調整をします。次に, Marking Server を選びます(デフォルトのサーバーで良ければそのまま)。次に AnswerTestType を選びます。これは採点方法のことで,大きくは自由記述や動画,数式の採点があります。図では数式で答えるタイプの「AlgEquiv」を選びました。これは代数的に等価(等号で結ぶことが可能)であれば正解とするものです。他には,計算問題,相対的あるいは絶対的な数値評価等があります(数式の採点はSTACKというプロジェクトの成果を利用しています)。
下図に,自由記述タイプの「none」を選んだ場合の画面をあげます。Operation の記述は Python となります。自由記述のタイプでは,項目をチェックすることで,学生の解答に幾らか処理を加えることが可能です。改行の削除や全角文字を半角に変換する等の処理をチェックして指定します。この処理は受講生が回答する際に適用されます。例えば改行の削除(LFDelete)をチェックすると,受講者は改行を含む回答はできなくなります。
解答欄に付けられる順番は変更が可能です。「順位を上へ」ボタンで,順位を上位に変更可能です。
以下では,順を追ってコンテンツを作成してみます。最初は乱数を用いた数式自動採点の問いを作成します。
まず,メインタブでタイトル等を記入します。”server” とは LMS の server ではなくて,採点スクリプトを実行する server です。keyword は,将来検索用にと考えて用意した項目ですが,まだ特に利用していません。これらの入力欄は書き換えて他にフォーカスを移動させると自動的に更新されます。「SCORM File」は以前に作成したコンテンツを読み込むものです。作成された SCORM ファイル自体が保存ファイルです。「SCORM作成」ボタンはコンテンツを SCORM ファイル (zip) として作成し,そのリンク先を表示します。下記画面では,タイトル,keyword を記入しています。メインタブの各項目の変更は,すぐにコンテンツに反映されます。右側のエリア(コンテンツの問いの構成を記録する configfile.xml の内容が表示されている)をみると,タイトルとキーワードが更新されていることが確認できます(このエリアは編集できません)。
問題文タブに切り替えます。最初に,余分なファイルを削除します。 「Media List」 にあるファイルをチェックして「Delete」ボタンを押すと削除されます。下図は削除された後のメッセージで,削除されたファイルの名前が返されています。
次に,問題の本文を作成します。左上の欄にHTMLコードを記入して「更新」ボタンを押すと右側の欄に反映されます。本文中で数式を書く際に Mathjax が利用できます。例えば $\lambda$
と記入すると \(\lambda\) と表示されます。独立した数式は $$
で囲みます。四角い箱は $\fbox{ (1) }$
と記入して,\(\fbox{ (1) }\) と表示されます。乱数的な置き換えをする部分は,@rand[0]@ のように記述します(何で置き換えるかは,次の解答欄タブで設定します)。rand の添え字はゼロから始まります。
この他の機能としては,問題文で使用する画像ファイルや音声ファイルのアップロードが可能です。「Choose」ボタンを押して,画像ファイルを選択し,「Submit」ボタンで,ローカルのパソコンからアップロードします。アップロードが終了すると,「Media List」にファイル名が表示されます。アップロードしたファイルは本文のHTMLソースと同じフォルダー内にコピーされるので,特別なパスを記述する必要はありません。コンテンツの縦の寸法を伸ばすときには,「文の高さ」ラジオボタンで適当な縦の長さ(ピクセル)を選びます。
次に,「解答欄」タブに移ります。最初に乱数の設定をします。Random のラジオボタンを set か combo にすると,プラスマークが現れます。このマークをクリックして,乱数の記入欄を追加します。欄中のマイナスマークをクリックするとその欄は削除されます。
下図では3つの乱数値を利用しています。それぞれの乱数の候補となる値をカンマ区切りで並べています。set は複数の乱数値を利用する場合に,決まった組み合わせを用いる場合です。下図の場合乱数値の組は,( 60, 1, 60) と ( 120, 2, 120) の二つのセットとなります。 combo なら,8通りの組み合わせとなります。
乱数値の設定はすぐに反映されます。メインタブに戻ってみると,右側に表示されている configfile.xml の中の common タグの値が更新されていることが確認できます。
解答欄のタブに戻ります。Language Type の設定ですが,数式の採点の場合を例にとると,自動採点をする前に Maxima か Python を利用して,受講生の解答等に対していくつか処理(後述する Operation 欄に記述)をすることができますが,その言語を選択します。ここでは Maxima を選んでいます。Common source は,各解答に対する処理に共通する定義や関数などを記述します。
下図では,「解答欄を追加」ボタンをクリックして,完成イメージ上に解答欄を追加しています。追加された解答欄をクリックすすると,右側に現在の解答欄の設定が表示されます(ここでは,デフォルト値)。解答欄はドラッグして位置を自由に変更できます。変更した座標値は,すぐさま入力欄「x,y,w,h」の値に反映されます。下図は解答が自由記述のタイプの「none」の場合です。
次に,採点タイプなどの設定をします。Marking Server は下図では変更せずデフォルトを選択しています。AnswerTestType はドロップダウンリストから,数値の絶対的な大きさの評価をする NumAbsolute を選びました。AT Option を指定していないので,正解との差が 5% 以内であれば正解と評価されます。TAns に正解を記述します。ここでは乱数値を用いて rand[2]/rand[0]*rand[1] と記述しました。Operation には,解答や正解に対する処理を記述します。
STACK の自動採点機能を単純に利用するだけなら,以上で設定は終わりですが,Operation に関して説明を続けます。
Operation のコードでは,あらかじめ役割が決められた下記の変数があります。Python と Maxima で多少異なります。
- rand[] : 乱数値の値が入った配列。
- studentAnswer[] : 受講者の回答が入っている配列。Maxima の場合は数値数式の型。Python の場合は文字列。
- studentAnswerString[] : 受講者の回答が文字列として格納されている配列。Python の場合は利用できない
- sans : 受講者の回答
- tans : 教師が用意した正解
- rawmark : 評点の基となる値。0 から 1 の範囲の値を設定する。これと配点をかけた値を四捨五入した整数値が評点となるが,通常は Operation 内で値を設定する必要はない。この後の STACK による自動採点処理で 0 か 1 に設定される。Operation で値を設定すると,STACK の自動採点処理を実施しない。
- feedback : 受講生に返すメッセージ。回答が締め切られ,採点結果を知らせる状態のときにはじめて返される。
- tips : Python のみの変数(Python のリスト変数)。受講生に返すメッセージ。コンテンツの設定に関わらず必ず受講生に返す。
- status : Python のみの変数(連想配列,Python の dictionary)。受講生には返さない。NLsheet や NLmark で利用する。回答の内容から,情報を抽出し,採点に利用することを想定している。statistics というキーに’no’を設定すると,解答人数などの統計的な情報を受講生に返さない。
sans, tans, rawmark, feedback, status の値を, Operation コードの中で定義すると,この Operation コードの後の処理でその内容が読み取られます。とくに,tans と sans は STACK の数式自動採点で利用されます。そのため,これらが未定義であると数式の自動採点が実行できません(NoneEvaluate の場合は tans が空白でもOK)。数式の自動採点を実行しない自由記述や動画による回答の場合には正解が空欄であっても問題にはなりません。
上記の Operation コードの場合の処理の全体のコードを例として挙げます。受講生は 数値 2 を回答しています。
display2d:false;
rand[0]:'(120);
rand[1]:'(2);
rand[2]:'(120);
studentAnswer[0]:'(2);
studentAnswerString[0]:"2";
tans:'(120/120*2);
sans:'(2);
rawmark: "";feedback: "";
sans:''sans;
tans:''tans;
if sequal("sans", string(sans)) then sans:"null";
if sequal("tans", string(tans)) then tans:"null";
if rawmark="" then rawmark:"null";
if sequal("rawmark", string(rawmark)) then rawmark:"null";
if numberp(rawmark) then rawmark:string(rawmark);
if sequal("feedback", string(feedback)) then feedback:"null";
printf(false,"array('sans'=>'~a', 'tans'=>'~a', 'rawmark'=>'~a', 'feedback'=>'~a')", sans, tans, rawmark, feedback);
前半では,乱数値の設定と解答欄の値の取り込み(問いはひとつのみなので,この問いの解答として 2 が読み込まれているだけですが),正解と解答の定義があります。正解に含まれる乱数の置換もなされています。そのあと Operation コードが続きます。sans:''sans;
は Maxima としての最終的な式の評価です。Operation コードの後は,それ以前に定義された変数の値の読み取りです。最後に文字列として sans, tans, rawmark, feedback の値を書き出して PHP に渡します。このうち sans, tans の値はこの後の数式自動採点処理で利用されます。ここでもし,rawmark に値(PHPの数値)が設定されていたら,この後の数式自動採点処理は行われません。
Operation のコードの初期の内容は,採点を担当するサーバーによってカスタマイズ可能です。初期のコードの中に注釈などを記述して,それぞれのサーバーでどんな機能が用意されているのか,説明することを想定しています。また,Language Type の設定が Maxima か Python の何れかによって,初期コードが異なります。
数式採点の場合は,Common source と Operation は同じ言語にする必要があります。自由記述や動画の採点処理の場合は,Language Type に関わらず,Operation の言語は Python になります。Language Type が Maxima であれば,Common source のコードは処理に取り込まれません。Common source の挿入位置は,解答欄の値が取り込まれた直後です。
解答欄タブの解説に戻ります。
回答方法のタイプは AnswerTestType ドロップダウンリストで選びます。テキストで回答するタイプとして,none, tex, dictation, selection があります。none は汎用的な自由記述のタイプでプログラムソースなども記入可能な解答欄です。tex は tex の記述が利用できるタイプで化学式等が記入可能です。dictation は英語などの分かち書き言語の聞き取り用で,採点の際に自動的に,単語数のカウントや,解答者が正解に現れない単語を解答した場合に色分けして赤く表示する機能があります。Selection は選択枝です。バイナリファイルで回答するタイプとして,video があります。これは動画で回答するタイプですが,jpeg や png であれば,静止画の回答も可能です。(2秒間の動画として保存されます)。Expression は数式で解答するタイプです。Expression の中で良く使用するものをあげます。
AlgEquiv は典型的な物理の評価方法で,正解と解答が恒等式であれば正解とします。数学の計算問題のように,最後まで式変形がなされているかどうかが問題となるときには, EqualComAss を選びます。FacForm は因数分解ですが,AT Option に主変数を指定します。他に,よく利用するものとしては,数値の絶対精度を比較する NumAbsolute と,相対精度で比較する NumRelative があります。それぞれ,AT Option に許容範囲を指定します。数式の評価方法の多くは STACK というプロジェクトから借用しています。詳細は stack のサイトを参照してください。STACK 由来でないものとして,Dimension と NoneEvaluate があります。Dimension は次元を答えるタイプで,L と M と T とその指数だけを用いて回答します。NoneEvaluate は実験の測定データなどを入力するもので,自動採点はなされません。点数もゼロ点です。
数式の記入方法は \(\TeX\) の形式では記入しません。 Maxima の形式に従います。そうは言っても,ほとんど通常の数式の取り扱い方と同じです。四則演算は + - * /
を用います。積が入る場合には必ず *
を挿入します。\(\cos \theta \) は,cos(theta)
と記入します。下付きは特殊で x[1]
と記入すると, \(x_1\) と表示されます。記入方法はコンテンツに解答する場合と同じですので,コンテンツの利用方法のチュートリアルを参照してください。
Operation エリアの鉛筆アイコンをクリックすると,下図のような大きな編集画面となります。コードが長くなる場合にご利用ください。プラスマイナスアイコンは記入欄を伸ばしたり縮めたりするときに利用します。
メインタブに戻ります。
右側にコンテンツの構成情報が表示されています。この欄は編集できません。この中に author_name タグがあります。コンテンツの作成者を示すものですが,このコンテンツは手動採点が可能なコンテンツなので,誰が採点するかを決める必要があって,この author_name タグに記されている人だけがこの教材を採点することが可能で,オーサリングツールによって自動的にログイン者がここに記入されます。他の人が作成したコンテンツを読み込んだ場合も自動的にログイン者に置き換わります。この仕様は問題バンクの NLPortal も同じです。他の人が作った問題であっても,ダウンロードするとダウンロードした人の ID に書き換えられます。 q_ID タグはコンテンツを区別するもので,このオーサリングツールが自動的に付けています。以前に作成したコンテンツを読み込んだ場合には,新しい ID に変更されます。その為,別な問題として認識されることになります。q_ID_e タグには SCORM ファイル作成時に,暗号化された q_ID が書き込まれます。q_ID_e と q_ID が一致しないと,採点処理はなされません。q_ID_e はコンテンツの身元を保証するためのものです。UserID タグには,解答を送信する際に LMS 上の受講者の ID が記入されます。
「Preview」ボタンをクリックし,コンテンツを表示させ,動きを確認します。開く際に,LMS との接続や異常終了関連の警告メッセージが表示されることがありますが,問題ありません。データーベースに記録は残りませんが,コンテンツを LMS に配置した場合と同様に解答可能です。問題文中の乱数値の部分は用意した値の何れかに置き換えられます。どの値が使用されるかは,問題の ID(q_ID) と受講者の LMS 上の ID (UserID タグに記入されるもの)で決まりますが,プレビューの場合には,UserID が利用できないので問題の ID のみで決まります。そのため何度プレビューを開きなおしても問題の ID が同じであれば,同じ乱数の値が採用されます。解答欄をクリックすると左側に解答記入用の窓が開きます。解答方法は学生が回答する場合と同じですので,学生用のマニュアルを参考にしてください。ここでは省略します。
ヘッダーに Mode immediate と表示されていますが,これはコンテンツの作成者(ログイン者)によって異なります。作成者が即時採点(immediate)と後採点(later)のどちらをデフォルトとしているかで異なります。デフォルト値の変更も可能ですし,コンテンツをLMSに配置した後変更することもできます。プレビューの時は数式であれば,いずれも即時採点となります。手動採点のタイプでは Accepted と表示されます。プレビューではデーターベースへの記入はありません。LMS にコンテンツを配置し,学生が回答して初めてデーターベースに記録が残ります。
プレビューを閉じて,メインタブに戻ります。
最後に SCORM コンテンツを作成し,保存します。「SCORM作成」ボタンをクリックすると,ボタンの右側に SCORM コンテンツへのリンクが現れます。リンクをクリックして,ダウンロードします。SCORM ファイルは zip ファイルです。
次回, SCORM ファイルを修正する時には,このメインタブで 「Choose」ボタンを押して,SCORM ファイル(zipファイル)を読み込むと,以前のコンテンツが再現されます。オーサリングツールに読み込むとコンテンツの id が新しくつけ直されます(別のコンテンツとなる)。他の人が作成したコンテンツを読み込んだ場合も id は新しく付け直され,また作成者はログイン者に変更されます。
続いて,Common source 欄の利用方法を解説します。下記のコンテンツでは,変数 C を Common source 欄で定義して数値を代入し,この変数 c を使用して正解を定義しています。採点は数値による相対的な評価(NumRelative)で,AT Option の指定により,正解から1%以内であれば〇が付きます。
採点用のツール(NLsheet)で,コモンソースの取り扱いを見てみます。下図では受講者が 469 と回答して,正解となっています。
Operation ボタンを押して,処理コードを表示させます。
コードの部分を抜き出しました。途中に Common source が差し込まれています。下記のコードの結果得られた tans,sans が自動採点に利用されます。
display2d:false;
studentAnswer[0]:'(469);
studentAnswerString[0]:"469";
tans:'(c/(639*10^3));
sans:'(469);
c:2.99792458*10^8;
rawmark: "";feedback: "";
sans:''sans;
tans:''tans;
if sequal("sans", string(sans)) then sans:"null";
if sequal("tans", string(tans)) then tans:"null";
if rawmark="" then rawmark:"null";
if sequal("rawmark", string(rawmark)) then rawmark:"null";
if numberp(rawmark) then rawmark:string(rawmark);
if sequal("feedback", string(feedback)) then feedback:"null";
printf(false,"array('sans'=>'~a', 'tans'=>'~a', 'rawmark'=>'~a', 'feedback'=>'~a')", sans, tans, rawmark, feedback);
上記のように,適当な定数や関数を Common source で定義しておいて,正解や Operation コードにおいて,利用することが可能です。Python の場合は,NLportal にある例をご参照ください。
次に,自由記述と数式による解答の例をあげたいと思います。下図のようなコンテンツを作成します。問1は自由記述で解答し,問2は数式で解答します。
以下の図は,問1の設定を表示しています。AnswerTestType は none を選びました。Regulation の設定はとくにしていませんが,この Regulation とは,学習者の解答に加える簡易的な処理のことです。LFDelete をチェックすると改行を含む回答はできなくなります。問題作成者が設定する正解にも同じ Regulation が適用されます。Operation はデフォルトのコードのままです。none であれば,Python のコードとなります。コードの内容を書くと,まず rawmark,feedback には ‘null’ という文字列を設定していますが,このように設定すると最終的に null 値となります。tips は要素を持たないリストです。また tans と sans が一致した場合には, status に ‘coincide’ という key を設定し,値を yes とするように書いています。status は学習者に返しません。先生用の値で,採点ツールで確認できます。採点の際のヒントに利用することを想定しています。学習者に何かを返す場合には feedback か tips に値を設定します。feedback は学習者に結果を返す設定にしなければ返すことはありません。それに対して tips は必ず学習者に返します。ここではやっていませんが rawmark に値( 0 から 1 まで)を設定すると,点数が確定します。自由記述であっても,即時採点となります。rawmark に数値が設定されなければ,たとえ 正解と解答が一致していても,即時に解答者に正解であることを知らせることはありません。このデフォルトのコードは,とりあえず解答を受け取り,学生に何かのメッセージを返すこともなく,手動採点にすべてをゆだねるという内容です。
none は自由記述の解答で,デフォルトでは手動採点ですが,そのため正解に重要な意味はありません。この問いでは他にも正解があります。例えば正解のヒントとして”物質波かドブロイ波が正解”と「正解」欄に記入しておいても結構です。
Search は採点の際に過去の解答の履歴を参照して採点するかどうか示します。この値は自動的に決まるもので,AnswerTestType が video,NoneEvaluate であるとき,また正解が studentAnswer を用いて定義されているときには,no となります。video の場合は検索することに意味がありません。NoneEvaluate は測定データの入力等を想定しているので,そもそも正解が存在しません。studentAnswer を用いて定義されているときには,他の解答欄の値を参照して正解を定義するので,解答者によって正解が異なるため検索しません。乱数 rand を用いて定義された場合も正解が複数となりますが,この場合は過去の解答を検索します。その理由は履歴を検索する時には,解答だけでなく乱数値を合わせて検索する仕様となっているためです。
2問目の解答欄の設定です。AnswerTestType として AlgEquiv を選択し,TAns 欄に h/p
と記入しました。Operation は default のままです。このような物理のコンテンツの場合には,解答が正解と恒等式であれば正解と判断しますので, AlgEquiv が良いと思います。
下図のような,実験の測定値を入力して,その処理が正しいかどうかを判定する教材を作成します。このような場合,解答者によって正解が異なります。他の解答欄の値を参照しながら正解を準備するような処理が必要となります。コンテンツでは解答欄の1から5番に,測定値を入力して,5と6番で平均値と偏差を回答し,この二つの解答を判定します。
下図は長さの測定値を入力する解答欄(問1)の設定を表示しています。AnswerTestType は NoneEvaluate を選択しています。これは採点の際に点数に含まれません。TAns はとくに設定しません。Operation のコードはデフォルトのものです。そこにある $sans や $tans は解答や正解が文字列として代入されている変数です。この Operation コードの記述はとくに採点処理の上で意味はありませんが,例えばコードを改編して,入力された測定値が標準的な値から極端に外れたものであるような場合に, feedback に値を設定することで,学生に注意を促すようなことは可能です。
下図は問6の設定です。Tans 欄には何も記入せず,Operation コードの中で tans を定義します。測定値から平均値を求めてそれを tans として設定しています。測定値は studentAnswer[] という配列に入っています。配列のインデックスが問の番号とずれることに注意してください。studentAnswer[] のインデックスは0から始まります。endcons は配列の最後尾に要素を追加するという命令です。コードの中で rawmark,feedback は何も記述がないので,null 値が設定されます。
operation コードを組み込んだ問6の処理全体の例を下記にあげます。コードの先頭の所で,他の解答欄の値が studentAnswer[] に取り込まれています。バイナリーファイル(現在は動画と画像ファイルのみ)以外は,studentAnswer[] に取り込まれます。
display2d:false;
studentAnswer[0]:'(105.80);
studentAnswerString[0]:"105.80";
studentAnswer[1]:'(105.78);
studentAnswerString[1]:"105.78";
studentAnswer[2]:'(105.84);
studentAnswerString[2]:"105.84";
studentAnswer[3]:'(105.74);
studentAnswerString[3]:"105.74";
studentAnswer[4]:'(105.79);
studentAnswerString[4]:"105.79";
studentAnswer[5]:'(105.79);
studentAnswerString[5]:"105.79";
studentAnswer[6]:'(0.04);
studentAnswerString[6]:"0.04";
tans:'();
sans:'(105.79);
rawmark: "";feedback: "";
sans:''sans;
tmplist:[];
n:5;
for i:0 thru (n-1) do tmplist:endcons(studentAnswer[i],tmplist);
sum:0;
for i in tmplist do sum:sum+i;
tans:sum/n;
if sequal("sans", string(sans)) then sans:"null";
if sequal("tans", string(tans)) then tans:"null";
if rawmark="" then rawmark:"null";
if sequal("rawmark", string(rawmark)) then rawmark:"null";
if numberp(rawmark) then rawmark:string(rawmark);
if sequal("feedback", string(feedback)) then feedback:"null";
printf(false,"array('sans'=>'~a', 'tans'=>'~a', 'rawmark'=>'~a', 'feedback'=>'~a')", sans, tans, rawmark, feedback);
上記のコードで定義された tans と sans が NumAbsolute 判定に渡されます。
解答方法には選択肢も利用できます。下図はその例です。まず,AnswerTestType として Selection を選びます。次に,ドロップダウンリストから選択肢に付けるラベルを決めます。これは,先頭に付ける 1,2,3 … や,a,b,c … 等の記号のことです。後は,表示するラベルと正解をクリックして設定します。
TeX を利用した解答も可能です。AnswerTestType として tex を選びます。数式での解答とは違って,解答は TeX のソースを入力します。化学式を答えるような場合に利用できます(mhchem というマクロが読み込まれています)。下図は解答欄を設定する所です。
下図は,「化学式の例」をクリックして,入力用のヒントを表示させたところです。
下図は動画用いて回答するコンテンツの場合です。AnswerTestType として video を選びます。正解は設定しません。採点の参考にするために,出題意図などを記入します(空白でも可)。記入した内容は受講生には見えません。動画の制限時間を指定してください。長すぎる回答動画はこの制限時間でカットされます。
下図にデフォルトの Operation コードを表示しています。一行目にコメント文がありますが,一行目の文に pass-through という文字列が含まれていたら,それ以下のコードを実施しません。つまりデフォルトのコードは何もしないコードとなっています。このコメント文から pass-through という文字列を削除すると,それ以下のコードを実行します。2行目以降のコードは,base64変換された回答の動画ファイルを元のバイナリーファイルに戻して書き出して,その動画の時間を受講者に返す(tips に値を設定する)という内容です。
プレビューで回答してみたところです。あらかじめ撮影された動画ファイルをアップロードして回答します。jpeg と png であれば,静止画の回答も可能です(2秒の動画に変換されます)。egret サーバーでは,ffmpeg が利用できます。