SCORMに準拠したeラーニング教材を作る方法
本記事では、SCORM1.2を使ったlearningBOX向けの教材作成例をご紹介します。一部、learningBOX以外では通用しない例もありますので、ご注意ください(その場合は注意文を記載します)。また、本記事はlearningBOX 2.16.14で検証しており、古いバージョンや今後リリースされるバージョンでは同一の結果にならない場合があるので、ご了承ください。 learningBOXにおけるSCORM教材とは learningBOXでは、SCORM 1.2に準拠した教材をアップロードして利用できます。(※learningBOX 2.16.14時点では、複数のSCOからなるSCORMのアーカイブ(ZIPファイル)のアップロードには対応していません。また、SCORM 2004など、1.2以外のバージョンのSCORMにも対応していないので、ご注意ください) 目次に戻る 最小限のSCORM教材【ファイル構成】 learningBOXにおいて、起動ファイルがindex.htmlである場合は、マニフェストファイル (imsmanifest.xml:ZIPファイルの中の構造を示すファイル) は不要です。そのため、index.htmlファイルだけをZIPで圧縮すればSCORM教材として成立します(ただし、ほとんど全てのLMSにおいてimsmanifest.xmlファイルは必須です。QuizGeneratorやCardGeneratorなどでは、互換性のためにimsmanifest.xmlを出力しています。) ZIPファイル作成時の注意 教材をZIPファイルにまとめる際は、以下のようにファイルを選択して圧縮してください。悪い例のように、フォルダを選択して圧縮すると余分なフォルダ階層ができ、トラブルの原因となる場合があります。また、Macの場合、OS標準のZIPアーカイブ機能を使うと余分なファイルが保存されるので、不要なファイルが紛れ込む問題!? Macでzip圧縮する時に注意しておきたいことなどを参考に圧縮ください。 APIの探索 SCORM教材において、起動ファイル(index.htmlなど)がロードされると、SCORMのAPIを探索します。SCORM1.2において、APIの名称は“API”です。教材の入っているiframeもしくはframeから上位階層に向かって探していくことで、必ず発見できます。learningBOX2.16以降では、教材のプレビュー画面においてもAPIは提供されていますが、プレビュー画面では成績を保存しない仕様となっています。 コード例 onloadでAPI探索し、教材のAPIという変数でアクセスできるようにします。APIが見つかった場合は API Foundと、見つからなかった場合はAPI not Foundとコンソールに表示します。 (参照元)gistのURLhttps://gist.github.com/ynishi2014/8d1d951966d12d49c1eee898b4bacc17 実行例 learningBOXに搭載した場合は、SCORMのAPIを見つけることができるので、API foundと表示されます。 ローカルドライブ上などで実行するとAPIを見つけることができないので、API not foundと表示されます。 LMSInitializeとLMSFinish APIを発見したら、LMSInitializeを実行します。学習完了時にLMSFinishを実行します。QuizGeneratorにおいては採点結果表示のタイミングでLMSFinishを実行していますが、learningBOXで作成できるほとんどの教材では、教材のHTMLのonunloadのタイミングでLMSFinishを実行しています。LMSInitializeを実行する前やLMSFinishを実行した後は、成績を送信できないのでご注意ください。 コード例 (参照元)gistのURLhttps://gist.github.com/ynishi2014/d44930df2eddaa2f4140aab078e5e86f 実行例 learningBOXで実行すると、以下のように表示されます。これだけでもSCORM教材としては成立しているのですが、学習ステータス(cmi.core.lesson_status)を更新していないため、learningBOX上では成績が残らないように見えます。これはlearningBOXにおいて、cmi.core.lesson_statusがbrowsedの成績が無効な成績として取り扱われているからです。 合格になるだけのSCORM教材 LMSSetValueにて、cmi.core.lesson_statusにpassedを設定すると、合格になります。 コード例 (参照元)gistのURLhttps://gist.github.com/ynishi2014/4eb9a00dff3ff867d51192548471a919 送信できるステータス 成績としてcmi.core.lesson_statusに送信できる値は、以下のものがあります。 incomplete: 学習中 completed: 学習済 passed: 合格 failed: 不合格 browsed: 表示されない状態になります。 送信しなかった場合の挙動 成績を送信しなかった場合、以下のようになります。 初回学習:browsedになる(表示されない状態になる) 2回目以降の学習:前回の学習時の成績を引き継ぐ そのため、成績の判定が行われる前に教材を閉じた場合の挙動などに、注意が必要です。QuizGeneratorであれば冒頭でcmi.core.lesson_statusにbrowsedを設定しているので、解答を開始する前に閉じた場合にはbrowsedが記録され、成績が残っていないように見えます。 動作確認するには 利用予定のLMSで確認するのがベストですが、learningBOXであれば10名まで無料/無期限でご利用いただけますので、SCORMの教材開発・動作確認環境として活用しやすいのではないでしょうか。 APIコールを可視化 APIの呼び出しを可視化することで、開発効率を向上できます。記事の分量の都合がありますので、別の記事にてまとめさせていただきます。 目次に戻る SCORM1.2の仕様内で送信できる情報 先ほど述べたステータス(cmi.core.lesson_status) の他にも以下のような成績を送信できます。これらを送ることで学習の様子を詳細に知ることができ、学習状況の分析、学習者への適切なフィードバック、教材の改善などにつなげることができます。 得点 (cmi.core.score.raw) 得点です。SCORM1.2では、0〜100の整数を“文字列”形式で設定できます。 例API.LMSSetValue(“cmi.core.score.raw”, “100”);API.LMSSetValue(“cmi.core.score.raw”, score.toFixed(0)); 独自拡張 learningBOXにおいて、100を超える得点を認めています。例えば、105や400は有効な得点として認めています。しかし、負の数や小数は認めていないので、ご注意ください。また、learningBOX以外のLMSにおいて、100を超える得点はエラーとなります。 時間 (cmi.core.session_time) 学習時間です。learningBOXの場合、LMSInitializeとLMSFinishを実行すれば、自動的に計測されるようになっています。教材を開いてから閉じるまでの時間ではなく、より正確な学習時間を計測する場合は、教材内で計測して送信してください。QuizGeneratorでは、問題を解き始めてから結果表示画面が出るまでの時間、動画教材では動画を再生している時間だけを送信するようにしています。以下のようにすると、1時間2分3秒となります。 例API.LMSSetValue("cmi.core.session_time", "01:02:03"); 設問毎の情報 cmi.interactions.nの子項目です。nは、0から順に指定してください。1から始める、数字を飛ばす、小さな番号に戻るといった使い方は禁止されています。 ID (cmi.interactions.n.id) IDです。成績詳細画面には、以下のスクリーンショットの赤枠内のように表示されます。しかし、負の数や小数は認めていないので、ご注意ください。CSVで成績をダウンロードして使う、APIで成績を取得して使うといった予定がある場合には、適切なIDを指定しておく必要があります。 latency (cmi.interactions.n.latency) 所要時間です。成績詳細画面には、以下のように表示されます。 correct_responses (cmi.interactions.n.correct_responses.m.pattern) 正答例です。複数指定できますが、1つだけ設定される場合が多いように思います。 objectives (cmi.interactions.n.objectives.m.id) 設問ごとのobjective、つまり目的や達成目標などを表します。s:xxxという形式で値を設定するとセクションタグ、q:xxxという形式で値を設定すると設問タグとして、カルテに反映されます。 student_response (cmi.interactions.n.student_response) 学習者の解答内容です。入力した文字列や、選択肢番号などを送信します。 time (cmi.interactions.n.time) 学習時間です。その設問に掛けた時間を送信します。 result (cmi.interactions.n.result) 正(correct)誤(wrong)を送信します。中立(neutral)や、得点を送ることもできます。 目次に戻る learningBOXの独自拡張 通常、cmi.interactions.n.student_responseでは、HTMLを送信することができません。 解答をHTMLで送信する もちろんHTMLのタグを送信することはできますが、成績画面には送信したHTMLタグがそのまま表示されてしまいます。cmi.interactions.n.student_response_format にhtmlを指定すると、cmi.interactions.n.student_responseに送信した値をHTMLとして解釈して表示します。ただしJavaScriptは実行できないよう制限しています。 文字数制限緩和について 開始時刻 / 終了時刻(2.18以降で対応予定) 学習開始時刻と学習終了時刻を記録するための機能です。learningBOX 2.18 以降で使えるようになる予定です。(2022年6月リリース予定) 目次に戻る アンチパターン【過剰なLMSCommit】 LMSCommitを実行すると、LMSSetValueで設定した値が保存されます。多くのLMSでは、LMSSetValueではサーバにデータを送信せず、LMSCommitのタイミングでサーバにデータを送信するようになっています。これは、サーバにデータを送信する処理に掛かる時間が比較的長く、LMSSetValueを実行する度に通信していては処理に時間が掛かってしまうためです。例えば、設問数が100、1問当たりのLMSSetValueの回数が6、通信遅延が10msとすると、100×6×10=6000msとなり、成績送信に6秒掛かることになります。海外からの利用であれば通信遅延が10倍以上になることもあるため、LMSCommitを過剰に実行するべきではありません。 LMSCommitを実行すべきタイミング cmi.core.lesson_statusを送信した後や、全ての成績のLMSSetValueが終わった後に実行すべきです。学習を開始したタイミングでcmi.core.lesson_statusにincompleteを送信し、LMSCommitを実行することで、他の人(教師、管理者など)から見た成績が“学習中”に切り替わります。全ての成績のLMSSetValueが終わった後も、LMSCommit、LMSFinishの順に実行すべきです。(※learnngBOXにおいて、LMSFinishの前にLMSCommitを実行しなくても、成績の送信処理は実行されるので、LMSFinishだけでも構いません) LMSFinishをしない 最後には必ず、LMSFinishを実行してください。SCORMの仕様にて、必ずLMSFinishを実行するよう定められているため、LMSFinishを実行しなかった場合の挙動については保証されません。 実装を確認せずLMSSetValueする SCORM1.2準拠のLMSが、SCORM1.2の全ての仕様を実装しているとは限りません。SCORM1.2の仕様(API)には、実装必須の項目と、実装しなくても許される項目が混在しています。そのため、LMSSetValueを実行する前には、送信しようとしている要素が実装されているか確認すべきです。 目次に戻る 使い方に関して不明点はお気軽にサポートまで learningBOXの使い方について、お困りごとやご不明点等ございましたら、いつでもお気軽にお問い合わせください。 ▼こちらもおすすめ!あわせて読みたい 目次に戻る