unleashing interaction - xapi and moodle

Post on 16-Feb-2017

1.809 Views

Category:

Software

2 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

top related