Tag Archives: SCORM1.2

SCORM1.2コンテンツ開発 実践

SCORM1.2 LMSがサポートするcmi.core要素を取得したい

cmi.core._children を利用すると、LMSがサポートするcmi.core要素を一覧で取得することができます。動作させるLMSで、どの要素が利用できるか、一つの目安になりますが、取得できた要素が、正しく動作するかまでは判断できません。LMS内で要素が存在しているか、していないか、分ることはそこまでです。

書式

LMSGetValue(“cmi.core._children”);

戻り値
カンマで区切りで取得できます。

student_id,student_name,lesson_location,credit,lesson_status,entry,total_time,lesson_mode,exit,
session_time,score

動作例

サンプルコンテンツ
SCORM12_cmi_core_children.zip

{tab=SCORM Cloud}
すべて対応

student_id,student_name,lesson_location,credit,lesson_status,entry,total_time,lesson_mode,
exit,session_time,score

{tab=Moodle2.3}
すべて対応

student_id,student_name,lesson_location,credit,lesson_status,entry,score,total_time,lesson_mode,
exit,session_time

{tab=ILIAS4.2.1}
すべて対応

student_id,student_name,lesson_location,credit,lesson_status,entry,score,total_time,
lesson_mode,exit,session_time

{tab=Moodle+ELECOA}
動作せず

※ELECOAのバージョン 2012年6月12日版{/tabs}

cmi.core._childrenから得られた、要素の動作状況

対応 ○ 未対応 ×

cmi.core._children SCORM Cloud Moodle2.3 ILIAS4.2.1
student_id
student_name
lesson_location
credit
lesson_status
entry
score
total_time
lesson_mode
exit
session_time
SCORM1.2コンテンツ開発 実践

SCORM1.2 学習者の氏名を取得したい

cmi.core.student_name を利用すると、学習者の氏名を取得することができます。
書式

LMSGetValue(“cmi.core.student_name”);

戻り値
姓(lastName)、名(firstName)の順番でカンマで区切られます。

Taguchi,Kunihiko

動作例

サンプルコンテンツ
SCORM12_student_name.zip

LMSのアカウント管理で、名(firstName)+姓(lastName)の順序で管理されていても、SCORM上では、姓(lastName)+名(firstName)の順序になるところが、少しまぎわらしいかもしれません。

{tab=SCORM Cloud}

アカウントの登録状態

{tab=Moodle2.3}

アカウントの登録状態

{tab=ILIAS4.2.1}

アカウントの登録状態

{tab=Moodle+ELECOA}
ELECOAでは、ユーザ名を取得します。ユーザ名は、氏名ではないので、不具合の可能性もあります。

アカウントの登録状態

※ELECOAのバージョン 2012年6月12日版
{/tabs}

SCORM1.2コンテンツ開発 実践

SCORM1.2 APIWrapper、SCOFunctionsを利用したSCOの起動と終了

APIWrapper.js、SCOFunctions.jsを利用して、簡単なSCOを作成してみましょう。

SCOのHTMLファイルにAPIWrapper.js、SCOFunctions.jsを読み込みます。

<script language="JavaScript" src="APIWrapper.js"></script>
<script language="JavaScript" src="SCOFunctions.js"></script>

APIアダプタの探索から、LMSInitialize()の処理は、onload時にloadPage()を実行します。

<script language="JavaScript">
window.onload = function(){
loadPage();
}
</script>

loadPage()で、APIWrapper.jsのメソッドが呼び出され、APIアダプタのパスの取得、LMSInitialize()の実行、cmi.core.lesson_statusをincomplete、学習時間を計測するタイマーが開始されます。

終了時は、unloadPage()を実行します。

<script language="JavaScript">
window.onunload = function(){
unloadPage();
}
</script>

unloadPage()で、cmi.core.exitをlogout、タイマーを終了して保存、LMSCommit()、LMSFinish()が実行されます。

このように、ライブラリを利用すると簡単に作成することができますが、どういったメソッドがあり、機能するかは、コードを読んで把握する必要があります。

SCORM1.2コンテンツ開発 実践

SCORM1.2 APIWrapper、SCOFunctionsの概要

便利なライブラリ

APIアダプタとやり取りを行う、SCOは、定番的な処理がいくつかあります。そうした処理は、毎回ゼロからプログラムを書くのではなく、まとめておいた方が便利です。インターネット上には、そうしたライブラリを配布しているサイトも存在しています。

ADLが配布しているサンプルコンテンツを見るとそのような処理をまとめた
APIWrapper.jsSCOFunctions.jsというJavaScriptの外部ファイルを利用しています。

APIWrapper.js APIアダプタの階層パスの取得から、LMSInitialize()などメソッドを実行するときの、エラー処理が追加されています。実用上、最低限の処理のかたまりです。
SCOFunctions.js APIWrapperに対してさらに機能拡張として処理が付加されています。例えば、LMSInitialize()を実行したらcmi.core.lesson_status(学習状況のステータス)をincomplete(未修了)にしたり、起動したSCOの学習時間を計測するスクリプトが書かれています。

ライセンスは、基本的に自由に利用できる独自ライセンスですが、API Wrapperは、2011年9月7日、手直され、クリエイティブコモンズ(CC BY-SA 3.0)として単独で公開されました。ADLが公開しているサンプルファイルは、それ以前に作られたものなので、ライセンスは独自ライセンスのままです。

手直しは、JavaScriptのアラートウインドウが、console.logに変更されています。IE7など古いブラウザは未対応のため旧APIWrapper.jsの方がいい場合があるかもしれません。
SCOFunctions.jsは、独自ライセンスのままです。CCの配布はないようです。

ADLによるサンプルコンテンツの配布
SCORM 1.2 Content ExamplesのSCORM 1.2 Content PackagesにSCOFunctions.js、SCOFunctions.jsを含むサンプルがあります。
SCORM Version 1.2 Resources ダウンロード

ADLによるAPI Wrapper ファイルの配布 (クリエイティブコモンズ版)
ADL Releases SCORM Version 1.2 and SCORM 2004 API Wrapper Files ダウンロード


APIWrapper、SCOFunctionsのライセンス

ADLのサンプルで使用されている、APIWrapper、SCOFunctionsの独自ライセンスの条文です。

Concurrent Technologies Corporation (CTC) grants you (“Licensee”) a non-exclusive, royalty free, license to use, modify and redistribute this software in source and binary code form, provided that i) this copyright notice and license appear on all copies of the software; and ii) Licensee does not utilize the software in a manner which is disparaging to CTC.

(意訳)
コンカレントテクノロジーコーポレーション(CTC) は、あなたに包括的、ロイヤルティフリーとして、このソフトウェアを以下の条件のもとで、ソースとバイナリコードの修正と再配布のライセンスを保証します。
i) この著作権表示とライセンスは、コピーしたソフトウェア上にすべて表示します。
ii) ライセンス授与者がCTCに不利益な形でソフトウェアを使用しない。

訳の内容保障はいたしません、参考程度にして判断してください。

SCORM1.2概要

SCORM1.2 APIアダプタの状態遷移とSCOのメソッド

SCOとLMS間のデータのやり取りは、「SCORM1.2 ランタイム環境の概要」で説明したように、SCOは、APIアダプタに接続してデータの送受信を行います。SCOは、APIアダプタに対して次のJavaScriptのメソッドを利用することができます。これらのメソッドは、LMSが用意するものです。

APIメソッド
意味
LMSInitialize() LMSとの通信セッションを開始する
LMSFinish() LMSとの通信セッションを終了する
LMSGetValue() LMSから値を取得します
LMSSetValue() LMSに値をセットします
LMSCommit() すべてのデータを永続化(サーバー側に保存)します
LMSGetLastError() 最後のAPIの呼び出しに起因するエラーコードを返します
LMSGetErrorString() 指定されたエラーコードの文字列を返します
LMSGetDiagnostic() 最後に発生したエラーについての詳細情報を返します



APIアダプタとSCOとの通信は、3つの状態遷移からなります。

  • 未接続
  • 接続中
  • 切断

それぞれの状態で、利用できるメソッドが異なります。

仕様書では、Not Initialized、Running、Terminatedという風にAPIアダプタの状態遷移が分かれています。
findAPI() は、擬似コードです。APIアダプタのメソッドではありません。


未接続 APIアダプタへの接続処理

学習者がSCOを選択しようとしたとき、そのSCOはAPIアダプタに対して、まだ未接続状態です。接続状態になるには、次の2つの処理が必要です。

  • APIアダプタのJavaScriptの階層パスを取得する
  • LMSInitialize()を実行して接続を確立する

SCOがAPIアダプタに接続しようとするとき、まだLMSInitialize()を実行することはできません。実行するうえで、SCOはLMSのLMSInitialize()メソッドの階層パスが分らないためです。そのため、階層パスを調べ、場所が分った段階で、LMSInitialize()を実行します。そうすることで、「未接続」から「接続中」へと状態を遷移させることができます。

SCORMコンテンツを作成するうえで、APIアダプタのパスの取得は、つまづき易いポイントだと思います。


通信セッション中

「接続中」の状態になったら、LMSGetValue()、LMSSetValue()を使いLMSとデータのやり取りができるようになります。どのようなデータを取得、セットするかは、データモデル要素を利用していきます。

とくに、LMSSetValue()は、APIアダプタに対して値をセットするもので、クライアント側の処理となります。必ずしもサーバー側にデータがセットされるとは限りません。そのため、きちんとサーバー側にデータを渡すように、LMSSetValue()を実行した後に、LMSCommit() を実行すると、その時点、クライアント側に溜まっている情報が、サーバ側に渡ります。プッシュする確定ボタンみたいなものです。

通信セッションの終了処理

SCOを終了するときは、LMSFinish()を実行して「切断」します。仕様上では、LMSFinish()を実行すると内部では、LMSCommit()が自動的に実行されます。そのため、むやみに?データをセットしたからといって、LMSCommit()をする必要はそれほどありません。※ただLMSのデフォルトの動作は、LMS依存を引き起こす原因に繋がるため、安心ではありますが。

「切断」状態は、LMSFinish()を実行したときの戻り値により実行できるメソッドです。

エラー情報の取得

LMSGetValue()などを実行したとき、存在しないデータモデル要素や、型が間違っていると、LMSは、エラーコードを戻します。LMSGetLastError()、LMSGetErrorString()、LMSGetDiagnostic()の引数に、そのエラーコードを渡すと、詳細情報など知ることができます。