Upload
christian-glahn
View
1.809
Download
2
Embed Size (px)
Citation preview
FHO Fachhochschule Ostschweiz
Unleashing Interaction XAPI and Moodle
SAMOO Meeting Luzern 12. Feb. 2016
@phish108 @htwblc
XAPI and Moodle § XAPI Plug-in
§ Exposes Moodle Logs as XAPI Streams (Read only LRS)
§ PowerTLA Drop-In § Full XAPI LRS with Document Support § Configurable User Identification § Authorization Layer for Tools and Users § Client-side API
my baby!
Why do I want XAPI?
§ Document student activities (E-Portfolios) § More flexible assessment § Gamification § Personalised OER § Tool integration
LMS plugins are too complicated for building cool solutions
Activity Activity Activity Activity Activity
Activity Streams and Statements
Context
Actor Verb
Object
Result Time Authority
UUID
The Basic XAPI Process
Senses learner activity
Makes VLEs respond
Sensor Networks
Senses learner activity
Access a resource Take a test
Post on a forum
Update a Wiki page
Upload an assignment
LMS Sensors
click
scroll
comment
align
Senses learner activity
GPS Light conditions
Display orientation Noise levels
Temperature
Tactile (shake, turn)
More Sensors
NFC
Unlock a resource
Example Actuators
Makes VLEs respond
Evaluate test scores
Provide an assignment
Update Portfolio
Message updates
Provide feedback
XAPI allows us to implement crazy complex learning environments
VLEDigital Library
Mobile App VLE
LRS
LRS
Sensor Network
Mobile App
LRS
Sensor Network
Mobile App
LRS
LocalSensor Network
Mobile App
LRSLocal
Sensor Network
VLE
LRS
VLE
LRS
VLE
LRS
Sensors
Output Actuators
Mobler Cards App LMS E-Portfolio System
LRS LRS LRSSensor Network
E-Portfolio System
LRS
E-Portfolio System
LRS
SCORM
Mobile App
LRS
LocalSensor Network
Simulation
LRSLocal
Sensor Network
VLE
LRS
VLE
LRS
E-Portfolio System
LRS
HR-Mangement
System
LRS
SCORM
PLE VLE
LRS
LRS
VLE
LRS
CMI /LRS
CMI /LRSContent
Interaction Script
Proxy Content
DRM
Just a few settings I toyed with
simple is best ... XAPI & Interactive Content
Educational Resource
LRS
ActuatorSensor
XAPI & Interactive Content
You have to code interactive resources HTML and JavaScript are mandatory
Moodle Theme
Client XAPI
Moodle UI API
Educational Resource
Resource Logic(JavaScript)
Moodle Server
Moodle Logging
API
XAPI LRS
Moodle Services
Moodle Auth API
Educational Design and Privacy Issues with Moodle Moodle does not offer a privilege system that supports student collaboration § Logs are tool- and teacher-centric § Each activity can have separate privilege sets § Privileges are not object orientated § Privileges are agnostic towards social relations Hence, PowerTLA has no collaboration support
A Word on SCORM-style CMI
AICC CMI (Computer Managed Instruction) New CMI-5 defines XAPI extensions and runtime requirements § Not always smartly, but it’s mainly for aviation people …
New CMI-5 concerns no longer client APIs
Let’s have a closer look at the PowerTLA Client XAPI
PowerTLA Client XAPI § Event-based API discovery § Abstracts and exposes XAPI Logic
§ Context management § Documents § Provides meaningful default values
§ Actors (default: yourself) § Objects (default: the page you’re on)
§ Long-running and nested activities
PowerTLA Client XAPI Interfaces (WIP) lrs.setActor(actorObject)lrs.unsetActor()//ContextManagementlrs.startContext(contextObject)lrs.endContext(contextObject)lrs.clearContext()contextObject=lrs.getContext()//ActivityManagementactionUUID=lrs.startAction(verb,[objectURL])actionUUID=lrs.recordAction(verb,[objectURL],[result])lrs.finishAction(actionUUID,[result])activityStream=lrs.getStream()activityStatement=lrs.lastAction()//StateDocumentslrs.setStateDoc(actionUUID,activityStateData)activityStateData=lrs.getStateDoc(actionUUID)
lrs.ready(function())lrs.enableAutoFinish()lrs.disableAutoFinish()//LRSCommunicationlrs.fetchMyActions(filter,function(stream))lrs.fetchUserActions(filter,function(stream))lrs.fetchActions(filter,function(stream))lrs.fetchState(function(stateDoc),objectId,actionUUID,actorObject)lrs.push()lrs.pushStream()lrs.pushState()//ClientPersistencylrs.store()lrs.load()lrs.flush()
PowerTLA turns the good old Page-Module into Activities
The magic
happens here
Simple Interaction Tracking <pclass="clickTargetbtn-largebtn-primaryspan4"type="button">Clickhere</p><scripttype="text/javascript"src="/tla/js/rsd.js"></script><scripttype="text/javascript"src="/tla/js/lrs.js"></script><scripttype="text/javascript">varverbClick='http://xapi.ch/verb/gui/click';lrs&&lrs.ready(function(){//initsensor$(".clickTarget").click(sensorFunction);});functionsensorFunction(){lrs.recordAction(verbClick);lrs.push();}</script>
Load the PowerTLA
API
Resource Logic
Normal HTML
Simple Interaction Tracking <pclass="clickTargetbtn-largebtn-primaryspan4"type="button">Clickhere</p><scripttype="text/javascript"src="/tla/js/rsd.js"></script><scripttype="text/javascript"src="/tla/js/lrs.js"></script><scripttype="text/javascript">varverbClick='http://xapi.ch/verb/gui/click';lrs&&lrs.ready(function(){//initsensor$(".clickTarget").click(sensorFunction);});functionsensorFunction(){lrs.recordAction(verbClick);lrs.push();}</script>
Verify that PowerTLA is available
Init the Interaction
Sensor
Record the Interaction
Tell Moodle
Our XAPI Verb
Reusing Past Interactions varverbClick='http://xapi.ch/verb/gui/click';lrs&&lrs.ready(function(){lrs.fetchMyActions({verb:verbCLick,object:document.location.href},actuatorFunction);$(".clickTarget").click(sensorFunction);});functionactuatorFunction(){$("#myActionCount").text(lrs.getStream().length);}functionsensorFunction(){lrs.recordAction(verbClick);actuatorFunction();lrs.push();}
Fetch the personal activities from Moodle
Filter only our XAPI verb
Filter only the current page
Look at the activities
Update the actuator
Our XAPI Click Counter Actuator
updated with every visit
Click Sensor
The Activity Stream [{"id":"3909970f-0b50-401f-9e12-0511435b8721","timestamp":"2016-02-12T09:30:54.869Z","actor":{"objectType":"Agent","openid":"https://mdl-tst.htwchur.ch/tla/restservice/identity/profile.php/user/YTxpSdh"},"verb":{"id":"http://xapi.ch/verb/gui/click"},"object":{"id":"https://mdl-tst.htwchur.ch/mod/page/view.php?id=51"},"stored":"2016-02-12T10:30:55+0100"},{"id":"ba0f8385-a642-499f-ab4b-3a8e4707412d","timestamp":"2016-02-12T10:48:34.900Z","actor":{"objectType":"Agent","openid":"https://mdl-tst.htwchur.ch/tla/restservice/identity/profile.php/user/YTxpSdh"},"verb":{"id":"http://xapi.ch/verb/gui/click"},"object":{"id":"https://mdl-tst.htwchur.ch/mod/page/view.php?id=51"},"stored":"2016-02-12T11:48:35+0100"},{"id":"d17760fc-db1b-4ce6-900c-387f6a3bb24f“,"timestamp":"2016-02-12T13:52:52.711Z","actor":{"objectType":"Agent","openid":"https://mdl-tst.htwchur.ch/tla/restservice/identity/profile.php/user/YTxpSdh"},"verb":{"id":"http://xapi.ch/verb/gui/click"},"object":{"id":"https://mdl-tst.htwchur.ch/mod/page/view.php?id=51"},"stored":"2016-02-12T14:52:51+0100"}]
Let‘s look at this statement
The Statement more Readable { "timestamp" : "2016-02-12T09:30:54.869Z", "object" : { "id" : "https://mdl-tst.htwchur.ch/mod/page/view.php?id=51" }, "id" : "3909970f-0b50-401f-9e12-0511435b8721", "actor" : { "openid" : "https://mdl-tst.htwchur.ch/tla/restservice/identity/profile.php/user/YTxpSdh", "objectType" : "Agent" }, "stored" : "2016-02-12T10:30:55+0100", "verb" : { "id" : "http://xapi.ch/verb/gui/click" } },
The page we looked at
PowerTLA controlled Student-ID
Our XAPI verb
All this has been generated by this JavaScript
lrs.recordAction(verbClic
k);
Student Time
Moodle Time
Use Activities from other Resources
varverbClick='http://xapi.ch/verb/gui/click';lrs&&lrs.ready(function(){lrs.fetchMyActions({verb:verCLick,object:document.location.href},actuatorFunction);}); functionactuatorFunction(){varactivityStream=lrs.getStream();$("#myActionCount").text(activityStream.length);//wecannowanalysetheindividualobjectsintheactivityStream...}
Remove the object filter to get all clicks
The Result are Cross Activity Analytics
The Activity Stream [...,{"id":"3a09a0d3-471d-4d82-8213-842c37996697","actor":{"objectType":"Agent","openid":"https://mdl-tst.htwchur.ch/tla/restservice/identity/profile.php/user/YTxpSdh"},"verb":{"id":"http://xapi.ch/verb/gui/click"},"object":{"id":"https://mdl-tst.htwchur.ch/mod/page/view.php?id=50"},"stored":"2016-02-11T21:43:21+0100","timestamp":"2016-02-11T20:43:21.694Z"},{"id":"3909970f-0b50-401f-9e12-0511435b8721","actor":{"objectType":"Agent","openid":"https://mdl-tst.htwchur.ch/tla/restservice/identity/profile.php/user/YTxpSdh"},"verb":{"id":"http://xapi.ch/verb/gui/click"},"timestamp":"2016-02-12T09:30:54.869Z","stored":"2016-02-12T10:30:55+0100","object":{"id":"https://mdl-tst.htwchur.ch/mod/page/view.php?id=51"}},...]
Click on Page 50
Click on Page 51
Complex Interactions – Nested Activities
mainUUID=lrs.startAction(mainActionVerb);lrs.startContext({"statement":mainUUID});lrs.recordAction(nestedActionVerb);lrs.recordAction(nestedActionVerb);lrs.recordAction(nestedActionVerb);lrs.endContext({"statement":mainUUID});lrs.finishAction(mainUUID);lrs.push();
Automaticaly link all following actions to
the main activity
Wrap things up and gather the results
Complex Interactions In Practice Brainstorming+Categorisation Activity
The activity is just 1 interactive Moodle page
Complex Interactions In Practice Step 1: Brainstorming
Students enter their ideas
Students mark when they are
ready to proceed
Complex Interactions In Practice Step 2: Categorisation
Student ideas are expanded with
predefined terms
Students drag&drop the ideas into
predefined categories
Students mark when they are
finshed
Complex Interactions In Practice Step 3: Feedback
Immediate Feedback and
Results
Provided Ideas Categorisation Accuracy
Complex Interactions In Practice Step 4: Flow-control (when visiting the page again)
Students can perform the activity
only once
Students & teachers can look
at the results
The Activity Stream [{"id":"e3118f32-3753-4700-bb6a-4e1b5f939e13","timestamp":"2016-02-13T02:08:05.844Z","actor":{"objectType":"Agent","openid":"https://mdl-tst.htwchur.ch/tla/restservice/identity/profile.php/user/-FDKeRx"},"verb":{"id":"http://mobinaut.org/xapi/verb/creative/ideacontribute"},"object":{"id":"https://mdl-tst.htwchur.ch/mod/page/view.php?id=53"},"context":{"statement":"b68b9c22-de8b-4b4c-b6d2-88883b291d66"},"result":{"extensions":{"http://mobinaut.io/xapi/result/input":"ETHLET"}}},{"id":"c905bac8-89d9-470d-94e7-44ad88744e76","timestamp":"2016-02-13T02:08:10.059Z","actor":{"objectType":"Agent","openid":"https://mdl-tst.htwchur.ch/tla/restservice/identity/profile.php/user/-FDKeRx"},"verb":{"id":"http://mobinaut.org/xapi/verb/creative/ideacontribute"},"object":{"id":"https://mdl-tst.htwchur.ch/mod/page/view.php?id=53"},"context":{"statement":"b68b9c22-de8b-4b4c-b6d2-88883b291d66"},"result":{"extensions":{"http://mobinaut.io/xapi/result/input":"MoodleCafé"}}},{"id":"cc5f752f-7e5c-4360-91f9-d28fd1d3df43","timestamp":"2016-02-13T02:08:14.750Z","actor":{"objectType":"Agent","openid":"https://mdl-tst.htwchur.ch/tla/restservice/identity/profile.php/user/-FDKeRx"},"verb":{"id":"http://mobinaut.org/xapi/verb/reflective/ideaassociate"},"object":{"id":"https://mdl-tst.htwchur.ch/mod/page/view.php?id=53"},"context":{"statement":"b68b9c22-de8b-4b4c-b6d2-88883b291d66"},"result":{"extensions":{"http://mobinaut.io/xapi/result/associate":["block1","SAMOO"]}}},{"id":"3457f69f-fcf1-4bd0-b0fb-a72923b6bbd5","timestamp":"2016-02-13T02:08:16.157Z","actor":{"objectType":"Agent","openid":"https://mdl-tst.htwchur.ch/tla/restservice/identity/profile.php/user/-FDKeRx"},"verb":{"id":"http://mobinaut.org/xapi/verb/reflective/ideaassociate"},"object":{"id":"https://mdl-tst.htwchur.ch/mod/page/view.php?id=53"},"context":{"statement":"b68b9c22-de8b-4b4c-b6d2-88883b291d66"},"result":{"extensions":{"http://mobinaut.io/xapi/result/associate":["block2","MoodleMoots"]}}},{"id":"35010d0b-a5fd-4154-bebb-c77d79f0f448","timestamp":"2016-02-13T02:08:17.245Z","actor":{"objectType":"Agent","openid":"https://mdl-tst.htwchur.ch/tla/restservice/identity/profile.php/user/-FDKeRx"},"verb":{"id":"http://mobinaut.org/xapi/verb/reflective/ideaassociate"},"object":{"id":"https://mdl-tst.htwchur.ch/mod/page/view.php?id=53"},"context":{"statement":"b68b9c22-de8b-4b4c-b6d2-88883b291d66"},"result":{"extensions":{"http://mobinaut.io/xapi/result/associate":["block3","HTWBLC"]}}},{"id":"147037b6-8b0d-492e-a21a-80ff5378c774","timestamp":"2016-02-13T02:08:18.446Z","actor":{"objectType":"Agent","openid":"https://mdl-tst.htwchur.ch/tla/restservice/identity/profile.php/user/-FDKeRx"},"verb":{"id":"http://mobinaut.org/xapi/verb/reflective/ideaassociate"},"object":{"id":"https://mdl-tst.htwchur.ch/mod/page/view.php?id=53"},"context":{"statement":"b68b9c22-de8b-4b4c-b6d2-88883b291d66"},"result":{"extensions":{"http://mobinaut.io/xapi/result/associate":["block2","Blackboard"]}}},{"id":"ec488973-a632-4347-85a5-1a0b6aa21f96","timestamp":"2016-02-13T02:08:19.805Z","actor":{"objectType":"Agent","openid":"https://mdl-tst.htwchur.ch/tla/restservice/identity/profile.php/user/-FDKeRx"},"verb":{"id":"http://mobinaut.org/xapi/verb/reflective/ideaassociate"},"object":{"id":"https://mdl-tst.htwchur.ch/mod/page/view.php?id=53"},"context":{"statement":"b68b9c22-de8b-4b4c-b6d2-88883b291d66"},"result":{"extensions":{"http://mobinaut.io/xapi/result/associate":["block1","MoodlePartners"]}}},{"id":"bc396eb8-d881-4d75-ba56-21c96fb646c6","timestamp":"2016-02-13T02:08:21.069Z","actor":{"objectType":"Agent","openid":"https://mdl-tst.htwchur.ch/tla/restservice/identity/profile.php/user/-FDKeRx"},"verb":{"id":"http://mobinaut.org/xapi/verb/reflective/ideaassociate"},"object":{"id":"https://mdl-tst.htwchur.ch/mod/page/view.php?id=53"},"context":{"statement":"b68b9c22-de8b-4b4c-b6d2-88883b291d66"},"result":{"extensions":{"http://mobinaut.io/xapi/result/associate":["block3","ETHLET"]}}},{"id":"a87d2abb-e79d-47ed-bc69-665012077cc8","timestamp":"2016-02-13T02:08:23.212Z","actor":{"objectType":"Agent","openid":"https://mdl-tst.htwchur.ch/tla/restservice/identity/profile.php/user/-FDKeRx"},"verb":{"id":"http://mobinaut.org/xapi/verb/reflective/ideaassociate"},"object":{"id":"https://mdl-tst.htwchur.ch/mod/page/view.php?id=53"},"context":{"statement":"b68b9c22-de8b-4b4c-b6d2-88883b291d66"},"result":{"extensions":{"http://mobinaut.io/xapi/result/associate":["block3","MoodleUserAssociation"]}}},{"id":"2bbb7a0b-7e43-447f-addf-fabf98954033","timestamp":"2016-02-13T02:08:25.501Z","actor":{"objectType":"Agent","openid":"https://mdl-tst.htwchur.ch/tla/restservice/identity/profile.php/user/-FDKeRx"},"verb":{"id":"http://mobinaut.org/xapi/verb/reflective/ideaassociate"},"object":{"id":"https://mdl-tst.htwchur.ch/mod/page/view.php?id=53"},"context":{"statement":"b68b9c22-de8b-4b4c-b6d2-88883b291d66"},"result":{"extensions":{"http://mobinaut.io/xapi/result/associate":["block2","MoodleCafé"]}}},{"id":"b68b9c22-de8b-4b4c-b6d2-88883b291d66","timestamp":"2016-02-13T02:08:05.842Z","actor":{"objectType":"Agent","openid":"https://mdl-tst.htwchur.ch/tla/restservice/identity/profile.php/user/-FDKeRx"},"verb":{"id":"http://mobinaut.org/xapi/verb/creative/brainstormassign+state"},"object":{"id":"https://mdl-tst.htwchur.ch/mod/page/view.php?id=53"},"result":{"duration":"PT0H0M21S"}}]
11 activities recorded in the example
Nested Activities from Step 1 {"id":"e3118f32-3753-4700-bb6a-4e1b5f939e13","object":{"id":"https://mdl-tst.htwchur.ch/mod/page/view.php?id=53"},"result":{"extensions":{"http://mobinaut.io/xapi/result/input":"ETHLET"}},"actor":{"openid":"https://mdl-tst.htwchur.ch/tla/restservice/identity/profile.php/user/-FDKeRx","objectType":"Agent"},"verb":{"id":"http://mobinaut.org/xapi/verb/creative/ideacontribute"},"timestamp":"2016-02-13T02:08:05.844Z","context":{"statement":"b68b9c22-de8b-4b4c-b6d2-88883b291d66"}}
Student Input Result
Link the framing activity via its ID
The kind of activity
lrs.startContext()creates the context for all following activities
Passed to lrs.recordAction()
Nested Activities from Step 2 {"id":"147037b6-8b0d-492e-a21a-80ff5378c774","object":{"id":"https://mdl-tst.htwchur.ch/mod/page/view.php?id=53"},"result":{"extensions":{"http://mobinaut.io/xapi/result/associate":["block2“,"Blackboard“]}},"verb":{"id":"http://mobinaut.org/xapi/verb/reflective/ideaassociate"},"actor":{"openid":"https://mdl-tst.htwchur.ch/tla/restservice/identity/profile.php/user/-FDKeRx","objectType":"Agent"},"context":{"statement":"b68b9c22-de8b-4b4c-b6d2-88883b291d66"},"timestamp":"2016-02-13T02:08:18.446Z"}
Categorisation Result
Link the framing activity via its ID
The kind of activity
The Framing Activity { "result" : { "duration" : "PT0H0M21S" }, "actor" : { "openid" : "https://mdl-tst.htwchur.ch/tla/restservice/identity/profile.php/user/-FDKeRx", "objectType" : "Agent" }, "object" : { "id" : "https://mdl-tst.htwchur.ch/mod/page/view.php?id=53" }, "id" : "b68b9c22-de8b-4b4c-b6d2-88883b291d66", "verb" : { "id" : "http://mobinaut.org/xapi/verb/creative/brainstormassign+state" }, "timestamp" : "2016-02-13T02:08:05.842Z" }
The ID for the result document
The verb tells us that there is a state
document
lrs.startAction()& lrs.finishAction()
automatically produce the activity‘s duration
The Activty State Document {"correcterms":3,"ownterms":["ETHLET","MoodleCafé"],"association":{"block1":[{"value":"SAMOO","match":1},{"value":"MoodlePartners","match":0}],"block2":[{"value":"MoodleMoots","match":0},{"value":"Blackboard","match":1},{"value":"MoodleCafé","match":0}],"block3":[{"value":"HTWBLC","match":0},{"value":"ETHLET","match":0},{"value":"MoodleUserAssociation","match":1}]}}
Assessment Result
Brainstorming Result
Correct Categorisation
Wrong Categorisation
The state document stores what the activity needs
Conclusions § XAPI allows us to create lightweight activities
for Moodle
§ The PowerTLA Client XAPI simplifies the activity tracking for interactive resources
§ The most complex part is the interaction design not the experience tracking
FHO Fachhochschule Ostschweiz
Christian Glahn Blended Learning Center @phish108 @htwblc
http://www.htwchur.chhttp://xapi.ch
https://github.com/phish108/PowerTLA