Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
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 LR...
Why do I want XAPI?
§  Document student activities (E-Portfolios)
§  More flexible assessment
§  Gamification
§  Personali...
ActivityActivityity Activity Ac
Activity Streams and Statements
Context
Actor
Verb
Object
Result
TimeAuthority
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
...
Senses
learner activity
GPS
Light conditions
Display orientationNoise levels
Temperature
Tactile (shake, turn)
More Sensor...
Unlock a resource
Example Actuators
Makes VLEs
respond
Evaluate test scores
Provide an assignment
Update Portfolio
Message...
XAPI allows us to implement crazy
complex learning environments
VLEDigital Library
Mobile App VLE
LRS
LRS
ensor
twork
Mobi...
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 XA...
Educational Design and
Privacy Issues with Moodle
Moodle does not offer a privilege system that
supports student collabora...
A Word on
SCORM-style CMI
AICC CMI (Computer Managed Instruction)
New CMI-5 defines XAPI extensions and runtime
requiremen...
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
§...
PowerTLA Client XAPI
Interfaces (WIP)
lrs.setActor(actorObject)	
lrs.unsetActor()	
	
//	Context	Management	
lrs.startConte...
PowerTLA turns the good old
Page-Module into Activities
The
magic
happens
here
Simple Interaction Tracking
<p	class="clickTarget	btn-large	btn-primary	span4"	type="button">Click	here</p>	
	
<script	typ...
Simple Interaction Tracking
<p	class="clickTarget	btn-large	btn-primary	span4"	type="button">Click	here</p>	
	
<script	typ...
Reusing Past Interactions
var	verbClick	=	'http://xapi.ch/verb/gui/click';	
	
lrs	&&	lrs.ready(function()	{	
					lrs.fetc...
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":{"object...
The Statement more Readable
{
"timestamp" : "2016-02-12T09:30:54.869Z",
"object" : {
"id" : "https://mdl-tst.htwchur.ch/mo...
Use Activities from other
Resources
var	verbClick	=	'http://xapi.ch/verb/gui/click';	
	
lrs	&&	lrs.ready(function()	{	
			...
The Result are Cross
Activity Analytics
The Activity Stream
[...,	
				{	"id"	:	"3a09a0d3-471d-4d82-8213-842c37996697",	
						"actor"	:	{	
							"objectType"	:	...
Complex Interactions
– Nested Activities
mainUUID	=	lrs.startAction(mainActionVerb);	
lrs.startContext({"statement":	mainU...
Complex Interactions In Practice
Brainstorming+Categorisation Activity
The activity is just1 interactive Moodle page
Complex Interactions In Practice
Step 1: Brainstorming
Students enter
their ideas
Students mark
when they are
ready to pro...
Complex Interactions In Practice
Step 2: Categorisation
Student ideas are
expanded with
predefined terms
Students drag&dro...
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
onl...
The Activity Stream
[{"id":"e3118f32-3753-4700-bb6a-4e1b5f939e13","timestamp":"2016-02-13T02:08:05.844Z","actor":
{"object...
Nested Activities from Step 1
{	
						"id"	:	"e3118f32-3753-4700-bb6a-4e1b5f939e13",	
						"object"	:	{	
									"id"	:...
Nested Activities from Step 2
{	
						"id"	:	"147037b6-8b0d-492e-a21a-80ff5378c774",	
						"object"	:	{	
									"id"	:...
The Framing Activity
{
"result" : {
"duration" : "PT0H0M21S"
},
"actor" : {
"openid" : "https://mdl-tst.htwchur.ch/tla/res...
The Activty State Document
{	
			"correcterms":3,	
			"ownterms":["ETH	LET","Moodle	Café"],	
			"association":{	
							"b...
Conclusions
§  XAPI allows us to create lightweight activities
for Moodle
§  The PowerTLA Client XAPI simplifies the
activ...
FHO Fachhochschule Ostschweiz
Christian Glahn
Blended Learning Center
@phish108 @htwblc
http://www.htwchur.ch	http://xapi....
Upcoming SlideShare
Loading in …5
×

Unleashing Interaction - XAPI and Moodle

2,542 views

Published on

This presentation shows how to create simple interactive resources using XAPI in Moodle using the PowerTLA client API.

Published in: Software

Unleashing Interaction - XAPI and Moodle

  1. 1. FHO Fachhochschule Ostschweiz Unleashing Interaction XAPI and Moodle SAMOO Meeting Luzern 12. Feb. 2016 @phish108 @htwblc
  2. 2. 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!
  3. 3. 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
  4. 4. ActivityActivityity Activity Ac Activity Streams and Statements Context Actor Verb Object Result TimeAuthority UUID
  5. 5. The Basic XAPI Process
  6. 6. Senses learner activity Makes VLEs respond Sensor Networks
  7. 7. 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
  8. 8. Senses learner activity GPS Light conditions Display orientationNoise levels Temperature Tactile (shake, turn) More Sensors NFC
  9. 9. Unlock a resource Example Actuators Makes VLEs respond Evaluate test scores Provide an assignment Update Portfolio Message updates Provide feedback
  10. 10. XAPI allows us to implement crazy complex learning environments VLEDigital Library Mobile App VLE LRS LRS ensor twork Mobile App LRS ensor twork Mobile App LRS Local Sensor Network Mobile App LRS Local Sensor Network VLE LRS VLE LRS VLE LRS Sensors Output Actuators Mobler Cards App LMS E-Portfolio System LRS LRS LRS nsor twork E-Portfolio System LRS E-Portfolio System LRS SCORM Mobile App LRS Local Sensor Network Simulation LRS Local Sensor Network VLE LRS VLE LRS E-Portfolio System LRS HR- Mangement System LRS SCORM PLE V LRS LR V LR CMI / LRS CMI / LRS Content Interaction Script Proxy Content DRM Just a few settings I toyed with
  11. 11. simple is best ... XAPI & Interactive Content Educational Resource LRS ActuatorSensor
  12. 12. 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
  13. 13. 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
  14. 14. 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
  15. 15. Let’s have a closer look at the PowerTLA Client XAPI
  16. 16. 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
  17. 17. PowerTLA Client XAPI Interfaces (WIP) lrs.setActor(actorObject) lrs.unsetActor() // Context Management lrs.startContext(contextObject) lrs.endContext(contextObject) lrs.clearContext() contextObject = lrs.getContext() // Activity Management actionUUID = lrs.startAction(verb, [objectURL]) actionUUID = lrs.recordAction(verb, [objectURL], [result]) lrs.finishAction(actionUUID, [result]) activityStream = lrs.getStream() activityStatement = lrs.lastAction() // State Documents lrs.setStateDoc(actionUUID, activityStateData) activityStateData = lrs.getStateDoc(actionUUID) lrs.ready(function()) lrs.enableAutoFinish() lrs.disableAutoFinish() // LRS Communication lrs.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() // Client Persistency lrs.store() lrs.load() lrs.flush()
  18. 18. PowerTLA turns the good old Page-Module into Activities The magic happens here
  19. 19. Simple Interaction Tracking <p class="clickTarget btn-large btn-primary span4" type="button">Click here</p> <script type="text/javascript" src="/tla/js/rsd.js"></script> <script type="text/javascript" src="/tla/js/lrs.js"></script> <script type="text/javascript"> var verbClick = 'http://xapi.ch/verb/gui/click'; lrs && lrs.ready(function() { // init sensor $(".clickTarget").click(sensorFunction); }); function sensorFunction() { lrs.recordAction(verbClick); lrs.push(); } </script> Load the PowerTLA API Resource Logic Normal HTML
  20. 20. Simple Interaction Tracking <p class="clickTarget btn-large btn-primary span4" type="button">Click here</p> <script type="text/javascript" src="/tla/js/rsd.js"></script> <script type="text/javascript" src="/tla/js/lrs.js"></script> <script type="text/javascript"> var verbClick = 'http://xapi.ch/verb/gui/click'; lrs && lrs.ready(function() { // init sensor $(".clickTarget").click(sensorFunction); }); function sensorFunction() { lrs.recordAction(verbClick); lrs.push(); } </script> Verify that PowerTLA is available Init the Interaction Sensor Record the Interaction Tell Moodle Our XAPI Verb
  21. 21. Reusing Past Interactions var verbClick = 'http://xapi.ch/verb/gui/click'; lrs && lrs.ready(function() { lrs.fetchMyActions({verb: verbCLick, object: document.location.href}, actuatorFunction); $(".clickTarget").click(sensorFunction); }); function actuatorFunction() { $("#myActionCount").text(lrs.getStream().length); } function sensorFunction() { 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
  22. 22. Our XAPI Click Counter Actuator updated with every visit Click Sensor
  23. 23. 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
  24. 24. 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(verbClick); Student Time Moodle Time
  25. 25. Use Activities from other Resources var verbClick = 'http://xapi.ch/verb/gui/click'; lrs && lrs.ready(function() { lrs.fetchMyActions({verb: verCLick, object: document.location.href}, actuatorFunction); }); function actuatorFunction() { var activityStream = lrs.getStream(); $("#myActionCount").text(activityStream.length); // we can now analyse the individual objects in the activityStream ... } Remove the object filter to get all clicks
  26. 26. The Result are Cross Activity Analytics
  27. 27. 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
  28. 28. 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
  29. 29. Complex Interactions In Practice Brainstorming+Categorisation Activity The activity is just1 interactive Moodle page
  30. 30. Complex Interactions In Practice Step 1: Brainstorming Students enter their ideas Students mark when they are ready to proceed
  31. 31. 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
  32. 32. Complex Interactions In Practice Step 3: Feedback Immediate Feedback and Results Provided Ideas Categorisation Accuracy
  33. 33. 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
  34. 34. 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":"ETH LET"}}}, {"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":"Moodle Café"}}}, {"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","Moodle Moots"]}}},{"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","HTW BLC"]}}},{"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- 11 activities recorded in the example
  35. 35. 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" : "ETH LET" } }, "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()
  36. 36. 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
  37. 37. 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
  38. 38. The Activty State Document { "correcterms":3, "ownterms":["ETH LET","Moodle Café"], "association":{ "block1":[{"value":"SAMOO","match":1}, {"value":"Moodle Partners","match":0}], "block2":[{"value":"Moodle Moots","match":0}, {"value":"Blackboard","match":1}, {"value":"Moodle Café","match":0}], "block3":[{"value":"HTW BLC","match":0}, {"value":"ETH LET","match":0}, {"value":"Moodle User Association","match":1}] } } Assessment Result Brainstorming Result Correct Categorisation Wrong Categorisation The state document storeswhat the activity needs
  39. 39. 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
  40. 40. FHO Fachhochschule Ostschweiz Christian Glahn Blended Learning Center @phish108 @htwblc http://www.htwchur.ch http://xapi.ch https://github.com/phish108/PowerTLA

×