A hands-on tutorial for the SocioCortex REST-API.
1. Introduction
1.1. Motivation
Social information management involves multiple users collaborating in the design and creation of information.  Therefore, social information management systems share a common set of general capabilities and features.
SocioCortex integrates those features and exposes them as services to its applications. In this way, domain-specific applications built upon the SocioCortex platform benefit from proven solution patterns for prevalent social information management problems.
App developers can build custom apps faster using the rich REST-API of the SocioCortex platform.
In order to spur the use of the REST-API and to remove barriers, this tutorial provides a hands-on example covering most of the typical use cases relevant for developers.
1.2. Concepts
1.2.1. Architecture
The image below illustrates the layers the SocioCortex REST-API is built of:
1.2.2. Class Hierarchy
To get a deeper understanding of the class hierarchy, the following class diagram seeks to abstract the classes and their hierarchical relationships:
1.2.3. Basic Types in SocioCortex
Shortly, we introduce the basic types that can be used within the SocioCortex ecosystem:
-
Number
-
String
-
Enumeration
-
Date
Furthermore, developers can define their own data types by creating respective entity type definitions as well as refine them with custom attribute definitions.
1.2.4. Helpful Resources
-
SocioCortex Server, https://server.sociocortex.com
-
SC-Angular, A library for developing apps with AngularJS and the SocioCortex REST-API, https://github.com/sebischair/sc-angular
2. Configuration
2.1. Running your own SocioCortex server instance
If you want to run your own SocioCortex server, you’ll find instructions and all necessary files for an on-premise installation here.
As you will work with a different server domain as the sebis SocioCortex server, you need to adjust all the URIs in the Postman collection throughout this tutorial and replace server.sociocortex.com with your respective server url (e.g. if running the server locally localhost:8083).
2.2. Working with sebis SocioCortex server
If you want to work with the server instance provided by the sebis chair, you can do so by simply registering on https://server.sociocortex.com (see image below).
Alternatively, you can register over the REST-API itself as outlined in the upcoming section Authentication.
2.3. Postman setup
Postman is an application which is used to test and develop APIs. Its straightforward UI enables developers to send custom HTTP requests very comfortably. It can either be downloaded here: https://www.getpostman.com/
Or by simply clicking the button below:
3. Getting started with the REST-API
3.1. Introduction to demo scenario
The demo scenario that will serve as a real world example to demonstrate the usage of the SocioCortex REST-API is a simple publication management system.
Before we can start with the actual scenario, we check that the authentication is working for your credentials and shortly outline the differences of jwt and basic auth.
Once the authentication works, we create a workspace which we then use to store the required entity types in. We identify the required entity types as publication and conference. The latter we use to add entities, i.e. publications or conferences, to the workspace with respective entity types.
Furthermore, tasks and their definitions are introduced and combined with the attribute definitions of entity types.
While going through the demo scenario all HTTP verbs will be taken into account in order to make you feel comfortable with all kinds of actions necessary to interact with the SocioCortex REST-API.
3.1.1. Structure of resource URIs
Example URI for accessing all resources of type entityType within a workspace with a specific ID:
Additionally, one can provide query parameters to further refine for instance the requested meta attributes. More on query parameters can be found in [Query Parameters].
3.2. Authentication
In order to get started with SocioCortex, we first need to create an account to be able to create an own workspace as well as other entities.
3.2.1. Registering a new user (POST)
Request:
POST https://server.sociocortex.com/api/v1/users
BODY
{
"name":"$NAME",
<EMAIL_ADDRESS>"password":"$PASSWORD"
}
Response:
{
"isVerified": false,
"locale": "de-DE",
"mayCreateWorkspace": false,
"mayCreateGroup": false,
"id": "$ID",
"versions": [],
"email"<EMAIL_ADDRESS>"name": "$NAME",
"href": "https://server.sociocortex.com/api/v1/users/$ID",
"mayEdit": true,
"isAdministrator": false,
"mayCreateUser": false,
"groups": []
}
After having successfully send this information to the server, we check the respective provided email account for an email containing an activation link for SocioCortex.
Once we click the link in the email, the account is activated and we are ready to go.
3.2.2. Log in to SocioCortex
There are two ways to log in to SocioCortex, either by HTTP Basic authentication or by using JSON Web Tokens (JWT, https://jwt.io/). Throughout this tutorial we will be using the predefined HTTP requests from the Postman-Collection. Therefore, we encourage you to simply replace the placeholder $TOKEN in all the Postman requests with your own JWT (see JWT).
Basic auth
Basic Auth requires to send a respective HTTP Authorization Header in every request to the server. This Authorization Header contains a username and password combined with a single colon and base64-encoded with a "Basic" prefix, denoting the authorization method. Thus, it does not require any cookies, session identifiers or tokens provided and signed by the server.
An example request to get a users details could be the following:
Request:
GET https://server.sociocortex.com/api/v1/users/me
Authorization: Basic $BASE64_ENCODED_CREDENTIALS
JWT
A JWT can be received by providing the credentials to the server in the payload of a HTTP POST request. The token has an expiry date in its payload as well as user information.
Request:
POST https://server.sociocortex.com/api/v1/jwt
BODY
{
<EMAIL_ADDRESS>"password":"$PASSWORD"
}
Response:
{
"token": "$TOKEN",
"payload": {
"exp": "$EXPIRY_DATE",
"sub": "$USER_ID",
"name": "$NAME"
}
}
After having received the token, the token is sent with every request on access-restricted resources in a respective HTTP Authorization Header with the prefix "Bearer".
An example request to get a users details could be the following:
Request:
GET https://server.sociocortex.com/api/v1/users/me
Authorization: Bearer $TOKEN
3.3. Creating a workspace
Before creating our first workspace we check for the currently available workspaces because who knows, maybe someone else did the job for us already.
We do this with a simple HTTP GET request on the workspaces resource. The server will respond with a list of workspaces stored.
3.3.1. Looking for existing workspaces (GET)
Request:
GET https://server.sociocortex.com/api/v1/workspaces
Response:
[
{
"id": "944wcmiregxu",
"name": "sc-visualizer",
"href": "https://server.sociocortex.com/api/v1/workspaces/944wcmiregxu"
},
{
"id": "107yhdgc7q9u6",
"name": "Northwind",
"href": "https://server.sociocortex.com/api/v1/workspaces/107yhdgc7q9u6"
}
]
We can tell that no one has yet created a publication management workspace so we continue by creating one with a HTTP POST request.
3.3.2. Creating workspace publication management (POST)
Request:
POST https://server.sociocortex.com/api/v1/workspaces
BODY
{
"name": "Publication Management"
}
Response:
{
"id": "10sasph8dvxhg",
"versions": ["..."],
"rootEntity": {
"id": "bqr7jmg37vqt",
"name": "Publication Management - Home",
"href": "https://server.sociocortex.com/api/v1/entities/bqr7jmg37vqt"
},
"mayCreateEntities": true,
"isFavorite": false,
"entityTree": {
"id": "bqr7jmg37vqt",
"name": "Publication Management - Home",
"href": "https://server.sociocortex.com/api/v1/entities/bqr7jmg37vqt"
},
"name": "Publication Management",
"permissions": {
"contributors": [],
"administrators": [
{
"id": "$USER_ID",
"name": "$NAME",
"href": "https://server.sociocortex.com/api/v1/users/$USER_ID"
}
],
"writers": [],
"readers": []
},
"customFunctions": [],
"mayEdit": true,
"href": "https://server.sociocortex.com/api/v1/workspaces/10sasph8dvxhg"
}
3.3.3. Looking at a single workspace (GET)
As we have seen in the response of the server on our POST request the workspace has been created with an id (in my case the id 10sasph8dvxhg). We can easily use this id now to get this specific workspace. In the following requests replace the id 10sasph8dvxhg with your own "$WORKSPACE_ID".
Request:
GET https://server.sociocortex.com/api/v1/workspaces/10sasph8dvxhg
Response:
{
"id": "10sasph8dvxhg",
"versions": [
{
"action": "Edited",
"date": "2016-07-15T17:06:42.012Z",
"type": "_edit",
"user": {
"id": "$USER_ID",
"name": "$NAME",
"href": "https://server.sociocortex.com/api/v1/users/$USER_ID"
}
},
{
"action": "Added",
"date": "2016-07-15T17:06:41.371Z",
"type": "_new",
"user": {
"id": "$USER_ID",
"name": "$NAME",
"href": "https://server.sociocortex.com/api/v1/users/$USER_ID"
}
}
],
"rootEntity": {
"id": "bqr7jmg37vqt",
"name": "Publication Management - Home",
"href": "https://server.sociocortex.com/api/v1/entities/bqr7jmg37vqt"
},
"mayCreateEntities": true,
"isFavorite": false,
"entityTree": {
"id": "bqr7jmg37vqt",
"name": "Publication Management - Home",
"href": "https://server.sociocortex.com/api/v1/entities/bqr7jmg37vqt"
},
"name": "Publication Management",
"permissions": {
"contributors": [],
"administrators": [
{
"id": "$USER_ID",
"name": "$NAME",
"href": "https://server.sociocortex.com/api/v1/users/$USER_ID"
}
],
"writers": [],
"readers": []
},
"customFunctions": [],
"mayEdit": true,
"href": "https://server.sociocortex.com/api/v1/workspaces/10sasph8dvxhg"
}
There are some attributes which are obvious and some that will be introduced throughout the tutorial. In Permissions the concept of read/write accessibility is further discussed.
3.4. Creating entity types
Now that we have created the workspace where the publication management system will store its contents, we can continue by creating two entity types required to store publications prepared for and presented on multiple conferences.
3.4.1. Creating publication entity type (POST)
To create an entity type in a workspace we simply concat the URI of the workspace by /entityTypes and use the HTTP POST method to create a new entity type publication.
Request:
POST https://server.sociocortex.com/api/v1/workspaces/10sasph8dvxhg/entityTypes
BODY
{
"name": "Publication"
}
Response:
{
"processes": [],
"attributeDefinitions": [],
"taskDefinitions": [],
"workspace": {
"id": "10sasph8dvxhg",
"name": "Publication Management",
"href": "https://server.sociocortex.com/api/v1/workspaces/10sasph8dvxhg"
},
"entitiesCount": 0,
"structurednessMetric": 1,
"id": "dt56spnul01p",
"versions": [
{
"action": "Added",
"date": "2016-07-15T17:26:37.202Z",
"type": "_new",
"user": {
"id": "$USER_ID",
"name": "$NAME",
"href": "https://server.sociocortex.com/api/v1/users/$USER_ID"
}
}
],
"consistencyMetric": 1,
"derivedAttributeDefinitions": [],
"name": "Publication",
"allowFreeAttributes": false,
"associations": [],
"incomingAssociations": [],
"customFunctions": [],
"mayEdit": true,
"href": "https://server.sociocortex.com/api/v1/entityTypes/dt56spnul01p"
}
3.4.2. Creating conference entity type (POST)
Request:
POST https://server.sociocortex.com/api/v1/workspaces/10sasph8dvxhg/entityTypes
BODY
{
"name": "Conference"
}
Response:
{
"processes": [],
"attributeDefinitions": [],
"taskDefinitions": [],
"workspace": {
"id": "10sasph8dvxhg",
"name": "Publication Management",
"href": "https://server.sociocortex.com/api/v1/workspaces/10sasph8dvxhg"
},
"entitiesCount": 0,
"structurednessMetric": 1,
"id": "19c48jgd4b8m2",
"versions": [
{
"action": "Added",
"date": "2016-07-15T17:29:20.655Z",
"type": "_new",
"user": {
"id": "$USER_ID",
"name": "$NAME",
"href": "https://server.sociocortex.com/api/v1/users/$USER_ID"
}
}
],
"consistencyMetric": 1,
"derivedAttributeDefinitions": [],
"name": "Conference",
"allowFreeAttributes": false,
"associations": [],
"incomingAssociations": [],
"customFunctions": [],
"mayEdit": true,
"href": "https://server.sociocortex.com/api/v1/entityTypes/19c48jgd4b8m2"
}
Finally, we have our workspace and the two required entity types set up. In the next steps we refine the attributes of the entity types before we start creating entities in the step after.
3.5. Creating attribute definitions
Sociocortex offers the possibility to create custom attribute definitions for attributes of entity types. This is a common task and you can make use of the attribute types introduced in Concepts or define relations between entity types.
3.5.1. Creating text attributes (POST)
The simplest attribute defintion type is surely a text attribute. We create a text attribute Abstract which should store the abstract of a publication. Therefore we send a HTTP POST request on the attribute definitions of the respective entity type - in this case the publication.
Request:
POST https://server.sociocortex.com/api/v1/entityTypes/dt56spnul01p/attributeDefinitions
BODY
{
"name": "Abstract",
"multiplicity": "maximalOne",
"attributeType": "Text"
}
Response:
{
"id": "2gegqgdueyqd",
"versions": [],
"readOnly": false,
"name": "Abstract",
"multiplicity": "maximalOne",
"attributeType": "Text",
"entityType": {
"id": "dt56spnul01p",
"name": "Publication",
"href": "https://server.sociocortex.com/api/v1/entityTypes/dt56spnul01p"
},
"href": "https://server.sociocortex.com/api/v1/attributeDefinitions/2gegqgdueyqd"
}
More attribute definitions of the various types are created in the next sections. For the matter of simplicity, we leave out the responses for the following requests.
3.5.2. Creating numeric attributes (POST)
Every conference needs a year in which it is taking place. We use a numeric attribute respectively:
Request:
POST https://server.sociocortex.com/api/v1/entityTypes/19c48jgd4b8m2/attributeDefinitions
BODY
{
"name": "Year",
"multiplicity": "maximalOne",
"attributeType": "Number"
}
3.5.3. Creating enumeration attributes (POST)
Every publication needs one of the statuses: Planned, Submitted, Accepted. We will create an attribute defintion of type enum to realize this.
Request:
POST https://server.sociocortex.com/api/v1/entityTypes/dt56spnul01p/attributeDefinitions
BODY
{
"name": "Status",
"multiplicity": "maximalOne",
"attributeType": "Enumeration",
"options": {
"enumerationValues": [
"Planned",
"Submitted",
"Accepted"
]
}
}
Conferences also require an enum attribute - the rank of the conference:
Request:
POST https://server.sociocortex.com/api/v1/entityTypes/19c48jgd4b8m2/attributeDefinitions
BODY
{
"name": "Rank",
"multiplicity": "maximalOne",
"attributeType": "Enumeration",
"options": {
"enumerationValues": [
"A",
"B",
"C"
]
}
}
3.5.4. Creating relation attributes (POST)
A simple example for a relation among two entity types is an acceptedIn relation for publications. Once they are accepted by a conference the conferences are stored in this attribute.
Request:
POST https://server.sociocortex.com/api/v1/entityTypes/dt56spnul01p/attributeDefinitions
BODY
{
"name": "acceptedIn",
"multiplicity": "any",
"attributeType": "Link",
"options": {
"entityType": {
"id": "19c48jgd4b8m2"
},
"resourceType": "entities"
}
}
Another straightforward relation is the mapping of authors to publications:
Request:
POST https://server.sociocortex.com/api/v1/entityTypes/dt56spnul01p/attributeDefinitions
BODY
{
"name": "authors",
"multiplicity": "any",
"attributeType": "Link",
"options": {
"resourceType": "users"
}
}
3.6. Creating entities
To create entities of the two entity types send HTTP POST requests to the types' endpoints, defined by their respective id.
3.6.1. Creating a conference entity (POST)
Request:
POST https://server.sociocortex.com/api/v1/entityTypes/19c48jgd4b8m2/entities
BODY
{
"name": "International Conference on Software Engineering (ICSE)",
"attributes":[
{
"name":"Rank",
"values":["A"]
},
{
"name":"Year",
"values":[2016]
}
]
}
Response:
{
"files": [],
"workspace": {
"id": "10sasph8dvxhg",
"name": "Publication Management",
"href": "https://server.sociocortex.com/api/v1/workspaces/10sasph8dvxhg"
},
"children": [],
"tasks": [],
"entityType": {
"id": "19c48jgd4b8m2",
"name": "Conference",
"href": "https://server.sociocortex.com/api/v1/entityTypes/19c48jgd4b8m2"
},
"incomingReferences": {},
"creator": {
"id": "$USER_ID",
"name": "$NAME",
"href": "https://server.sociocortex.com/api/v1/users/$USER_ID"
},
"id": "n6eidlmr0by7",
"versions": ["..."],
"createdAt": "2016-07-24T11:12:00.000Z",
"name": "International Conference on Software Engineering (ICSE)",
"lastModifier": {
"id": "$USER_ID",
"name": "$NAME",
"href": "https://server.sociocortex.com/api/v1/users/$USER_ID"
},
"permissions": {
"writers": [
{
"id": "$USER_ID",
"name": "$NAME",
"href": "https://server.sociocortex.com/api/v1/users/$USER_ID"
}
],
"readers": [
{
"id": "$USER_ID",
"name": "$NAME",
"href": "https://server.sociocortex.com/api/v1/users/$USER_ID"
}
]
},
"attributes": [
{
"id": "pme5rnjsvx5z",
"values": [
"A"
],
"name": "Rank",
"href": "https://server.sociocortex.com/api/v1/attributes/pme5rnjsvx5z"
},
{
"id": "voa7iqjet7pf",
"values": [
2016
],
"name": "Year",
"href": "https://server.sociocortex.com/api/v1/attributes/voa7iqjet7pf"
}
],
"mayEdit": true,
"href": "https://server.sociocortex.com/api/v1/entities/n6eidlmr0by7",
"lastModifiedAt": "2016-07-24T11:12:00.000Z"
}
3.6.2. Creating a publication entity (POST)
Request:
POST https://server.sociocortex.com/api/v1/entityTypes/dt56spnul01p/entities
BODY
{
"name": "Re16a - Lessons Learned in Aligning Data and Model Evolution in Collaborative Information Systems",
"attributes":[
{
"name":"acceptedIn",
"values":[{"id":"n6eidlmr0by7"}]
},
{
"name":"Abstract",
"values": ["Today's enterprises have to align their information systems continuously with their dynamic business and IT environment. ..."]
},
{
"name":"Status",
"values":["Accepted"]
},
{
"name":"authors",
"values":[{
"id":"1hda5st2csfom"
}]
}
]
}
Response:
{
"files": [],
"workspace": {
"id": "10sasph8dvxhg",
"name": "Publication Management",
"href": "https://server.sociocortex.com/api/v1/workspaces/10sasph8dvxhg"
},
"children": [],
"tasks": [],
"entityType": {
"id": "dt56spnul01p",
"name": "Publication",
"href": "https://server.sociocortex.com/api/v1/entityTypes/dt56spnul01p"
},
"incomingReferences": {},
"creator": {
"id": "$USER_ID",
"name": "$NAME",
"href": "https://server.sociocortex.com/api/v1/users/$USER_ID"
},
"id": "127trtufzdgcw",
"versions": ["..."],
"createdAt": "2016-07-24T11:27:26.000Z",
"name": "Re16a - Lessons Learned in Aligning Data and Model Evolution in Collaborative Information Systems",
"lastModifier": {
"id": "$USER_ID",
"name": "$NAME",
"href": "https://server.sociocortex.com/api/v1/users/$USER_ID"
},
"permissions": {
"writers": [
{
"id": "$USER_ID",
"name": "$NAME",
"href": "https://server.sociocortex.com/api/v1/users/$USER_ID"
}
],
"readers": [
{
"id": "$USER_ID",
"name": "$NAME",
"href": "https://server.sociocortex.com/api/v1/users/$USER_ID"
}
]
},
"attributes": [
{
"id": "7mgjht1rkna8",
"values": [
{
"id": "1hda5st2csfom",
"name": "Thomas Reschenhofer",
"href": "https://server.sociocortex.com/api/v1/users/1hda5st2csfom"
}
],
"name": "authors",
"href": "https://server.sociocortex.com/api/v1/attributes/7mgjht1rkna8"
},
{
"id": "iqqlpxfbnr8f",
"values": [
{
"id": "n6eidlmr0by7",
"name": "International Conference on Software Engineering (ICSE)",
"href": "https://server.sociocortex.com/api/v1/entities/n6eidlmr0by7"
}
],
"name": "acceptedIn",
"href": "https://server.sociocortex.com/api/v1/attributes/iqqlpxfbnr8f"
},
{
"id": "rvzij9nn9of4",
"values": [
"Accepted"
],
"name": "Status",
"href": "https://server.sociocortex.com/api/v1/attributes/rvzij9nn9of4"
},
{
"id": "ys69v6zjfz54",
"values": [
"Today's enterprises have to align their information systems continuously with their dynamic business and IT environment. ..."
],
"name": "Abstract",
"href": "https://server.sociocortex.com/api/v1/attributes/ys69v6zjfz54"
}
],
"mayEdit": true,
"href": "https://server.sociocortex.com/api/v1/entities/127trtufzdgcw",
"lastModifiedAt": "2016-07-24T11:27:26.000Z"
}
3.7. Getting entity types
As we have created two entity types with respective instances, it might be interesting to query these types and their attribute definitions. The SocioCortex REST-API offers the possibility to further refine queries by query parameters, e.g. by specifying desired attributes or meta attributes. A more detailed description can be found in [Query Parameters].
3.7.1. Looking at all created entity types (GET)
Request:
GET https://server.sociocortex.com/api/v1/workspaces/10sasph8dvxhg/entityTypes
Response:
[
{
"id": "dt56spnul01p",
"name": "Publication",
"href": "https://server.sociocortex.com/api/v1/entityTypes/dt56spnul01p"
},
{
"id": "19c48jgd4b8m2",
"name": "Conference",
"href": "https://server.sociocortex.com/api/v1/entityTypes/19c48jgd4b8m2"
}
]
If more specific information about these entity types is required, we simply add the query parameter meta with value * :
Request:
GET https://server.sociocortex.com/api/v1/workspaces/10sasph8dvxhg/entityTypes?meta=*
Response:
[
{
"processes": [],
"attributeDefinitions": [
{
"id": "2gegqgdueyqd",
"versions": [],
"readOnly": false,
"name": "Abstract",
"multiplicity": "maximalOne",
"attributeType": "Text",
"entityType": {
"id": "dt56spnul01p",
"name": "Publication",
"href": "https://server.sociocortex.com/api/v1/entityTypes/dt56spnul01p"
},
"href": "https://server.sociocortex.com/api/v1/attributeDefinitions/2gegqgdueyqd"
},
{
"id": "1knrlnoj7kjer",
"versions": [],
"readOnly": false,
"name": "acceptedIn",
"multiplicity": "any",
"attributeType": "Link",
"entityType": {
"id": "dt56spnul01p",
"name": "Publication",
"href": "https://server.sociocortex.com/api/v1/entityTypes/dt56spnul01p"
},
"href": "https://server.sociocortex.com/api/v1/attributeDefinitions/1knrlnoj7kjer",
"options": {
"entityType": {
"id": "19c48jgd4b8m2",
"name": "Conference",
"href": "https://server.sociocortex.com/api/v1/entityTypes/19c48jgd4b8m2"
},
"resourceType": "entities"
}
},
{
"id": "18b1hu00gnxdi",
"versions": [],
"readOnly": false,
"name": "authors",
"multiplicity": "any",
"attributeType": "Link",
"entityType": {
"id": "dt56spnul01p",
"name": "Publication",
"href": "https://server.sociocortex.com/api/v1/entityTypes/dt56spnul01p"
},
"href": "https://server.sociocortex.com/api/v1/attributeDefinitions/18b1hu00gnxdi",
"options": {
"resourceType": "users"
}
},
{
"id": "mfpco2wx3zqp",
"versions": [],
"readOnly": false,
"name": "Status",
"multiplicity": "maximalOne",
"attributeType": "Enumeration",
"entityType": {
"id": "dt56spnul01p",
"name": "Publication",
"href": "https://server.sociocortex.com/api/v1/entityTypes/dt56spnul01p"
},
"href": "https://server.sociocortex.com/api/v1/attributeDefinitions/mfpco2wx3zqp",
"options": {
"enumerationValues": [
"Planned",
"Submitted",
"Accepted"
]
}
}
],
"taskDefinitions": [],
"workspace": {
"id": "10sasph8dvxhg",
"name": "Publication Management",
"href": "https://server.sociocortex.com/api/v1/workspaces/10sasph8dvxhg"
},
"entitiesCount": 6,
"structurednessMetric": 1,
"id": "dt56spnul01p",
"versions": ["..."],
"consistencyMetric": 1,
"derivedAttributeDefinitions": [],
"name": "Publication",
"allowFreeAttributes": false,
"associations": [
{
"id": "1knrlnoj7kjer",
"versions": [],
"readOnly": false,
"name": "acceptedIn",
"multiplicity": "any",
"attributeType": "Link",
"entityType": {
"id": "dt56spnul01p",
"name": "Publication",
"href": "https://server.sociocortex.com/api/v1/entityTypes/dt56spnul01p"
},
"href": "https://server.sociocortex.com/api/v1/attributeDefinitions/1knrlnoj7kjer",
"options": {
"entityType": {
"id": "19c48jgd4b8m2",
"name": "Conference",
"href": "https://server.sociocortex.com/api/v1/entityTypes/19c48jgd4b8m2"
},
"resourceType": "entities"
}
}
],
"incomingAssociations": [],
"customFunctions": [],
"mayEdit": true,
"href": "https://server.sociocortex.com/api/v1/entityTypes/dt56spnul01p"
},
{
"processes": [],
"attributeDefinitions": [
{
"id": "5ybnu95cmhfq",
"versions": [],
"readOnly": false,
"name": "Rank",
"multiplicity": "maximalOne",
"attributeType": "Enumeration",
"entityType": {
"id": "19c48jgd4b8m2",
"name": "Conference",
"href": "https://server.sociocortex.com/api/v1/entityTypes/19c48jgd4b8m2"
},
"href": "https://server.sociocortex.com/api/v1/attributeDefinitions/5ybnu95cmhfq",
"options": {
"enumerationValues": [
"A",
"B",
"C"
]
}
},
{
"id": "m4kghlbyf1e5",
"versions": [],
"readOnly": false,
"name": "Year",
"multiplicity": "maximalOne",
"attributeType": "Number",
"entityType": {
"id": "19c48jgd4b8m2",
"name": "Conference",
"href": "https://server.sociocortex.com/api/v1/entityTypes/19c48jgd4b8m2"
},
"href": "https://server.sociocortex.com/api/v1/attributeDefinitions/m4kghlbyf1e5"
}
],
"taskDefinitions": [],
"workspace": {
"id": "10sasph8dvxhg",
"name": "Publication Management",
"href": "https://server.sociocortex.com/api/v1/workspaces/10sasph8dvxhg"
},
"entitiesCount": 5,
"structurednessMetric": 1,
"id": "19c48jgd4b8m2",
"versions": ["..."],
"consistencyMetric": 1,
"derivedAttributeDefinitions": [],
"name": "Conference",
"allowFreeAttributes": false,
"associations": [],
"incomingAssociations": [
{
"id": "1knrlnoj7kjer",
"versions": [],
"readOnly": false,
"name": "acceptedIn",
"multiplicity": "any",
"attributeType": "Link",
"entityType": {
"id": "dt56spnul01p",
"name": "Publication",
"href": "https://server.sociocortex.com/api/v1/entityTypes/dt56spnul01p"
},
"href": "https://server.sociocortex.com/api/v1/attributeDefinitions/1knrlnoj7kjer",
"options": {
"entityType": {
"id": "19c48jgd4b8m2",
"name": "Conference",
"href": "https://server.sociocortex.com/api/v1/entityTypes/19c48jgd4b8m2"
},
"resourceType": "entities"
}
}
],
"customFunctions": [],
"mayEdit": true,
"href": "https://server.sociocortex.com/api/v1/entityTypes/19c48jgd4b8m2"
}
]
3.7.2. Looking at the publication entity type (GET)
To retrieve details about a single entity we add the respective id to the URI.
Request:
GET https://server.sociocortex.com/api/v1/entityTypes/dt56spnul01p
Response:
{
"processes": [],
"attributeDefinitions": [
{
"id": "2gegqgdueyqd",
"versions": [],
"readOnly": false,
"name": "Abstract",
"multiplicity": "maximalOne",
"attributeType": "Text",
"entityType": {
"id": "dt56spnul01p",
"name": "Publication",
"href": "https://server.sociocortex.com/api/v1/entityTypes/dt56spnul01p"
},
"href": "https://server.sociocortex.com/api/v1/attributeDefinitions/2gegqgdueyqd"
},
{
"id": "1knrlnoj7kjer",
"versions": [],
"readOnly": false,
"name": "acceptedIn",
"multiplicity": "any",
"attributeType": "Link",
"entityType": {
"id": "dt56spnul01p",
"name": "Publication",
"href": "https://server.sociocortex.com/api/v1/entityTypes/dt56spnul01p"
},
"href": "https://server.sociocortex.com/api/v1/attributeDefinitions/1knrlnoj7kjer",
"options": {
"entityType": {
"id": "19c48jgd4b8m2",
"name": "Conference",
"href": "https://server.sociocortex.com/api/v1/entityTypes/19c48jgd4b8m2"
},
"resourceType": "entities"
}
},
{
"id": "18b1hu00gnxdi",
"versions": [],
"readOnly": false,
"name": "authors",
"multiplicity": "any",
"attributeType": "Link",
"entityType": {
"id": "dt56spnul01p",
"name": "Publication",
"href": "https://server.sociocortex.com/api/v1/entityTypes/dt56spnul01p"
},
"href": "https://server.sociocortex.com/api/v1/attributeDefinitions/18b1hu00gnxdi",
"options": {
"resourceType": "users"
}
},
{
"id": "mfpco2wx3zqp",
"versions": [],
"readOnly": false,
"name": "Status",
"multiplicity": "maximalOne",
"attributeType": "Enumeration",
"entityType": {
"id": "dt56spnul01p",
"name": "Publication",
"href": "https://server.sociocortex.com/api/v1/entityTypes/dt56spnul01p"
},
"href": "https://server.sociocortex.com/api/v1/attributeDefinitions/mfpco2wx3zqp",
"options": {
"enumerationValues": [
"Planned",
"Submitted",
"Accepted"
]
}
}
],
"taskDefinitions": [],
"workspace": {
"id": "10sasph8dvxhg",
"name": "Publication Management",
"href": "https://server.sociocortex.com/api/v1/workspaces/10sasph8dvxhg"
},
"entitiesCount": 6,
"structurednessMetric": 1,
"id": "dt56spnul01p",
"versions": ["..."],
"consistencyMetric": 1,
"derivedAttributeDefinitions": [],
"name": "Publication",
"allowFreeAttributes": false,
"associations": [
{
"id": "1knrlnoj7kjer",
"versions": [],
"readOnly": false,
"name": "acceptedIn",
"multiplicity": "any",
"attributeType": "Link",
"entityType": {
"id": "dt56spnul01p",
"name": "Publication",
"href": "https://server.sociocortex.com/api/v1/entityTypes/dt56spnul01p"
},
"href": "https://server.sociocortex.com/api/v1/attributeDefinitions/1knrlnoj7kjer",
"options": {
"entityType": {
"id": "19c48jgd4b8m2",
"name": "Conference",
"href": "https://server.sociocortex.com/api/v1/entityTypes/19c48jgd4b8m2"
},
"resourceType": "entities"
}
}
],
"incomingAssociations": [],
"customFunctions": [],
"mayEdit": true,
"href": "https://server.sociocortex.com/api/v1/entityTypes/dt56spnul01p"
}
3.8. Getting attribute definitions
3.8.1. Looking at attribute definitions of entity type (GET)
For our entity types we have created custom attribute definitions which might also be useful to have another look at. To query these we add the attributeDefinitions keyword:
Request:
GET https://server.sociocortex.com/api/v1/entityTypes/dt56spnul01p/attributeDefinitions
Response:
[
{
"id": "2gegqgdueyqd",
"name": "Abstract",
"href": "https://server.sociocortex.com/api/v1/attributeDefinitions/2gegqgdueyqd"
},
{
"id": "1knrlnoj7kjer",
"name": "acceptedIn",
"href": "https://server.sociocortex.com/api/v1/attributeDefinitions/1knrlnoj7kjer"
},
{
"id": "18b1hu00gnxdi",
"name": "authors",
"href": "https://server.sociocortex.com/api/v1/attributeDefinitions/18b1hu00gnxdi"
},
{
"id": "mfpco2wx3zqp",
"name": "Status",
"href": "https://server.sociocortex.com/api/v1/attributeDefinitions/mfpco2wx3zqp"
}
]
3.9. Getting entities
Obviously, one of the most common tasks is to retrieve all the entities in a workspace or of a certain type. This can either be done by specifically searching for entities through the search endpoint (see Searching) or by querying by entity type, workspace or id of a single entity.
3.9.1. Looking at all existing entities in workspace (GET)
Request:
GET https://server.sociocortex.com/api/v1/workspaces/10sasph8dvxhg/entities
Response:
[{
"id": "bqr7jmg37vqt",
"name": "Publication Management - Home",
"href": "https://server.sociocortex.com/api/v1/entities/bqr7jmg37vqt"
},
{
"id": "n6eidlmr0by7",
"name": "International Conference on Software Engineering (ICSE)",
"href": "https://server.sociocortex.com/api/v1/entities/n6eidlmr0by7"
},
{
"id": "127trtufzdgcw",
"name": "Re16a - Lessons Learned in Aligning Data and Model Evolution in Collaborative Information Systems",
"href": "https://server.sociocortex.com/api/v1/entities/127trtufzdgcw"
}]
3.9.2. Looking at all existing entities of entity type publication (GET)
Request:
GET https://server.sociocortex.com/api/v1/entityTypes/dt56spnul01p/entities
Response:
[{
"id": "127trtufzdgcw",
"name": "Re16a - Lessons Learned in Aligning Data and Model Evolution in Collaborative Information Systems",
"href": "https://server.sociocortex.com/api/v1/entities/127trtufzdgcw"
}]
3.9.3. Looking at single entity (GET)
Request:
GET https://server.sociocortex.com/api/v1/entities/127trtufzdgcw
Response:
{
"files": [],
"workspace": {
"id": "10sasph8dvxhg",
"name": "Publication Management",
"href": "https://server.sociocortex.com/api/v1/workspaces/10sasph8dvxhg"
},
"children": [],
"tasks": [],
"entityType": {
"id": "dt56spnul01p",
"name": "Publication",
"href": "https://server.sociocortex.com/api/v1/entityTypes/dt56spnul01p"
},
"incomingReferences": {},
"creator": {
"id": "$USER_ID",
"name": "$NAME",
"href": "https://server.sociocortex.com/api/v1/users/$USER_ID"
},
"id": "127trtufzdgcw",
"versions": ["..."],
"createdAt": "2016-07-24T11:27:26.000Z",
"name": "Re16a - Lessons Learned in Aligning Data and Model Evolution in Collaborative Information Systems",
"lastModifier": {
"id": "$USER_ID",
"name": "$NAME",
"href": "https://server.sociocortex.com/api/v1/users/$USER_ID"
},
"permissions": {
"writers": [
{
"id": "$USER_ID",
"name": "$NAME",
"href": "https://server.sociocortex.com/api/v1/users/$USER_ID"
}
],
"readers": [
{
"id": "$USER_ID",
"name": "$NAME",
"href": "https://server.sociocortex.com/api/v1/users/$USER_ID"
}
]
},
"attributes": [
{
"id": "7mgjht1rkna8",
"values": [
{
"id": "1hda5st2csfom",
"name": "Thomas Reschenhofer",
"href": "https://server.sociocortex.com/api/v1/users/1hda5st2csfom"
}
],
"name": "authors",
"href": "https://server.sociocortex.com/api/v1/attributes/7mgjht1rkna8"
},
{
"id": "iqqlpxfbnr8f",
"values": [
{
"id": "n6eidlmr0by7",
"name": "International Conference on Software Engineering (ICSE)",
"href": "https://server.sociocortex.com/api/v1/entities/n6eidlmr0by7"
}
],
"name": "acceptedIn",
"href": "https://server.sociocortex.com/api/v1/attributes/iqqlpxfbnr8f"
},
{
"id": "rvzij9nn9of4",
"values": [
"Accepted"
],
"name": "Status",
"href": "https://server.sociocortex.com/api/v1/attributes/rvzij9nn9of4"
},
{
"id": "ys69v6zjfz54",
"values": [
"Today's enterprises have to align their information systems continuously with their dynamic business and IT environment. ..."
],
"name": "Abstract",
"href": "https://server.sociocortex.com/api/v1/attributes/ys69v6zjfz54"
}
],
"mayEdit": true,
"href": "https://server.sociocortex.com/api/v1/entities/127trtufzdgcw",
"lastModifiedAt": "2016-07-24T11:27:26.000Z"
}
3.10. Tasks and task definitions
Attributes of entity types can be linked to tasks, which means that for instance a task is not yet completed until a certain attribute it is linked to is set. Task definitions create those links between attributes and tasks to be fulfilled. In the following, we will first create a task definition for the previously defined status attribute of the publication entity type. Then, we create a new publication entity whose status is not set to any value yet. Last, the status of new entity is updated and set to accepted. This will fulfill the respective task.
3.10.1. Create task definition (POST)
For creating the task definition, we require the id of the previously defined entity type publication as well as the id of the attribute definition of Status which it contains. You need to replace them with your own values in order to make the requests work.
Request:
POST https://server.sociocortex.com/api/v1/taskDefinitions
BODY
{
"name": "Publication Status",
"entityType": {
"id":"dt56spnul01p"
},
"attributeDefinitions": [
{
"id":"mfpco2wx3zqp"
}
]
}
Response:
{
"attributeDefinitions": [
{
"id": "mfpco2wx3zqp",
"versions": [],
"readOnly": false,
"name": "Status",
"multiplicity": "maximalOne",
"attributeType": "Enumeration",
"entityType": {
"id": "dt56spnul01p",
"name": "Publication",
"href": "https://server.sociocortex.com/api/v1/entityTypes/dt56spnul01p"
},
"href": "https://server.sociocortex.com/api/v1/attributeDefinitions/mfpco2wx3zqp",
"options": {
"enumerationValues": [
"Planned",
"Submitted",
"Accepted"
]
}
}
],
"id": "875jp376lljp",
"satisfies": [],
"name": "Publication Status",
"tasks": [],
"preconditions": [],
"entityType": {
"id": "dt56spnul01p",
"name": "Publication",
"href": "https://server.sociocortex.com/api/v1/entityTypes/dt56spnul01p"
},
"href": "https://server.sociocortex.com/api/v1/taskDefinitions/875jp376lljp"
}
3.10.2. Create entity publication (POST)
Next, we create a new publication where we purposefully do not set all the defined attributes yet.
Request:
POST https://server.sociocortex.com/api/v1/entityTypes/dt56spnul01p/entities
BODY
{
"name": "Ha15a - Empowering End-Users to Collaboratively Structure Processes for Knowledge Work",
"attributes":[
{
"name":"acceptedIn",
"values":[]
},
{
"name":"Abstract",
"values": ["Knowledge work is becoming the predominant type of work in many countries and is involved in the most important processes in organizations. ..."]
},
{
"name":"Status",
"values":[]
},
{
"name":"authors",
"values":[]
}
]
}
Response:
{
"isOverdue": false,
"progress": 0,
"files": [],
"workspace": {
"id": "10sasph8dvxhg",
"name": "Publication Management",
"href": "https://server.sociocortex.com/api/v1/workspaces/10sasph8dvxhg"
},
"children": [],
"isInconsistent": false,
"tasks": [
{
"expertises": [],
"isOverdue": false,
"progress": 0,
"id": "1jxlh7fiinyp3",
"taskDefinition": {
"id": "875jp376lljp",
"name": "Publication Status",
"href": "https://server.sociocortex.com/api/v1/taskDefinitions/875jp376lljp"
},
"skipped": false,
"isProgressCalculated": true,
"entity": {
"id": "pvv5b7tg2ave",
"name": "Ha15a - Empowering End-Users to Collaboratively Structure Processes for Knowledge Work",
"href": "https://server.sociocortex.com/api/v1/entities/pvv5b7tg2ave"
},
"name": "Publication Status",
"attributes": [
{
"id": "1nnq4l3r7xiez",
"name": "Status",
"href": "https://server.sociocortex.com/api/v1/attributes/1nnq4l3r7xiez"
}
],
"isInconsistent": false,
"href": "https://server.sociocortex.com/api/v1/tasks/1jxlh7fiinyp3"
}
],
"entityType": {
"id": "dt56spnul01p",
"name": "Publication",
"href": "https://server.sociocortex.com/api/v1/entityTypes/dt56spnul01p"
},
"incomingReferences": {},
"creator": {
"id": "$USER_ID",
"name": "$NAME",
"href": "https://server.sociocortex.com/api/v1/users/$USER_ID"
},
"id": "pvv5b7tg2ave",
"versions": ["..."],
"createdAt": "2016-07-25T12:12:42.000Z",
"name": "Ha15a - Empowering End-Users to Collaboratively Structure Processes for Knowledge Work",
"lastModifier": {
"id": "$USER_ID",
"name": "$NAME",
"href": "https://server.sociocortex.com/api/v1/users/$USER_ID"
},
"permissions": {
"writers": [
{
"id": "$USER_ID",
"name": "$NAME",
"href": "https://server.sociocortex.com/api/v1/users/$USER_ID"
}
],
"readers": [
{
"id": "$USER_ID",
"name": "$NAME",
"href": "https://server.sociocortex.com/api/v1/users/$USER_ID"
}
]
},
"attributes": [
{
"id": "1fxaj2nfs3yp9",
"values": [],
"name": "authors",
"href": "https://server.sociocortex.com/api/v1/attributes/1fxaj2nfs3yp9"
},
{
"id": "1nnq4l3r7xiez",
"values": [],
"name": "Status",
"href": "https://server.sociocortex.com/api/v1/attributes/1nnq4l3r7xiez"
},
{
"id": "1r36ijukwwbtf",
"values": [],
"name": "acceptedIn",
"href": "https://server.sociocortex.com/api/v1/attributes/1r36ijukwwbtf"
},
{
"id": "1rc9u2if7o62m",
"values": [
"Knowledge work is becoming the predominant type of work in many countries and is involved in the most important processes in organizations. ..."
],
"name": "Abstract",
"href": "https://server.sociocortex.com/api/v1/attributes/1rc9u2if7o62m"
}
],
"mayEdit": true,
"href": "https://server.sociocortex.com/api/v1/entities/pvv5b7tg2ave",
"lastModifiedAt": "2016-07-25T12:12:42.000Z"
}
3.10.3. Updating status of publication (PUT)
If we look at the entity we just created, we can see a task list being attached to it with one open task concerning the taskDefinition we created before. Its progress is 0 and thus the task is not yet fulfilled.
Request:
GET https://server.sociocortex.com/api/v1/entities/pvv5b7tg2ave
Response:
{
"isOverdue": false,
"progress": 0,
"files": [],
"workspace": {
"id": "10sasph8dvxhg",
"name": "Publication Management",
"href": "https://server.sociocortex.com/api/v1/workspaces/10sasph8dvxhg"
},
"children": [],
"isInconsistent": false,
"tasks": [
{
"expertises": [],
"isOverdue": false,
"progress": 0,
"id": "1jxlh7fiinyp3",
"taskDefinition": {
"id": "875jp376lljp",
"name": "Publication Status",
"href": "https://server.sociocortex.com/api/v1/taskDefinitions/875jp376lljp"
},
"skipped": false,
"isProgressCalculated": true,
"entity": {
"id": "pvv5b7tg2ave",
"name": "Ha15a - Empowering End-Users to Collaboratively Structure Processes for Knowledge Work",
"href": "https://server.sociocortex.com/api/v1/entities/pvv5b7tg2ave"
},
"name": "Publication Status",
"attributes": [
{
"id": "1nnq4l3r7xiez",
"name": "Status",
"href": "https://server.sociocortex.com/api/v1/attributes/1nnq4l3r7xiez"
}
],
"isInconsistent": false,
"href": "https://server.sociocortex.com/api/v1/tasks/1jxlh7fiinyp3"
}
],
"entityType": {
"id": "dt56spnul01p",
"name": "Publication",
"href": "https://server.sociocortex.com/api/v1/entityTypes/dt56spnul01p"
},
"incomingReferences": {},
"creator": {
"id": "$USER_ID",
"name": "$NAME",
"href": "https://server.sociocortex.com/api/v1/users/$USER_ID"
},
"id": "pvv5b7tg2ave",
"versions": ["..."],
"createdAt": "2016-07-25T12:12:42.000Z",
"name": "Ha15a - Empowering End-Users to Collaboratively Structure Processes for Knowledge Work",
"lastModifier": {
"id": "$USER_ID",
"name": "$NAME",
"href": "https://server.sociocortex.com/api/v1/users/$USER_ID"
},
"permissions": {
"writers": [
{
"id": "$USER_ID",
"name": "$NAME",
"href": "https://server.sociocortex.com/api/v1/users/$USER_ID"
}
],
"readers": [
{
"id": "$USER_ID",
"name": "$NAME",
"href": "https://server.sociocortex.com/api/v1/users/$USER_ID"
}
]
},
"attributes": [
{
"id": "1fxaj2nfs3yp9",
"values": [],
"name": "authors",
"href": "https://server.sociocortex.com/api/v1/attributes/1fxaj2nfs3yp9"
},
{
"id": "1nnq4l3r7xiez",
"values": [],
"name": "Status",
"href": "https://server.sociocortex.com/api/v1/attributes/1nnq4l3r7xiez"
},
{
"id": "1r36ijukwwbtf",
"values": [],
"name": "acceptedIn",
"href": "https://server.sociocortex.com/api/v1/attributes/1r36ijukwwbtf"
},
{
"id": "1rc9u2if7o62m",
"values": [
"Knowledge work is becoming the predominant type of work in many countries and is involved in the most important processes in organizations. ..."
],
"name": "Abstract",
"href": "https://server.sociocortex.com/api/v1/attributes/1rc9u2if7o62m"
}
],
"mayEdit": true,
"href": "https://server.sociocortex.com/api/v1/entities/pvv5b7tg2ave",
"lastModifiedAt": "2016-07-25T12:12:42.000Z"
}
In order to fulfill the task we update the concurrent entity by using the HTTP PUT method to change the status to Accepted. The response contains the updated entity with a progress of the task of 100 which means it is fulfilled.
Request:
PUT https://server.sociocortex.com/api/v1/entities/pvv5b7tg2ave
BODY
{
"attributes":[
{
"id": "1nnq4l3r7xiez",
"name":"Status",
"values": ["Accepted"]
}
]
}
Response:
{
"isOverdue": false,
"progress": 100,
"files": [],
"workspace": {
"id": "10sasph8dvxhg",
"name": "Publication Management",
"href": "https://server.sociocortex.com/api/v1/workspaces/10sasph8dvxhg"
},
"children": [],
"isInconsistent": false,
"tasks": [
{
"progress": 100,
"isOverdue": false,
"taskDefinition": {
"id": "875jp376lljp",
"name": "Publication Status",
"href": "https://server.sociocortex.com/api/v1/taskDefinitions/875jp376lljp"
},
"entity": {
"id": "pvv5b7tg2ave",
"name": "Ha15a - Empowering End-Users to Collaboratively Structure Processes for Knowledge Work",
"href": "https://server.sociocortex.com/api/v1/entities/pvv5b7tg2ave"
},
"isProgressCalculated": true,
"isInconsistent": false,
"expertises": [],
"id": "1jxlh7fiinyp3",
"skipped": false,
"name": "Publication Status",
"finishedAt": "2016-07-26T07:22:35.000Z",
"finishedBy": {
"id": "$USER_ID",
"name": "$NAME",
"href": "https://server.sociocortex.com/api/v1/users/$USER_ID"
},
"attributes": [
{
"id": "1nnq4l3r7xiez",
"name": "Status",
"href": "https://server.sociocortex.com/api/v1/attributes/1nnq4l3r7xiez"
}
],
"href": "https://server.sociocortex.com/api/v1/tasks/1jxlh7fiinyp3"
}
],
"entityType": {
"id": "dt56spnul01p",
"name": "Publication",
"href": "https://server.sociocortex.com/api/v1/entityTypes/dt56spnul01p"
},
"incomingReferences": {},
"creator": {
"id": "$USER_ID",
"name": "$NAME",
"href": "https://server.sociocortex.com/api/v1/users/$USER_ID"
},
"id": "pvv5b7tg2ave",
"versions": ["..."],
"createdAt": "2016-07-25T12:12:42.000Z",
"name": "Ha15a - Empowering End-Users to Collaboratively Structure Processes for Knowledge Work",
"lastModifier": {
"id": "$USER_ID",
"name": "$NAME",
"href": "https://server.sociocortex.com/api/v1/users/$USER_ID"
},
"permissions": {
"writers": [
{
"id": "$USER_ID",
"name": "$NAME",
"href": "https://server.sociocortex.com/api/v1/users/$USER_ID"
}
],
"readers": [
{
"id": "$USER_ID",
"name": "$NAME",
"href": "https://server.sociocortex.com/api/v1/users/$USER_ID"
}
]
},
"attributes": [
{
"id": "1fxaj2nfs3yp9",
"values": [],
"name": "authors",
"href": "https://server.sociocortex.com/api/v1/attributes/1fxaj2nfs3yp9"
},
{
"id": "1nnq4l3r7xiez",
"values": [
"Accepted"
],
"name": "Status",
"href": "https://server.sociocortex.com/api/v1/attributes/1nnq4l3r7xiez"
},
{
"id": "1r36ijukwwbtf",
"values": [],
"name": "acceptedIn",
"href": "https://server.sociocortex.com/api/v1/attributes/1r36ijukwwbtf"
},
{
"id": "1rc9u2if7o62m",
"values": [
"Knowledge work is becoming the predominant type of work in many countries and is involved in the most important processes in organizations. ..."
],
"name": "Abstract",
"href": "https://server.sociocortex.com/api/v1/attributes/1rc9u2if7o62m"
}
],
"mayEdit": true,
"href": "https://server.sociocortex.com/api/v1/entities/pvv5b7tg2ave",
"lastModifiedAt": "2016-07-25T12:12:42.000Z"
}
3.11. Updating entities and entity types
3.11.1. Updating name of entity (PUT)
The easiest way to demonstrate how entities are updated is by sending a HTTP PUT request on an existing conference which is supposed to change the name of the conference. Let’s assume we just want to get rid of the abbreviation of the conference (ICSE).
Request:
PUT https://server.sociocortex.com/api/v1/entities/n6eidlmr0by7
{
"name":"International Conference on Software Engineering"
}
Response:
{
"files": [],
"workspace": {
"id": "10sasph8dvxhg",
"name": "Publication Management",
"href": "https://server.sociocortex.com/api/v1/workspaces/10sasph8dvxhg"
},
"children": [],
"tasks": [],
"entityType": {
"id": "19c48jgd4b8m2",
"name": "Conference",
"href": "https://server.sociocortex.com/api/v1/entityTypes/19c48jgd4b8m2"
},
"incomingReferences": {
"acceptedIn": [
{
"id": "127trtufzdgcw",
"name": "Re16a - Lessons Learned in Aligning Data and Model Evolution in Collaborative Information Systems",
"href": "https://server.sociocortex.com/api/v1/entities/127trtufzdgcw"
}
]
},
"creator": {
"id": "$USER_ID",
"name": "$NAME",
"href": "https://server.sociocortex.com/api/v1/users/$USER_ID"
},
"id": "n6eidlmr0by7",
"versions": ["..."],
"createdAt": "2016-07-24T11:12:00.000Z",
"name": "International Conference on Software Engineering",
"lastModifier": {
"id": "$USER_ID",
"name": "$NAME",
"href": "https://server.sociocortex.com/api/v1/users/$USER_ID"
},
"permissions": {
"writers": [
{
"id": "$USER_ID",
"name": "$NAME",
"href": "https://server.sociocortex.com/api/v1/users/$USER_ID"
}
],
"readers": [
{
"id": "$USER_ID",
"name": "$NAME",
"href": "https://server.sociocortex.com/api/v1/users/$USER_ID"
}
]
},
"attributes": [
{
"id": "pme5rnjsvx5z",
"values": [
"A"
],
"name": "Rank",
"href": "https://server.sociocortex.com/api/v1/attributes/pme5rnjsvx5z"
},
{
"id": "voa7iqjet7pf",
"values": [
2016
],
"name": "Year",
"href": "https://server.sociocortex.com/api/v1/attributes/voa7iqjet7pf"
}
],
"mayEdit": true,
"href": "https://server.sociocortex.com/api/v1/entities/n6eidlmr0by7",
"lastModifiedAt": "2016-07-24T18:18:06.000Z"
}
3.11.2. Updating single attribute of entity (PUT)
As attributes might change over time, it might be necessary to change an attribute of an entity at some point. This can be done by sending a HTTP PUT request to a certain attribute identified by its id. The latter can be found out by querying the respective entity first (see Looking at single entity (GET)). Let’s assume we want to change the authors of the publication created in Create entity publication (POST) where in our case the id of the authors attribute is 1fxaj2nfs3yp9.
Request:
PUT https://server.sociocortex.com/api/v1/attributes/1fxaj2nfs3yp9
BODY
{
"values":[{
"id":"1d94htksgwy2i",
"name": "Matheus Hauder"
}]
}
Response:
{
"id": "1fxaj2nfs3yp9",
"values": [
{
"id": "1d94htksgwy2i",
"name": "Matheus Hauder",
"href": "https://server.sociocortex.com/api/v1/users/1d94htksgwy2i"
}
],
"attributeDefinition": {
"id": "18b1hu00gnxdi",
"versions": [],
"readOnly": false,
"name": "authors",
"multiplicity": "any",
"attributeType": "Link",
"entityType": {
"id": "dt56spnul01p",
"name": "Publication",
"href": "https://server.sociocortex.com/api/v1/entityTypes/dt56spnul01p"
},
"href": "https://server.sociocortex.com/api/v1/attributeDefinitions/18b1hu00gnxdi",
"options": {
"resourceType": "users"
}
},
"name": "authors",
"href": "https://server.sociocortex.com/api/v1/attributes/1fxaj2nfs3yp9"
}
3.12. Deleting instances
Deletion is generally not different to any of the other considered action except for the HTTP verb. For deleting instances (e.g. entities, entityTypes or workspaces), one can simply send the HTTP DELETE verb to a respective resource endpoint (i.e. URI). However, it is recommended to get first get an understanding of how SocioCortex handles deletion and what cascading deletion behavior one has to expect.
An example for deleting the previously created workspace publication management is the following:
Request:
DELETE https://server.sociocortex.com/api/v1/workspaces/10sasph8dvxhg
If deleting instances is important for you, there is a master thesis covering the deletion behavior more detailed, it can be downloaded here (see slide 9).
4. Permissions
In Getting started with the REST-API the permissions were shortly mentioned. In this section the underlying concept of accessibility is explained more precisely. There are three types of accessibility rights: read, edit and contribute permissions. Editors can read and edit pages and their attachments. In addition to editors, readers have read-only access to pages which do not override this setting. Contributors are allowed to create new pages in respective workspaces. They may only read/edit pages to which they are explicitly assigned as readers/editors. Accessibility rules can be inherited from the containing workspace or from parent entities. By default, newly created entities will inherit readers and editors from their workspace.
In order to change the permissions to workspaces or certain entities, the REST-API or the server user interface (https://server.sociocortex.com) can be used:
4.1. Add reader to workspace
For the SocioCortex REST-API, we take the workspace created in Creating a workspace and add another reader to the workspace. In our case this is a user with the id aosqsp1qsrfa which we simply add to the array of readers in the permissions object.
Request:
PUT https://server.sociocortex.com/api/v1/workspaces/10sasph8dvxhg
BODY
{
"permissions": {
"readers": [{
"id": "aosqsp1qsrfa"
}]
}
}
Response:
{
"id": "10sasph8dvxhg",
"versions": ["..."],
"rootEntity": {
"id": "bqr7jmg37vqt",
"name": "Publication Management - Home",
"href": "https://server.sociocortex.com/api/v1/entities/bqr7jmg37vqt"
},
"mayCreateEntities": true,
"isFavorite": false,
"entityTree": {
"id": "bqr7jmg37vqt",
"name": "Publication Management - Home",
"href": "https://server.sociocortex.com/api/v1/entities/bqr7jmg37vqt"
},
"name": "Publication Management",
"permissions": {
"contributors": [],
"administrators": [
{
"id": "$USER_ID",
"name": "$NAME",
"href": "https://server.sociocortex.com/api/v1/users/$USER_ID"
}
],
"writers": [],
"readers": [
{
"id": "aosqsp1qsrfa",
"name": "daniel",
"href": "https://server.sociocortex.com/api/v1/users/aosqsp1qsrfa"
}
]
},
"customFunctions": [],
"mayEdit": true,
"href": "https://server.sociocortex.com/api/v1/workspaces/10sasph8dvxhg"
}
4.2. Add editor to workspace
Request:
PUT https://server.sociocortex.com/api/v1/workspaces/10sasph8dvxhg
BODY
{
"permissions": {
"writers": [{
"id": "aosqsp1qsrfa"
}]
}
}
Response:
{
"id": "10sasph8dvxhg",
"versions": ["..."],
"rootEntity": {
"id": "bqr7jmg37vqt",
"name": "Publication Management - Home",
"href": "https://server.sociocortex.com/api/v1/entities/bqr7jmg37vqt"
},
"mayCreateEntities": true,
"isFavorite": false,
"entityTree": {
"id": "bqr7jmg37vqt",
"name": "Publication Management - Home",
"href": "https://server.sociocortex.com/api/v1/entities/bqr7jmg37vqt"
},
"name": "Publication Management",
"permissions": {
"contributors": [],
"administrators": [
{
"id": "$USER_ID",
"name": "$NAME",
"href": "https://server.sociocortex.com/api/v1/users/$USER_ID"
}
],
"writers": [
{
"id": "aosqsp1qsrfa",
"name": "daniel",
"href": "https://server.sociocortex.com/api/v1/users/aosqsp1qsrfa"
}
],
"readers": [
{
"id": "aosqsp1qsrfa",
"name": "daniel",
"href": "https://server.sociocortex.com/api/v1/users/aosqsp1qsrfa"
}
]
},
"customFunctions": [],
"mayEdit": true,
"href": "https://server.sociocortex.com/api/v1/workspaces/10sasph8dvxhg"
}
5. Optional request parameters
When looking at the responses from the server you might have noticed that some returned entities or workspaces contain more attributes/information than others. The reason for that is that by default when returning a list, the SocioCortex REST-API includes only certain attributes in the returned objects. Thus, when getting all workspaces in Creating a workspace the list of results only contained the attributes id,name and href. However, the response for a single workspace contained attributes such as permissions, versions or rootEntity. The same applies to entities which we queried in Getting entities. Here, by querying single entities the self-defined attributes were included which we did not see when getting a list of entities. Now, when querying a list one might also be interested in certain attributes which are not by default included in the responded list, e.g. attributes you defined yourself. The SocioCortex REST-API enables developers to do so by adding request parameters which are introduced in the following subsections.
5.1. Meta
As mentioned above when getting all workspaces the responses are missing so-called meta attributes as permissions. They are meta attributes as they are generated for every workspace or entity that is created in SocioCortex. By appending the meta request parameter these can be manually included. Basically, you can either append a comma-separated list of attributes that are supposed to be included or simply add a * to include all attributes.
Examples:
https://server.sociocortex.com/api/v1/workspaces?meta=permissions
Returns all workspaces and includes the permissions meta attribute.
https://server.sociocortex.com/api/v1/workspaces?meta=*
Returns all workspaces and includes all meta attributes.
5.2. Attributes
In order to include certain attributes (e.g. self-defined attributes) in the responded list of entities, the request parameter attributes is appended to the URI (see URI schema in Introduction to demo scenario). As for meta attributes, you either include a * for all attributes or a comma-separated list of attributes.
Examples:
https://server.sociocortex.com/api/v1/workspaces/10sasph8dvxhg/entities?attributes=Year,Rank
Returns all entities of a workspace and includes the self-defined attributes Year and Rank.
https://server.sociocortex.com/api/v1/workspaces/10sasph8dvxhg/entities?attributes=*
Returns all entities of a workspace and includes all attributes of entity types.
5.3. Content
When querying entities one might be willing to include or exclude the content of certain entities such as text pages. Therefore, the content parameter enables us to simply set a flag whether the rich-text content of the entity should be included in the response.
Example:
https://server.sociocortex.com/api/v1/workspaces/10sasph8dvxhg/entities?content=true
Returns all entities of a workspace and includes their rich-text content.
5.4. Tasks
Tasks are linked to attributes as we have seen in Tasks and task definitions. When retrieving entities from a server developers can add a boolean parameter tasks to the URI indicating if the tasks of the entity should be included in the response.
Example:
https://server.sociocortex.com/api/v1/workspaces/10sasph8dvxhg/entities?tasks=true
Returns all entities of a workspace and includes their respective linked tasks.
6. Searching
There are two endpoints in the SocioCortex REST-API which offer the ability to search for instances of all types of classes that SocioCortex consists of: * Search hints: Retrieves a list of search hints containing basic information and a disambiguation of search hits. * Search results: Retrieves a list of search hints containing full information, e.g., attributes of entities, meta information, and highlighted search hits.
Both options allow developers to search by text, workspace, entityType or resource type. Additionally, the search results may also include all query parameters listed in [Query Parameters], e.g. (meta) attributes, and thus could contain the entire entity objects. The search hints are a limited data sample which can be helpful when implementing an autocompletion search or other use cases where the data samples to not necessarily have to contain all relevant attributes/information.
Moreover, search hints and results can be ordered by attributes in two directions (ascending, descending) and limited by number. For performance reasons for the search results endpoint a server-side pagination is also provided.
For a complete list of filter parameters have a look at the REST-API specification which can be found here.
6.1. Search hints
6.1.1. Searching for all instances in workspace
Let’s start by requesting all instances of classes in the workspace publication management.
Request:
GET https://server.sociocortex.com/api/v1/searchHints?workspace=10sasph8dvxhg
Response:
{
"totalCount": 8,
"hints": [
{
"id": "dt56spnul01p",
"disambiguation": "Publication Management",
"name": "Publication",
"href": "https://server.sociocortex.com/api/v1/entityTypes/dt56spnul01p",
"resourceType": "entityTypes"
},
{
"id": "1bbxmsluu87f7",
"disambiguation": "Publication Management",
"name": "Text Page",
"href": "https://server.sociocortex.com/api/v1/entityTypes/1bbxmsluu87f7",
"resourceType": "entityTypes"
},
{
"id": "19c48jgd4b8m2",
"disambiguation": "Publication Management",
"name": "Conference",
"href": "https://server.sociocortex.com/api/v1/entityTypes/19c48jgd4b8m2",
"resourceType": "entityTypes"
},
{
"id": "127trtufzdgcw",
"disambiguation": "/Publication Management/_",
"name": "Re16a - Lessons Learned in Aligning Data and Model Evolution in Collaborative Information Systems",
"href": "https://server.sociocortex.com/api/v1/entities/127trtufzdgcw",
"resourceType": "entities"
},
{
"id": "10sasph8dvxhg",
"name": "Publication Management",
"href": "https://server.sociocortex.com/api/v1/workspaces/10sasph8dvxhg",
"resourceType": "workspaces"
},
{
"id": "pvv5b7tg2ave",
"disambiguation": "/Publication Management/_",
"name": "Ha15a - Empowering End-Users to Collaboratively Structure Processes for Knowledge Work",
"href": "https://server.sociocortex.com/api/v1/entities/pvv5b7tg2ave",
"resourceType": "entities"
},
{
"id": "n6eidlmr0by7",
"disambiguation": "/Publication Management/_",
"name": "International Conference on Software Engineering",
"href": "https://server.sociocortex.com/api/v1/entities/n6eidlmr0by7",
"resourceType": "entities"
},
{
"id": "bqr7jmg37vqt",
"disambiguation": "Publication Management",
"name": "Publication Management - Home",
"href": "https://server.sociocortex.com/api/v1/entities/bqr7jmg37vqt",
"resourceType": "entities"
}
]
}
The response contains an object which tells us the total count of results for these search parameters and lists all results with their respective resourceType.
6.1.2. Searching for text in all instances in workspace
To further specify what is searched for, the text query parameter can be appended to make a full-text search.
Request:
GET https://server.sociocortex.com/api/v1/searchHints?workspace=10sasph8dvxhg&text=Information
Response:
{
"totalCount": 1,
"hints": [
{
"id": "127trtufzdgcw",
"disambiguation": "/Publication Management/_",
"name": "Re16a - Lessons Learned in Aligning Data and Model Evolution in Collaborative Information Systems",
"href": "https://server.sociocortex.com/api/v1/entities/127trtufzdgcw",
"resourceType": "entities"
}
]
}
6.1.3. Searching instances of resource type in workspace
Sometimes it might be necessary to search for instances of a certain resource type.
Request:
GET https://server.sociocortex.com/api/v1/searchHints?workspace=10sasph8dvxhg&resourceType=entityTypes
Response:
{
"totalCount": 3,
"hints": [
{
"id": "dt56spnul01p",
"disambiguation": "Publication Management",
"name": "Publication",
"href": "https://server.sociocortex.com/api/v1/entityTypes/dt56spnul01p",
"resourceType": "entityTypes"
},
{
"id": "1bbxmsluu87f7",
"disambiguation": "Publication Management",
"name": "Text Page",
"href": "https://server.sociocortex.com/api/v1/entityTypes/1bbxmsluu87f7",
"resourceType": "entityTypes"
},
{
"id": "19c48jgd4b8m2",
"disambiguation": "Publication Management",
"name": "Conference",
"href": "https://server.sociocortex.com/api/v1/entityTypes/19c48jgd4b8m2",
"resourceType": "entityTypes"
}
]
}
6.2. Search results
Besides the search hints functionality, the search results endpoint also offers the ability to append query parameters to refine custom attribute inclusion (for query parameters see [Query Parameters]). As a result returned instances could contain all (meta) attributes or even the entire object with all attributes, tasks or relations. Consequently, the returned list needs to be limited in size to assure performance. The response object therefore contains a count of the total amount of results, but the result list only contains a max size of n results per page. These parameters can be manually set. For example if I want to retrieve 20 results per page and get the results of page 2 the following URI is to be requested:
GET https://server.sociocortex.com/api/v1/searchResults?workspace=10sasph8dvxhg&page=2&n=20
6.2.1. Searching for entities in a workspace (GET)
Request:
GET https://server.sociocortex.com/api/v1/searchResults?workspace=10sasph8dvxhg
Response:
{
"results": [
{
"id": "dt56spnul01p",
"name": "Publication",
"href": "https://server.sociocortex.com/api/v1/entityTypes/dt56spnul01p",
"resourceType": "entityTypes"
},
{
"id": "1bbxmsluu87f7",
"name": "Text Page",
"href": "https://server.sociocortex.com/api/v1/entityTypes/1bbxmsluu87f7",
"resourceType": "entityTypes"
},
{
"id": "bqr7jmg37vqt",
"name": "Publication Management - Home",
"href": "https://server.sociocortex.com/api/v1/entities/bqr7jmg37vqt",
"resourceType": "entities"
},
{
"id": "10sasph8dvxhg",
"name": "Publication Management",
"href": "https://server.sociocortex.com/api/v1/workspaces/10sasph8dvxhg",
"resourceType": "workspaces"
},
{
"id": "19c48jgd4b8m2",
"name": "Conference",
"href": "https://server.sociocortex.com/api/v1/entityTypes/19c48jgd4b8m2",
"resourceType": "entityTypes"
},
{
"id": "15qr31m7ewuje",
"name": "A sample paper",
"href": "https://server.sociocortex.com/api/v1/entities/15qr31m7ewuje",
"resourceType": "entities"
},
{
"id": "24ixbhft7i4b",
"name": "A sample conference",
"href": "https://server.sociocortex.com/api/v1/entities/24ixbhft7i4b",
"resourceType": "entities"
}
],
"totalCount": 7
}
6.2.2. Searching for entities with all attributes
To include all attributes in the result list the attributes parameter is appended to the search request URI. This request puts it all together, workspace, resourceType, orderBy and attribute filter.
Request:
GET https://server.sociocortex.com/api/v1/searchResults?text=Collaboratively&workspace=10sasph8dvxhg&resourceType=entities&orderBy=alphabetically&attributes=*
Response:
{
"results": [
{
"isOverdue": false,
"progress": 100,
"id": "pvv5b7tg2ave",
"highlightedName": "Ha15a - Empowering End-Users to <span class=\"sc-search-highlight\">Collaboratively</span> Structure Processes for Knowledge Work",
"name": "Ha15a - Empowering End-Users to Collaboratively Structure Processes for Knowledge Work",
"isInconsistent": false,
"attributes": [
{
"id": "1fxaj2nfs3yp9",
"values": [
{
"id": "1d94htksgwy2i",
"name": "Matheus Hauder",
"href": "https://server.sociocortex.com/api/v1/users/1d94htksgwy2i"
}
],
"name": "authors",
"href": "https://server.sociocortex.com/api/v1/attributes/1fxaj2nfs3yp9"
},
{
"id": "1nnq4l3r7xiez",
"values": [
"Accepted"
],
"name": "Status",
"href": "https://server.sociocortex.com/api/v1/attributes/1nnq4l3r7xiez"
},
{
"id": "1r36ijukwwbtf",
"values": [],
"name": "acceptedIn",
"href": "https://server.sociocortex.com/api/v1/attributes/1r36ijukwwbtf"
},
{
"id": "1rc9u2if7o62m",
"values": [
"Knowledge work is becoming the predominant type of work in many countries and is involved in the most important processes in organizations. ..."
],
"name": "Abstract",
"href": "https://server.sociocortex.com/api/v1/attributes/1rc9u2if7o62m"
}
],
"href": "https://server.sociocortex.com/api/v1/entities/pvv5b7tg2ave",
"resourceType": "entities"
}
],
"totalCount": 1
}


This game requires JavaScript to run.
Drop your dots into the grid. Connect four (horizontally, vertically or diagonally) to win. Good luck!


Some times you will be able to obtain more information about a patient's referrals by reading through the original order that a clinician made for the referral. To do this, please follow the steps in the following image.
To access a referral order
You should now see the following screen


Copyright 2016 Dean Attali. Licensed under the MIT license.
knitr
is a popular package for generating dynamic reports in R using the concept of literate programming. ezknitr
is an extension of knitr
that adds flexibility in several ways and solves a few issues that are commonly encountered with knitr
.
One common source of frustration with knitr
is that it assumes the directory where the source file lives should be the working directory, which is often not true. ezknitr
addresses this problem by giving you complete control over where all the inputs and outputs are, and adds several other convenient features. The two main functions are ezknit()
and ezspin()
, which are wrappers around knitr
's knit()
and spin()
, used to make rendering markdown/HTML documents easier.
ezknitr
is available through both CRAN and GitHub.
To install the CRAN version:
install.packages("ezknitr")
To install the latest developmental version from GitHub:
install.packages("devtools")
devtools::install_github("ropensci/ezknitr")
If you have a very simple project with a flat directory structure, then knitr
works great. But even something as simple as trying to knit a document that reads a file from a different directory or placing the output rendered files in a different folder cannot be easily done with knitr
.
ezknitr
improves basic knitr
functionality in a few ways. You get to decide:
knitr
assumption that the working directory is wherever the input file isknitr
, all the rendered output files will be generated in the folder you're currently inknitr
makes it cumbersome to change this directoryAssume you have an Rmarkdown file that reads a data file and produces a short report while also generating a figure. Native knit()
(or spin()
if you're starting with an R script instead of an Rmd file) works great if you have a flat directory structure like this:
- project/
|- input.csv
|- report.Rmd
But what happens if you have a slightly more complex structure? In a real project, you rarely have everything just lying around in the same folder. Here is an example of a more realistic initial directory structure (assume the working directory/project root is set to project/
):
- project/
|- analysis/
|- report.Rmd
|- data/
|- input.csv
Now if you want knitr
to work, you'd have to ensure the path to input.csv
is relative to the analysis/
directory because that's where the Rmd file is. This is counter-intuitive because most people expect to create paths relative to the working directory/project root (project/
in this case), but knitr
will use the analysis/
folder as the working directory. Any code reading the input file needs to use ../data/input.csv
instead of data/input.csv
.
Other than being confusing, it also means that you cannot naively run the Rmd code chunks manually because when you run the code in the console, your working directory is not set to what knitr
will use as the working directory. More specifically, if you try to run the command that reads the input file, your console will look in project/../data/input.csv
(which doesn't exist).
A similar problem arises when you want to create files in your report: knitr
will create the files relative to where the Rmd file is, rather than relative to the project root.
Another problem with the flat directory structure is that you may want to control where the resulting reports get generated. knitr
will create all the outputs in your working directory, and as far as I know there is no way to control that.
ezknitr
addresses these issues, and more. It provides wrappers to knit()
and spin()
that allow you to set the working directory for the input file, and also uses a more sensible default working directory: the current working directory. ezknitr
also lets you decide where the output files and output figures will be generated, and uses a better default path for the output files: the directory containing the input file.
Assuming your working directory is currently set to the project/
directory, you could use the following ezknitr
command to do what you want:
library(ezknitr)
ezknit(file = "analysis/report.Rmd", out_dir = "reports", fig_dir = "myfigs")
- project/
|- analysis/
|- report.Rmd
|- data/
|- input.csv
|- reports/
|- myfigs/
|- fig1.png
|- report.md
|- report.HTML
We didn't explicitly have to set the working direcory, but you can use the wd
argument if you do require a different directory (for example, if you are running this from some build script or from any arbitrary directory). After running ezknit()
, you can run open_output_dir()
to open the output directory in your file browser if you want to easily see the resulting report. Getting a similar directory structure with knitr
is not simple, but with ezknitr
it's trivial.
Note that ezknitr
produces both a markdown and an HTML file for each report (you can choose to discard them with the keep_md
and keep_html
arguments).
As an example of a more complex realistic scenario where ezknitr
would be useful, imagine having multiple analysis scripts, with each one needing to be run on multiple datasets. Being the organizer scientist that you are, you want to be able to run each analysis on each dataset, and keep the results neatly organized. I personally was involved in a few projects requiring exactly this, and ezknitr
was in fact born for solving this exact issue. Assume you have the following files in your project:
- project/
|- analysis/
|- calculate.Rmd
|- explore.Rmd
|- data/
|- human.dat
|- mouse.dat
We can easily use ezknitr
to run any of the analysis Rmarkdowns on any of the datasets and assign the results to a unique output. Let's assume that each analysis script expects there to be a variable named DATASET_NAME
inside the script that tells the script what data to operate on. The following ezknitr
code illustrates how to achieve the desired output.
library(ezknitr)
ezknit(file = "analysis/explore.Rmd", out_dir = "reports/human",
params = list("DATASET_NAME" = "human.dat"), keep_html = FALSE)
ezknit(file = "analysis/explore.Rmd", out_dir = "reports/mouse",
params = list("DATASET_NAME" = "mouse.dat"), keep_html = FALSE)
ezknit(file = "analysis/calculate.Rmd", out_dir = "reports/mouse",
params = list("DATASET_NAME" = "mouse.dat"), keep_html = FALSE)
- project/
|- analysis/
|- calculate.Rmd
|- explore.Rmd
|- data/
|- human.dat
|- mouse.dat
|- reports/
|- human/
|- explore.md
|- mouse/
|- calculate.md
|- explore.md
Note that this example uses the params = list()
argument, which lets you pass variables to the input Rmarkdown. In this case, I use it to tell the Rmarkdown what dataset to use, and the Rmarkdown assumes a DATASET_NAME
variable exists. This of course means that the analysis script has an external dependency by having a variable that is not defined inside of it. You can use the set_default_params()
function inside the Rmarkdown to ensure the variable uses a default value if none was provided.
Also note that differentiating the species in the output could also have been done using the out_suffix
argument instead of the out_dir
argument. For example, using out_suffix = "human"
would have resulted in an ouput file named explore-human.md
.
After installing and loading the package (library(ezknitr)
), you can experiment with ezknitr
using the setup_ezknit_test()
or setup_ezspin_test()
functions to see their benefits. See ?setup_ezknit_test
for more information.
knit()
is the most popular and well-known function from knitr
. It lets you create a markdown document from an Rmarkdown file. You can learn more about knit()
on the official knitr page.
spin()
is similar, but starts one step further back: it takes an R script as input, creates an Rmarkdown document from the R script, and then proceeds to create a markdown document from it. spin()
can be useful in situations where you develop a large R script and want to be able to produce reports from it directly instead of having to copy chunks into a separate Rmarkdown file. You can read more about why I like spin()
in the blog post “knitr's best hidden gem: spin”.
When the core of this package was developed, none of its functionality was supported in any way by either knitr
or rmarkdown
. Over time, rmarkdown::render()
got some new features that are very similar to features of ezknitr
. Native support for parameters inside Rmarkdown files using YAML is a big feature which makes the use of set_default_params()
and the params
argument of ezknitr
less important. However, the core problem that ezknitr
wants to solve is the working directory issue, and this issue has yet to be addressed by rmarkdown
or knitr
, which makes ezknitr
still useful.
Please note that this project is released with a Contributor Code of Conduct. By participating in this project you agree to abide by its terms.


What’s the first thing you think of when you think of fire extinguisher steps of operation? Take a moment and give it some thought. Was your first step something like “determine if I should use a fire extinguisher or get to safety instead?” If not, you overlooked a very important decision point. If you’re involved in a fire, there may be times when it’s best for you to get to safety instead of trying to fight the fire. In fact, there are times when fighting the fire may increase the danger to yourself and to others in the area.


Welcome to
jason's classroom
A place to study for your High School Equivalency Diploma
hse exams
expand_more
GED™ Exam
HiSET™ Exam
TASC™ Exam
study
expand_more
mathematics
reading
science
social studies
writing
message
Contact
coming soon...


Alt-Ergo - An automatic theorem prover dedicated to program verification
alt-ergo [ options ] file
Alt-Ergo is an automatic theorem prover. It takes as inputs an arbitrary polymorphic and multi-sorted first-order formula written is a why like syntax.
-h Help. Will give you the full list of command line options.
A theory of functional arrays with integer indexes . This theory provides a built-in type ('a,'b) farray and a built-in syntax for manipulating arrays.
For instance, given an abstract datatype tau and a functional array t of type (int, tau) farray declared as follows:
type tau
logic t : (int, tau) farray
The expressions:
t[i] denotes the value stored in t at index i
t[i1<-v1,...,in<-vn] denotes an array which stores the same values as t for every index except possibly i1,...,in, where it stores value v1,...,vn. This expression is equivalent to ((t[i1<-v1])[i2<-v2])...[in<-vn].
Examples.
t[0<-v][1<-w]
t[0<-v, 1<-w]
t[0<-v, 1<-w][1]
A theory of enumeration types.
For instance an enumeration type t with constructors A, B, C is defined as follows :
type t = A | B | C
Which means that all values of type t are equal to either A, B or C. And that all these constructors are distinct.
A theory of polymorphic records.
For instance a polymorphic record type 'a t with two labels a and b of type 'a and int respectively is defined as follows:
type 'a t = { a : 'a; b : int }
The expressions { a = 4; b = 5 } and { r with b = 3} denote records, while the dot notation r.a is used to access to labels.
Alt-Ergo (v. >= 0.95) allows the user to force the type of terms using the syntax <term> : <type>. The example below illustrates the use of this new feature.
type 'a list
logic nil : 'b list
logic f : 'c list -> int
goal g1 : f(nil) = f(nil) (* not valid because the two instances of nil may have different types *)
goal g2 : f(nil:'d list) = f(nil:'d list) (* valid *)
ERGOLIB Alternative path for the Alt-Ergo library
Sylvain Conchon<EMAIL_ADDRESS>and Evelyne Contejean<EMAIL_ADDRESS>Alt-Ergo web site: http://alt-ergo.lri.fr


We make corporate services happen at the tip of your fingers
We are a digital enterprise based in Singapore with a mission to shed light
as well as transparency on the opaque market of corporate services. We
empower companies with unprecedented access to suitable vendors and
help vendors broaden their sales coverage. We operate globally.
What we do
This theme will look great on any device, no matter the size!
Bid4Skill
This theme will look great on any device, no matter the size!
Bid4Agency
Featuring the latest build of the new Bootstrap 4 framework!
Bid4CustomerService
Ready to use with your own content, or customize the source files!
Our clients
Who we are
Margaret E.
"This is fantastic! Thanks so much guys!"
Fred S.
"Bootstrap is amazing. I've been using it to create lots of super nice landing pages."
Sarah W.
"Thanks so much for making these free resources available to us!"


[Seal of Avarice]
The Seal of Avarice bestows the following benefits:
Ownership of the Necropolises:
The Lords of Dawn have exclusive rights to the eight Necropolises. In case of a tie, entry is no longer exclusive.
Meeting with Lith:
The door to the Forbidden Sanctum opens and we finally meet Lilith, the Abyssal Mother. She is our greatest enemy, sleeping in the Saints Necropolis.
Commerce with Merchant of Mammon:
You can do business with the Merchant of Mammon in the Necropolises. They accept payment in ancient adena, and have many fine, rare articles.
"I wish to fight for the Seal of Avarice."
Back


A single page Black Jack card game app where a user can play against a simulated dealer. App made using JavaScript, CSS3, HTML5, and jQuery.
An application that allows users to create a personalized list of favorite films / collection of films utilizing a third party API search. Built with: JavaScript, CSS3, HTML5, MongoDB, Mongoose, NodeJS, Passport.
A dashboard application that assists users in a job search by allowing them to search and access job postings from a third party API. Then allowing to save desired listings in an organized system to help streamline the job search process. Built with: AngularJS, JavaScript, CSS3, HTML5, MongoDB, Mongoose, NodeJS, Passport.
A streamline date organization / planning app with social activity and dining suggestions for a user to generate date ideas. This app was built using: Ruby on Rails, HTML5, CSS3.


import logging
from airflow.exceptions import AirflowException
from airflow.hooks import HttpHook
from airflow.models import BaseOperator
from airflow.utils.decorators import apply_defaults
[docs]class SimpleHttpOperator(BaseOperator):
"""
Calls an endpoint on an HTTP system to execute an action
:param http_conn_id: The connection to run the sensor against
:type http_conn_id: string
:param endpoint: The relative part of the full url
:type endpoint: string
:param method: The HTTP method to use, default = "POST"
:type method: string
:param data: The data to pass. POST-data in POST/PUT and params
in the URL for a GET request.
:type data: For POST/PUT, depends on the content-type parameter,
for GET a dictionary of key/value string pairs
:param headers: The HTTP headers to be added to the GET request
:type headers: a dictionary of string key/value pairs
:param response_check: A check against the 'requests' response object.
Returns True for 'pass' and False otherwise.
:type response_check: A lambda or defined function.
:param extra_options: Extra options for the 'requests' library, see the
'requests' documentation (options to modify timeout, ssl, etc.)
:type extra_options: A dictionary of options, where key is string and value
depends on the option that's being modified.
"""
template_fields = ('endpoint','data',)
template_ext = ()
ui_color = '#f4a460'
@apply_defaults
def __init__(self,
endpoint,
method='POST',
data=None,
headers=None,
response_check=None,
extra_options=None,
http_conn_id='http_default', *args, **kwargs):
super(SimpleHttpOperator, self).__init__(*args, **kwargs)
self.http_conn_id = http_conn_id
self.method = method
self.endpoint = endpoint
self.headers = headers or {}
self.data = data or {}
self.response_check = response_check
self.extra_options = extra_options or {}
def execute(self, context):
http = HttpHook(self.method, http_conn_id=self.http_conn_id)
logging.info("Calling HTTP method")
response = http.run(self.endpoint,
self.data,
self.headers,
self.extra_options)
if self.response_check:
if not self.response_check(response):
raise AirflowException("Response check returned False.")


Storyboard StudyRightExtendsReverseClassModel
Start situation: There are some java files. We parse them and generate a class model:


Hello! This app is here to help you learn a bit about APIs by contributing a new endpoint. The app is hosted on Glitch at api-learner.glitch.me and managed as an open source project on GitHub in the Glitch API Learner repo.
Check out the tutorial in the README to learn about APIs and make an open source contribution at the same time!


This is a website built to combine two of my passions: running and web development. It is designed to combine all the resources you need to enjoy running in the Austin community in one place. There are route maps and descriptions, training plans, strength training workouts, training videos, a race calendar, and a community bulletin board. This was built using a materialize UI framework, JavaScript, jQuery, Node, Express, Handlebars, and MongoDB. It features a user login, using the passport local strategy, and a fully responsive design that allows you to take it with you on a run.
A JavaScript powered hangman game featuring artists from the 2016 ACL Festival lineup.
Key highlights from this game include:
- • Selects artists at random and does not repeat any artist during an individual game session.
- • Accepts only alphabetic characters as user inputs.
- • Alerts the user if an input is invalid, or has already been guessed.
- • Tracks overall wins and losses.
- • Get it right, or run out of guesses, and the game will provide a picture and short bio for the selected artist, then automatically moves on to the next challenge.
A portfolio website for an Austin based legislative affairs consulting firm.
A mock travel site built using: node.js; express; express-handlebars; jQuery; and, the Materialize CSS framework. This site guides users through a series of simple questions and then queries the Home Away API to find the personalized lodgings in specially curated neighborhoods.
A ten question trivia game that raises awareness on the issue of global poverty. This game explores the setTimeout JavaScript function and uses the html 5 audio element to lay down a groovy soundtrack from the Beastie Boys.
A full stack web application built using node and express and deployed via Heroku. This application polls users, and then compares responses to those of other poll takers to find the most compatible match. This application provides client side form validation and has a clean, minimalistic UI built with the Bootstrap CSS framework.
A campaign website promoting a candidate for the Huntsville City Council


Your browser does not support the video tag. I suggest you upgrade your browser.
Your browser does not support the video tag. I suggest you upgrade your browser.
Work in progress...
Please visit later
shirletterly.com


Tango Calendar Montreal lists the weekly tango events (Milongas and Practicas) around Montreal. The site is maintained by Edmund Lam.
Missing something on the calendar? Let me know!
The night is young. Tango Calendar Montreal Copyright © tangocalmontreal 2023


Use the icon-btn class (for buttons) or the icon-link class (for links) and any of the available icons for a borderless, actionable icon style.
{% highlight html %} {% endhighlight %}To remove the background colour and hover states, apply the icon-btn--transparent modifier. This is typically needed if the icon button is placed on a non-default background colour or if the icon has a colour fill (as in the case below).
{% highlight html %} {% endhighlight %}An icon button can be badged using the badge module.
The button or anchor element requires an additional icon-btn--badged or icon-link--badged modifier, respectively.
{% highlight html %} {% endhighlight %}


--- layout: post status: publish published: true title: Podcast 3.59 - Dodging the Cannonball that is Prince Fielder author: display_name: Corey Fineran login: Corey email<EMAIL_ADDRESS>url: '' author_login: Corey author_email<EMAIL_ADDRESS>wordpress_id: 6604 wordpress_url: http://ivyenvy.com/?p=6604 date: '2012-01-24 22:58:26 +0000' date_gmt: '2012-01-25 04:58:26 +0000' categories: - Podcast tags: - Astros - Prince Fielder - Josh Vitters - Brett Jackson - Marlon Byrd - Carlos Pena - Matt Szczur - Darwin Barney - Junior Lake - Javier Baez - Yoenis Cespedes - Anthony Rizzo - Dan Vogelbach - Idaho Cubs comments: [] ---
Andy joins Corey through Skype. Marlon Byrd reportedly drops 40 lbs and we consider what this could mean to his performance on the field. Darwin Barney supposedly puts on 18 pounds. Andy shares his knowledge of exercise and weight training and we try to figure where and why Barney put this weight on.
Some of the guys in the Cubs' minor league system (Brett Jackson, Anthony Rizzo, Javier Baez, Dan Vogelbach) are rated highly in the prospect rankings on MLB.com and we look at the players and discuss their progression and the expectations. We also consider the future infield of Rizzo, Baez, Lake and Castro.
Carlos Pena is officially an ex-Cub and we reflect on his short stint with the Cubs. Prince Fielder is reportedly signing with the Tigers. The Astros consider changing their name when they move to the American League and we read some of names that our listeners submitted.
We then look at some of your suggested topics, such as the idea of the Cubs entering a new era, a bizarre workout video from the Idaho Cubs, Yoenis Cespedes and how we would construct a MLB team from scratch.


return np.array([[self.vehicles[vehicle]["speed"],
self.vehicles[vehicle]["lane"],
self.get_headway(vehicle)]for vehicle in self.vehicles]).T
def render(self):
print("current velocity, lane, headway:", self.state)
return np.array([[self.vehicles[vehicle]["speed"],
self.vehicles[vehicle]["lane"],
self.vehicles[vehicle]["absolute_position"]] for vehicle in self.vehicles]).T
def render(self):
print("current velocity, lane, headway:", self.state)


fun presentPaymentMethodSelection(selectedPaymentMethodId: String? = null): Unit
Launch the PaymentMethodsActivity to allow the user to select a payment method, or to add a new one.
The initial selected Payment Method ID uses the following logic.
selectedPaymentMethodId
- if non-null, the ID of the Payment Method that should be
initially selected on the Payment Method selection screen


Connect With Us
Contact Us
P
:<PHONE_NUMBER>
E
:
<EMAIL_ADDRESS>Contact Us
Toggle navigation
Reflexology Cork
Reflexology
Fertility Reflexology
Maternity Reflexology
FAQ's
Contact Us
Contact Details
Innishannon
CORK
P
:<PHONE_NUMBER>
E
:
<EMAIL_ADDRESS>H
: Monday - Saturday
By Appointment
Send us a Message
Full Name:
Phone Number:
Email Address:
Message:
Send Message


Independent Work
Lab and Projects
Science Demonstration
Silent Reading and Review
Chill Testing
Mad Science
Wooded Ecosystem


Before Change
(0 if (i + 1) > threads % num_loaders else 1),
FIRST_PORT + i % num_servers, i, iteration_results),
{}) for i in range(num_loaders)]
logging.error("BEFORE: %s", args)
vm_util.RunThreaded(RunLoad, args)
throughput = 0.0
latency = 0.0
logging.error("%s", iteration_results)
After Change
(0 if (i + 1) > threads % num_loaders else 1),
FIRST_PORT + i % num_servers, i),
{}) for i in range(num_loaders)]
client_results = [i for i in vm_util.RunThreaded(RunLoad, args)
if i is not None]
logging.info("Redis results by client: %s", client_results)
throughput = sum(
client_throughput for client_throughput, _ in client_results)
if not throughput:
raise errors.Benchmarks.RunError(
"Zero throughput for {} threads: {}".format(threads, client_results))
// Average latency across clients
latency = (sum(client_latency * client_throughput
for client_latency, client_throughput in client_results) /
throughput)


Next: Tracing tokens, Previous: Listing rules, Up: Tracing and diagnosing parses [Contents][Index]
The parse diagnostics should include a facility for displaying Earley sets by Earley set location. For each Earley item at a location, the facility should display
The “progress reports” methods of Libmarpa are available for this purpose. See Progress reports.
It is up to the application how to display rule and dot position, but the most helpful way is usually to display the LHS and RHS, with a bullet or dot at the appropriate position in the RHS. This is what is done when showing dotted rules in this document, as for example in
[ Y ::= C • X ].
The current location of each Earley item may be displayed with the Earley item but, since it is shared by the entire set of Earley items, it can also be put in a header, or left implicit.
We recall (see Earlemes and Earley set IDs) that
the Earley IDs range from 0 to latest
, inclusive,
where latest
is the latest Earley set.
See The latest Earley set].
The obvious way to display the Earley items is one at a time.
We call this the “raw” method of displaying an Earley set.
But we can also try to compact this listing by grouping together
Earley items that share a dotted rule
(and which therefore differ only in their origins).
We call this the “compact” method of displaying an Earley set.
Marpa::R2
uses the compact method.
To use the compact method,
we must be able to show an arbitrarily large number of origins compactly.
The following is an example line from
Marpa::R2
’s progress reports:
F11 x12 @0...38-41 L1c1-L2c40 <plain assignment> -> ’x’ ’=’ expression •
In this example line, the following are true:
Marpa::R2
level.
For more details on Marpa::R2
’s implementation of progress
reports, see
https://metacpan.org/dist/Marpa-R2/view/pod/Progress.pod.
The disadvantage of the compact representation of Earley sets is that it is more complicated to read. The disadvantage of the raw representation is that, for ambiguous grammars, the number of Earley items can be very large, and therefore the listing of the Earley set can be unmanageably long.
Next: Tracing tokens, Previous: Listing rules, Up: Tracing and diagnosing parses [Contents][Index]


It is our mission to meet your needs by providing a seamless integration of high-quality services, state-of-the-art products, and a cutting-edge social media presence.
Innovate
Lightbulbs symbolize ideas. And we have plenty. Also, we wear ties. The point is, we look good while we're thinking of stuff. Unless it's casual Friday.
Collaborate
We have very important meetings where we share ideas. Sharing is good. Diversity is also good. The icon above reflects both of those values.
Grow
We don't just talk about success. We make graphs. Lots and lots of graphs. And our graphs always slope up and to the right.


Register
First Name:
Last Name:
Male
Female
Other
Email:
Password:
Birthday:
Month
January
February
March
Day
1
2
3
Year
2018
2019
2020
I agree to the terms and conditions
Submit


The function cumulateData() helps you to cumulate the 'rows' of a json object. See main.js for how to use it.
Open the console to see the result.


Timetable scheduling application
Upload new File
Verify new File - choose file!
- Make sure that the sheet you want to check is the first worksheet of the XLSX file!
- Also make sure that none of the timetable entries is EMPTY - if it's an open slot please make it have the '--' characters!


Herro Mustafa: The US Will Send Energy Experts to Bulgaria
The US will send a team of energy experts to help develop Bulgaria as an energy hub in the Balkans, US Ambassador to Bulgaria Herro Mustafa announced.
Experts will visit Kozloduy and Belene NPPs as well as gas storage facilities in the country.
"It is wonderful that Bulgaria has opportunities to supply gas from sources other than Russia. It is thus possible to diversify, that is, not to depend on just one country," the US ambassador emphasized.
Expect details.


Our project group was given two datasets: one contains information about the cases of alleged witchcraft, while the other contains information on the profiles of the accused witches. The datasets were compiled by Julian Goodare, who is coincidentally the author of many studies pertaining to the Great Scottish Witch Hunts. On top of our data, we also referred to additional sources, primary and secondary. We referred to the Lynda video on Information Literacy to assist us with finding our sources; we recorded different keywords related to our topic before looking them up across several library databases, like the UCLA Library Catalog.
One notable primary source that we found was Newes from Scotland - Declaring the Damnable Life and Death of Dr. Fian, A Notable Sorcerer that was compiled by Carmichael, detailing confessions of some accused witches who were allegedly involved in the attempted murder of King James VI.
For data processing, we first combined the two datasets to create a single .csv file. We found that the datasets are one-to-one, except for the cases that involved two or more witches; hence, we used the vlookup function in Excel to combine the two datasets into one, in order to facilitate our analysis.
Before we began our analysis, we looked at the following research questions:
Once we narrowed down our research questions, our data specialist, James used R to breakdown the profiles of the witches by gender, age, and occupation. Using the same software, James also collected the years which had abnormally high numbers of accusations. Meanwhile, our map specialist, Michelle, worked with our class’ map specialist, Albert, to identify the counties where witchcraft accusations were most prevalent.
To visualize our findings, we used Tableau (for bars and charts) and Carto (for maps). We then embedded our visualizations on the website so that the visualizations are interactive which allows readers to toggle between different parameters.
We used a variety of bars and charts to visualize our data, after referring to The Data Visualization Catalogue. For timelines, we used a line chart to emphasize peaks in accusations, for comparisons, we used mostly bar charts to highlight differences, and for location-related information, we used a heat map to indicate areas with high numbers of accusations.
Ultimately, our project is presented on a custom website that was created by our web specialist, Christine. Following the suggestion from the video on Design Aesthetics for the Web, Christine created the website with the color and form in mind: the contrasting colors make the contents easy to read while the incorporation of a sidebar on our site allows readers to jump to different sections within the same page.
If you wish to learn more about our data and how we critiqued it, please refer to our data critique!
We would like to thank Professor Posner and Francesca Albrezzi for their assistance and helpful feedback on our project. We would also like to thank Albert Kochaphum for helping us with mapping the different Scottish counties, and Julian Goodare, Lauren Martin, Joyce Miller and Louise Yeoman for answering all our questions and the countless hours spent curating data for their collection of Scottish Witchcraft Trials.
Wendy is a fourth Year Political Science Major and Digital Humanities Minor. As the project manager, she is in charge of time management and making sure we meet our milestones. She is also a content contributor and assisted research for Gender and Socioeconomic status of the accused.
Christine is a Microbiology, Immunology, & Molecular Genetics major and Bioinformatics and Digital Humanities double minor. She hopes to utilize her knowledge of programming and web development to pursue a career in software engineering after graduation. Working with all the other project members, Christine used Bootstrap frameworks and HTML, CSS, and Javascript to effectively display information on the project website.
James is a third year Statistics major and Digital humanities minor at UCLA. Pursuing data science as a career, he wants to use his statistics and coding background to create valuable insights and inform communities of the value of their data. James is also a member of UCLA's Student Alumni Association, Alumni Scholars Club, and UCLARadio. James used R and Tableau for our project to create relevant data visualizations.
Tenn Shaun is a 3rd year Financial Actuarial Mathematics major and Digital Humanities minor. As the content specialist, he works closely with the James and Michelle, the data visualization specialist and the mapping specialist respectively, to ensure that his research is consistent with the data. He also weaves the data visuals into his content, ensuring a cohesive narrative for the project.
Michelle is a third year Linguistics & Computer Science and Cognitive Science double major with a minor in Digital Humanities. As the mapping specialist, she geocoded the old shires of Scotland and utilized Carto to create a heat map depicting the quantity of witchcraft accusations across the different counties. She is also currently a Virtual Reality developer at the UCLA Cotsen Institute of Archaeology and 3D printing specialist at the UCLA Lux Lab.


« Previous Demo:
Slideshow with jmpress.js
Back to the Codrops Article
Tips & Tricks
Direction-Aware
Hover Effect
Default
Delay
Inverse
Named Object
Here we use the inverse direction.
My Muse by Zachary Horst
Menu by Simon Jensen
TN Aquarium by Charlie Gann
Mr. Crabs by John Generalov
Gallery of Mo 2.Mo logo by Adam Campion
Ice Cream - nom nom by Eight Hour Day
Natalie & Justin Cleaning by Justin Younger
App Preview by Ryan Deshler
Cornwall Map by Katharina Maria Zimmermann
final AD logo by Annette Diana
Land Those Planes by Lee Ann Marcel
Seahorse by Trevor Basset


Computer skills
Office PackageAbout me
So, I am a 23 years-old final-year industrial engineering student who -as you can see- likes programming, among other things.
This came about simply because I wanted to see how difficult (or easy) it could be to deploy a personal website. But since we are all here I can also show you some of the projects I'm working on in my free time.
Below you will see some jobs that I put together in my spare time related to other of my interests: finance and data science. (Okay I have only two right now but the idea is for the next section to increase its size over time.)
Portfolio
Data Science
MACD strategy advisor
My first project. Here you'll see my attempt to build a program that calculates the MACD and its signal in order to advice whether or not to buy a stock.
Web Design
OVO web page
As I said, I'm currently studying in my last year of industrial engineering and so I had to create a real-world investment project as my final work. Here you can see the web page I designed for it.