Table of Contents

TinCan

Tincan is a json store of activities that one has performed in an LMS. The LMS can be a web or mobile or desktop app. http://tincanapi.com/

Tincan uses json format to store data http://en.wikipedia.org/wiki/JSON , http://www.json.org/

Implementation

Work flow

1. Tincan runs as an application on it's own.

2. Any LMS (like Expertus one) has to register as a client application through the web page provided by Tincan app. LMS is approved by the admin of tincan app. Once it is approved, LMS needs to follow Oauth(2.0) to authenticate itself and start using the API.

3. In case of multi tenent applications each company/site can register itself as an app in tincan so that data is kept seperated. This is needed because tincan assumes an actor (LMS user) is unique and is identified by email in our case. In case more than one site in the multi tenant LMS has the same user, this helps to differentiate his actions on each site.

4. LMS is provided with the oauth access token using which it can store records in LRS through the REST API.

5. The record is stored in raw format. Each record is called a statement.

6. The following things are separated from the record.

  1. The Actor or who's done it
  2. The Verb or what he has done
  3. The TincanObject or on which the action is performed.

7. The LMS can query the statements, using the search API provided by app.

8. The LMS can get the info of agents, verbs and etc. using their APIs.

REST API

With the implementation of above algorithm we can provide a simple search interface as shown. The rest API implemented will be based upon https://cloud.scorm.com/sc/user/LRSView so that it could be queried from any querying agent that can query an LRS.

Record.tinsearch(actor_identifier, verb_identifier, object_identifier, start_time, end_time, search_term)

The above interface will help build almost any query for the purpose of report generation or for other purposes. External applications can use the LRS service via a REST interface explained here https://wiki.exphosted.com/doku.php/tincan_api_rest

Model Architecture

Supported API

We provide a REStful api as explained here https://wiki.exphosted.com/doku.php/tincan_api_rest

Supported Verbs

The following verbs will be supported: http://adlnet.gov/expapi/verbs/

Software and gems used

The following gems are used to build this app

Json Record Table

json dump: A column that contains the json dump of data app id: An id that relates which app has put in the data This table will be modeled in Rails app along with an REST API that will help any application put in data into the LRS.

Validations on Json Record

The following validations should be done on JSON record

An example Tincan statement

Suggestion: Why can’t we allow people to put their own regexp for an app to validate a statement being inserted?

Table Designs

Table Name: users

Column Name Type Description
id Integer For internal Rails purpose
mail String email of the login
hashed_password String SHA2 / SHA1 hash of the password
recovery_token String Password recovery token
token_expires_at DateTime Time at which token expires
created_at DateTime For internal Rails purpose
updated_at DateTime For internal Rails purpose

Table Name: client_applications

Column Name Type Description
id Integer For internal Rails purpose
name String Name of the application
key String Key for the app to be used in authentication
user_id Integer Identifies to which user the app belongs
created_at DateTime For internal Rails purpose
updated_at DateTime For internal Rails purpose

Table Name: statements

Column Name Type Description Example Content
id Integer For internal Rails purpose
guid String This is the id of statement in Tincan statement (must be unique)
client_application_id Integer Id of application to which the statement belongs
content Text Json content that's stored Please checkout this link
tracked_at DateTime Time at which record was created (this is extracted from json)
verb_id Integer The id in the Verb model is mapped here and indexed
actor_id Integer The id in the actor model is mapped here and indexed
tincan_object_id Integer id of object Polymorphed between Actor, Activity and Statement (by default its activity)
tincan_object_type Integer The type of Polymorphed tincan_object is mapped here
created_at DateTime For internal Rails purpose
updated_at DateTime For internal Rails purpose

Table Name: actors

Name Type Description
id Integer For internal Rails purpose se
type String Describing what the agent is - (Agent/Group) - By default its agent
identifier String mbox / mboxsha/ openid
identifier_type Integer The identifier type (0-mbox, 1-mbox hash, 2-openid)
content Text The content dump of the actor
created_at DateTime For internal Rails purpose
updated_at DateTime For internal Rails purpose

Table Name: verbs

Name Type Description Example Content
id Integer For internal Rails purpose
spec_id String id of the verb extracted from the Record
content Text The raw text content of the verb that was last pushed { “id”: “http://adlnet.gov/expapi/verbs/experienced”, “display”: {“en-US”: “experienced”} }
created_at DateTime For internal Rails purpose
updated_at DateTime For internal Rails purpose

Table Name: activities

Column Name Type Description Example Content
id Integer For internal Rails purpose
spec_id String The id of activity present in the Tincan statement
content Text The raw text content of the activity object that was last pushed { “id”: “http://example.com/activities/solo-hang-gliding”, “definition”: {“name”: { “en-US”: “Solo Hang Gliding” }}
created_at DateTime For internal Rails purpose
updated_at DateTime For internal Rails purpose

Table Name: results

Name Type Description
id Integer For internal Rails purpose
statement_id Integer Links the Statement model to the result
success boolean Says weather the person has succeeded in the activity
completion boolean Says weather the person has completed the activity
response String The response / or remarks for this result
duration Decimal Duration in seconds
created_at DateTime For internal Rails purpose
updated_at DateTime For internal Rails purpose

Table Name: scores

Column Name Type Description
id Integer Unique identifier in the DB
result_id Integer Links the result model to the score
raw Decimal The score the student has obtained
min Decimal The minimum test score
max Decimal The maximum score that can be obtained
created_at DateTime For internal Rails purpose
updated_at DateTime For internal Rails purpose

Searching

Fetching records is an important issue. So searching of some sort must be provided. These are the methoods that could be followed

  1. A simple SQL based search
  2. If the previous method becomes slow, we can implement a Solr based search

Sample client application

A sample client will be built that demos how to consume the REST APIs.

Example - https://github.com/adlnet/experienceapi_client_examples/tree/master/1.0

Will also explore API gee to test API end points.

Help for LMSs and conent providers to prepare tincan statements

1) Converting scorm to tin can statements - http://tincanapi.co.uk/pages/SCORM_to_Tin_Can_API.html

2) Authoring tools that support tincan api.

3) How LMSs can launch tincan activities ?

This is specific to the LMS's player. They can launch in any possible way and track the statemtents. In general, to play articulate and capitivate content, some examples and code is available and can be found at http://tincanapi.co.uk/ under the section “Code and samples”

Tincan API Enhancements

Following are the list of enhacnements planned for the expertus tincan LRS.

1) Client app login and Reporting -

Allow each client app to login from the UI to view their statements reports. Some of the initial set of reports could be like below.

2) Tincan LRS Connectors/Launchers -

Some libraries should be provided to the client apps to be able to easily send statemtents to tincan LRS. Initially these connectors support Drupal, google course builder and learnexa app(or any rails app).

References -

Drupal -

https://drupal.org/node/1829346

https://github.com/phkemper/xapi

Google course builder -

https://code.google.com/r/fugu13-tincan-course-builder/

3) Refreshed UI -

UI of the tincan LRS app needs to be redesigned.

References

Open items/Comments

To be done

  1. Should decide if concurrency control and state API are needed? If needed, they will be delivered in next version.
  2. Not many apps will be using this LRS. Still, we need to decide if API throttling needs to be done.
  3. Build a statement viewer like - http://tincanapi.com/public-lrs/ . Allow client applications to login and see the statements. (Done)