Research
Security News
Malicious npm Packages Inject SSH Backdoors via Typosquatted Libraries
Socket’s threat research team has detected six malicious npm packages typosquatting popular libraries to insert SSH backdoors.
babe-project
Advanced tools
Basic Architecture for Browser-based experiments (https://github.com/babe-project)
basic architecture for browser-based experiments
Download the _babe .zip
Unzip and place the folder (babe-base-master) in the libraries/
folder of your experiment.
Your experiment's structure should look something like this:
experiment/
+ libraries/
+ babe-babe-master
+ \_babe.full.min.js
+ \_babe.min.js
+ ...
+ ...
_babe.full.min.js
includes the dependencies that _babe uses (jQuery, Mustache and csv-js). There is no need to install and import jQuery, Mustache and csv-js.
_babe.min.js
includes only the _babe package, the dependencies should be installed separately for _babe to work.
index.html
the full version:
<script src="libraries/babe-base-master/_babe.full.min.js></script>
no-dependencies version:
<script src="libraries/babe-base-master/_babe.min.js></script>
import _babe-styles in your index.html
:
<link rel="stylesheet" type="text/css" href="libraries/babe-base-master/_babe-styles.css">
You need npm installed on your machine. Here is more information on how to install npm
If you have npm installed, run the following command from your experiment's directory
npm install babe-project --save
Dependencies:
Include _babe in your main .html
file:
<link rel="stylesheet" type="text/css" href="node_modules/babe-project/_babe-styles.css">
<script src="node_modules/mustache/mustache.min.js"></script>
<script src="node_modules/jquery/dist/jquery.min.js"></script>
<script src="node_modules/csv-js/csv.js"></script>
<script src="node_modules/babe-project/_babe.min.js></script>
Use _babeInit()
to create a _babe experiment.
_babeInit
takes an object as a parameter with the following properties:
views_seq
- a list of view objects in the sequence you want them to appear in your experiment. more infodeploy
- an object with information about the deploy methods of your experiment. more infoprogress_bar
- an object with information about the progress bars in the views of your experiment. more infoSample _babeInit
call:
$("document").ready(function() {
_babeInit({
views_seq: [
intro,
instructions,
practice,
main,
thanks
],
deploy: {
"experimentID": "4",
"serverAppURL": "https://babe-demo.herokuapp.com/api/submit_experiment/",
"deployMethod": "debug",
"contact_email": "YOUREMAIL@wherelifeisgreat.you",
"prolificURL": "https://app.prolific.ac/submissions/complete?cc=ABCD1234"
},
progress_bar: {
in: [
"practice",
"main"
],
style: "default",
width: 150
}
});
});
_babe views get inserted in an html element with id main
, you need to have an html tag (preferrably div
or main
)
with id="main"
Sample index.html
<!DOCTYPE html>
<html>
<head>
...
...
...
</head>
<body>
<-- ask the participants to enable JavaScript in their browser -->
<noscript>This task requires JavaScript. Please enable JavaScript in your browser and reload the page. For more information on how to do that, please refer to
<a href='https://enable-javascript.com' target='_blank'>enable-javascript.com</a>
</noscript>
<!-- views are inserted in here -->
<main id='main'>
Loading...
</main>
</body>
</html>
_babe provides several ready-made views which you can access form the _babeViews
object.
trial type views:
_babeViews.forcedChoice
- binary forced-choice task_babeViews.sliderRating
- slider rating task_babeViews.textboxInput
textbox input task_babeViews.dropdownMenu
- dropdown menu task_babeViews.ratingScale
- Likert-scale rating task_babeViews.sentenceSelection
- text selection task_babeViews.imageSelection
- click-on-a-picture task_babeViews.keyPress
- press a button taskother views:
_babeViews.intro
- introduction view_babeViews.instructions
- instructions view_babeViews.begin
- begin experiment view; can be used between the practice and the main view_babeViews.postTest
- post-experiment questionnaire_babeViews.thanks
- the last view that handles the submission of the results of creates a table with the results in 'Debug Mode'Each _babe view function takes an object as a parameter with the following properties:
trials
- the number of trials this view will appear
trial type views also have:
trial_type
- the name of the trial type that will be in the final data (for example 'main binary choice');data
- a list of trialsother views also have:
title
- the title in the viewtext
- the text in the viewbuttonText
- the text on the button that takes the user to the newxt viewSample use of _babe views:
// your_js_file.js
const intro = _babeViews.intro({
title: 'Welcome!',
text: 'This is an experiment!',
buttonText: 'Begin the experiment',
trials: 1
});
const instructions = _babeViews.instructions({
title: 'Instructions',
text: 'Choose an answer',
buttonText: 'Next',
trials: 1
});
const main = _babeViews.forcedChoice({
trial_type: 'main',
data: main_trials,
trials: 4
});
const thanks = _babeViews.thanks({
title: 'Thank you for taking part in this experiment!',
trials: 1
});
$("document").ready(function() {
_babeInit({
views_seq: [
intro,
instructions,
main,
thanks
],
deploy: {
"experimentID": "4",
"serverAppURL": "https://babe-demo.herokuapp.com/api/submit_experiment/",
"deployMethod": "debug",
"contact_email": "YOUREMAIL@wherelifeisgreat.you",
"prolificURL": "https://app.prolific.ac/submissions/complete?cc=ABCD1234"
},
progress_bar: {
in: [
"main"
],
style: "default",
width: 100
}
});
});
You can also create your own views.
The views are functions that return an object with the following properties:
trials: number
- the number of trials this view appearsCT: 0
- current trial, always starts from 0name: string
- the name of the view (the progress bar uses the name)render: function
- a function that renders the view
CT
and _babe
as parameters to render()Add the data gathered from your custom trial type views to _babe.trial_data
Sample custom trial type view:
_babeViews.pressTheButton = function(config) {
const _pressTheButton = {
name: config.name,
title: config.title,
render(CT, _babe) {
let startTime = Date.now();
const viewTemplate =
`<div class='view'>
{{# title }}
<h1 class="title">{{ title }}</h1>
{{/ title }}
<button id="the-button">Press me!</button>
</div>`;
$("#main").html(
Mustache.render(viewTemplate, {
title: this.title
})
);
$('#the-button').on('click', function(e) {
_babe.trial_data.push({
trial_type: config.trial_type,
trial_number: CT+1,
RT: Date.now() - startTime
});
_babe.findNextView();
});
},
CT: 0,
trials: config.trials
};
return _pressTheButton;
};
const mainTrial = _babeViews.pressTheButton({
name: 'buttonPress',
title: 'How quickly can you press this button?',
trial_type: 'main',
trials: 1
});
$("document").ready(function() {
_babeInit({
...
views_seq: [
...
mainTrial,
...
],
...
});
});
Sample custom info view:
_babeViews.sayHello = function(config) {
const _sayHello = {
name: config.name,
title: config.title,
render(CT, _babe) {
const viewTemplate =
`<div class='view'>
{{# title }}
<h1 class="title">{{ title }}</h1>
{{/ title }}
<button id="hello-button">Hello back!</button>
</div>`;
$("#main").html(
Mustache.render(viewTemplate, {
title: this.title
})
);
$('#hello-button').on('click', function(e) {
_babe.findNextView();
});
},
CT: 0,
trials: config.trials
};
return _sayHello;
};
const hello = _babeViews.sayHello({
name: 'buttonPress',
title: 'Hello!?',
trials: 1
});
$("document").ready(function() {
_babeInit({
...
views_seq: [
...
hello,
...
],
...
});
});
The deploy config has the following properties:
experimentID
- the experimentID is needed to recover data from the babe server app. You receive the experimentID when you create the experiment using the babe server appserverAppURL
- if you use the _babe server app, specify its URL heredeployMethod
- use one of 'debug', 'localServer', 'MTurk', 'MTurkSandbox', 'Prolific', 'directLink'contact_email
- who to contact in case of troubleprolificURL
- the prolific completion URL if the deploy method is "Prolific"_babe provides the option to include progress bars in the views specified in the progress_bar.in
list passed to _babeInit
.
You can use one of the following 3 styles (include pictues)
separate
- have separate progress bars in each views declared in progress_bar.in
default
- have one progress bar throughout the whole experimentchunks
- have a separate progress chunk for each view in progress_bar.in
Use progress_bar.width
to set the width (in pixels) of the progress bar or chunk
Sample progress bar
$("document").ready(function() {
_babeInit({
...
progress_bar: {
in: [
"practice",
"main"
], // only the practice and the main view will have progress bars in this experiment
style: "chunks", // there will be two chunks - one for the practice and one for the main view
width: 100 // each one of the two chunks will be 100 pixels long
}
});
});
FAQs
Basic Architecture for Browser-based experiments (https://github.com/babe-project/babe-project)
The npm package babe-project receives a total of 3 weekly downloads. As such, babe-project popularity was classified as not popular.
We found that babe-project demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 3 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
Security News
Socket’s threat research team has detected six malicious npm packages typosquatting popular libraries to insert SSH backdoors.
Security News
MITRE's 2024 CWE Top 25 highlights critical software vulnerabilities like XSS, SQL Injection, and CSRF, reflecting shifts due to a refined ranking methodology.
Security News
In this segment of the Risky Business podcast, Feross Aboukhadijeh and Patrick Gray discuss the challenges of tracking malware discovered in open source softare.