SlideShare a Scribd company logo
1 of 35
Download to read offline
Smelling What The Rock’s Cooking:
Converting SCORM Content to cmi5
George Vilches
xAPI Party - Fall 2021
What We Will be Talking About
● Brief cmi5 overview
● Comparison of standards
● cmi5 CATAPULT tools: Course templates &
Content Test Suite
● SCORM to cmi5 terminology
● Converting existing SCORM content to
cmi5
Background on cmi5
cmi5 is an “xAPI Profile”
● An extra set of rules called a “Profile”
● Ensures plug & play interoperability between learning content and LMSs
● Designed specifically for when a learner launches from the LMS user
interface
Components
● Course package/structure
● Learning Management System (LMS)
● Learning Record Store (LRS)
● Assignable Unit (AU)
Comparison of Key Features
Features SCORM xAPI cmi5
Defined content launch ✔ ✘ ✔
Track “anything” ✘ ✔ ✔
Normalized reporting ✔ ✘ ✔
Mobile applications ✘ ✔ ✔
Distributed content ✘ ✔* ✔
Data portability ✘ ✔ ✔
Extensibility ✘ ✔ ✔
Normalized completion criteria ✔ ✘ ✔
Multiple lesson support ✔ ✘ ✔
When to Migrate Legacy Content to cmi5
● Revising or updating existing content.
● Capturing more detailed learning data from existing courseware.
● Modernizing your training per the DoDI 1322.26 fungible resources.
● Avoiding pop up windows.
The best time is today! Let’s do it.
Use Your Tools
Is your content from an authoring tool?
Is your content based on a known
framework?
They might already publish to cmi5, just
use it.
A Recent cmi5 Win!
Make a Statement Easy as Pie
Publish to cmi5!
cmi5 content
and convert legacy SCORM content
Using course templates to build
cmi5 Course Template Structure
“Tracking Plugin”, A Helper of Helpers
● Wraps raw functionality with common use cases
● Combines independent behaviors
● Adds functionality beyond cmi5 that courses often use
○ Bookmarks
○ Statement batching
● Handles boundary UI/standards cases that are tricky to get right
○ Initialization
○ Exit behavior
● Simplifies error handling
● Models statement generation for Video Profile
SCORM to cmi5 Terminology
SCORM cmi5
Activity (SCO) Identifier Publisher ID
Aggregation / Cluster Block
Launch Data launchParameters
Manifest Course Structure
Resource HREF AU URL
Rollup (partial) moveOn
SCO AU
Manifest Conversion (SCORM, imsmanifest.xml)
<?xml version="1.0" standalone="no" ?>
<manifest identifier="com.scorm.golfsamples.runtime.basicruntime.12" version="1"
xmlns="http://www.imsproject.org/xsd/imscp_rootv1p1p2"
xmlns:adlcp="http://www.adlnet.org/xsd/adlcp_rootv1p2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.imsproject.org/xsd/imscp_rootv1p1p2 imscp_rootv1p1p2.xsd
http://www.imsglobal.org/xsd/imsmd_rootv1p2p1 imsmd_rootv1p2p1.xsd
http://www.adlnet.org/xsd/adlcp_rootv1p2 adlcp_rootv1p2.xsd">
<metadata>
<schema>ADL SCORM</schema>
<schemaversion>1.2</schemaversion>
</metadata>
<organizations default="golf_sample_default_org">
<organization identifier="golf_sample_default_org">
<title>Golf Explained - Run-time Basic Calls</title>
<item identifier="item_1" identifierref="resource_1">
<title>Golf Explained</title>
</item>
</organization>
</organizations>
<resources>
<resource identifier="resource_1" type="webcontent" adlcp:scormtype="sco" href="shared/launchpage.html">
</resource>
</resources>
</manifest>
Manifest Conversion (cmi5, cmi5.xml)
<?xml version="1.0" encoding="utf-8"?>
<courseStructure xmlns="https://w3id.org/xapi/profiles/cmi5/v1/CourseStructure.xsd">
<course id="https://scorm.com/golfsamples/runtime/basicruntime/12_to_cmi5">
<title>
<langstring lang="en-US">Golf Explained - Run-time Basic Calls</langstring>
</title>
<description>
<langstring lang="en-US">
Golf Explained - Run-time Basic Calls
</langstring>
</description>
</course>
<au id="https://scorm.com/golfsamples/runtime/basicruntime/12_to_cmi5/content"
moveOn="CompletedOrPassed">
<title>
<langstring lang="en-US">Golf Explained</langstring>
</title>
<description>
<langstring lang="en-US">
Learn the rules of golf!
</langstring>
</description>
<url>shared/launchpage.html</url>
</au>
</courseStructure>
Meaningful Manifest Differences
SCORM cmi5
<organization identifier="golf_sample_default_org">
<title>Golf Explained - Run-time Basic Calls</title>
<item identifier="item_1" identifierref="resource_1">
<title>Golf Explained</title>
</item>
</organization>
<resource identifier="resource_1" type="webcontent"
adlcp:scormtype="sco" href="shared/launchpage.html">
<au
id="https://scorm.com/golfsamples/runtime/basicruntime/12_to_cm
i5/content"
moveOn="Passed">
<title>
<langstring lang="en-US">Golf Explained</langstring>
</title>
<description>
<langstring lang="en-US">
Learn the rules of golf!
</langstring>
</description>
<url>shared/launchpage.html</url>
</au>
The Hard Way Always Involves Javascript
SCORM Runtime Command cmi5 Verb
LMSInitialize("") Initialized
LMSSetValue("cmi.core. lesson_status", "completed") Completed
LMSSetValue("cmi.core.lesson_status", "passed") Passed
LMSSetValue("cmi.core.lesson_status", "failed") Failed
LMSFinish("") Terminated
LMSSetValue("cmi.suspend_data", "...")
LMSSetValue("cmi.core.lesson_ location", "...")
(set as Activity State)
But First, The Front 9?
● The Venerable Golf Courses
● Examples of standard SCORM 1.2 /
2004 functionality
● Contains the wisdom of ancients
● Less interesting than rocks
Step By Step, Runtime
1. What SCORM version is the package?
a. Does it support multiple versions?
b. Can you put a cmi5 plugin next to it?
2. Find the SCORM commands.
a. Search for “API.LMS” or “API_1484_11.”
3. Create collection of SCORM get/set keys
a. These are (almost) all prefixed “cmi.”
4. Look up SCORM->cmi5 mappings
5. Replace with appropriate cmi5_course.js
tracking call.
a. Or add one if we didn’t already include it!
Inject cmi5 Tracking
SCORM cmi5
var currentPage = null;
var startTimeStamp = null;
var processedUnload = false;
var reachedEnd = false;
<script src="cmi5.min.js"
type="text/javascript"></script>
<script src="course_cmi5.js"
type="text/javascript"></script>
...
var currentPage = null;
var startTimeStamp = null;
var processedUnload = false;
var reachedEnd = false;
var trackingPlugin = new CourseCmi5Plugin();
Initialize
SCORM cmi5
function doStart(){
//get the iFrame sized correctly and set up
SetupIFrame();
//record the time that the learner started
the SCO so that we can report the total time
startTimeStamp = new Date();
//initialize communication with the LMS
API.LMSInitialize("");
//it's a best practice to set the lesson
status to incomplete when
//first launching the course (if the course
is not already completed)
var completionStatus =
ScormProcessGetValue("cmi.core.lesson_status");
if (completionStatus == "not attempted"){
...
function doStart() {
//get the iFrame sized correctly and set up
SetupIFrame();
//record the time that the learner started
the SCO so that we can report the total time
startTimeStamp = new Date();
//initialize communication with the LMS
trackingPlugin.initialize(postInit,
trackingActivityUpdate);
}
function postInit() {
...
Set Default Status
SCORM cmi5
//it's a best practice to set the lesson status to
incomplete when
//first launching the course (if the course is not
already completed)
var completionStatus =
ScormProcessGetValue("cmi.core.lesson_status");
if (completionStatus == "not attempted"){
ScormProcessSetValue("cmi.core.lesson_status",
"incomplete");
}
// Don’t set a default completion/success status
X
Fetch Bookmark
SCORM cmi5
var bookmark =
API.LMSGetValue("cmi.core.lesson_location");
//if there isn't a stored bookmark, start the user at the
first page
if (bookmark == ""){
currentPage = 0;
}
else{
//if there is a stored bookmark, prompt the user to
resume from the previous location
if (confirm("Would you like to resume from where you
previously left off?")){
currentPage = parseInt(bookmark, 10);
}
else{
currentPage = 0;
}
}
goToPage();
trackingPlugin.getBookmark().then(function(bookmark) {
//if there isn't a stored bookmark, start the user at
the first page
if (bookmark == ""){
currentPage = 0;
}
else{
//if there is a stored bookmark, prompt the user
to resume from the previous location
if (confirm("Would you like to resume from where
you previously left off?")){
currentPage = parseInt(bookmark, 10);
}
else{
currentPage = 0;
}
}
goToPage();
});
Save Bookmark
SCORM cmi5
//save the current location as the bookmark
API.LMSSetValue("cmi.core.lesson_location", currentPage);
//save the current location as the bookmark
trackingPlugin.setBookmark(currentPage);
Success / Score
SCORM cmi5
function RecordTest(score){
API.LMSSetValue("cmi.core.score.raw", score);
API.LMSSetValue("cmi.core.score.min", "0");
API.LMSSetValue("cmi.core.score.max", "100");
//if we get a test result, set the lesson status to
passed/failed instead of completed
//consider 70% to be passing
if (score >= 70){
API.LMSSetValue("cmi.core.lesson_status",
"passed");
}
else{
API.LMSSetValue("cmi.core.lesson_status",
"failed");
}
}
function RecordTest(score){
const scaledScore = score / 100.;
const scoreObj = {
scaled: scaledScore,
raw: score,
min: 0,
max: 100
};
//if we get a test result, set the lesson status to
passed/failed instead of completed
//consider 70% to be passing
if (score >= 70){
trackingPlugin.cmi5.passed(scoreObj);
}
else{
trackingPlugin.cmi5.failed(scoreObj);
}
}
Interactions
SCORM cmi5
function RecordQuestion(id, questionText, questionType,
learnerResponse, correctAnswer, wasCorrect, objectiveId){
API.LMSSetValue("cmi.interactions._count", true)
API.LMSSetValue("cmi.interactions." + nextIndex + ".id",
id);
API.LMSSetValue("cmi.interactions." + nextIndex + ".type",
questionType);
if (questionType == "choice"){
learnerResponse = FormatChoiceResponse(learnerResponse);
correctAnswer = FormatChoiceResponse(correctAnswer);
}
if (learnerResponse != ""){
API.LMSSetValue("cmi.interactions." + nextIndex +
".student_response", learnerResponse);
}
API.LMSSetValue("cmi.interactions." + nextIndex +
".correct_responses.0.pattern", correctAnswer);
//Finally record whether or not the learner's response was
correct
if (wasCorrect == true){
API.LMSSetValue("cmi.interactions." + nextIndex +
".result", "correct");
}
else{
API.LMSSetValue("cmi.interactions." + nextIndex +
".result", "wrong");
}
}
function RecordQuestion(id, questionText, questionType,
learnerResponse, correctAnswer, wasCorrect, choices){
let interactionData = {
testId: "quiz001",
interactionType: questionType,
interactionId: id,
userAnswers: [learnerResponse],
correctAnswers: [correctAnswer],
name: id,
description: questionText,
success: wasCorrect
};
if (choices){
interactionData["choices"] =
choices.map((choice, i) => {
return {"id": i + "", "description": {"en-US":
choice}};
});
console.log("interactiondata choices",
interactionData["choices"]);
}
trackingPlugin.captureInteractions([interactionData], {});
}
Terminate / Exit Preparation
//note use of short-circuit AND. If the user
reached the end, don't prompt.
//just exit normally and submit the results.
if (reachedEnd == false && confirm("Would you
like to save your progress to resume later?")){
//set exit to suspend
API.LMSSetValue("cmi.core.exit", "suspend");
}
else{
//set exit to normal
API.LMSSetValue("cmi.core.exit", "");
}
//process the unload handler to close out the
session.
//the presense of an adl.nav.request will cause
the LMS to
//take the content away from the user.
doUnload(true);
SCORM cmi5
//note use of short-circuit AND. If the user
reached the end, don't prompt.
//just exit normally and submit the results.
if (reachedEnd == false && confirm("Would you
like to save your progress to resume later?")){
}
else{
trackingPlugin.setBookmark("");
}
//process the unload handler to close out the
session.
doUnload(true);
Terminate / Exit
//record the session time
var endTimeStamp = new Date();
var totalMilliseconds = (endTimeStamp.getTime() -
startTimeStamp.getTime());
var scormTime =
ConvertMilliSecondsToSCORMTime(totalMilliseconds, false);
API.LMSSetValue("cmi.core.session_time", scormTime);
//if the user just closes the browser, we will default to
saving
//their progress data. If the user presses exit, he is
prompted.
//If the user reached the end, the exit normall to submit
results.
if (pressedExit == false && reachedEnd == false){
API.LMSSetValue("cmi.core.exit", "suspend");
}
API.LMSFinish("");
SCORM cmi5
trackingPlugin.exit(false);
Let’s See the Fruit of Our Labor
The *cmi5* Golf Course
Special Conversion Quirks
● Passed / Completed / Failed repeats:
○ Okay in SCORM
○ BAD in cmi5 - no dupes, no failed after passed
● Mastery score
○ SCORM: Evaluates and overwrites status after usage
○ cmi5: Checks at status Statement time, MUST reject if mismatched
● Sequencing
○ SCORM: Only supported in 2004, manifest-based
○ cmi5: No manifest-based sequencing, can only be done at runtime
■ Extensions: “requires”, “equivalences”
CATAPULT Documentation
GitHub repository, course examples,
user guides, installation and deployment
instructions can be found at:
https://adlnet.github.io/CATAPULT/
cmi5 Best Practices Guide:
https://adlnet.gov/assets/uploads/cmi5%20
Best%20Practices%20Guide%20-%20From%2
0Conception%20to%20Conformance.pdf
Early cmi5 adopters that claim support for
cmi5 according to cmi5 working group.
Run your own CTS today!
● Use Docker***
● Use a cmi5 conformant LRS
How to pick an LRS:
● Check the cmi5 list of adopters
● Build your own!
What do you need to get started with cmi5
https://aicc.github.io/CMI-5_Spec_Current/adoption/
Resources
Keep up-to-date on cmi5 CATAPULT
https://adlnet.gov/projects/cmi5-CATAPULT/ & https://xapi.com/cmi5-project-catapult/
Visit ADL’s cmi5 page and xapi.com’s cmi5 page for more background
https://adlnet.gov/projects/cmi5-standard/ & https://xapi.com/cmi5/
View ADL’s cmi5 resources
https://adlnet.gov/resources/cmi5-resources/
Join the cmi5 weekly working group
http://aicc.github.io/CMI-5_Spec_Current/
Have questions? Ask us anything!
George Vilches
george.vilches@rusticisoftware.com
Email us:
info@rusticisoftware.com
Learn more:
rusticisoftware.com
scorm.com
xapi.com

More Related Content

What's hot

End-End Security with Confluent Platform
End-End Security with Confluent Platform End-End Security with Confluent Platform
End-End Security with Confluent Platform confluent
 
kintone Café 東京 Vol.3 ハンズオン資料(kintone & AWS Lambda/S3)
kintone Café 東京 Vol.3 ハンズオン資料(kintone & AWS Lambda/S3)kintone Café 東京 Vol.3 ハンズオン資料(kintone & AWS Lambda/S3)
kintone Café 東京 Vol.3 ハンズオン資料(kintone & AWS Lambda/S3)JOYZO
 
Apache Karaf - Building OSGi applications on Apache Karaf - T Frank & A Grzesik
Apache Karaf - Building OSGi applications on Apache Karaf - T Frank & A GrzesikApache Karaf - Building OSGi applications on Apache Karaf - T Frank & A Grzesik
Apache Karaf - Building OSGi applications on Apache Karaf - T Frank & A Grzesikmfrancis
 
Web deploy command line
Web deploy command lineWeb deploy command line
Web deploy command lineLarry Nung
 
오픈소스로 구축하는 클라우드 이야기
오픈소스로 구축하는 클라우드 이야기오픈소스로 구축하는 클라우드 이야기
오픈소스로 구축하는 클라우드 이야기Nalee Jang
 
Open infradays 2019_msa_k8s
Open infradays 2019_msa_k8sOpen infradays 2019_msa_k8s
Open infradays 2019_msa_k8sHyoungjun Kim
 
Anatomy of a Container: Namespaces, cgroups & Some Filesystem Magic - LinuxCon
Anatomy of a Container: Namespaces, cgroups & Some Filesystem Magic - LinuxConAnatomy of a Container: Namespaces, cgroups & Some Filesystem Magic - LinuxCon
Anatomy of a Container: Namespaces, cgroups & Some Filesystem Magic - LinuxConJérôme Petazzoni
 
Pulumi. Modern Infrastructure as Code.
Pulumi. Modern Infrastructure as Code.Pulumi. Modern Infrastructure as Code.
Pulumi. Modern Infrastructure as Code.Yurii Bychenok
 
Infrastructure as "Code" with Pulumi
Infrastructure as "Code" with PulumiInfrastructure as "Code" with Pulumi
Infrastructure as "Code" with PulumiVenura Athukorala
 
Fun with PRB, VRFs and NetNS on Linux - What is it, how does it work, what ca...
Fun with PRB, VRFs and NetNS on Linux - What is it, how does it work, what ca...Fun with PRB, VRFs and NetNS on Linux - What is it, how does it work, what ca...
Fun with PRB, VRFs and NetNS on Linux - What is it, how does it work, what ca...Maximilan Wilhelm
 
Persistent Storage with Containers with Kubernetes & OpenShift
Persistent Storage with Containers with Kubernetes & OpenShiftPersistent Storage with Containers with Kubernetes & OpenShift
Persistent Storage with Containers with Kubernetes & OpenShiftRed Hat Events
 
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】Masahito Zembutsu
 
Apache EventMesh を使ってみた
Apache EventMesh を使ってみたApache EventMesh を使ってみた
Apache EventMesh を使ってみたYoshiyasu SAEKI
 
【BS15】.NET アップグレード アシスタントで簡単にできます! .NET Framework アプリの .NET 6 へのマイグレーション
【BS15】.NET アップグレード アシスタントで簡単にできます! .NET Framework アプリの .NET 6 へのマイグレーション 【BS15】.NET アップグレード アシスタントで簡単にできます! .NET Framework アプリの .NET 6 へのマイグレーション
【BS15】.NET アップグレード アシスタントで簡単にできます! .NET Framework アプリの .NET 6 へのマイグレーション 日本マイクロソフト株式会社
 
Docker networking basics & coupling with Software Defined Networks
Docker networking basics & coupling with Software Defined NetworksDocker networking basics & coupling with Software Defined Networks
Docker networking basics & coupling with Software Defined NetworksAdrien Blind
 
超簡単!Apache TomcatをWindowsにインストール
超簡単!Apache TomcatをWindowsにインストール超簡単!Apache TomcatをWindowsにインストール
超簡単!Apache TomcatをWindowsにインストールShin Tanigawa
 
HttpClient詳解、或いは非同期の落とし穴について
HttpClient詳解、或いは非同期の落とし穴についてHttpClient詳解、或いは非同期の落とし穴について
HttpClient詳解、或いは非同期の落とし穴についてYoshifumi Kawai
 

What's hot (20)

KubeConRecap_nakamura.pdf
KubeConRecap_nakamura.pdfKubeConRecap_nakamura.pdf
KubeConRecap_nakamura.pdf
 
End-End Security with Confluent Platform
End-End Security with Confluent Platform End-End Security with Confluent Platform
End-End Security with Confluent Platform
 
kintone Café 東京 Vol.3 ハンズオン資料(kintone & AWS Lambda/S3)
kintone Café 東京 Vol.3 ハンズオン資料(kintone & AWS Lambda/S3)kintone Café 東京 Vol.3 ハンズオン資料(kintone & AWS Lambda/S3)
kintone Café 東京 Vol.3 ハンズオン資料(kintone & AWS Lambda/S3)
 
Apache Karaf - Building OSGi applications on Apache Karaf - T Frank & A Grzesik
Apache Karaf - Building OSGi applications on Apache Karaf - T Frank & A GrzesikApache Karaf - Building OSGi applications on Apache Karaf - T Frank & A Grzesik
Apache Karaf - Building OSGi applications on Apache Karaf - T Frank & A Grzesik
 
macvlan and ipvlan
macvlan and ipvlanmacvlan and ipvlan
macvlan and ipvlan
 
Web deploy command line
Web deploy command lineWeb deploy command line
Web deploy command line
 
오픈소스로 구축하는 클라우드 이야기
오픈소스로 구축하는 클라우드 이야기오픈소스로 구축하는 클라우드 이야기
오픈소스로 구축하는 클라우드 이야기
 
Open infradays 2019_msa_k8s
Open infradays 2019_msa_k8sOpen infradays 2019_msa_k8s
Open infradays 2019_msa_k8s
 
Anatomy of a Container: Namespaces, cgroups & Some Filesystem Magic - LinuxCon
Anatomy of a Container: Namespaces, cgroups & Some Filesystem Magic - LinuxConAnatomy of a Container: Namespaces, cgroups & Some Filesystem Magic - LinuxCon
Anatomy of a Container: Namespaces, cgroups & Some Filesystem Magic - LinuxCon
 
NGINXをBFF (Backend for Frontend)として利用した話
NGINXをBFF (Backend for Frontend)として利用した話NGINXをBFF (Backend for Frontend)として利用した話
NGINXをBFF (Backend for Frontend)として利用した話
 
Pulumi. Modern Infrastructure as Code.
Pulumi. Modern Infrastructure as Code.Pulumi. Modern Infrastructure as Code.
Pulumi. Modern Infrastructure as Code.
 
Infrastructure as "Code" with Pulumi
Infrastructure as "Code" with PulumiInfrastructure as "Code" with Pulumi
Infrastructure as "Code" with Pulumi
 
Fun with PRB, VRFs and NetNS on Linux - What is it, how does it work, what ca...
Fun with PRB, VRFs and NetNS on Linux - What is it, how does it work, what ca...Fun with PRB, VRFs and NetNS on Linux - What is it, how does it work, what ca...
Fun with PRB, VRFs and NetNS on Linux - What is it, how does it work, what ca...
 
Persistent Storage with Containers with Kubernetes & OpenShift
Persistent Storage with Containers with Kubernetes & OpenShiftPersistent Storage with Containers with Kubernetes & OpenShift
Persistent Storage with Containers with Kubernetes & OpenShift
 
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
 
Apache EventMesh を使ってみた
Apache EventMesh を使ってみたApache EventMesh を使ってみた
Apache EventMesh を使ってみた
 
【BS15】.NET アップグレード アシスタントで簡単にできます! .NET Framework アプリの .NET 6 へのマイグレーション
【BS15】.NET アップグレード アシスタントで簡単にできます! .NET Framework アプリの .NET 6 へのマイグレーション 【BS15】.NET アップグレード アシスタントで簡単にできます! .NET Framework アプリの .NET 6 へのマイグレーション
【BS15】.NET アップグレード アシスタントで簡単にできます! .NET Framework アプリの .NET 6 へのマイグレーション
 
Docker networking basics & coupling with Software Defined Networks
Docker networking basics & coupling with Software Defined NetworksDocker networking basics & coupling with Software Defined Networks
Docker networking basics & coupling with Software Defined Networks
 
超簡単!Apache TomcatをWindowsにインストール
超簡単!Apache TomcatをWindowsにインストール超簡単!Apache TomcatをWindowsにインストール
超簡単!Apache TomcatをWindowsにインストール
 
HttpClient詳解、或いは非同期の落とし穴について
HttpClient詳解、或いは非同期の落とし穴についてHttpClient詳解、或いは非同期の落とし穴について
HttpClient詳解、或いは非同期の落とし穴について
 

Similar to Smelling what The Rock's cooking: Converting SCORM content to cmi5

Another Learning Standard? Where cmi5 Fits with SCORM and xAPI
Another Learning Standard? Where cmi5 Fits with SCORM and xAPIAnother Learning Standard? Where cmi5 Fits with SCORM and xAPI
Another Learning Standard? Where cmi5 Fits with SCORM and xAPIRustici Software
 
Comparing Hot JavaScript Frameworks: AngularJS, Ember.js and React.js - Sprin...
Comparing Hot JavaScript Frameworks: AngularJS, Ember.js and React.js - Sprin...Comparing Hot JavaScript Frameworks: AngularJS, Ember.js and React.js - Sprin...
Comparing Hot JavaScript Frameworks: AngularJS, Ember.js and React.js - Sprin...Matt Raible
 
Build Your Own CMS with Apache Sling
Build Your Own CMS with Apache SlingBuild Your Own CMS with Apache Sling
Build Your Own CMS with Apache SlingBob Paulin
 
SharePoint Framework, Angular and Azure Functions
SharePoint Framework, Angular and Azure FunctionsSharePoint Framework, Angular and Azure Functions
SharePoint Framework, Angular and Azure FunctionsSébastien Levert
 
CSS Regression Tests
CSS Regression TestsCSS Regression Tests
CSS Regression TestsKaloyan Kosev
 
Ecmascript 2015 – best of new features()
Ecmascript 2015 – best of new features()Ecmascript 2015 – best of new features()
Ecmascript 2015 – best of new features()Miłosz Sobczak
 
Web 2.0 Expo: Even Faster Web Sites
Web 2.0 Expo: Even Faster Web SitesWeb 2.0 Expo: Even Faster Web Sites
Web 2.0 Expo: Even Faster Web SitesSteve Souders
 
Essential SAFe and Launching your first Agile Release Train
Essential SAFe and Launching your first Agile Release TrainEssential SAFe and Launching your first Agile Release Train
Essential SAFe and Launching your first Agile Release TrainCprime
 
The Web on OSGi: Here's How
The Web on OSGi: Here's HowThe Web on OSGi: Here's How
The Web on OSGi: Here's Howmrdon
 
Web20expo 20080425
Web20expo 20080425Web20expo 20080425
Web20expo 20080425Media Gorod
 
Swagger AEM - An OpenAPI Specification for AEM
Swagger AEM - An OpenAPI Specification for AEMSwagger AEM - An OpenAPI Specification for AEM
Swagger AEM - An OpenAPI Specification for AEMCliffano Subagio
 
SharePoint Saturday Lisbon 2017 - SharePoint Framework, Angular & Azure Funct...
SharePoint Saturday Lisbon 2017 - SharePoint Framework, Angular & Azure Funct...SharePoint Saturday Lisbon 2017 - SharePoint Framework, Angular & Azure Funct...
SharePoint Saturday Lisbon 2017 - SharePoint Framework, Angular & Azure Funct...Sébastien Levert
 
Selenium & PHPUnit made easy with Steward (Berlin, April 2017)
Selenium & PHPUnit made easy with Steward (Berlin, April 2017)Selenium & PHPUnit made easy with Steward (Berlin, April 2017)
Selenium & PHPUnit made easy with Steward (Berlin, April 2017)Ondřej Machulda
 
Introduction to windows power shell in sharepoint 2010
Introduction to windows power shell in sharepoint 2010Introduction to windows power shell in sharepoint 2010
Introduction to windows power shell in sharepoint 2010Binh Nguyen
 
Spring Northwest Usergroup Grails Presentation
Spring Northwest Usergroup Grails PresentationSpring Northwest Usergroup Grails Presentation
Spring Northwest Usergroup Grails Presentationajevans
 

Similar to Smelling what The Rock's cooking: Converting SCORM content to cmi5 (20)

Another Learning Standard? Where cmi5 Fits with SCORM and xAPI
Another Learning Standard? Where cmi5 Fits with SCORM and xAPIAnother Learning Standard? Where cmi5 Fits with SCORM and xAPI
Another Learning Standard? Where cmi5 Fits with SCORM and xAPI
 
Comparing Hot JavaScript Frameworks: AngularJS, Ember.js and React.js - Sprin...
Comparing Hot JavaScript Frameworks: AngularJS, Ember.js and React.js - Sprin...Comparing Hot JavaScript Frameworks: AngularJS, Ember.js and React.js - Sprin...
Comparing Hot JavaScript Frameworks: AngularJS, Ember.js and React.js - Sprin...
 
Build Your Own CMS with Apache Sling
Build Your Own CMS with Apache SlingBuild Your Own CMS with Apache Sling
Build Your Own CMS with Apache Sling
 
SharePoint Framework, Angular and Azure Functions
SharePoint Framework, Angular and Azure FunctionsSharePoint Framework, Angular and Azure Functions
SharePoint Framework, Angular and Azure Functions
 
CSS Regression Tests
CSS Regression TestsCSS Regression Tests
CSS Regression Tests
 
Ecmascript 2015 – best of new features()
Ecmascript 2015 – best of new features()Ecmascript 2015 – best of new features()
Ecmascript 2015 – best of new features()
 
Web 2.0 Expo: Even Faster Web Sites
Web 2.0 Expo: Even Faster Web SitesWeb 2.0 Expo: Even Faster Web Sites
Web 2.0 Expo: Even Faster Web Sites
 
Essential SAFe and Launching your first Agile Release Train
Essential SAFe and Launching your first Agile Release TrainEssential SAFe and Launching your first Agile Release Train
Essential SAFe and Launching your first Agile Release Train
 
The Web on OSGi: Here's How
The Web on OSGi: Here's HowThe Web on OSGi: Here's How
The Web on OSGi: Here's How
 
Spring boot
Spring bootSpring boot
Spring boot
 
Web20expo 20080425
Web20expo 20080425Web20expo 20080425
Web20expo 20080425
 
Swagger AEM - An OpenAPI Specification for AEM
Swagger AEM - An OpenAPI Specification for AEMSwagger AEM - An OpenAPI Specification for AEM
Swagger AEM - An OpenAPI Specification for AEM
 
SharePoint Saturday Lisbon 2017 - SharePoint Framework, Angular & Azure Funct...
SharePoint Saturday Lisbon 2017 - SharePoint Framework, Angular & Azure Funct...SharePoint Saturday Lisbon 2017 - SharePoint Framework, Angular & Azure Funct...
SharePoint Saturday Lisbon 2017 - SharePoint Framework, Angular & Azure Funct...
 
Selenium & PHPUnit made easy with Steward (Berlin, April 2017)
Selenium & PHPUnit made easy with Steward (Berlin, April 2017)Selenium & PHPUnit made easy with Steward (Berlin, April 2017)
Selenium & PHPUnit made easy with Steward (Berlin, April 2017)
 
OSGi with the Spring Framework
OSGi with the Spring FrameworkOSGi with the Spring Framework
OSGi with the Spring Framework
 
Introduction to windows power shell in sharepoint 2010
Introduction to windows power shell in sharepoint 2010Introduction to windows power shell in sharepoint 2010
Introduction to windows power shell in sharepoint 2010
 
Spring Northwest Usergroup Grails Presentation
Spring Northwest Usergroup Grails PresentationSpring Northwest Usergroup Grails Presentation
Spring Northwest Usergroup Grails Presentation
 
Oscon 20080724
Oscon 20080724Oscon 20080724
Oscon 20080724
 
Spring boot wednesday
Spring boot wednesdaySpring boot wednesday
Spring boot wednesday
 
Grails Spring Boot
Grails Spring BootGrails Spring Boot
Grails Spring Boot
 

More from Rustici Software

Which standard is best for your content?
Which standard is best for your content?Which standard is best for your content?
Which standard is best for your content?Rustici Software
 
Our IEEE LTSC voting members recap 2023 and what’s next for the standards
Our IEEE LTSC voting members recap 2023 and what’s next for the standardsOur IEEE LTSC voting members recap 2023 and what’s next for the standards
Our IEEE LTSC voting members recap 2023 and what’s next for the standardsRustici Software
 
Always have an exit plan: Questing to limit SCORM lost completions
Always have an exit plan: Questing to limit SCORM lost completionsAlways have an exit plan: Questing to limit SCORM lost completions
Always have an exit plan: Questing to limit SCORM lost completionsRustici Software
 
Egg-cellent Ways Content Controller Helps Your Organization’s Training Needs
Egg-cellent Ways  Content Controller  Helps Your Organization’s Training NeedsEgg-cellent Ways  Content Controller  Helps Your Organization’s Training Needs
Egg-cellent Ways Content Controller Helps Your Organization’s Training NeedsRustici Software
 
RIP to Manual Course Packaging: How SANS Streamlines Content Distribution
RIP to Manual  Course Packaging:  How SANS Streamlines Content DistributionRIP to Manual  Course Packaging:  How SANS Streamlines Content Distribution
RIP to Manual Course Packaging: How SANS Streamlines Content DistributionRustici Software
 
Ready to get pedantic? Picking the best verb for Statements
Ready to get pedantic?  Picking the best verb for StatementsReady to get pedantic?  Picking the best verb for Statements
Ready to get pedantic? Picking the best verb for StatementsRustici Software
 
Ask Me Anything: Using eLearning Standards when creating content
Ask Me Anything: Using eLearning Standards when creating contentAsk Me Anything: Using eLearning Standards when creating content
Ask Me Anything: Using eLearning Standards when creating contentRustici Software
 
Meeting in the Middle: A Blended Approach to Learning Tech
Meeting in the Middle: A Blended Approach to Learning TechMeeting in the Middle: A Blended Approach to Learning Tech
Meeting in the Middle: A Blended Approach to Learning TechRustici Software
 
Tales from the trails: Navigating a proven path from content creation to dist...
Tales from the trails: Navigating a proven path from content creation to dist...Tales from the trails: Navigating a proven path from content creation to dist...
Tales from the trails: Navigating a proven path from content creation to dist...Rustici Software
 
Content Controller: The easiest way to share content with your customers
Content Controller: The easiest way to share content with your customersContent Controller: The easiest way to share content with your customers
Content Controller: The easiest way to share content with your customersRustici Software
 
Content Controller: The easiest way to centralize content across your learnin...
Content Controller: The easiest way to centralize content across your learnin...Content Controller: The easiest way to centralize content across your learnin...
Content Controller: The easiest way to centralize content across your learnin...Rustici Software
 
By the Numbers: A Behind the Scenes Look at xAPI and cmi5 Adoption
By the Numbers: A Behind the Scenes Look at xAPI and cmi5 AdoptionBy the Numbers: A Behind the Scenes Look at xAPI and cmi5 Adoption
By the Numbers: A Behind the Scenes Look at xAPI and cmi5 AdoptionRustici Software
 
Back to the Drawing Board: Painting a Picture with xAPI
Back to the Drawing Board: Painting a Picture with xAPIBack to the Drawing Board: Painting a Picture with xAPI
Back to the Drawing Board: Painting a Picture with xAPIRustici Software
 
Back to the Drawing Board: Sketching out SCORM
Back to the Drawing Board: Sketching out SCORMBack to the Drawing Board: Sketching out SCORM
Back to the Drawing Board: Sketching out SCORMRustici Software
 
Ins and Outs of Connecting Technologies in a Modern Learning Ecosystem
Ins and Outs of Connecting Technologies in a Modern Learning EcosystemIns and Outs of Connecting Technologies in a Modern Learning Ecosystem
Ins and Outs of Connecting Technologies in a Modern Learning EcosystemRustici Software
 
Drinking the xAPI Kool Aid
Drinking the xAPI Kool AidDrinking the xAPI Kool Aid
Drinking the xAPI Kool AidRustici Software
 
Extending Your Reach: Taking Your Training Content Beyond Your LMS
Extending Your Reach: Taking Your Training Content Beyond Your LMSExtending Your Reach: Taking Your Training Content Beyond Your LMS
Extending Your Reach: Taking Your Training Content Beyond Your LMSRustici Software
 
State of xAPI Adoption: Our Numbers
State of xAPI Adoption: Our NumbersState of xAPI Adoption: Our Numbers
State of xAPI Adoption: Our NumbersRustici Software
 
Taking xAPI Profiles Further: Designing xAPI Profiles to Address Specific Req...
Taking xAPI Profiles Further: Designing xAPI Profiles to Address Specific Req...Taking xAPI Profiles Further: Designing xAPI Profiles to Address Specific Req...
Taking xAPI Profiles Further: Designing xAPI Profiles to Address Specific Req...Rustici Software
 
xAPI 201: Move from Experimentation to Mastery
xAPI 201: Move from Experimentation to MasteryxAPI 201: Move from Experimentation to Mastery
xAPI 201: Move from Experimentation to MasteryRustici Software
 

More from Rustici Software (20)

Which standard is best for your content?
Which standard is best for your content?Which standard is best for your content?
Which standard is best for your content?
 
Our IEEE LTSC voting members recap 2023 and what’s next for the standards
Our IEEE LTSC voting members recap 2023 and what’s next for the standardsOur IEEE LTSC voting members recap 2023 and what’s next for the standards
Our IEEE LTSC voting members recap 2023 and what’s next for the standards
 
Always have an exit plan: Questing to limit SCORM lost completions
Always have an exit plan: Questing to limit SCORM lost completionsAlways have an exit plan: Questing to limit SCORM lost completions
Always have an exit plan: Questing to limit SCORM lost completions
 
Egg-cellent Ways Content Controller Helps Your Organization’s Training Needs
Egg-cellent Ways  Content Controller  Helps Your Organization’s Training NeedsEgg-cellent Ways  Content Controller  Helps Your Organization’s Training Needs
Egg-cellent Ways Content Controller Helps Your Organization’s Training Needs
 
RIP to Manual Course Packaging: How SANS Streamlines Content Distribution
RIP to Manual  Course Packaging:  How SANS Streamlines Content DistributionRIP to Manual  Course Packaging:  How SANS Streamlines Content Distribution
RIP to Manual Course Packaging: How SANS Streamlines Content Distribution
 
Ready to get pedantic? Picking the best verb for Statements
Ready to get pedantic?  Picking the best verb for StatementsReady to get pedantic?  Picking the best verb for Statements
Ready to get pedantic? Picking the best verb for Statements
 
Ask Me Anything: Using eLearning Standards when creating content
Ask Me Anything: Using eLearning Standards when creating contentAsk Me Anything: Using eLearning Standards when creating content
Ask Me Anything: Using eLearning Standards when creating content
 
Meeting in the Middle: A Blended Approach to Learning Tech
Meeting in the Middle: A Blended Approach to Learning TechMeeting in the Middle: A Blended Approach to Learning Tech
Meeting in the Middle: A Blended Approach to Learning Tech
 
Tales from the trails: Navigating a proven path from content creation to dist...
Tales from the trails: Navigating a proven path from content creation to dist...Tales from the trails: Navigating a proven path from content creation to dist...
Tales from the trails: Navigating a proven path from content creation to dist...
 
Content Controller: The easiest way to share content with your customers
Content Controller: The easiest way to share content with your customersContent Controller: The easiest way to share content with your customers
Content Controller: The easiest way to share content with your customers
 
Content Controller: The easiest way to centralize content across your learnin...
Content Controller: The easiest way to centralize content across your learnin...Content Controller: The easiest way to centralize content across your learnin...
Content Controller: The easiest way to centralize content across your learnin...
 
By the Numbers: A Behind the Scenes Look at xAPI and cmi5 Adoption
By the Numbers: A Behind the Scenes Look at xAPI and cmi5 AdoptionBy the Numbers: A Behind the Scenes Look at xAPI and cmi5 Adoption
By the Numbers: A Behind the Scenes Look at xAPI and cmi5 Adoption
 
Back to the Drawing Board: Painting a Picture with xAPI
Back to the Drawing Board: Painting a Picture with xAPIBack to the Drawing Board: Painting a Picture with xAPI
Back to the Drawing Board: Painting a Picture with xAPI
 
Back to the Drawing Board: Sketching out SCORM
Back to the Drawing Board: Sketching out SCORMBack to the Drawing Board: Sketching out SCORM
Back to the Drawing Board: Sketching out SCORM
 
Ins and Outs of Connecting Technologies in a Modern Learning Ecosystem
Ins and Outs of Connecting Technologies in a Modern Learning EcosystemIns and Outs of Connecting Technologies in a Modern Learning Ecosystem
Ins and Outs of Connecting Technologies in a Modern Learning Ecosystem
 
Drinking the xAPI Kool Aid
Drinking the xAPI Kool AidDrinking the xAPI Kool Aid
Drinking the xAPI Kool Aid
 
Extending Your Reach: Taking Your Training Content Beyond Your LMS
Extending Your Reach: Taking Your Training Content Beyond Your LMSExtending Your Reach: Taking Your Training Content Beyond Your LMS
Extending Your Reach: Taking Your Training Content Beyond Your LMS
 
State of xAPI Adoption: Our Numbers
State of xAPI Adoption: Our NumbersState of xAPI Adoption: Our Numbers
State of xAPI Adoption: Our Numbers
 
Taking xAPI Profiles Further: Designing xAPI Profiles to Address Specific Req...
Taking xAPI Profiles Further: Designing xAPI Profiles to Address Specific Req...Taking xAPI Profiles Further: Designing xAPI Profiles to Address Specific Req...
Taking xAPI Profiles Further: Designing xAPI Profiles to Address Specific Req...
 
xAPI 201: Move from Experimentation to Mastery
xAPI 201: Move from Experimentation to MasteryxAPI 201: Move from Experimentation to Mastery
xAPI 201: Move from Experimentation to Mastery
 

Recently uploaded

Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...shyamraj55
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024Scott Keck-Warren
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsMemoori
 
Azure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & ApplicationAzure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & ApplicationAndikSusilo4
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitecturePixlogix Infotech
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Allon Mureinik
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticscarlostorres15106
 
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphSIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphNeo4j
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j
 
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsMark Billinghurst
 
Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...HostedbyConfluent
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking MenDelhi Call girls
 
Benefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksBenefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksSoftradix Technologies
 

Recently uploaded (20)

Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024
 
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptxE-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial Buildings
 
Azure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & ApplicationAzure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & Application
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC Architecture
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
 
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphSIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
 
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR Systems
 
Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food Manufacturing
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
Benefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksBenefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other Frameworks
 

Smelling what The Rock's cooking: Converting SCORM content to cmi5

  • 1. Smelling What The Rock’s Cooking: Converting SCORM Content to cmi5 George Vilches xAPI Party - Fall 2021
  • 2. What We Will be Talking About ● Brief cmi5 overview ● Comparison of standards ● cmi5 CATAPULT tools: Course templates & Content Test Suite ● SCORM to cmi5 terminology ● Converting existing SCORM content to cmi5
  • 3. Background on cmi5 cmi5 is an “xAPI Profile” ● An extra set of rules called a “Profile” ● Ensures plug & play interoperability between learning content and LMSs ● Designed specifically for when a learner launches from the LMS user interface Components ● Course package/structure ● Learning Management System (LMS) ● Learning Record Store (LRS) ● Assignable Unit (AU)
  • 4. Comparison of Key Features Features SCORM xAPI cmi5 Defined content launch ✔ ✘ ✔ Track “anything” ✘ ✔ ✔ Normalized reporting ✔ ✘ ✔ Mobile applications ✘ ✔ ✔ Distributed content ✘ ✔* ✔ Data portability ✘ ✔ ✔ Extensibility ✘ ✔ ✔ Normalized completion criteria ✔ ✘ ✔ Multiple lesson support ✔ ✘ ✔
  • 5. When to Migrate Legacy Content to cmi5 ● Revising or updating existing content. ● Capturing more detailed learning data from existing courseware. ● Modernizing your training per the DoDI 1322.26 fungible resources. ● Avoiding pop up windows. The best time is today! Let’s do it.
  • 6. Use Your Tools Is your content from an authoring tool? Is your content based on a known framework? They might already publish to cmi5, just use it.
  • 8. Make a Statement Easy as Pie
  • 10. cmi5 content and convert legacy SCORM content Using course templates to build
  • 11. cmi5 Course Template Structure
  • 12. “Tracking Plugin”, A Helper of Helpers ● Wraps raw functionality with common use cases ● Combines independent behaviors ● Adds functionality beyond cmi5 that courses often use ○ Bookmarks ○ Statement batching ● Handles boundary UI/standards cases that are tricky to get right ○ Initialization ○ Exit behavior ● Simplifies error handling ● Models statement generation for Video Profile
  • 13. SCORM to cmi5 Terminology SCORM cmi5 Activity (SCO) Identifier Publisher ID Aggregation / Cluster Block Launch Data launchParameters Manifest Course Structure Resource HREF AU URL Rollup (partial) moveOn SCO AU
  • 14. Manifest Conversion (SCORM, imsmanifest.xml) <?xml version="1.0" standalone="no" ?> <manifest identifier="com.scorm.golfsamples.runtime.basicruntime.12" version="1" xmlns="http://www.imsproject.org/xsd/imscp_rootv1p1p2" xmlns:adlcp="http://www.adlnet.org/xsd/adlcp_rootv1p2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.imsproject.org/xsd/imscp_rootv1p1p2 imscp_rootv1p1p2.xsd http://www.imsglobal.org/xsd/imsmd_rootv1p2p1 imsmd_rootv1p2p1.xsd http://www.adlnet.org/xsd/adlcp_rootv1p2 adlcp_rootv1p2.xsd"> <metadata> <schema>ADL SCORM</schema> <schemaversion>1.2</schemaversion> </metadata> <organizations default="golf_sample_default_org"> <organization identifier="golf_sample_default_org"> <title>Golf Explained - Run-time Basic Calls</title> <item identifier="item_1" identifierref="resource_1"> <title>Golf Explained</title> </item> </organization> </organizations> <resources> <resource identifier="resource_1" type="webcontent" adlcp:scormtype="sco" href="shared/launchpage.html"> </resource> </resources> </manifest>
  • 15. Manifest Conversion (cmi5, cmi5.xml) <?xml version="1.0" encoding="utf-8"?> <courseStructure xmlns="https://w3id.org/xapi/profiles/cmi5/v1/CourseStructure.xsd"> <course id="https://scorm.com/golfsamples/runtime/basicruntime/12_to_cmi5"> <title> <langstring lang="en-US">Golf Explained - Run-time Basic Calls</langstring> </title> <description> <langstring lang="en-US"> Golf Explained - Run-time Basic Calls </langstring> </description> </course> <au id="https://scorm.com/golfsamples/runtime/basicruntime/12_to_cmi5/content" moveOn="CompletedOrPassed"> <title> <langstring lang="en-US">Golf Explained</langstring> </title> <description> <langstring lang="en-US"> Learn the rules of golf! </langstring> </description> <url>shared/launchpage.html</url> </au> </courseStructure>
  • 16. Meaningful Manifest Differences SCORM cmi5 <organization identifier="golf_sample_default_org"> <title>Golf Explained - Run-time Basic Calls</title> <item identifier="item_1" identifierref="resource_1"> <title>Golf Explained</title> </item> </organization> <resource identifier="resource_1" type="webcontent" adlcp:scormtype="sco" href="shared/launchpage.html"> <au id="https://scorm.com/golfsamples/runtime/basicruntime/12_to_cm i5/content" moveOn="Passed"> <title> <langstring lang="en-US">Golf Explained</langstring> </title> <description> <langstring lang="en-US"> Learn the rules of golf! </langstring> </description> <url>shared/launchpage.html</url> </au>
  • 17. The Hard Way Always Involves Javascript SCORM Runtime Command cmi5 Verb LMSInitialize("") Initialized LMSSetValue("cmi.core. lesson_status", "completed") Completed LMSSetValue("cmi.core.lesson_status", "passed") Passed LMSSetValue("cmi.core.lesson_status", "failed") Failed LMSFinish("") Terminated LMSSetValue("cmi.suspend_data", "...") LMSSetValue("cmi.core.lesson_ location", "...") (set as Activity State)
  • 18.
  • 19. But First, The Front 9? ● The Venerable Golf Courses ● Examples of standard SCORM 1.2 / 2004 functionality ● Contains the wisdom of ancients ● Less interesting than rocks
  • 20. Step By Step, Runtime 1. What SCORM version is the package? a. Does it support multiple versions? b. Can you put a cmi5 plugin next to it? 2. Find the SCORM commands. a. Search for “API.LMS” or “API_1484_11.” 3. Create collection of SCORM get/set keys a. These are (almost) all prefixed “cmi.” 4. Look up SCORM->cmi5 mappings 5. Replace with appropriate cmi5_course.js tracking call. a. Or add one if we didn’t already include it!
  • 21. Inject cmi5 Tracking SCORM cmi5 var currentPage = null; var startTimeStamp = null; var processedUnload = false; var reachedEnd = false; <script src="cmi5.min.js" type="text/javascript"></script> <script src="course_cmi5.js" type="text/javascript"></script> ... var currentPage = null; var startTimeStamp = null; var processedUnload = false; var reachedEnd = false; var trackingPlugin = new CourseCmi5Plugin();
  • 22. Initialize SCORM cmi5 function doStart(){ //get the iFrame sized correctly and set up SetupIFrame(); //record the time that the learner started the SCO so that we can report the total time startTimeStamp = new Date(); //initialize communication with the LMS API.LMSInitialize(""); //it's a best practice to set the lesson status to incomplete when //first launching the course (if the course is not already completed) var completionStatus = ScormProcessGetValue("cmi.core.lesson_status"); if (completionStatus == "not attempted"){ ... function doStart() { //get the iFrame sized correctly and set up SetupIFrame(); //record the time that the learner started the SCO so that we can report the total time startTimeStamp = new Date(); //initialize communication with the LMS trackingPlugin.initialize(postInit, trackingActivityUpdate); } function postInit() { ...
  • 23. Set Default Status SCORM cmi5 //it's a best practice to set the lesson status to incomplete when //first launching the course (if the course is not already completed) var completionStatus = ScormProcessGetValue("cmi.core.lesson_status"); if (completionStatus == "not attempted"){ ScormProcessSetValue("cmi.core.lesson_status", "incomplete"); } // Don’t set a default completion/success status X
  • 24. Fetch Bookmark SCORM cmi5 var bookmark = API.LMSGetValue("cmi.core.lesson_location"); //if there isn't a stored bookmark, start the user at the first page if (bookmark == ""){ currentPage = 0; } else{ //if there is a stored bookmark, prompt the user to resume from the previous location if (confirm("Would you like to resume from where you previously left off?")){ currentPage = parseInt(bookmark, 10); } else{ currentPage = 0; } } goToPage(); trackingPlugin.getBookmark().then(function(bookmark) { //if there isn't a stored bookmark, start the user at the first page if (bookmark == ""){ currentPage = 0; } else{ //if there is a stored bookmark, prompt the user to resume from the previous location if (confirm("Would you like to resume from where you previously left off?")){ currentPage = parseInt(bookmark, 10); } else{ currentPage = 0; } } goToPage(); });
  • 25. Save Bookmark SCORM cmi5 //save the current location as the bookmark API.LMSSetValue("cmi.core.lesson_location", currentPage); //save the current location as the bookmark trackingPlugin.setBookmark(currentPage);
  • 26. Success / Score SCORM cmi5 function RecordTest(score){ API.LMSSetValue("cmi.core.score.raw", score); API.LMSSetValue("cmi.core.score.min", "0"); API.LMSSetValue("cmi.core.score.max", "100"); //if we get a test result, set the lesson status to passed/failed instead of completed //consider 70% to be passing if (score >= 70){ API.LMSSetValue("cmi.core.lesson_status", "passed"); } else{ API.LMSSetValue("cmi.core.lesson_status", "failed"); } } function RecordTest(score){ const scaledScore = score / 100.; const scoreObj = { scaled: scaledScore, raw: score, min: 0, max: 100 }; //if we get a test result, set the lesson status to passed/failed instead of completed //consider 70% to be passing if (score >= 70){ trackingPlugin.cmi5.passed(scoreObj); } else{ trackingPlugin.cmi5.failed(scoreObj); } }
  • 27. Interactions SCORM cmi5 function RecordQuestion(id, questionText, questionType, learnerResponse, correctAnswer, wasCorrect, objectiveId){ API.LMSSetValue("cmi.interactions._count", true) API.LMSSetValue("cmi.interactions." + nextIndex + ".id", id); API.LMSSetValue("cmi.interactions." + nextIndex + ".type", questionType); if (questionType == "choice"){ learnerResponse = FormatChoiceResponse(learnerResponse); correctAnswer = FormatChoiceResponse(correctAnswer); } if (learnerResponse != ""){ API.LMSSetValue("cmi.interactions." + nextIndex + ".student_response", learnerResponse); } API.LMSSetValue("cmi.interactions." + nextIndex + ".correct_responses.0.pattern", correctAnswer); //Finally record whether or not the learner's response was correct if (wasCorrect == true){ API.LMSSetValue("cmi.interactions." + nextIndex + ".result", "correct"); } else{ API.LMSSetValue("cmi.interactions." + nextIndex + ".result", "wrong"); } } function RecordQuestion(id, questionText, questionType, learnerResponse, correctAnswer, wasCorrect, choices){ let interactionData = { testId: "quiz001", interactionType: questionType, interactionId: id, userAnswers: [learnerResponse], correctAnswers: [correctAnswer], name: id, description: questionText, success: wasCorrect }; if (choices){ interactionData["choices"] = choices.map((choice, i) => { return {"id": i + "", "description": {"en-US": choice}}; }); console.log("interactiondata choices", interactionData["choices"]); } trackingPlugin.captureInteractions([interactionData], {}); }
  • 28. Terminate / Exit Preparation //note use of short-circuit AND. If the user reached the end, don't prompt. //just exit normally and submit the results. if (reachedEnd == false && confirm("Would you like to save your progress to resume later?")){ //set exit to suspend API.LMSSetValue("cmi.core.exit", "suspend"); } else{ //set exit to normal API.LMSSetValue("cmi.core.exit", ""); } //process the unload handler to close out the session. //the presense of an adl.nav.request will cause the LMS to //take the content away from the user. doUnload(true); SCORM cmi5 //note use of short-circuit AND. If the user reached the end, don't prompt. //just exit normally and submit the results. if (reachedEnd == false && confirm("Would you like to save your progress to resume later?")){ } else{ trackingPlugin.setBookmark(""); } //process the unload handler to close out the session. doUnload(true);
  • 29. Terminate / Exit //record the session time var endTimeStamp = new Date(); var totalMilliseconds = (endTimeStamp.getTime() - startTimeStamp.getTime()); var scormTime = ConvertMilliSecondsToSCORMTime(totalMilliseconds, false); API.LMSSetValue("cmi.core.session_time", scormTime); //if the user just closes the browser, we will default to saving //their progress data. If the user presses exit, he is prompted. //If the user reached the end, the exit normall to submit results. if (pressedExit == false && reachedEnd == false){ API.LMSSetValue("cmi.core.exit", "suspend"); } API.LMSFinish(""); SCORM cmi5 trackingPlugin.exit(false);
  • 30. Let’s See the Fruit of Our Labor The *cmi5* Golf Course
  • 31. Special Conversion Quirks ● Passed / Completed / Failed repeats: ○ Okay in SCORM ○ BAD in cmi5 - no dupes, no failed after passed ● Mastery score ○ SCORM: Evaluates and overwrites status after usage ○ cmi5: Checks at status Statement time, MUST reject if mismatched ● Sequencing ○ SCORM: Only supported in 2004, manifest-based ○ cmi5: No manifest-based sequencing, can only be done at runtime ■ Extensions: “requires”, “equivalences”
  • 32. CATAPULT Documentation GitHub repository, course examples, user guides, installation and deployment instructions can be found at: https://adlnet.github.io/CATAPULT/ cmi5 Best Practices Guide: https://adlnet.gov/assets/uploads/cmi5%20 Best%20Practices%20Guide%20-%20From%2 0Conception%20to%20Conformance.pdf
  • 33. Early cmi5 adopters that claim support for cmi5 according to cmi5 working group. Run your own CTS today! ● Use Docker*** ● Use a cmi5 conformant LRS How to pick an LRS: ● Check the cmi5 list of adopters ● Build your own! What do you need to get started with cmi5 https://aicc.github.io/CMI-5_Spec_Current/adoption/
  • 34. Resources Keep up-to-date on cmi5 CATAPULT https://adlnet.gov/projects/cmi5-CATAPULT/ & https://xapi.com/cmi5-project-catapult/ Visit ADL’s cmi5 page and xapi.com’s cmi5 page for more background https://adlnet.gov/projects/cmi5-standard/ & https://xapi.com/cmi5/ View ADL’s cmi5 resources https://adlnet.gov/resources/cmi5-resources/ Join the cmi5 weekly working group http://aicc.github.io/CMI-5_Spec_Current/
  • 35. Have questions? Ask us anything! George Vilches george.vilches@rusticisoftware.com Email us: info@rusticisoftware.com Learn more: rusticisoftware.com scorm.com xapi.com