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()の引数に、そのエラーコードを渡すと、詳細情報など知ることができます。

SCORM1.2概要

SCORM1.2 コンテンツアグリケーションモデルの概要

コースウェアの作成は、一度の作り切りで終わるものではなく、別のコースウェアを作成するとき、以前作成した学習資源を再利用できれば利便性が上がると思います。SCORMは、コースウェアの概念、学習資源の管理支援、そしてコンテンツの実装に関して、コンテンツモデル、メタデータ、コンテンツパッケージに分類し、これらを総称してコンテンツアグリケーションモデルと呼んでいます。

コンテンツアグリケーションモデルの理解は、再利用するにはどうすれば効率的か?ということを考えると、なぜSCORMは、そのような仕組みなのか、あれこれ注文をつけてくるのか見えてくるかもしれません。


コンテンツモデル

SCORMのコースウェアは、学習資源(SCO、アセット)の集合から成り立っています。新規に学習資源を作ることもあれば、既存のものを再利用して組み立てることもできます。しかし、1つの学習資源が、ほかの学習資源に依存していると、芋づる式に無関係なものまで含まれる危険性があります、そうすると再利用の利便性は落ちてしまいます。そのため、学習資源は、資源間の結びつきは弱く、独立性が高いことが求められます。コースウェアの設計者は、いつか再利用されることを意識して作る必要があります。

こうして作られた学習資源の集合は、どのような順番で提示するか学習の順番を決めます。フラットな並びでも、また1つの学習項目でも構いませんが、本の目次のような、章節項といった入れ子の階層構造も作ることができます。この体系化された構造のことをコンテンツモデルと言います。SCORM1.2では、学習の進行は、上から下へ(章→節→項)とリニアに進んでいきます。

コンテンツモデルは、体系化した目次のような項目のモデルを示しただけです。学習資源との結びつきは、含まれません。コンテンツモデルに、学習資源としてSCOやアセットを集約した状態のことを、コンテンツアグリケーションと言います。



メタデータ

多くのコースウェアを作成して、学習資源が増えてきたら、再利用して新たなコースウェアを作ることは自然なことだと思います。まだ学習資源の数が少ない場合、何がどこにあるのかといった管理で困ることはないかもしれませんが、もし、それが数千、数万とある場合、さまざまなサーバーに分散されている場合、必要な学習資源を見つけるには、どうしたらいいでしょうか?

SCORMは、そのようなことに対して支援するため、1つの画像からコースウェアに対して、メタデータをつける事ができます。メタデータとは、コンピュータが認識できる対象物への意味づけ(属性)です。

例えば、コンピュータは、一枚の画像から、その画像が示す内容までは分かりません。何の絵が描いてあるかまでは分からないわけです。ウサギの絵が必要になった場合、画像に「ウサギ」という意味づけ(属性)が設定されていれば、検索によりその画像を見つけ出すことができます。

SCORMのメタデータは、学習コンテンツの特徴などを示した意味づけとなります。学習コンテンツは、どの言語(Japanese、English・・)で作られたか、シミュレーション型なのかドリル型なのかといった、情報を持たせることができます。

SCORMのメタデータには、割り当てる種類により3種類に分かれます。

  • コンテンツアグリゲーションメタデータ
  • SCOメタデータ
  • アセットメタデータ

コンテンツアグリゲーションメタデータは、1つのコースウェア全体に対する情報です。SCO、アセットのメタデータは、コースウェアを構成する学習資産に対する情報となります。例えば、映像ファイルがある場合、アセットメタデータとして講義タイトル、作成日などを付けることができます。

メタデータは、SCORMの学習コンテンツの動作に直接関係しないため、記述しなくてもLMS上で学習コンテンツは動作します。LMSによっては、メタデータの情報を管理画面に表示するものもあるかもしれませんが、コンテンツリポジトリなどデータベースでコンテンツを管理することで、メタデータの便利さが実感できるかもしれません。

そのため、そのような検索システムを利用しない場合、あまりメリットが享受できないため、メタデータの記述は、省略することもあると思います。

コンテンツパッケージ

コンテンツパッケージは、コンテンツモデルやメタデータの具体的な記述を行い、さまざまなLMSで実行可能なコースウェアのフォーマットを提供することです。

SCORMのコースウェアの作成は、学習資源(SCO、アセット)と、マニフェストファイルに分かれます。マニフェストファイルは、コンテンツモデルなど構造に関するものをXML形式で記述したものです。

学習資源は、基本的に個々が独立しているため、それらをどのように繋げて、制御をしたいのか、そういった記述は、すべてこのマニフェストファイルに記述します。マニフェストファイル1つで同じ学習資源でもコンテンツの挙動はまったく違うものになります。また、このファイルが無ければLMSは、コースウェアとして認識することができません。それだけとても重要なファイルです。

こうして作られたコースウェアは、最後に圧縮フォーマットのZIP形式で1つのファイルにまとめます。このファイルを特にPIF(ぴふ)ファイルといい、LMSにコースウェアを登録するときのファイル形式となります。

SCORM1.2概要

SCORM1.2 ランタイム環境の概要

ランタイム環境

ランタイム環境は、学習コンテンツとLMSとの間で行われる処理に関する内容です。
次の3つから構成されます。

  • 学習コンテンツの起動の仕方
  • SCOとLMSとの間でのデータ送受信の仕方 APIの利用
  • データ送受信で利用される、データモデル要素の提供

LMSは、学習コンテンツを起動するとき、コンテンツアグリケーションモデルのマニフェストファイルに記述されるURLを参照します。

学習コンテンツは、SCOなのかアセットなのかで大きく処理が変わります。SCOの場合、LMS(具体的には、APIアダプタ)に対して、APIを利用して情報の送受信を行うことができます。そのなかで、どのような情報を伝えることができるかを定義したものが、データモデル要素です。

データモデル要素には、学習時間や学習完了などに関する情報が定義されています。そういった要素を組み合わせて、必要な処理を組み立てていきます。

アセットの場合は、そもそもLMSに対してデータの送受信はできません。ブラウザに表示するだけです。※ただしLMS側は、何もデータ送信しない学習コンテンツは、デフォルトの挙動で学習完了などのフラグが立ちます。

このような処理は、次のように表現することができます。おそらく気になるところは、APIアダプタからLMSに対してのデータ送受信でしょうか。この部分は、SCORMでは規定されておらず、LMSの独自仕様として自由に実装することができます。そのため、この部分は、コンテンツ制作者は気にする必要はありません。APIアダプタは、SCOに対してインターフェースの役割をもち、コンテンツ制作者は、APIアダプタとのやりとりだけを考えればいいわけです。

例えば、データモデル要素として仮に○○という情報を、LMSに送信する場合、APIの規定としてLMSSetValueというメソッドを利用します。この引数にデータモデル要素を渡します。SCOから、APIアダプタに渡された○○は、LMSにバトンタッチされていきます。

このように、ランタイム環境は、学習コンテンツの起動からデータの送受信といった一連の動作に関する内容が規定されています。

SCORM1.2概要

SCORM1.2の構成要素

SCORM1.2の仕様構成は、ランタイム環境(RTE あーるてぃーい)とコンテンツアグリケーションモデル(CAM きゃむ)の2つの構成に分けることができます。

学習コンテンツとLMSとの間で、位置関係を大まかに示すとつぎのようになります。

まずこの2つが、どのあたりのことを意味しているのか把握するといいでしょう。

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

SCORM1.2 学習者のStudent IDを取得したい

cmi.core.student_id を利用すると、学習者を識別する一意の値を取得できます。ログインIDを返すLMSが多いですが、一意な文字列であれば何でも良いため、必ずしもログインIDが返されるとは限りません。

書式

LMSGetValue(“cmi.core.student_id”);

戻り値
LMSがログインIDをStudent IDと定めた場合、norausagiでLMSにログインするとnorausagiの文字列を返します。

norausagi

動作例

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

{tab=SCORM Cloud}
ログインIDを返す。SCORM Cloudでは、ログインIDは、登録メールアドレスのため、戻り値はメールアドレスが表示される。

{tab=Moodle2.1}
ログインIDを返す。

{tab=ILIAS4.1.7}
usr_idの値を返す。※ norausagiでログインしている。

ILIASでは、loginではなく、usr_idがcmi.core.student_idとして設定される。(usr_dataテーブル)

{tab=Moodle2.3+ELECOA}
idの値を返す。※ norausagiでログインしている。

ELECOAでは、usernameではなく、idがcmi.core.student_idとして設定される。(mdl_userテーブル)

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