diff --git a/.eslintrc.json b/.eslintrc.json
index 94d2d17..6d754a4 100644
--- a/.eslintrc.json
+++ b/.eslintrc.json
@@ -1,174 +1,24 @@
{
- "root": true,
- //"parser": "babel-eslint", // https://github.com/babel/babel-eslint
- "env": { // http://eslint.org/docs/user-guide/configuring.html#specifying-environments
- "browser": true, // browser global variables
- "node": true // Node.js global variables and Node.js-specific rules
- },
- "ecmaFeatures": {
- "arrowFunctions": true,
- "blockBindings": true,
- "classes": true,
- "defaultParams": true,
- "destructuring": true,
- "forOf": true,
- "generators": false,
- "modules": true,
- "objectLiteralComputedProperties": true,
- "objectLiteralDuplicateProperties": false,
- "objectLiteralShorthandMethods": true,
- "objectLiteralShorthandProperties": true,
- "spread": true,
- "superInFunctions": true,
- "templateStrings": true,
- "jsx": false
- },
- "rules": {
-/**
- * Strict mode
- */
- // babel inserts "use strict"; for us
- "strict": [2, "never"], // http://eslint.org/docs/rules/strict
-
-/**
- * ES6
- */
- "no-var": 2, // http://eslint.org/docs/rules/no-var
- "prefer-const": 0, // http://eslint.org/docs/rules/prefer-const
-
-/**
- * Variables
- */
- "no-shadow": 2, // http://eslint.org/docs/rules/no-shadow
- "no-shadow-restricted-names": 2, // http://eslint.org/docs/rules/no-shadow-restricted-names
- "no-unused-vars": [2, { // http://eslint.org/docs/rules/no-unused-vars
- "vars": "local",
- "args": "none"
- }],
- "no-use-before-define": 0, // http://eslint.org/docs/rules/no-use-before-define
-
-/**
- * Possible errors
- */
- "comma-dangle": [2, "never"], // http://eslint.org/docs/rules/comma-dangle
- "no-cond-assign": [2, "always"], // http://eslint.org/docs/rules/no-cond-assign
- "no-console": 1, // http://eslint.org/docs/rules/no-console
- "no-debugger": 1, // http://eslint.org/docs/rules/no-debugger
- "no-alert": 1, // http://eslint.org/docs/rules/no-alert
- "no-constant-condition": 1, // http://eslint.org/docs/rules/no-constant-condition
- "no-dupe-keys": 2, // http://eslint.org/docs/rules/no-dupe-keys
- "no-duplicate-case": 2, // http://eslint.org/docs/rules/no-duplicate-case
- "no-empty": 2, // http://eslint.org/docs/rules/no-empty
- "no-ex-assign": 2, // http://eslint.org/docs/rules/no-ex-assign
- "no-extra-boolean-cast": 0, // http://eslint.org/docs/rules/no-extra-boolean-cast
- "no-extra-semi": 2, // http://eslint.org/docs/rules/no-extra-semi
- "no-func-assign": 2, // http://eslint.org/docs/rules/no-func-assign
- "no-inner-declarations": 2, // http://eslint.org/docs/rules/no-inner-declarations
- "no-invalid-regexp": 2, // http://eslint.org/docs/rules/no-invalid-regexp
- "no-irregular-whitespace": 2, // http://eslint.org/docs/rules/no-irregular-whitespace
- "no-obj-calls": 2, // http://eslint.org/docs/rules/no-obj-calls
- "no-sparse-arrays": 2, // http://eslint.org/docs/rules/no-sparse-arrays
- "no-unreachable": 2, // http://eslint.org/docs/rules/no-unreachable
- "use-isnan": 2, // http://eslint.org/docs/rules/use-isnan
- "block-scoped-var": 0, // http://eslint.org/docs/rules/block-scoped-var
-
-/**
- * Best practices
- */
- "consistent-return": 0, // http://eslint.org/docs/rules/consistent-return
- "curly": [2, "multi-line"], // http://eslint.org/docs/rules/curly
- "default-case": 2, // http://eslint.org/docs/rules/default-case
- "dot-notation": [2, { // http://eslint.org/docs/rules/dot-notation
- "allowKeywords": true
- }],
- "eqeqeq": 2, // http://eslint.org/docs/rules/eqeqeq
- "guard-for-in": 0, // http://eslint.org/docs/rules/guard-for-in
- "no-caller": 2, // http://eslint.org/docs/rules/no-caller
- "no-else-return": 2, // http://eslint.org/docs/rules/no-else-return
- "no-eq-null": 2, // http://eslint.org/docs/rules/no-eq-null
- "no-eval": 2, // http://eslint.org/docs/rules/no-eval
- "no-extend-native": 2, // http://eslint.org/docs/rules/no-extend-native
- "no-extra-bind": 2, // http://eslint.org/docs/rules/no-extra-bind
- "no-fallthrough": 2, // http://eslint.org/docs/rules/no-fallthrough
- "no-floating-decimal": 2, // http://eslint.org/docs/rules/no-floating-decimal
- "no-implied-eval": 2, // http://eslint.org/docs/rules/no-implied-eval
- "no-lone-blocks": 2, // http://eslint.org/docs/rules/no-lone-blocks
- "no-loop-func": 2, // http://eslint.org/docs/rules/no-loop-func
- "no-multi-str": 2, // http://eslint.org/docs/rules/no-multi-str
- "no-native-reassign": 2, // http://eslint.org/docs/rules/no-native-reassign
- "no-new": 2, // http://eslint.org/docs/rules/no-new
- "no-new-func": 2, // http://eslint.org/docs/rules/no-new-func
- "no-new-wrappers": 2, // http://eslint.org/docs/rules/no-new-wrappers
- "no-octal": 2, // http://eslint.org/docs/rules/no-octal
- "no-octal-escape": 2, // http://eslint.org/docs/rules/no-octal-escape
- "no-param-reassign": 0, // http://eslint.org/docs/rules/no-param-reassign
- "no-proto": 2, // http://eslint.org/docs/rules/no-proto
- "no-redeclare": 2, // http://eslint.org/docs/rules/no-redeclare
- // "no-return-assign": 2, // http://eslint.org/docs/rules/no-return-assign
- "no-script-url": 2, // http://eslint.org/docs/rules/no-script-url
- "no-self-compare": 2, // http://eslint.org/docs/rules/no-self-compare
- "no-sequences": 2, // http://eslint.org/docs/rules/no-sequences
- "no-throw-literal": 2, // http://eslint.org/docs/rules/no-throw-literal
- "no-with": 2, // http://eslint.org/docs/rules/no-with
- "radix": 2, // http://eslint.org/docs/rules/radix
- "vars-on-top": 2, // http://eslint.org/docs/rules/vars-on-top
- "wrap-iife": [2, "any"], // http://eslint.org/docs/rules/wrap-iife
- "yoda": 2, // http://eslint.org/docs/rules/yoda
-
-/**
- * Style
- */
- "indent": [2, 2], // http://eslint.org/docs/rules/indent
- "brace-style": [2, // http://eslint.org/docs/rules/brace-style
- "1tbs", {
- "allowSingleLine": true
- }],
- "quotes": [
- 2, "single", "avoid-escape" // http://eslint.org/docs/rules/quotes
+ "plugins": [
+ "react"
],
- "camelcase": [2, { // http://eslint.org/docs/rules/camelcase
- "properties": "never"
- }],
- "comma-spacing": [2, { // http://eslint.org/docs/rules/comma-spacing
- "before": false,
- "after": true
- }],
- "comma-style": [2, "last"], // http://eslint.org/docs/rules/comma-style
- "eol-last": 2, // http://eslint.org/docs/rules/eol-last
- "func-names": 0, // http://eslint.org/docs/rules/func-names
- "key-spacing": [2, { // http://eslint.org/docs/rules/key-spacing
- "beforeColon": false,
- "afterColon": true
- }],
- "new-cap": [2, { // http://eslint.org/docs/rules/new-cap
- "newIsCap": true
- }],
- "no-multiple-empty-lines": [2, { // http://eslint.org/docs/rules/no-multiple-empty-lines
- "max": 2
- }],
- "no-nested-ternary": 2, // http://eslint.org/docs/rules/no-nested-ternary
- "no-new-object": 2, // http://eslint.org/docs/rules/no-new-object
- "no-spaced-func": 2, // http://eslint.org/docs/rules/no-spaced-func
- "no-trailing-spaces": 2, // http://eslint.org/docs/rules/no-trailing-spaces
- "no-extra-parens": [2, "functions"], // http://eslint.org/docs/rules/no-extra-parens
- "no-underscore-dangle": 0, // http://eslint.org/docs/rules/no-underscore-dangle
- "one-var": [2, "never"], // http://eslint.org/docs/rules/one-var
- "padded-blocks": [2, "never"], // http://eslint.org/docs/rules/padded-blocks
- "semi": [2, "always"], // http://eslint.org/docs/rules/semi
- "semi-spacing": [2, { // http://eslint.org/docs/rules/semi-spacing
- "before": false,
- "after": true
- }],
- "keyword-spacing": [2, { // http://eslint.org/docs/rules/keyword-spacing
- "before": true,
- "after": true
- }],
- "space-before-blocks": 2, // http://eslint.org/docs/rules/space-before-blocks
- "space-before-function-paren": [2, "never"], // http://eslint.org/docs/rules/space-before-function-paren
- "space-infix-ops": 2, // http://eslint.org/docs/rules/space-infix-ops
- "spaced-comment": [0, "always", { // http://eslint.org/docs/rules/spaced-comment
- "exceptions": ["*"],
- "markers": ["*"]
- }]
- }
-}
+ "parserOptions": {
+ "ecmaVersion": 6,
+ "sourceType": "module",
+ "ecmaFeatures": {
+ "jsx": true
+ }
+ },
+ "env": {
+ "es6": true,
+ "browser": true,
+ "node": true,
+ "mocha": true
+ },
+ "extends": [
+ "eslint:recommended",
+ "plugin:react/recommended"
+ ],
+ "rules": {
+ }
+}
\ No newline at end of file
diff --git a/app/app.js b/app/app.js
index 21ca29b..0266887 100644
--- a/app/app.js
+++ b/app/app.js
@@ -25,7 +25,6 @@
d: 4
}];
- MicroEvent.mixin(this);
let self = this;
let addDays = function(myDate, days) {
@@ -135,16 +134,6 @@
tick();
get_weather();
- // getNextTrainTime('dbe', 'glq');
- // getNextTrainTime('glq', 'dbe');
-
- // start 15 minute timer
-
- _fastTimer = setInterval(function() {
-
- // getNextTrainTime('dbe', 'glq');
- // getNextTrainTime('glq', 'dbe');
- }, (60000));
_slowTimer = setInterval(function() {
diff --git a/app/css/custom.scss b/app/css/custom.scss
index 8d97d12..f2a1f23 100644
--- a/app/css/custom.scss
+++ b/app/css/custom.scss
@@ -2,15 +2,15 @@
@import "../../bower_components/mui/src/sass/mui/colors";
// customize MUI variables
-$mui-primary-color: mui-color('teal', '500');
-$mui-primary-color-dark: mui-color('teal', '700');
-$mui-primary-color-light: mui-color('teal', '100');
+$mui-primary-color: mui-color('blue-grey', '500');
+$mui-primary-color-dark: mui-color('blue-grey', '700');
+$mui-primary-color-light: mui-color('blue-grey', '100');
$mui-accent-color: mui-color('deep-purple', '900');
$mui-accent-color-dark: mui-color('indigo', 'A100');
$mui-accent-color-light: mui-color('indigo', 'A400');
-$mui-base-font-family: 'Roboto Slab', "Helvetica Neue", Helvetica, Arial, Verdana,"Trebuchet MS";
+$mui-base-font-family: 'Roboto Condensed', "Helvetica Neue", Helvetica, Arial, Verdana,"Trebuchet MS";
// import MUI SASS
@import "../../bower_components/mui/src/sass/mui";
diff --git a/bower.json b/bower.json
new file mode 100644
index 0000000..bf691dd
--- /dev/null
+++ b/bower.json
@@ -0,0 +1,20 @@
+{
+ "name": "silvergit",
+ "description": "silvergit",
+ "main": "web-server.js",
+ "authors": [
+ "Martin Donnelly"
+ ],
+ "license": "ISC",
+ "homepage": "",
+ "private": true,
+ "ignore": [
+ "**/.*",
+ "node_modules",
+ "bower_components",
+ "test",
+ "tests"
+ ],
+ "dependencies": {
+ }
+}
\ No newline at end of file
diff --git a/fonts.list b/fonts.list
new file mode 100644
index 0000000..ab862b3
--- /dev/null
+++ b/fonts.list
@@ -0,0 +1,2 @@
+Roboto+Slab
+Roboto+Condensed
\ No newline at end of file
diff --git a/gulpfile.js b/gulpfile.js
index db2a4bf..1a780f0 100644
--- a/gulpfile.js
+++ b/gulpfile.js
@@ -18,7 +18,7 @@ let filePath = {
build_dir: 'live'
};
-let dest = 'live';
+let dest = 'app/live';
let fontOptions = { };
@@ -50,7 +50,7 @@ gulp.task('appJS', function() {
loops: true, // Optimize loops
unused: true, // Drop unused variables/functions
hoist_funs: true, // Hoist function declarations
- hoist_vars: false, // Hoist variable declarations
+ hoist_vars: true, // Hoist variable declarations
if_return: true, // Optimize if-s followed by return/continue
join_vars: true, // Join var declarations
cascade: true, // Try to cascade `right` into `left` in sequences
@@ -61,18 +61,32 @@ gulp.task('appJS', function() {
.pipe(gulp.dest(dest + '/js'));
});
+gulp.task('customMUI', function() {
+ return gulp.src(['app/css/custom.scss'])
+ .pipe(sass({outputStyle: 'compressed'}).on('error', sass.logError))
+ //.pipe(cssnano())
+ .pipe(rename('mui.custom.css'))
+ .pipe(gulp.dest(dest + '/css'));
+});
+
+
gulp.task('vendor', function() {
return gulp.src([
- 'app/libs/zepto.min.js',
- 'app/libs/microevent.js',
- 'app/libs/ejs.js',
- 'app/libs/underscore.js',
- 'app/libs/backbone.js'
+ 'bower_components/zepto/zepto.min.js',
+ 'bower_components/ejs/ejs.min.js',
+ 'bower_components/underscore/underscore-min.js',
+ 'bower_components/backbone/backbone-min.js'
])
.pipe(concat('vendor.js'))
.pipe(uglify({mangle: false}))
.pipe(gulp.dest(dest + '/js'));
});
+gulp.task('fonts', function() {
+ return gulp.src('./fonts.list')
+ .pipe(googleWebFonts(fontOptions))
+ .pipe(gulp.dest(dest + '/fonts'))
+ ;
+});
-gulp.task('default', ['appJS', 'vendor']);
\ No newline at end of file
+gulp.task('default', ['appJS', 'vendor', 'customMUI', 'fonts']);
\ No newline at end of file
diff --git a/lib/btc.js b/lib/btc.js
index 78f6047..09b15c7 100644
--- a/lib/btc.js
+++ b/lib/btc.js
@@ -1,52 +1,51 @@
- var http = require('http');
-var btcCache = {};
-exports.doBTC = function (req,res) {
- console.log('Bitcoin request');
- function btcQuery(callback, r) {
- var req = r;
- var options = {
- host: 'api.coindesk.com',
+ let http = require('http');
+ let btcCache = {};
+ exports.doBTC = function(req, res) {
+ console.log('Bitcoin request');
+ function btcQuery(callback, r) {
+ var req = r;
+ var options = {
+ host: 'api.coindesk.com',
// port: 80,
- path: '/v1/bpi/currentprice.json',
+ path: '/v1/bpi/currentprice.json',
// method: 'GET',
- headers: {
+ headers: {
/* 'Content-Type': 'application/json',
'Content-Length': Buffer.byteLength(data)*/
}
};
-try {
- http.request(options).on('response', function (response) {
- var data = '';
- response.on("data", function (chunk) {
- data += chunk;
+ try {
+ http.request(options).on('response', function(response) {
+ var data = '';
+ response.on('data', function(chunk) {
+ data += chunk;
});
- response.on('end', function () {
- callback(JSON.parse(data), r);
+ response.on('end', function() {
+ callback(JSON.parse(data), r);
});
response.on('error', function(e) {
- console.error(e);
- });
+ console.error(e);
+ });
}).end();
} catch (e) {
- console.error(e);
- }
+ console.error(e);
+}
}
- var now = new Date();
- if (now - GLOBAL.lastcheck > (59000 )) {
- btcQuery(function (a, b) {
+ let now = new Date();
+ if (now - GLOBAL.lastcheck > (59000 )) {
+ btcQuery(function(a) {
// console.log(a);
- console.log('Got btc data.')
- btcCache = a;
- GLOBAL.lastcheck = now;
- res.setHeader('Content-Type', 'application/json');
- res.end(JSON.stringify(btcCache));
- }, res)
+ console.log('Got btc data.');
+ btcCache = a;
+ GLOBAL.lastcheck = now;
+ res.setHeader('Content-Type', 'application/json');
+ res.end(JSON.stringify(btcCache));
+ }, res);
+ } else {
+ console.log('Using cache');
+ res.setHeader('Content-Type', 'application/json');
+ res.end(JSON.stringify(btcCache));
}
- else {
- console.log("Using cache");
- res.setHeader('Content-Type', 'application/json');
- res.end(JSON.stringify(btcCache));
- }
- };
+};
diff --git a/lib/newdata.json b/lib/newdata.json
index 3255c53..809f415 100644
--- a/lib/newdata.json
+++ b/lib/newdata.json
@@ -1 +1 @@
-{"last":1491172884722,"data":{"trains":{"last":"2017-04-02T22:33:36.333Z","data":[]},"weather":{"currently":"Partly Cloudy. Around 4 to 11 degrees.","today":"Partly cloudy until afternoon.","later":"Light rain tomorrow and Sunday, with temperatures peaking at 12°C on Wednesday.","alerts":{},"data":{"latitude":55.95,"longitude":-4.566667,"timezone":"Europe/London","offset":1,"currently":{"time":1491172422,"summary":"Partly Cloudy","icon":"partly-cloudy-night","nearestStormDistance":89,"nearestStormBearing":271,"precipIntensity":0,"precipProbability":0,"temperature":6.75,"apparentTemperature":4.11,"dewPoint":3.65,"humidity":0.81,"windSpeed":8.55,"windBearing":115,"visibility":10,"cloudCover":0.5,"pressure":1015.06,"ozone":322.88},"minutely":{"summary":"Partly cloudy for the hour.","icon":"partly-cloudy-night","data":[{"time":1491172380,"precipIntensity":0,"precipProbability":0},{"time":1491172440,"precipIntensity":0,"precipProbability":0},{"time":1491172500,"precipIntensity":0,"precipProbability":0},{"time":1491172560,"precipIntensity":0,"precipProbability":0},{"time":1491172620,"precipIntensity":0,"precipProbability":0},{"time":1491172680,"precipIntensity":0,"precipProbability":0},{"time":1491172740,"precipIntensity":0,"precipProbability":0},{"time":1491172800,"precipIntensity":0,"precipProbability":0},{"time":1491172860,"precipIntensity":0,"precipProbability":0},{"time":1491172920,"precipIntensity":0,"precipProbability":0},{"time":1491172980,"precipIntensity":0,"precipProbability":0},{"time":1491173040,"precipIntensity":0,"precipProbability":0},{"time":1491173100,"precipIntensity":0,"precipProbability":0},{"time":1491173160,"precipIntensity":0,"precipProbability":0},{"time":1491173220,"precipIntensity":0,"precipProbability":0},{"time":1491173280,"precipIntensity":0,"precipProbability":0},{"time":1491173340,"precipIntensity":0,"precipProbability":0},{"time":1491173400,"precipIntensity":0,"precipProbability":0},{"time":1491173460,"precipIntensity":0,"precipProbability":0},{"time":1491173520,"precipIntensity":0,"precipProbability":0},{"time":1491173580,"precipIntensity":0,"precipProbability":0},{"time":1491173640,"precipIntensity":0,"precipProbability":0},{"time":1491173700,"precipIntensity":0,"precipProbability":0},{"time":1491173760,"precipIntensity":0,"precipProbability":0},{"time":1491173820,"precipIntensity":0,"precipProbability":0},{"time":1491173880,"precipIntensity":0,"precipProbability":0},{"time":1491173940,"precipIntensity":0,"precipProbability":0},{"time":1491174000,"precipIntensity":0,"precipProbability":0},{"time":1491174060,"precipIntensity":0,"precipProbability":0},{"time":1491174120,"precipIntensity":0,"precipProbability":0},{"time":1491174180,"precipIntensity":0,"precipProbability":0},{"time":1491174240,"precipIntensity":0,"precipProbability":0},{"time":1491174300,"precipIntensity":0,"precipProbability":0},{"time":1491174360,"precipIntensity":0,"precipProbability":0},{"time":1491174420,"precipIntensity":0,"precipProbability":0},{"time":1491174480,"precipIntensity":0,"precipProbability":0},{"time":1491174540,"precipIntensity":0,"precipProbability":0},{"time":1491174600,"precipIntensity":0,"precipProbability":0},{"time":1491174660,"precipIntensity":0,"precipProbability":0},{"time":1491174720,"precipIntensity":0,"precipProbability":0},{"time":1491174780,"precipIntensity":0,"precipProbability":0},{"time":1491174840,"precipIntensity":0,"precipProbability":0},{"time":1491174900,"precipIntensity":0,"precipProbability":0},{"time":1491174960,"precipIntensity":0,"precipProbability":0},{"time":1491175020,"precipIntensity":0,"precipProbability":0},{"time":1491175080,"precipIntensity":0,"precipProbability":0},{"time":1491175140,"precipIntensity":0,"precipProbability":0},{"time":1491175200,"precipIntensity":0,"precipProbability":0},{"time":1491175260,"precipIntensity":0,"precipProbability":0},{"time":1491175320,"precipIntensity":0,"precipProbability":0},{"time":1491175380,"precipIntensity":0,"precipProbability":0},{"time":1491175440,"precipIntensity":0,"precipProbability":0},{"time":1491175500,"precipIntensity":0,"precipProbability":0},{"time":1491175560,"precipIntensity":0,"precipProbability":0},{"time":1491175620,"precipIntensity":0,"precipProbability":0},{"time":1491175680,"precipIntensity":0,"precipProbability":0},{"time":1491175740,"precipIntensity":0,"precipProbability":0},{"time":1491175800,"precipIntensity":0,"precipProbability":0},{"time":1491175860,"precipIntensity":0,"precipProbability":0},{"time":1491175920,"precipIntensity":0,"precipProbability":0},{"time":1491175980,"precipIntensity":0,"precipProbability":0}]},"hourly":{"summary":"Light rain starting tomorrow afternoon, continuing until tomorrow evening.","icon":"rain","data":[{"time":1491170400,"summary":"Partly Cloudy","icon":"partly-cloudy-night","precipIntensity":0,"precipProbability":0,"temperature":6.91,"apparentTemperature":4.38,"dewPoint":3.62,"humidity":0.8,"windSpeed":8.23,"windBearing":118,"visibility":10,"cloudCover":0.42,"pressure":1013.26,"ozone":321.81},{"time":1491174000,"summary":"Partly Cloudy","icon":"partly-cloudy-night","precipIntensity":0,"precipProbability":0,"temperature":6.75,"apparentTemperature":4.04,"dewPoint":3.79,"humidity":0.81,"windSpeed":8.81,"windBearing":114,"visibility":10,"cloudCover":0.57,"pressure":1016.47,"ozone":323.71},{"time":1491177600,"summary":"Mostly Cloudy","icon":"partly-cloudy-night","precipIntensity":0,"precipProbability":0,"temperature":6.83,"apparentTemperature":4.04,"dewPoint":4.18,"humidity":0.83,"windSpeed":9.26,"windBearing":112,"visibility":10,"cloudCover":0.69,"pressure":1017.71,"ozone":325.84},{"time":1491181200,"summary":"Mostly Cloudy","icon":"partly-cloudy-night","precipIntensity":0,"precipProbability":0,"temperature":6.98,"apparentTemperature":4.07,"dewPoint":4.68,"humidity":0.85,"windSpeed":9.96,"windBearing":112,"visibility":10,"cloudCover":0.64,"pressure":1018.2,"ozone":328.47},{"time":1491184800,"summary":"Partly Cloudy","icon":"partly-cloudy-night","precipIntensity":0,"precipProbability":0,"temperature":7.07,"apparentTemperature":4.07,"dewPoint":5.09,"humidity":0.87,"windSpeed":10.51,"windBearing":113,"visibility":10,"cloudCover":0.59,"pressure":1018.03,"ozone":331.34},{"time":1491188400,"summary":"Partly Cloudy","icon":"partly-cloudy-night","precipIntensity":0,"precipProbability":0,"temperature":6.99,"apparentTemperature":3.86,"dewPoint":5.17,"humidity":0.88,"windSpeed":11.07,"windBearing":113,"visibility":10,"cloudCover":0.55,"pressure":1017.63,"ozone":333.32},{"time":1491192000,"summary":"Mostly Cloudy","icon":"partly-cloudy-night","precipIntensity":0,"precipProbability":0,"temperature":7.21,"apparentTemperature":4.02,"dewPoint":5.46,"humidity":0.89,"windSpeed":11.59,"windBearing":115,"visibility":10,"cloudCover":0.63,"pressure":1017.94,"ozone":333.7},{"time":1491195600,"summary":"Mostly Cloudy","icon":"partly-cloudy-night","precipIntensity":0,"precipProbability":0,"temperature":7.19,"apparentTemperature":3.9,"dewPoint":5.44,"humidity":0.89,"windSpeed":12.11,"windBearing":115,"visibility":10,"cloudCover":0.71,"pressure":1017.56,"ozone":333.2},{"time":1491199200,"summary":"Mostly Cloudy","icon":"partly-cloudy-day","precipIntensity":0,"precipProbability":0,"temperature":7.01,"apparentTemperature":3.62,"dewPoint":5.24,"humidity":0.89,"windSpeed":12.44,"windBearing":115,"visibility":10,"cloudCover":0.79,"pressure":1017.19,"ozone":332.84},{"time":1491202800,"summary":"Mostly Cloudy","icon":"partly-cloudy-day","precipIntensity":0,"precipProbability":0,"temperature":7.42,"apparentTemperature":4.07,"dewPoint":5.56,"humidity":0.88,"windSpeed":12.81,"windBearing":118,"visibility":10,"cloudCover":0.84,"pressure":1016.82,"ozone":333.03},{"time":1491206400,"summary":"Mostly Cloudy","icon":"partly-cloudy-day","precipIntensity":0,"precipProbability":0,"temperature":8.09,"apparentTemperature":4.83,"dewPoint":6,"humidity":0.87,"windSpeed":13.31,"windBearing":121,"visibility":10,"cloudCover":0.87,"pressure":1016.46,"ozone":333.36},{"time":1491210000,"summary":"Mostly Cloudy","icon":"partly-cloudy-day","precipIntensity":0,"precipProbability":0,"temperature":9.01,"apparentTemperature":5.94,"dewPoint":6.71,"humidity":0.86,"windSpeed":13.69,"windBearing":125,"visibility":10,"cloudCover":0.91,"pressure":1016.07,"ozone":333.7},{"time":1491213600,"summary":"Mostly Cloudy","icon":"partly-cloudy-day","precipIntensity":0,"precipProbability":0,"temperature":10.03,"apparentTemperature":10.03,"dewPoint":7.57,"humidity":0.85,"windSpeed":14.07,"windBearing":126,"visibility":10,"cloudCover":0.89,"pressure":1015.65,"ozone":334.05},{"time":1491217200,"summary":"Mostly Cloudy","icon":"partly-cloudy-day","precipIntensity":0.1016,"precipProbability":0.15,"precipType":"rain","temperature":11.18,"apparentTemperature":11.18,"dewPoint":8.51,"humidity":0.84,"windSpeed":14.44,"windBearing":127,"visibility":10,"cloudCover":0.88,"pressure":1015.21,"ozone":334.41},{"time":1491220800,"summary":"Light Rain","icon":"rain","precipIntensity":0.762,"precipProbability":0.66,"precipType":"rain","temperature":11.8,"apparentTemperature":11.8,"dewPoint":9.02,"humidity":0.83,"windSpeed":14.82,"windBearing":128,"visibility":10,"cloudCover":0.87,"pressure":1014.83,"ozone":334.6},{"time":1491224400,"summary":"Light Rain","icon":"rain","precipIntensity":0.8509,"precipProbability":0.68,"precipType":"rain","temperature":11.42,"apparentTemperature":11.42,"dewPoint":9.06,"humidity":0.85,"windSpeed":14.78,"windBearing":130,"visibility":10,"cloudCover":0.88,"pressure":1014.49,"ozone":334.38},{"time":1491228000,"summary":"Light Rain","icon":"rain","precipIntensity":0.6401,"precipProbability":0.64,"precipType":"rain","temperature":10.86,"apparentTemperature":10.86,"dewPoint":9.01,"humidity":0.88,"windSpeed":14.53,"windBearing":132,"visibility":8.56,"cloudCover":0.9,"pressure":1014.18,"ozone":333.98},{"time":1491231600,"summary":"Light Rain","icon":"rain","precipIntensity":0.8966,"precipProbability":0.68,"precipType":"rain","temperature":10.39,"apparentTemperature":10.39,"dewPoint":8.96,"humidity":0.91,"windSpeed":14.27,"windBearing":134,"visibility":5.93,"cloudCover":1,"pressure":1013.94,"ozone":333.99},{"time":1491235200,"summary":"Light Rain","icon":"rain","precipIntensity":0.795,"precipProbability":0.67,"precipType":"rain","temperature":10.06,"apparentTemperature":10.06,"dewPoint":8.79,"humidity":0.92,"windSpeed":13.71,"windBearing":143,"visibility":6.96,"cloudCover":1,"pressure":1013.79,"ozone":334.48},{"time":1491238800,"summary":"Light Rain","icon":"rain","precipIntensity":0.5842,"precipProbability":0.63,"precipType":"rain","temperature":9.77,"apparentTemperature":6.98,"dewPoint":8.63,"humidity":0.93,"windSpeed":13.14,"windBearing":149,"visibility":8.83,"cloudCover":1,"pressure":1013.75,"ozone":335.38},{"time":1491242400,"summary":"Light Rain","icon":"rain","precipIntensity":0.3759,"precipProbability":0.56,"precipType":"rain","temperature":9.49,"apparentTemperature":6.73,"dewPoint":8.48,"humidity":0.93,"windSpeed":12.55,"windBearing":153,"visibility":10,"cloudCover":0.98,"pressure":1013.83,"ozone":337.01},{"time":1491246000,"summary":"Light Rain","icon":"rain","precipIntensity":0.2489,"precipProbability":0.5,"precipType":"rain","temperature":9.33,"apparentTemperature":6.63,"dewPoint":8.39,"humidity":0.94,"windSpeed":11.84,"windBearing":157,"visibility":10,"cloudCover":0.91,"pressure":1013.98,"ozone":340.09},{"time":1491249600,"summary":"Drizzle","icon":"rain","precipIntensity":0.1295,"precipProbability":0.22,"precipType":"rain","temperature":9.2,"apparentTemperature":6.49,"dewPoint":8.36,"humidity":0.94,"windSpeed":11.74,"windBearing":173,"visibility":9.93,"cloudCover":0.82,"pressure":1014.25,"ozone":343.89},{"time":1491253200,"summary":"Mostly Cloudy","icon":"partly-cloudy-night","precipIntensity":0.0889,"precipProbability":0.12,"precipType":"rain","temperature":9.13,"apparentTemperature":6.52,"dewPoint":8.31,"humidity":0.95,"windSpeed":11.09,"windBearing":181,"visibility":9.48,"cloudCover":0.77,"pressure":1014.81,"ozone":346.64},{"time":1491256800,"summary":"Mostly Cloudy","icon":"partly-cloudy-night","precipIntensity":0.0762,"precipProbability":0.1,"precipType":"rain","temperature":8.82,"apparentTemperature":6.6,"dewPoint":7.81,"humidity":0.93,"windSpeed":8.73,"windBearing":208,"visibility":10,"cloudCover":0.8,"pressure":1015.75,"ozone":347.58},{"time":1491260400,"summary":"Mostly Cloudy","icon":"partly-cloudy-night","precipIntensity":0.0838,"precipProbability":0.11,"precipType":"rain","temperature":8.48,"apparentTemperature":5.87,"dewPoint":7.22,"humidity":0.92,"windSpeed":10.22,"windBearing":236,"visibility":10,"cloudCover":0.84,"pressure":1016.95,"ozone":347.45},{"time":1491264000,"summary":"Mostly Cloudy","icon":"partly-cloudy-night","precipIntensity":0.0864,"precipProbability":0.12,"precipType":"rain","temperature":8.1,"apparentTemperature":4.97,"dewPoint":6.56,"humidity":0.9,"windSpeed":12.6,"windBearing":254,"visibility":10,"cloudCover":0.85,"pressure":1018.21,"ozone":346.68},{"time":1491267600,"summary":"Mostly Cloudy","icon":"partly-cloudy-night","precipIntensity":0.066,"precipProbability":0.08,"precipType":"rain","temperature":7.55,"apparentTemperature":4.27,"dewPoint":5.4,"humidity":0.86,"windSpeed":12.61,"windBearing":262,"visibility":10,"cloudCover":0.66,"pressure":1019.47,"ozone":345.2},{"time":1491271200,"summary":"Partly Cloudy","icon":"partly-cloudy-night","precipIntensity":0.0406,"precipProbability":0.03,"precipType":"rain","temperature":6.95,"apparentTemperature":3.72,"dewPoint":4.14,"humidity":0.82,"windSpeed":11.45,"windBearing":266,"visibility":10,"cloudCover":0.43,"pressure":1020.75,"ozone":343.08},{"time":1491274800,"summary":"Partly Cloudy","icon":"partly-cloudy-night","precipIntensity":0.0203,"precipProbability":0.01,"precipType":"rain","temperature":6.37,"apparentTemperature":3.24,"dewPoint":2.97,"humidity":0.79,"windSpeed":10.22,"windBearing":267,"visibility":10,"cloudCover":0.25,"pressure":1021.96,"ozone":340.97},{"time":1491278400,"summary":"Partly Cloudy","icon":"partly-cloudy-night","precipIntensity":0,"precipProbability":0,"temperature":6.24,"apparentTemperature":3.29,"dewPoint":2.78,"humidity":0.78,"windSpeed":9.33,"windBearing":263,"visibility":10,"cloudCover":0.34,"pressure":1023.05,"ozone":338.81},{"time":1491282000,"summary":"Partly Cloudy","icon":"partly-cloudy-night","precipIntensity":0,"precipProbability":0,"temperature":6.12,"apparentTemperature":3.34,"dewPoint":2.68,"humidity":0.79,"windSpeed":8.5,"windBearing":255,"visibility":10,"cloudCover":0.45,"pressure":1024.04,"ozone":336.65},{"time":1491285600,"summary":"Partly Cloudy","icon":"partly-cloudy-day","precipIntensity":0,"precipProbability":0,"temperature":6.06,"apparentTemperature":3.36,"dewPoint":2.59,"humidity":0.78,"windSpeed":8.17,"windBearing":246,"visibility":10,"cloudCover":0.56,"pressure":1024.95,"ozone":335.37},{"time":1491289200,"summary":"Partly Cloudy","icon":"partly-cloudy-day","precipIntensity":0,"precipProbability":0,"temperature":6.84,"apparentTemperature":4.14,"dewPoint":2.96,"humidity":0.76,"windSpeed":8.9,"windBearing":246,"visibility":10,"cloudCover":0.58,"pressure":1025.82,"ozone":335.69},{"time":1491292800,"summary":"Partly Cloudy","icon":"partly-cloudy-day","precipIntensity":0,"precipProbability":0,"temperature":7.55,"apparentTemperature":4.77,"dewPoint":3.18,"humidity":0.74,"windSpeed":9.99,"windBearing":247,"visibility":10,"cloudCover":0.59,"pressure":1026.61,"ozone":336.89},{"time":1491296400,"summary":"Mostly Cloudy","icon":"partly-cloudy-day","precipIntensity":0,"precipProbability":0,"temperature":8.08,"apparentTemperature":5.23,"dewPoint":3.24,"humidity":0.72,"windSpeed":10.93,"windBearing":247,"visibility":10,"cloudCover":0.62,"pressure":1027.22,"ozone":337.67},{"time":1491300000,"summary":"Mostly Cloudy","icon":"partly-cloudy-day","precipIntensity":0,"precipProbability":0,"temperature":8.29,"apparentTemperature":5.36,"dewPoint":3.21,"humidity":0.7,"windSpeed":11.67,"windBearing":247,"visibility":10,"cloudCover":0.68,"pressure":1027.6,"ozone":337.24},{"time":1491303600,"summary":"Mostly Cloudy","icon":"partly-cloudy-day","precipIntensity":0,"precipProbability":0,"temperature":8.69,"apparentTemperature":5.76,"dewPoint":3.41,"humidity":0.69,"windSpeed":12.33,"windBearing":246,"visibility":10,"cloudCover":0.77,"pressure":1027.81,"ozone":336.4},{"time":1491307200,"summary":"Mostly Cloudy","icon":"partly-cloudy-day","precipIntensity":0,"precipProbability":0,"temperature":9.36,"apparentTemperature":6.5,"dewPoint":3.88,"humidity":0.69,"windSpeed":12.99,"windBearing":246,"visibility":10,"cloudCover":0.83,"pressure":1027.97,"ozone":336.2},{"time":1491310800,"summary":"Mostly Cloudy","icon":"partly-cloudy-day","precipIntensity":0,"precipProbability":0,"temperature":10.12,"apparentTemperature":10.12,"dewPoint":4.65,"humidity":0.69,"windSpeed":13.35,"windBearing":245,"visibility":10,"cloudCover":0.8,"pressure":1028.09,"ozone":337.63},{"time":1491314400,"summary":"Mostly Cloudy","icon":"partly-cloudy-day","precipIntensity":0,"precipProbability":0,"temperature":10.88,"apparentTemperature":10.88,"dewPoint":5.46,"humidity":0.69,"windSpeed":13.72,"windBearing":245,"visibility":10,"cloudCover":0.73,"pressure":1028.16,"ozone":339.7},{"time":1491318000,"summary":"Mostly Cloudy","icon":"partly-cloudy-day","precipIntensity":0,"precipProbability":0,"temperature":11.3,"apparentTemperature":11.3,"dewPoint":6,"humidity":0.7,"windSpeed":14.01,"windBearing":245,"visibility":10,"cloudCover":0.69,"pressure":1028.2,"ozone":340.58},{"time":1491321600,"summary":"Mostly Cloudy","icon":"partly-cloudy-day","precipIntensity":0,"precipProbability":0,"temperature":11.04,"apparentTemperature":11.04,"dewPoint":6.11,"humidity":0.72,"windSpeed":14.11,"windBearing":245,"visibility":10,"cloudCover":0.65,"pressure":1028.2,"ozone":339.03},{"time":1491325200,"summary":"Mostly Cloudy","icon":"partly-cloudy-day","precipIntensity":0,"precipProbability":0,"temperature":10.58,"apparentTemperature":10.58,"dewPoint":6.07,"humidity":0.74,"windSpeed":14.13,"windBearing":245,"visibility":10,"cloudCover":0.62,"pressure":1028.18,"ozone":336.29},{"time":1491328800,"summary":"Mostly Cloudy","icon":"partly-cloudy-day","precipIntensity":0,"precipProbability":0,"temperature":9.99,"apparentTemperature":7.13,"dewPoint":5.87,"humidity":0.76,"windSpeed":14.09,"windBearing":246,"visibility":10,"cloudCover":0.61,"pressure":1028.18,"ozone":334.21},{"time":1491332400,"summary":"Mostly Cloudy","icon":"partly-cloudy-night","precipIntensity":0,"precipProbability":0,"temperature":9.43,"apparentTemperature":6.44,"dewPoint":5.61,"humidity":0.77,"windSpeed":13.98,"windBearing":247,"visibility":10,"cloudCover":0.67,"pressure":1028.28,"ozone":333.6},{"time":1491336000,"summary":"Mostly Cloudy","icon":"partly-cloudy-night","precipIntensity":0,"precipProbability":0,"temperature":8.94,"apparentTemperature":5.82,"dewPoint":5.39,"humidity":0.78,"windSpeed":13.9,"windBearing":248,"visibility":10,"cloudCover":0.76,"pressure":1028.4,"ozone":333.66},{"time":1491339600,"summary":"Mostly Cloudy","icon":"partly-cloudy-night","precipIntensity":0,"precipProbability":0,"temperature":8.43,"apparentTemperature":5.19,"dewPoint":5.14,"humidity":0.8,"windSpeed":13.82,"windBearing":250,"visibility":10,"cloudCover":0.85,"pressure":1028.44,"ozone":333.73},{"time":1491343200,"summary":"Mostly Cloudy","icon":"partly-cloudy-night","precipIntensity":0,"precipProbability":0,"temperature":8.01,"apparentTemperature":4.6,"dewPoint":4.61,"humidity":0.79,"windSpeed":14.14,"windBearing":255,"visibility":10,"cloudCover":0.87,"pressure":1028.33,"ozone":333.79}]},"daily":{"summary":"Light rain tomorrow and Sunday, with temperatures peaking at 12°C on Wednesday.","icon":"rain","data":[{"time":1491087600,"summary":"Partly cloudy until afternoon.","icon":"partly-cloudy-day","sunriseTime":1491112028,"sunsetTime":1491159524,"moonPhase":0.2,"precipIntensity":0,"precipIntensityMax":0,"precipProbability":0,"temperatureMin":4.34,"temperatureMinTime":1491112800,"temperatureMax":11.51,"temperatureMaxTime":1491141600,"apparentTemperatureMin":3.12,"apparentTemperatureMinTime":1491105600,"apparentTemperatureMax":11.51,"apparentTemperatureMaxTime":1491141600,"dewPoint":4.3,"humidity":0.79,"windSpeed":3.7,"windBearing":172,"visibility":10,"cloudCover":0.25,"pressure":1016.79,"ozone":337.46},{"time":1491174000,"summary":"Light rain starting in the afternoon, continuing until evening.","icon":"rain","sunriseTime":1491198270,"sunsetTime":1491246045,"moonPhase":0.24,"precipIntensity":0.2311,"precipIntensityMax":0.8966,"precipIntensityMaxTime":1491231600,"precipProbability":0.68,"precipType":"rain","temperatureMin":6.75,"temperatureMinTime":1491174000,"temperatureMax":11.8,"temperatureMaxTime":1491220800,"apparentTemperatureMin":3.62,"apparentTemperatureMinTime":1491199200,"apparentTemperatureMax":11.8,"apparentTemperatureMaxTime":1491220800,"dewPoint":7.01,"humidity":0.88,"windSpeed":11.41,"windBearing":132,"visibility":10,"cloudCover":0.81,"pressure":1015.77,"ozone":334.71},{"time":1491260400,"summary":"Mostly cloudy throughout the day.","icon":"partly-cloudy-day","sunriseTime":1491284513,"sunsetTime":1491332566,"moonPhase":0.27,"precipIntensity":0.0178,"precipIntensityMax":0.0864,"precipIntensityMaxTime":1491264000,"precipProbability":0.12,"precipType":"rain","temperatureMin":6.06,"temperatureMinTime":1491285600,"temperatureMax":11.3,"temperatureMaxTime":1491318000,"apparentTemperatureMin":3.24,"apparentTemperatureMinTime":1491274800,"apparentTemperatureMax":11.3,"apparentTemperatureMaxTime":1491318000,"dewPoint":4.54,"humidity":0.77,"windSpeed":11.95,"windBearing":250,"visibility":10,"cloudCover":0.65,"pressure":1025.62,"ozone":338.19},{"time":1491346800,"summary":"Mostly cloudy throughout the day.","icon":"partly-cloudy-day","sunriseTime":1491370756,"sunsetTime":1491419088,"moonPhase":0.31,"precipIntensity":0,"precipIntensityMax":0,"precipProbability":0,"temperatureMin":6.56,"temperatureMinTime":1491361200,"temperatureMax":12.24,"temperatureMaxTime":1491400800,"apparentTemperatureMin":2.77,"apparentTemperatureMinTime":1491361200,"apparentTemperatureMax":12.24,"apparentTemperatureMaxTime":1491400800,"dewPoint":4.87,"humidity":0.77,"windSpeed":12.01,"windBearing":279,"visibility":10,"cloudCover":0.76,"pressure":1030.83,"ozone":324.18},{"time":1491433200,"summary":"Mostly cloudy throughout the day.","icon":"partly-cloudy-day","sunriseTime":1491457000,"sunsetTime":1491505609,"moonPhase":0.35,"precipIntensity":0.0127,"precipIntensityMax":0.0279,"precipIntensityMaxTime":1491494400,"precipProbability":0.01,"precipType":"rain","temperatureMin":5.75,"temperatureMinTime":1491516000,"temperatureMax":11.07,"temperatureMaxTime":1491483600,"apparentTemperatureMin":2.55,"apparentTemperatureMinTime":1491516000,"apparentTemperatureMax":11.07,"apparentTemperatureMaxTime":1491483600,"dewPoint":6.07,"humidity":0.87,"windSpeed":9.68,"windBearing":266,"visibility":10,"cloudCover":0.82,"pressure":1030.17,"ozone":295.29},{"time":1491519600,"summary":"Mostly cloudy throughout the day.","icon":"partly-cloudy-day","sunriseTime":1491543244,"sunsetTime":1491592130,"moonPhase":0.38,"precipIntensity":0.0203,"precipIntensityMax":0.0305,"precipIntensityMaxTime":1491570000,"precipProbability":0.02,"precipType":"rain","temperatureMin":3.92,"temperatureMinTime":1491602400,"temperatureMax":10.53,"temperatureMaxTime":1491573600,"apparentTemperatureMin":0.71,"apparentTemperatureMinTime":1491537600,"apparentTemperatureMax":10.53,"apparentTemperatureMaxTime":1491573600,"dewPoint":4.53,"humidity":0.85,"windSpeed":11.91,"windBearing":259,"visibility":8.95,"cloudCover":0.85,"pressure":1023.4,"ozone":302.23},{"time":1491606000,"summary":"Mostly cloudy throughout the day.","icon":"partly-cloudy-day","sunriseTime":1491629489,"sunsetTime":1491678652,"moonPhase":0.41,"precipIntensity":0.0229,"precipIntensityMax":0.0457,"precipIntensityMaxTime":1491656400,"precipProbability":0.04,"precipType":"rain","temperatureMin":2.07,"temperatureMinTime":1491613200,"temperatureMax":11.38,"temperatureMaxTime":1491660000,"apparentTemperatureMin":-0.49,"apparentTemperatureMinTime":1491616800,"apparentTemperatureMax":11.38,"apparentTemperatureMaxTime":1491660000,"dewPoint":4.07,"humidity":0.85,"windSpeed":3.04,"windBearing":228,"cloudCover":0.71,"pressure":1020.17,"ozone":320.64},{"time":1491692400,"summary":"Light rain starting in the afternoon.","icon":"rain","sunriseTime":1491715734,"sunsetTime":1491765174,"moonPhase":0.45,"precipIntensity":0.1092,"precipIntensityMax":0.2972,"precipIntensityMaxTime":1491760800,"precipProbability":0.53,"precipType":"rain","temperatureMin":2.34,"temperatureMinTime":1491706800,"temperatureMax":11.86,"temperatureMaxTime":1491750000,"apparentTemperatureMin":0.42,"apparentTemperatureMinTime":1491706800,"apparentTemperatureMax":11.86,"apparentTemperatureMaxTime":1491750000,"dewPoint":5.39,"humidity":0.91,"windSpeed":4.39,"windBearing":84,"cloudCover":0.95,"pressure":1015.62,"ozone":336.98}]},"flags":{"sources":["datapoint","gfs","cmc","nam","rap","sref","fnmoc","isd","madis","nearest-precip","metwarn","darksky"],"datapoint-stations":["uk-301777","uk-3134","uk-322052","uk-322595","uk-322659","uk-350056","uk-351269","uk-351289","uk-351397","uk-351465","uk-352102","uk-352379","uk-352954","uk-354999","uk-371524","uk-371606"],"isd-stations":["031070-99999","031160-99999","031200-99999","031290-99999","031330-99999","031340-99999","031350-99999","031360-99999","031380-99999","031390-99999","031400-99999","031430-99999","031450-99999","031480-99999","031490-99999","031520-99999"],"madis-stations":["AU945","C9560","C9739","D4018","E0915","E3381","EGPF","EGPK","MZIU7"],"units":"uk2"}}},"history":["On 2 April 1593, the College of New Aberdeen was founded.","The college was founded by the Earl Marischal of Scotland, George Keith of Inverugie, and became known as Marischal College. The site of the College was formerly occupied by a Franciscan Priory which was disestablished during the Reformation of 1560. Marischal College was the second university in Aberdeen, following the foundation of King's College in 1495 by Bishop William Elphinstone. The two universities were united in 1860 as the University of Aberdeen.","Today also saw the birth, in 1688 of John Smibbert, the Scottish-born American painter and architect who was noted for his portraits of American colonials.","Jack Buchanan, the film actor, producer and singer, was born this day in 1890. His films include, Monte Carlo, The Band Wagon and Yes, Mr.Brown.","Today' s recipe: a Spanish breakfast dish with a fruity accompaniment. Torrija, apricot and almond ","Microsoft Corporation announces the Z80 SoftCard--their first and (for many years) only hardware product--a microprocessor on a printed circuit board that plugged into the Apple II personal computer. It retailed for $349.00. The SoftCard allowed programs running under the CP/M operating system (included with the card, as was Microsoft BASIC) to run on the 6502-based Apple II with only minor modifications. In particular, the word processor WordStar was so popular that people bought the SoftCard and a companion \"80-column card\" just to run it. At one time, SoftCard brought in about half of Microsoft's total revenue. It was discontinued in 1986."],"today":"Sunday April 02, 2017 - The 91st day of 2017, and there are 273 days until the end of the year","tv":{"entries":[{"summary":"Rick and Morty 3x1 - The Rickshank Redemption","dtstart":"2017-04-02T03:30:00.000Z","dtend":"2017-04-02T04:00:00.000Z","description":"Coming Soon...","timeStart":"4:30:00","timeEnd":"5:00:00","duration":"30 minutes","combined":"4:30:00 - Rick and Morty 3x1 - The Rickshank Redemption, 30 minutes","recur":null,"long":"Sunday, 4:30:00 - ","longcombined":"Sunday, 4:30:00 - Rick and Morty 3x1 - The Rickshank Redemption, 30 minutes"}]},"cal":{"today":[{"summary":"Alans wedding","dtstart":"2017-04-01T23:00:00.809Z","dtend":"2017-04-02T23:00:00.809Z","description":"","timeStart":"0:00:00","timeEnd":"0:00:00","duration":"1 day","combined":"0:00:00 - Alans wedding, 1 day","recur":"FREQ=YEARLY","long":"Sunday, 0:00:00 - ","longcombined":"Sunday, 0:00:00 - Alans wedding, 1 day"}],"tomorrow":[{"summary":"Glasgow\\, United Kingdom\\, April 2017","dtstart":"2017-04-02T23:00:00.000Z","dtend":"2017-04-03T23:00:00.000Z","description":"Martin Donnelly is in Glasgow\\, United Kingdom from Apr 3\\, 20","timeStart":"0:00:00","timeEnd":"0:00:00","duration":"1 day","combined":"0:00:00 - Glasgow\\, United Kingdom\\, April 2017, 1 day","recur":null,"long":"Monday, 0:00:00 - ","longcombined":"Monday, 0:00:00 - Glasgow\\, United Kingdom\\, April 2017, 1 day"},{"summary":"SCOTRAIL - Dumbarton East to Glasgow Queen Street","dtstart":"2017-04-03T06:28:00.000Z","dtend":"2017-04-03T07:04:00.000Z","description":"View and/or edit details in TripIt : https://www.tripit.com/tr","timeStart":"7:28:00","timeEnd":"8:04:00","duration":"36 minutes","combined":"7:28:00 - SCOTRAIL - Dumbarton East to Glasgow Queen Street, 36 minutes","recur":null,"long":"Monday, 7:28:00 - ","longcombined":"Monday, 7:28:00 - SCOTRAIL - Dumbarton East to Glasgow Queen Street, 36 minutes"},{"summary":"SCOTRAIL - Glasgow Queen Street to Haymarket (Edinburgh)","dtstart":"2017-04-03T07:15:00.000Z","dtend":"2017-04-03T08:04:00.000Z","description":"View and/or edit details in TripIt : https://www.tripit.com/tr","timeStart":"8:15:00","timeEnd":"9:04:00","duration":"49 minutes","combined":"8:15:00 - SCOTRAIL - Glasgow Queen Street to Haymarket (Edinburgh), 49 minutes","recur":null,"long":"Monday, 8:15:00 - ","longcombined":"Monday, 8:15:00 - SCOTRAIL - Glasgow Queen Street to Haymarket (Edinburgh), 49 minutes"}],"week":[{"summary":"Update Timesheet","dtstart":"2017-04-07T14:30:00.938Z","dtend":"2017-04-07T15:30:00.938Z","description":"Update the timesheet using https://outsauce.backofficeportal.co","timeStart":"15:30:00","timeEnd":"16:30:00","duration":"1 hour","combined":"15:30:00 - Update Timesheet, 1 hour","recur":"FREQ=WEEKLY;COUNT=15;BYDAY=FR","long":"Friday, 15:30:00 - ","longcombined":"Friday, 15:30:00 - Update Timesheet, 1 hour"}]},"swedish":{"xml":{"$":{"xmlns:wotd":"http://www.transparent.com/word-of-the-day/"},"words":{"date":"04-02-2017","langname":"Swedish","wordtype":"verb","word":"att upprepa","wordsound":"http://wotd.transparent.com/swedish/level-1/sound/00397_WOTD_Swedish_Words.mp3","translation":"to repeat","fnphrase":"Jag förstår inte. Kan du upprepa det?","phrasesound":"http://wotd.transparent.com/swedish/level-1/sound/00397_WOTD_Swedish_Sentences.mp3","enphrase":"I don't understand. Can you repeat that?","wotd:transliteratedWord":"","wotd:transliteratedSentence":"","notes":""}}},"fitbit":{},"ftse":[{"name":"ITV Plc","price":"218.90","change_amount":"+7.50","change_percent":"+3.55%"},{"name":"Land Securities Group Plc","price":"1,059.00","change_amount":"+32.00","change_percent":"+3.12%"},{"name":"British Land Co Plc","price":"610.00","change_amount":"+17.50","change_percent":"+2.95%"},{"name":"Intu Properties Plc","price":"279.20","change_amount":"+7.30","change_percent":"+2.68%"},{"name":"Pearson Plc","price":"682.50","change_amount":"+14.50","change_percent":"+2.17%"},{"name":"ConvaTec Group Plc","price":"279.00","change_amount":"+5.80","change_percent":"+2.12%"},{"name":"Provident Financial Plc","price":"2,997.00","change_amount":"+60.00","change_percent":"+2.04%"},{"name":"easyJet Plc","price":"1,026.00","change_amount":"+19.00","change_percent":"+1.89%"},{"name":"Direct Line Insurance Group Plc","price":"347.40","change_amount":"+6.40","change_percent":"+1.88%"},{"name":"Hammerson","price":"571.00","change_amount":"+10.00","change_percent":"+1.78%"}],"quotes":{"quote":"The full use of your powers along lines of excellence.","author":"Definition of 'happiness' by J","category":"Famous"}},"expire":3600000,"date":{"year":2017,"month":4,"day":2}}
+{"last":1491390962956,"data":{"trains":{"last":"2017-04-05T11:15:23.872Z","data":[{"title":"Alterations to services between Glasgow Queen Street and Mallaig","description":"Due to a landslip between Possilpark & Parkhouse and Gilshochill the line is closed. Disruption is expected until the end of the day on 11/04/17. Train services between Glasgow Queen Street and Mallaig will be terminated at and started back from Crianlarich. Ardlui, Arrochar & Tarbet, Garelochhead, Helensburgh Upper, Dumbarton Central and Glasgow Queen Street will not be served. Customer Advice: Buses will run in place of trains between Glasgow Queen Street and Crianlarich from today, Wednesday 5th April. Buses will depart earlier than the scheduled train time by up to 20 minutes. Passengers wishing to travel from Glasgow Queen Street to intermediate stops between Glasgow and Crianlarich, please board a train service to Dalmuir for a replacement bus service which will call all stops to Crianlarich. The following train services will connect into buses at Dalmuir calling at Dumbarton Central, Helensburgh Upper, Garelochead, Arrochar and Tarbet, Ardlui and Crianlarich. 0731 from Queen Street Low Level to Dalmuir will connect in with the 0815 bus. 0936 from Queen Street Low Level to Dalmuir will connect in with the 1030 bus. 1136 from Queen Street Low Level to Dalmuir will connect in with the 1218 bus. 1536 from Queen Street Low Level to Dalmuir to connect in with the 1630 bus. 1731 from Queen Street Low Level to Dalmuir to connect in with the 1810 bus. Please note journey times will be extended. There has been a landslip onto the track between Gilshochill and Possilpark & Parkhouse and as a result, the line is closed until further notice. Staff have been working hard on site to assess the damage and the initial estimate for the line to be reopened is 7 days - start of service Wednesday 12th April. As this is an estimate it may be revised so please check here for updates. For live journey updates download the free ScotRail App or check our website at http://www.journeycheck.com/ScotRail. You can also tweet and follow us @ScotRail"},{"title":"Alterations to services between Glasgow Queen Street and Oban","description":"Due to a landslip between Possilpark & Parkhouse and Gilshochill the line is closed. Disruption is expected until the end of the day on 11/04/17. Train services between Glasgow Queen Street and Oban will be terminated at and started back from Crianlarich. Ardlui, Arrochar & Tarbet, Garelochhead, Helensburgh Upper, Dumbarton Central and Glasgow Queen Street will not be served. Customer Advice: Buses will run in place of trains between Glasgow Queen Street and Crianlarich from today, Wednesday 5th April. Buses will depart earlier than the scheduled train time by up to 20 minutes. Passengers wishing to travel from Glasgow Queen Street to intermediate stops between Glasgow and Crianlarich, please board a train service to Dalmuir for a replacement bus service which will call all stops to Crianlarich. The following train services will connect into buses at Dalmuir calling at Dumbarton Central, Helensburgh Upper, Garelochead, Arrochar and Tarbet, Ardlui and Crianlarich. 0731 from Queen Street Low Level to Dalmuir will connect in with the 0815 bus. 0936 from Queen Street Low Level to Dalmuir will connect in with the 1030 bus. 1136 from Queen Street Low Level to Dalmuir will connect in with the 1218 bus. 1536 from Queen Street Low Level to Dalmuir to connect in with the 1630 bus. 1731 from Queen Street Low Level to Dalmuir to connect in with the 1810 bus. Please note journey times will be extended. There has been a landslip onto the track between Gilshochill and Possilpark & Parkhouse and as a result, the line is closed until further notice. Staff have been working hard on site to assess the damage and the initial estimate for the line to be reopened is 7 days - start of service Wednesday 12th April. As this is an estimate it may be revised so please check here for updates. For live journey updates download the free ScotRail App or check our website at http://www.journeycheck.com/ScotRail. You can also tweet and follow us @ScotRail"},{"title":"Alterations to services between Glasgow Queen Street and Fort William","description":"Due to a landslip between Possilpark & Parkhouse and Gilshochill the line is closed. Disruption is expected until the end of the day on 11/04/17. Train services between Glasgow Queen Street and Fort William will be terminated at and started back from Crianlarich. Ardlui, Arrochar & Tarbet, Garelochhead, Helensburgh Upper, Dumbarton Central and Glasgow Queen Street will not be served. Customer Advice: Buses will run in place of trains between Glasgow Queen Street and Crianlarich from today, Wednesday 5th April. Buses will depart earlier than the scheduled train time by up to 20 minutes. Passengers wishing to travel from Glasgow Queen Street to intermediate stops between Glasgow and Crianlarich, please board a train service to Dalmuir for a replacement bus service which will call all stops to Crianlarich. The following train services will connect into buses at Dalmuir calling at Dumbarton Central, Helensburgh Upper, Garelochead, Arrochar and Tarbet, Ardlui and Crianlarich. 0731 from Queen Street Low Level to Dalmuir will connect in with the 0815 bus. 0936 from Queen Street Low Level to Dalmuir will connect in with the 1030 bus. 1136 from Queen Street Low Level to Dalmuir will connect in with the 1218 bus. 1536 from Queen Street Low Level to Dalmuir to connect in with the 1630 bus. 1731 from Queen Street Low Level to Dalmuir to connect in with the 1810 bus. Please note journey times will be extended. There has been a landslip onto the track between Gilshochill and Possilpark & Parkhouse and as a result, the line is closed until further notice. Staff have been working hard on site to assess the damage and the initial estimate for the line to be reopened is 7 days - start of service Wednesday 12th April. As this is an estimate it may be revised so please check here for updates. For live journey updates download the free ScotRail App or check our website at http://www.journeycheck.com/ScotRail. You can also tweet and follow us @ScotRail"}]},"weather":{"currently":"Mostly Cloudy. Around 7 to 11 degrees.","today":"Mostly cloudy throughout the day.","later":"Mixed precipitation tomorrow through Wednesday, with temperatures peaking at 13°C on Saturday.","alerts":{},"data":{"latitude":55.95,"longitude":-4.566667,"timezone":"Europe/London","offset":1,"currently":{"time":1491390924,"summary":"Mostly Cloudy","icon":"partly-cloudy-day","nearestStormDistance":16,"nearestStormBearing":308,"precipIntensity":0,"precipProbability":0,"temperature":8.88,"apparentTemperature":6.19,"dewPoint":4.81,"humidity":0.76,"windSpeed":11.15,"windBearing":257,"visibility":10,"cloudCover":0.9,"pressure":1031.94,"ozone":319.9},"minutely":{"summary":"Mostly cloudy for the hour.","icon":"partly-cloudy-day","data":[{"time":1491390900,"precipIntensity":0,"precipProbability":0},{"time":1491390960,"precipIntensity":0,"precipProbability":0},{"time":1491391020,"precipIntensity":0,"precipProbability":0},{"time":1491391080,"precipIntensity":0,"precipProbability":0},{"time":1491391140,"precipIntensity":0,"precipProbability":0},{"time":1491391200,"precipIntensity":0,"precipProbability":0},{"time":1491391260,"precipIntensity":0,"precipProbability":0},{"time":1491391320,"precipIntensity":0,"precipProbability":0},{"time":1491391380,"precipIntensity":0,"precipProbability":0},{"time":1491391440,"precipIntensity":0,"precipProbability":0},{"time":1491391500,"precipIntensity":0,"precipProbability":0},{"time":1491391560,"precipIntensity":0,"precipProbability":0},{"time":1491391620,"precipIntensity":0,"precipProbability":0},{"time":1491391680,"precipIntensity":0,"precipProbability":0},{"time":1491391740,"precipIntensity":0,"precipProbability":0},{"time":1491391800,"precipIntensity":0,"precipProbability":0},{"time":1491391860,"precipIntensity":0,"precipProbability":0},{"time":1491391920,"precipIntensity":0,"precipProbability":0},{"time":1491391980,"precipIntensity":0,"precipProbability":0},{"time":1491392040,"precipIntensity":0,"precipProbability":0},{"time":1491392100,"precipIntensity":0,"precipProbability":0},{"time":1491392160,"precipIntensity":0,"precipProbability":0},{"time":1491392220,"precipIntensity":0,"precipProbability":0},{"time":1491392280,"precipIntensity":0,"precipProbability":0},{"time":1491392340,"precipIntensity":0,"precipProbability":0},{"time":1491392400,"precipIntensity":0,"precipProbability":0},{"time":1491392460,"precipIntensity":0,"precipProbability":0},{"time":1491392520,"precipIntensity":0,"precipProbability":0},{"time":1491392580,"precipIntensity":0,"precipProbability":0},{"time":1491392640,"precipIntensity":0,"precipProbability":0},{"time":1491392700,"precipIntensity":0,"precipProbability":0},{"time":1491392760,"precipIntensity":0,"precipProbability":0},{"time":1491392820,"precipIntensity":0,"precipProbability":0},{"time":1491392880,"precipIntensity":0,"precipProbability":0},{"time":1491392940,"precipIntensity":0,"precipProbability":0},{"time":1491393000,"precipIntensity":0,"precipProbability":0},{"time":1491393060,"precipIntensity":0,"precipProbability":0},{"time":1491393120,"precipIntensity":0,"precipProbability":0},{"time":1491393180,"precipIntensity":0,"precipProbability":0},{"time":1491393240,"precipIntensity":0,"precipProbability":0},{"time":1491393300,"precipIntensity":0,"precipProbability":0},{"time":1491393360,"precipIntensity":0,"precipProbability":0},{"time":1491393420,"precipIntensity":0,"precipProbability":0},{"time":1491393480,"precipIntensity":0,"precipProbability":0},{"time":1491393540,"precipIntensity":0,"precipProbability":0},{"time":1491393600,"precipIntensity":0,"precipProbability":0},{"time":1491393660,"precipIntensity":0,"precipProbability":0},{"time":1491393720,"precipIntensity":0,"precipProbability":0},{"time":1491393780,"precipIntensity":0,"precipProbability":0},{"time":1491393840,"precipIntensity":0,"precipProbability":0},{"time":1491393900,"precipIntensity":0,"precipProbability":0},{"time":1491393960,"precipIntensity":0,"precipProbability":0},{"time":1491394020,"precipIntensity":0,"precipProbability":0},{"time":1491394080,"precipIntensity":0,"precipProbability":0},{"time":1491394140,"precipIntensity":0,"precipProbability":0},{"time":1491394200,"precipIntensity":0,"precipProbability":0},{"time":1491394260,"precipIntensity":0,"precipProbability":0},{"time":1491394320,"precipIntensity":0,"precipProbability":0},{"time":1491394380,"precipIntensity":0,"precipProbability":0},{"time":1491394440,"precipIntensity":0,"precipProbability":0},{"time":1491394500,"precipIntensity":0,"precipProbability":0}]},"hourly":{"summary":"Drizzle tomorrow morning.","icon":"rain","data":[{"time":1491390000,"summary":"Mostly Cloudy","icon":"partly-cloudy-day","precipIntensity":0,"precipProbability":0,"temperature":8.88,"apparentTemperature":6.19,"dewPoint":4.69,"humidity":0.75,"windSpeed":11.11,"windBearing":257,"visibility":10,"cloudCover":0.93,"pressure":1031.91,"ozone":320.3},{"time":1491393600,"summary":"Mostly Cloudy","icon":"partly-cloudy-day","precipIntensity":0,"precipProbability":0,"temperature":9.62,"apparentTemperature":7.1,"dewPoint":5.88,"humidity":0.77,"windSpeed":11.28,"windBearing":257,"visibility":10,"cloudCover":0.83,"pressure":1032.01,"ozone":318.75},{"time":1491397200,"summary":"Mostly Cloudy","icon":"partly-cloudy-day","precipIntensity":0,"precipProbability":0,"temperature":10.46,"apparentTemperature":10.46,"dewPoint":6.62,"humidity":0.77,"windSpeed":11.2,"windBearing":257,"visibility":10,"cloudCover":0.81,"pressure":1032.09,"ozone":317.54},{"time":1491400800,"summary":"Mostly Cloudy","icon":"partly-cloudy-day","precipIntensity":0,"precipProbability":0,"temperature":11.34,"apparentTemperature":11.34,"dewPoint":7.43,"humidity":0.77,"windSpeed":11.25,"windBearing":259,"visibility":10,"cloudCover":0.77,"pressure":1032.15,"ozone":316.55},{"time":1491404400,"summary":"Mostly Cloudy","icon":"partly-cloudy-day","precipIntensity":0,"precipProbability":0,"temperature":11.37,"apparentTemperature":11.37,"dewPoint":7.42,"humidity":0.77,"windSpeed":10.94,"windBearing":261,"visibility":10,"cloudCover":0.74,"pressure":1032.23,"ozone":315.58},{"time":1491408000,"summary":"Mostly Cloudy","icon":"partly-cloudy-day","precipIntensity":0,"precipProbability":0,"temperature":10.58,"apparentTemperature":10.58,"dewPoint":6.86,"humidity":0.78,"windSpeed":10.28,"windBearing":261,"visibility":10,"cloudCover":0.69,"pressure":1032.39,"ozone":314.64},{"time":1491411600,"summary":"Mostly Cloudy","icon":"partly-cloudy-day","precipIntensity":0,"precipProbability":0,"temperature":9.47,"apparentTemperature":7.25,"dewPoint":6,"humidity":0.79,"windSpeed":9.44,"windBearing":261,"visibility":10,"cloudCover":0.63,"pressure":1032.56,"ozone":313.73},{"time":1491415200,"summary":"Mostly Cloudy","icon":"partly-cloudy-day","precipIntensity":0,"precipProbability":0,"temperature":8.59,"apparentTemperature":6.41,"dewPoint":5.43,"humidity":0.8,"windSpeed":8.35,"windBearing":262,"visibility":10,"cloudCover":0.6,"pressure":1032.74,"ozone":312.64},{"time":1491418800,"summary":"Partly Cloudy","icon":"partly-cloudy-night","precipIntensity":0,"precipProbability":0,"temperature":8.17,"apparentTemperature":6.05,"dewPoint":5.53,"humidity":0.83,"windSpeed":7.66,"windBearing":258,"visibility":10,"cloudCover":0.56,"pressure":1032.91,"ozone":311.2},{"time":1491422400,"summary":"Partly Cloudy","icon":"partly-cloudy-night","precipIntensity":0,"precipProbability":0,"temperature":7.94,"apparentTemperature":5.99,"dewPoint":5.77,"humidity":0.86,"windSpeed":6.92,"windBearing":252,"visibility":10,"cloudCover":0.51,"pressure":1033.09,"ozone":309.58},{"time":1491426000,"summary":"Partly Cloudy","icon":"partly-cloudy-night","precipIntensity":0,"precipProbability":0,"temperature":7.93,"apparentTemperature":6.18,"dewPoint":6.16,"humidity":0.89,"windSpeed":6.16,"windBearing":244,"visibility":10,"cloudCover":0.49,"pressure":1033.2,"ozone":308.08},{"time":1491429600,"summary":"Partly Cloudy","icon":"partly-cloudy-night","precipIntensity":0,"precipProbability":0,"temperature":7.68,"apparentTemperature":6.08,"dewPoint":6.24,"humidity":0.91,"windSpeed":5.57,"windBearing":237,"visibility":10,"cloudCover":0.52,"pressure":1033.24,"ozone":306.77},{"time":1491433200,"summary":"Partly Cloudy","icon":"partly-cloudy-night","precipIntensity":0,"precipProbability":0,"temperature":6.76,"apparentTemperature":5.14,"dewPoint":5.55,"humidity":0.92,"windSpeed":5.19,"windBearing":230,"visibility":10,"cloudCover":0.56,"pressure":1033.2,"ozone":305.57},{"time":1491436800,"summary":"Mostly Cloudy","icon":"partly-cloudy-night","precipIntensity":0,"precipProbability":0,"temperature":7.05,"apparentTemperature":5.64,"dewPoint":6.08,"humidity":0.94,"windSpeed":4.76,"windBearing":224,"visibility":10,"cloudCover":0.62,"pressure":1033.08,"ozone":304.57},{"time":1491440400,"summary":"Mostly Cloudy","icon":"partly-cloudy-night","precipIntensity":0,"precipProbability":0,"temperature":7.4,"apparentTemperature":5.98,"dewPoint":6.46,"humidity":0.94,"windSpeed":4.93,"windBearing":221,"visibility":10,"cloudCover":0.71,"pressure":1032.81,"ozone":303.85},{"time":1491444000,"summary":"Mostly Cloudy","icon":"partly-cloudy-night","precipIntensity":0,"precipProbability":0,"temperature":7.53,"apparentTemperature":6.07,"dewPoint":6.63,"humidity":0.94,"windSpeed":5.14,"windBearing":219,"visibility":9.85,"cloudCover":0.8,"pressure":1032.46,"ozone":303.33},{"time":1491447600,"summary":"Mostly Cloudy","icon":"partly-cloudy-night","precipIntensity":0,"precipProbability":0,"temperature":7.49,"apparentTemperature":5.88,"dewPoint":6.61,"humidity":0.94,"windSpeed":5.52,"windBearing":219,"visibility":9.48,"cloudCover":0.88,"pressure":1032.14,"ozone":302.8},{"time":1491451200,"summary":"Mostly Cloudy","icon":"partly-cloudy-night","precipIntensity":0,"precipProbability":0,"temperature":7.43,"apparentTemperature":5.72,"dewPoint":6.52,"humidity":0.94,"windSpeed":5.79,"windBearing":222,"visibility":10,"cloudCover":0.9,"pressure":1031.94,"ozone":302.34},{"time":1491454800,"summary":"Mostly Cloudy","icon":"partly-cloudy-night","precipIntensity":0,"precipProbability":0,"temperature":7.32,"apparentTemperature":5.44,"dewPoint":6.37,"humidity":0.94,"windSpeed":6.21,"windBearing":224,"visibility":10,"cloudCover":0.91,"pressure":1031.79,"ozone":301.87},{"time":1491458400,"summary":"Mostly Cloudy","icon":"partly-cloudy-day","precipIntensity":0,"precipProbability":0,"temperature":7.24,"apparentTemperature":5.21,"dewPoint":6.22,"humidity":0.93,"windSpeed":6.71,"windBearing":226,"visibility":10,"cloudCover":0.92,"pressure":1031.66,"ozone":301.02},{"time":1491462000,"summary":"Mostly Cloudy","icon":"partly-cloudy-day","precipIntensity":0.0584,"precipProbability":0.06,"precipType":"rain","temperature":7.43,"apparentTemperature":5.32,"dewPoint":6.21,"humidity":0.92,"windSpeed":7.1,"windBearing":232,"visibility":10,"cloudCover":0.93,"pressure":1031.55,"ozone":299.51},{"time":1491465600,"summary":"Drizzle","icon":"rain","precipIntensity":0.1422,"precipProbability":0.25,"precipType":"rain","temperature":7.84,"apparentTemperature":5.63,"dewPoint":6.35,"humidity":0.9,"windSpeed":7.8,"windBearing":240,"visibility":10,"cloudCover":0.94,"pressure":1031.46,"ozone":297.62},{"time":1491469200,"summary":"Drizzle","icon":"rain","precipIntensity":0.188,"precipProbability":0.37,"precipType":"rain","temperature":8.59,"apparentTemperature":6.41,"dewPoint":6.84,"humidity":0.89,"windSpeed":8.36,"windBearing":244,"visibility":10,"cloudCover":0.96,"pressure":1031.34,"ozone":295.87},{"time":1491472800,"summary":"Drizzle","icon":"rain","precipIntensity":0.1651,"precipProbability":0.31,"precipType":"rain","temperature":9.37,"apparentTemperature":7.24,"dewPoint":7.28,"humidity":0.87,"windSpeed":8.92,"windBearing":244,"visibility":10,"cloudCover":0.96,"pressure":1031.16,"ozone":294.33},{"time":1491476400,"summary":"Overcast","icon":"cloudy","precipIntensity":0.1092,"precipProbability":0.17,"precipType":"rain","temperature":10.14,"apparentTemperature":10.14,"dewPoint":7.71,"humidity":0.85,"windSpeed":9.44,"windBearing":244,"visibility":10,"cloudCover":0.97,"pressure":1030.95,"ozone":292.94},{"time":1491480000,"summary":"Overcast","icon":"cloudy","precipIntensity":0.0737,"precipProbability":0.09,"precipType":"rain","temperature":10.86,"apparentTemperature":10.86,"dewPoint":8.09,"humidity":0.83,"windSpeed":9.86,"windBearing":244,"visibility":10,"cloudCover":0.98,"pressure":1030.74,"ozone":292.03},{"time":1491483600,"summary":"Overcast","icon":"cloudy","precipIntensity":0.0864,"precipProbability":0.12,"precipType":"rain","temperature":11.28,"apparentTemperature":11.28,"dewPoint":8.46,"humidity":0.83,"windSpeed":10,"windBearing":245,"visibility":10,"cloudCover":0.99,"pressure":1030.54,"ozone":291.97},{"time":1491487200,"summary":"Overcast","icon":"cloudy","precipIntensity":0.1194,"precipProbability":0.19,"precipType":"rain","temperature":11.51,"apparentTemperature":11.51,"dewPoint":8.66,"humidity":0.83,"windSpeed":10.05,"windBearing":246,"visibility":10,"cloudCover":0.99,"pressure":1030.35,"ozone":292.39},{"time":1491490800,"summary":"Drizzle","icon":"rain","precipIntensity":0.1321,"precipProbability":0.22,"precipType":"rain","temperature":11.29,"apparentTemperature":11.29,"dewPoint":8.46,"humidity":0.83,"windSpeed":10.03,"windBearing":247,"visibility":10,"cloudCover":0.99,"pressure":1030.16,"ozone":292.53},{"time":1491494400,"summary":"Overcast","icon":"cloudy","precipIntensity":0.0991,"precipProbability":0.15,"precipType":"rain","temperature":10.76,"apparentTemperature":10.76,"dewPoint":8.07,"humidity":0.83,"windSpeed":9.78,"windBearing":248,"visibility":10,"cloudCover":1,"pressure":1029.93,"ozone":291.96},{"time":1491498000,"summary":"Overcast","icon":"cloudy","precipIntensity":0.0457,"precipProbability":0.04,"precipType":"rain","temperature":10.13,"apparentTemperature":10.13,"dewPoint":7.62,"humidity":0.84,"windSpeed":9.46,"windBearing":249,"visibility":10,"cloudCover":1,"pressure":1029.68,"ozone":291.1},{"time":1491501600,"summary":"Overcast","icon":"cloudy","precipIntensity":0,"precipProbability":0,"temperature":9.49,"apparentTemperature":7.35,"dewPoint":7.17,"humidity":0.85,"windSpeed":9.11,"windBearing":250,"visibility":10,"cloudCover":0.99,"pressure":1029.52,"ozone":290.46},{"time":1491505200,"summary":"Overcast","icon":"cloudy","precipIntensity":0.0203,"precipProbability":0.01,"precipType":"rain","temperature":8.93,"apparentTemperature":6.77,"dewPoint":6.78,"humidity":0.86,"windSpeed":8.54,"windBearing":248,"visibility":10,"cloudCover":0.99,"pressure":1029.51,"ozone":290.49},{"time":1491508800,"summary":"Overcast","icon":"cloudy","precipIntensity":0.0483,"precipProbability":0.04,"precipType":"rain","temperature":8.39,"apparentTemperature":6.26,"dewPoint":6.44,"humidity":0.88,"windSpeed":7.94,"windBearing":245,"visibility":10,"cloudCover":0.99,"pressure":1029.57,"ozone":290.74},{"time":1491512400,"summary":"Overcast","icon":"cloudy","precipIntensity":0.061,"precipProbability":0.07,"precipType":"rain","temperature":8.03,"apparentTemperature":5.98,"dewPoint":6.28,"humidity":0.89,"windSpeed":7.32,"windBearing":242,"visibility":10,"cloudCover":0.98,"pressure":1029.54,"ozone":290.39},{"time":1491516000,"summary":"Overcast","icon":"cloudy","precipIntensity":0.0483,"precipProbability":0.04,"precipType":"rain","temperature":7.83,"apparentTemperature":5.83,"dewPoint":6.17,"humidity":0.89,"windSpeed":6.95,"windBearing":239,"visibility":10,"cloudCover":0.95,"pressure":1029.32,"ozone":288.85},{"time":1491519600,"summary":"Mostly Cloudy","icon":"partly-cloudy-night","precipIntensity":0.0229,"precipProbability":0.01,"precipType":"rain","temperature":7.68,"apparentTemperature":5.76,"dewPoint":6.13,"humidity":0.9,"windSpeed":6.59,"windBearing":236,"visibility":10,"cloudCover":0.91,"pressure":1029.01,"ozone":286.7},{"time":1491523200,"summary":"Mostly Cloudy","icon":"partly-cloudy-night","precipIntensity":0,"precipProbability":0,"temperature":7.56,"apparentTemperature":5.69,"dewPoint":6.11,"humidity":0.91,"windSpeed":6.31,"windBearing":233,"visibility":10,"cloudCover":0.87,"pressure":1028.75,"ozone":284.91},{"time":1491526800,"summary":"Mostly Cloudy","icon":"partly-cloudy-night","precipIntensity":0,"precipProbability":0,"temperature":7.43,"apparentTemperature":5.59,"dewPoint":6.03,"humidity":0.91,"windSpeed":6.18,"windBearing":230,"visibility":10,"cloudCover":0.81,"pressure":1028.58,"ozone":283.74},{"time":1491530400,"summary":"Mostly Cloudy","icon":"partly-cloudy-night","precipIntensity":0,"precipProbability":0,"temperature":7.22,"apparentTemperature":5.36,"dewPoint":5.87,"humidity":0.91,"windSpeed":6.13,"windBearing":226,"visibility":10,"cloudCover":0.75,"pressure":1028.45,"ozone":282.93},{"time":1491534000,"summary":"Mostly Cloudy","icon":"partly-cloudy-night","precipIntensity":0,"precipProbability":0,"temperature":6.99,"apparentTemperature":5.09,"dewPoint":5.64,"humidity":0.91,"windSpeed":6.09,"windBearing":224,"visibility":10,"cloudCover":0.73,"pressure":1028.31,"ozone":282.6},{"time":1491537600,"summary":"Mostly Cloudy","icon":"partly-cloudy-night","precipIntensity":0,"precipProbability":0,"temperature":6.78,"apparentTemperature":4.9,"dewPoint":5.45,"humidity":0.91,"windSpeed":5.91,"windBearing":223,"visibility":10,"cloudCover":0.73,"pressure":1028.12,"ozone":282.74},{"time":1491541200,"summary":"Mostly Cloudy","icon":"partly-cloudy-night","precipIntensity":0,"precipProbability":0,"temperature":6.62,"apparentTemperature":4.77,"dewPoint":5.27,"humidity":0.91,"windSpeed":5.73,"windBearing":222,"visibility":10,"cloudCover":0.76,"pressure":1027.92,"ozone":283.36},{"time":1491544800,"summary":"Mostly Cloudy","icon":"partly-cloudy-day","precipIntensity":0,"precipProbability":0,"temperature":6.87,"apparentTemperature":5.12,"dewPoint":5.42,"humidity":0.9,"windSpeed":5.59,"windBearing":222,"visibility":10,"cloudCover":0.76,"pressure":1027.75,"ozone":284.63},{"time":1491548400,"summary":"Mostly Cloudy","icon":"partly-cloudy-day","precipIntensity":0,"precipProbability":0,"temperature":7.41,"apparentTemperature":5.81,"dewPoint":5.56,"humidity":0.88,"windSpeed":5.45,"windBearing":226,"visibility":10,"cloudCover":0.73,"pressure":1027.65,"ozone":286.83},{"time":1491552000,"summary":"Mostly Cloudy","icon":"partly-cloudy-day","precipIntensity":0,"precipProbability":0,"temperature":7.84,"apparentTemperature":6.34,"dewPoint":5.5,"humidity":0.85,"windSpeed":5.4,"windBearing":229,"visibility":10,"cloudCover":0.68,"pressure":1027.59,"ozone":289.7},{"time":1491555600,"summary":"Mostly Cloudy","icon":"partly-cloudy-day","precipIntensity":0,"precipProbability":0,"temperature":8.23,"apparentTemperature":6.78,"dewPoint":5.4,"humidity":0.82,"windSpeed":5.41,"windBearing":232,"visibility":10,"cloudCover":0.64,"pressure":1027.55,"ozone":292.57},{"time":1491559200,"summary":"Mostly Cloudy","icon":"partly-cloudy-day","precipIntensity":0,"precipProbability":0,"temperature":8.64,"apparentTemperature":7.21,"dewPoint":5.43,"humidity":0.8,"windSpeed":5.63,"windBearing":229,"visibility":10,"cloudCover":0.66,"pressure":1027.53,"ozone":295.3},{"time":1491562800,"summary":"Mostly Cloudy","icon":"partly-cloudy-day","precipIntensity":0,"precipProbability":0,"temperature":9.33,"apparentTemperature":7.94,"dewPoint":5.74,"humidity":0.78,"windSpeed":5.89,"windBearing":225,"visibility":10,"cloudCover":0.7,"pressure":1027.49,"ozone":298.03}]},"daily":{"summary":"Mixed precipitation tomorrow through Wednesday, with temperatures peaking at 13°C on Saturday.","icon":"rain","data":[{"time":1491346800,"summary":"Mostly cloudy throughout the day.","icon":"partly-cloudy-day","sunriseTime":1491370756,"sunsetTime":1491419088,"moonPhase":0.31,"precipIntensity":0.0102,"precipIntensityMax":0.066,"precipIntensityMaxTime":1491361200,"precipProbability":0.08,"precipType":"rain","temperatureMin":7.49,"temperatureMinTime":1491350400,"temperatureMax":11.37,"temperatureMaxTime":1491404400,"apparentTemperatureMin":4.41,"apparentTemperatureMinTime":1491350400,"apparentTemperatureMax":11.37,"apparentTemperatureMaxTime":1491404400,"dewPoint":4.94,"humidity":0.78,"windSpeed":10.08,"windBearing":249,"visibility":10,"cloudCover":0.76,"pressure":1031.3,"ozone":321.74},{"time":1491433200,"summary":"Drizzle in the morning.","icon":"rain","sunriseTime":1491457000,"sunsetTime":1491505609,"moonPhase":0.35,"precipIntensity":0.0584,"precipIntensityMax":0.188,"precipIntensityMaxTime":1491469200,"precipProbability":0.37,"precipType":"rain","temperatureMin":6.76,"temperatureMinTime":1491433200,"temperatureMax":11.51,"temperatureMaxTime":1491487200,"apparentTemperatureMin":5.14,"apparentTemperatureMinTime":1491433200,"apparentTemperatureMax":11.51,"apparentTemperatureMaxTime":1491487200,"dewPoint":6.96,"humidity":0.89,"windSpeed":7.59,"windBearing":240,"visibility":10,"cloudCover":0.91,"pressure":1031.02,"ozone":296.19},{"time":1491519600,"summary":"Mostly cloudy throughout the day.","icon":"partly-cloudy-day","sunriseTime":1491543244,"sunsetTime":1491592130,"moonPhase":0.38,"precipIntensity":0.0025,"precipIntensityMax":0.0229,"precipIntensityMaxTime":1491519600,"precipProbability":0.01,"precipType":"rain","temperatureMin":6.62,"temperatureMinTime":1491541200,"temperatureMax":11.56,"temperatureMaxTime":1491573600,"apparentTemperatureMin":4.77,"apparentTemperatureMinTime":1491541200,"apparentTemperatureMax":11.56,"apparentTemperatureMaxTime":1491573600,"dewPoint":5.77,"humidity":0.84,"windSpeed":5.17,"windBearing":217,"visibility":10,"cloudCover":0.72,"pressure":1027.13,"ozone":297.76},{"time":1491606000,"summary":"Mostly cloudy throughout the day.","icon":"partly-cloudy-day","sunriseTime":1491629489,"sunsetTime":1491678652,"moonPhase":0.41,"precipIntensity":0,"precipIntensityMax":0,"precipProbability":0,"temperatureMin":6.64,"temperatureMinTime":1491627600,"temperatureMax":12.74,"temperatureMaxTime":1491656400,"apparentTemperatureMin":4.93,"apparentTemperatureMinTime":1491627600,"apparentTemperatureMax":12.74,"apparentTemperatureMaxTime":1491656400,"dewPoint":7.18,"humidity":0.88,"windSpeed":6.83,"windBearing":197,"visibility":10,"cloudCover":0.79,"pressure":1021.9,"ozone":316.08},{"time":1491692400,"summary":"Mostly cloudy throughout the day.","icon":"partly-cloudy-day","sunriseTime":1491715734,"sunsetTime":1491765174,"moonPhase":0.45,"precipIntensity":0.033,"precipIntensityMax":0.0787,"precipIntensityMaxTime":1491760800,"precipProbability":0.1,"precipType":"rain","temperatureMin":3.18,"temperatureMinTime":1491775200,"temperatureMax":11.04,"temperatureMaxTime":1491739200,"apparentTemperatureMin":-0.87,"apparentTemperatureMinTime":1491775200,"apparentTemperatureMax":11.04,"apparentTemperatureMaxTime":1491739200,"dewPoint":6.8,"humidity":0.9,"windSpeed":8.38,"windBearing":227,"visibility":9.93,"cloudCover":0.83,"pressure":1015.2,"ozone":327.26},{"time":1491778800,"summary":"Partly cloudy until afternoon.","icon":"partly-cloudy-day","sunriseTime":1491801979,"sunsetTime":1491851695,"moonPhase":0.48,"precipIntensity":0.0381,"precipIntensityMax":0.066,"precipIntensityMaxTime":1491829200,"precipProbability":0.08,"precipType":"rain","temperatureMin":0.96,"temperatureMinTime":1491789600,"temperatureMax":9.52,"temperatureMaxTime":1491832800,"apparentTemperatureMin":-3.08,"apparentTemperatureMinTime":1491789600,"apparentTemperatureMax":6.44,"apparentTemperatureMaxTime":1491832800,"dewPoint":1.33,"humidity":0.8,"windSpeed":10.78,"windBearing":287,"visibility":10,"cloudCover":0.25,"pressure":1016.51,"ozone":344.36},{"time":1491865200,"summary":"Mixed precipitation until afternoon, starting again overnight, and breezy in the morning.","icon":"rain","sunriseTime":1491888225,"sunsetTime":1491938217,"moonPhase":0.52,"precipIntensity":0.1676,"precipIntensityMax":0.287,"precipIntensityMaxTime":1491894000,"precipProbability":0.52,"precipType":"rain","temperatureMin":1.7,"temperatureMinTime":1491948000,"temperatureMax":9.83,"temperatureMaxTime":1491919200,"apparentTemperatureMin":-1.71,"apparentTemperatureMinTime":1491876000,"apparentTemperatureMax":6.78,"apparentTemperatureMaxTime":1491919200,"dewPoint":3.94,"humidity":0.87,"windSpeed":11.67,"windBearing":269,"cloudCover":0.73,"pressure":1013.72,"ozone":345.19},{"time":1491951600,"summary":"Flurries in the morning and overnight.","icon":"snow","sunriseTime":1491974472,"sunsetTime":1492024739,"moonPhase":0.54,"precipIntensity":0.0457,"precipIntensityMax":0.061,"precipIntensityMaxTime":1492012800,"precipProbability":0.07,"precipType":"snow","precipAccumulation":0.879,"temperatureMin":-1.45,"temperatureMinTime":1491966000,"temperatureMax":8.24,"temperatureMaxTime":1492005600,"apparentTemperatureMin":-2.91,"apparentTemperatureMinTime":1491962400,"apparentTemperatureMax":8.24,"apparentTemperatureMaxTime":1492005600,"dewPoint":-0.54,"humidity":0.76,"windSpeed":2.15,"windBearing":49,"cloudCover":0.38,"pressure":1016.05,"ozone":367.48}]},"flags":{"sources":["datapoint","gfs","cmc","nam","rap","sref","fnmoc","isd","madis","nearest-precip","metwarn","darksky"],"datapoint-stations":["uk-301777","uk-3134","uk-322052","uk-322595","uk-322659","uk-350056","uk-351269","uk-351289","uk-351397","uk-351465","uk-352102","uk-352379","uk-352954","uk-354999","uk-371524","uk-371606"],"isd-stations":["031070-99999","031160-99999","031200-99999","031290-99999","031330-99999","031340-99999","031350-99999","031360-99999","031380-99999","031390-99999","031400-99999","031430-99999","031450-99999","031480-99999","031490-99999","031520-99999"],"madis-stations":["AU945","C9560","C9739","D4018","E0915","E3381","EGPF","EGPK"],"units":"uk2"}}},"history":["On 5th April 1820 government forces defeated Radical weavers at the Battle of Bonnymuir.","The Radicals had marched from Glasgow and were heading towards the Carron Iron Works in Falkirk. However, their ranks had been infiltrated by government agents and they were in fact being guided to an ambush outside the village of Bonnybridge. During the battle a Lieutenant of the 10th Hussars received a wound to the hand and a sergeant was severely wounded, four Radicals were wounded and a haul of five muskets, two pistols, eighteen pikes and about 100 rounds of ball cartridges were taken. Hardie and Baird, the leaders of the Radicals were hanged at Stirling, with Hardie declaring \"I die a martyr to the cause of truth and liberty\".","Cuthbert Hurd is born. Hurd was a mathematician hired directly by IBM President Thomas Watson Sr. in early 1949 and was only the second IBM employee hired with a PhD at the time. A figure generally unknown to history, Hurd quietly encouraged IBM upper management to enter into the computer field, convincing them in the early 1950s that a market for scientific computers existed after a cross-country sales trip revealed pent-up demand. At the time, IBM enjoyed large profits from its traditional punch card accounting business so the change was difficult for IBM to make internally. Hurd's first great success was in selling 10 of IBM's 701 computers, its first commercial scientific machine, which rented for $18,000 a month. Shortly thereafter, he became manager of the IBM team that invented and developed the FORTRAN programming language under John Backus. Hurd died on May 22, 1996 in Portola Valley, California."],"today":"Wednesday April 05, 2017 - The 94th day of 2017, and there are 270 days until the end of the year","tv":{"entries":[{"summary":"NCIS 14x20 - A Bowl of Cherries","dtstart":"2017-04-05T00:00:00.000Z","dtend":"2017-04-05T01:00:00.000Z","description":"After a vice admiral's laptop is infected with ransomware\\, he","timeStart":"1:00:00","timeEnd":"2:00:00","duration":"1 hour","combined":"1:00:00 - 'NCIS 14x20 - A Bowl of Cherries, 1 hour","recur":null,"long":"Wednesday, 1:00:00 - ","longcombined":"Wednesday, 1:00:00 - NCIS 14x20 - A Bowl of Cherries, 1 hour"},{"summary":"Prison Break 5x1 - Ogygia","dtstart":"2017-04-05T01:00:00.000Z","dtend":"2017-04-05T02:00:00.000Z","description":"Clues surface that suggest a previously thought-to-be-dead","timeStart":"2:00:00","timeEnd":"3:00:00","duration":"1 hour","combined":"2:00:00 - 'Prison Break 5x1 - Ogygia, 1 hour","recur":null,"long":"Wednesday, 2:00:00 - ","longcombined":"Wednesday, 2:00:00 - Prison Break 5x1 - Ogygia, 1 hour"},{"summary":"New Girl 6x22 - Five Stars for Beezus","dtstart":"2017-04-05T00:00:00.000Z","dtend":"2017-04-05T00:30:00.000Z","description":"Jess is ready to tell Nick of her true feelings for him.","timeStart":"1:00:00","timeEnd":"1:30:00","duration":"30 minutes","combined":"1:00:00 - 'New Girl 6x22 - Five Stars for Beezus, 30 minutes","recur":null,"long":"Wednesday, 1:00:00 - ","longcombined":"Wednesday, 1:00:00 - New Girl 6x22 - Five Stars for Beezus, 30 minutes"},{"summary":"Marvel's Agents of S.H.I.E.L.D. 4x16 - What If...","dtstart":"2017-04-05T02:00:00.000Z","dtend":"2017-04-05T03:00:00.000Z","description":"Hail the New World Order! Daisy and Simmons are the only hope","timeStart":"3:00:00","timeEnd":"4:00:00","duration":"1 hour","combined":"3:00:00 - 'Marvel's Agents of S.H.I.E.L.D. 4x16 - What If..., 1 hour","recur":null,"long":"Wednesday, 3:00:00 - ","longcombined":"Wednesday, 3:00:00 - Marvel's Agents of S.H.I.E.L.D. 4x16 - What If..., 1 hour"},{"summary":"DC's Legends of Tomorrow 2x17 - Aruba","dtstart":"2017-04-05T01:00:00.000Z","dtend":"2017-04-05T02:00:00.000Z","description":"As the Legends are about to take off for their next","timeStart":"2:00:00","timeEnd":"3:00:00","duration":"1 hour","combined":"2:00:00 - 'DC's Legends of Tomorrow 2x17 - Aruba, 1 hour","recur":null,"long":"Wednesday, 2:00:00 - ","longcombined":"Wednesday, 2:00:00 - DC's Legends of Tomorrow 2x17 - Aruba, 1 hour"}]},"cal":{"today":[],"tomorrow":[],"week":[{"summary":"Update Timesheet","dtstart":"2017-04-07T14:30:00.436Z","dtend":"2017-04-07T15:30:00.436Z","description":"Update the timesheet using https://outsauce.backofficeportal.co","timeStart":"15:30:00","timeEnd":"16:30:00","duration":"1 hour","combined":"15:30:00 - 'Update Timesheet, 1 hour","recur":"FREQ=WEEKLY;COUNT=15;BYDAY=FR","long":"Friday, 15:30:00 - ","longcombined":"Friday, 15:30:00 - Update Timesheet, 1 hour"}]},"swedish":{"xml":{"$":{"xmlns:wotd":"http://www.transparent.com/word-of-the-day/"},"words":{"date":"04-05-2017","langname":"Swedish","wordtype":"verb","word":"att ha på sig","wordsound":"http://wotd.transparent.com/swedish/level-1/sound/00400_WOTD_Swedish_Words.mp3","translation":"to wear","fnphrase":"Vad fan har du på dig?!","phrasesound":"http://wotd.transparent.com/swedish/level-1/sound/00400_WOTD_Swedish_Sentences.mp3","enphrase":"What the heck are you wearing?!","wotd:transliteratedWord":"","wotd:transliteratedSentence":"","notes":""}}},"fitbit":{},"ftse":[{"name":"BHP Billiton Plc","price":"1,280.75","change_amount":"+25.00","change_percent":"+1.99%"},{"name":"Antofagasta Holdings","price":"856.00","change_amount":"+16.50","change_percent":"+1.96%"},{"name":"ITV Plc","price":"217.00","change_amount":"+3.50","change_percent":"+1.64%"},{"name":"Royal Dutch Shell Plc B Shares","price":"2,218.75","change_amount":"+27.00","change_percent":"+1.23%"},{"name":"Centrica Plc","price":"216.85","change_amount":"+2.60","change_percent":"+1.21%"},{"name":"Whitbread Plc","price":"3,945.50","change_amount":"+45.00","change_percent":"+1.15%"},{"name":"Worldpay Group Plc","price":"298.75","change_amount":"+3.30","change_percent":"+1.12%"},{"name":"Rolls Royce Holdings Plc","price":"774.75","change_amount":"+8.00","change_percent":"+1.04%"},{"name":"Royal Dutch Shell Plc A Shares","price":"2,120.25","change_amount":"+21.50","change_percent":"+1.02%"},{"name":"DCC Plc","price":"7,092.50","change_amount":"+70.00","change_percent":"+1.00%"}],"quotes":{"quote":"Political correctness is tyranny with manners.","author":"Charlton Heston","category":"Famous"}},"expire":3600000,"date":{"year":2017,"month":4,"day":5}}
diff --git a/lib/today/calHandler.js b/lib/today/calHandler.js
index 4cc9e52..b9c53cd 100644
--- a/lib/today/calHandler.js
+++ b/lib/today/calHandler.js
@@ -1,16 +1,16 @@
-var request = require('request');
-var log4js = require('log4js');
-var logger = log4js.getLogger();
-var STRING = require('string');
-var util = require('util');
-var Elapsed = require('elapsed');
+const request = require('request')
+const log4js = require('log4js')
+const logger = log4js.getLogger()
+const STRING = require('string')
+let util = require('util')
+const Elapsed = require('elapsed')
require('sugar-date');
function processICAL(ical) {
'use strict';
logger.info('+ processICAL');
- var workingBlock = [];
- var segments = {
+ let workingBlock = []
+ const segments = {
meetingStartID: 'DTSTART;TZID=Europe/London:',
meetingStartAlt: 'DTSTART:',
meetingStartAltOther: 'DTSTART;VALUE=DATE:',
@@ -24,38 +24,38 @@ function processICAL(ical) {
beginAlarm: 'BEGIN:VALARM',
endAlarm: 'END:VALARM',
recur: 'RRULE:'
- };
+ }
- var rules = ['FREQ','WKST','UNTIL','BYMONTH','BYMONTHDAY','INTERVAL','BYDAY'];
+ const rules = ['FREQ', 'WKST', 'UNTIL', 'BYMONTH', 'BYMONTHDAY', 'INTERVAL', 'BYDAY']
function nThDayOfMonth(monthsAhead, wantedDay) {
- var now = new Date();
+ const now = new Date()
- for(var t=0; t < monthsAhead; t++) {
+ for(let t=0; t < monthsAhead; t++) {
}
}
function processRecurrence(workBlock) {
- var _workBlock = workBlock;
+ let _workBlock = workBlock
// logger.debug('Processing recurrence...');
// logger.debug('Processing recurrence...');
- var weekBits = {'SU':0,'MO':1,'TU':2,'WE':3,'TH':4,'FR':5,'SA':6};
- var blocks=[];
- var now = new Date();
- var day = now.getDate();
- var dayNum = now.getDay();
- var month = now.getMonth();
- var year = now.getFullYear();
+ const weekBits = {'SU': 0, 'MO': 1, 'TU': 2, 'WE': 3, 'TH': 4, 'FR': 5, 'SA': 6}
- var recurSettings = {freq:null, wkst:null, until:null, bymonth:null, bymonthday:null, interval:null, byday:null};
+ const now = new Date()
+ const day = now.getDate()
+ const dayNum = now.getDay()
+ const month = now.getMonth()
+ const year = now.getFullYear()
- var firstSplit = _workBlock.recur.split(';');
+ let recurSettings = {freq: null, wkst: null, until: null, bymonth: null, bymonthday: null, interval: null, byday: null}
- for (var t=0; t< firstSplit.length;t++)
+ const firstSplit = _workBlock.recur.split(';')
+
+ for (let t=0; t< firstSplit.length; t++)
{
- var ws = firstSplit[t].split('=');
+ const ws = firstSplit[t].split('=')
if (rules.indexOf(ws[0]) > -1) {
recurSettings[ws[0].toLowerCase()] = ws[1];
}
@@ -76,18 +76,17 @@ function processICAL(ical) {
if (recurSettings.freq !== null) {
// logger.debug(_workBlock);
- var origStart, origEnd, distance, newStart, newEnd;
+ let origStart, origEnd, distance, newStart, newEnd
origStart = Date.create(_workBlock.dtstart);
origEnd = Date.create(_workBlock.dtend);
- var _d = origStart.getDate();
- var _m = origStart.getMonth();
- var _h = origStart.getHours();
- var _min = origStart.getMinutes();
- var _secs = origStart.getSeconds();
+ const _d = origStart.getDate()
+ const _m = origStart.getMonth()
+ const _h = origStart.getHours()
+ const _min = origStart.getMinutes()
+ const _secs = origStart.getSeconds()
distance = origEnd - origStart;
-
if (recurSettings.freq === 'YEARLY') {
if (recurSettings.bymonth !== null && recurSettings.bymonthday !== null) {
@@ -122,10 +121,10 @@ function processICAL(ical) {
}
if (recurSettings.freq === 'WEEKLY' && recurSettings.interval === null) {
- var byDayBit = recurSettings.byday.split(',')[0];
- var byDayNumber = weekBits[byDayBit];
+ const byDayBit = recurSettings.byday.split(',')[0]
+ const byDayNumber = weekBits[byDayBit]
if (byDayNumber >= dayNum) {
- var daysAdded = byDayNumber - dayNum;
+ const daysAdded = byDayNumber - dayNum
newStart = Date.create().set({year:year, month: month , day: day, hour:_h, minutes:_min, seconds:_secs}).addDays(daysAdded);
newEnd = Date.create(newStart).addMilliseconds(distance);
_workBlock.dtstart = newStart;
@@ -140,8 +139,8 @@ function processICAL(ical) {
}
function processBlock(block) {
- var _wb;
- var workBlock = {
+ let _wb
+ let workBlock = {
summary: '',
dtstart: null,
dtend: null,
@@ -151,9 +150,9 @@ function processICAL(ical) {
duration: 0,
combined: '',
recur: null
- };
- var alarmFlag = false, ws, blockStep;
- for (var step = 0; step < block.length; step++) {
+ }
+ let alarmFlag = false, ws, blockStep
+ for (let step = 0; step < block.length; step++) {
blockStep = block[step];
if (blockStep.indexOf(segments.recur) >= 0) {
workBlock.recur = STRING(block[step].split(segments.recur)[1]).collapseWhitespace().s;
@@ -189,7 +188,6 @@ function processICAL(ical) {
workBlock.dtend = Date.create(ws);
}
-
if (blockStep.indexOf(segments.meetingDescID) >= 0) {
if (!alarmFlag) {
workBlock.description = STRING(block[step].split(segments.meetingDescID)[1]).collapseWhitespace().s;
@@ -200,7 +198,6 @@ function processICAL(ical) {
}
}
-
// We have to check recuring stuff before the cron stuff is processed.
if (workBlock.recur !== null) {
@@ -219,8 +216,8 @@ function processICAL(ical) {
//logger.debug(workBlock);
if (workBlock.dtstart !== null) {
workBlock.timeStart = workBlock.dtstart.format('{24hr}:{mm}:{ss}');
- workBlock.combined = '' + workBlock.timeStart + ' - ';
- workBlock.long = '' + workBlock.dtstart.format('{Weekday}') +', ' + workBlock.timeStart + ' - ';
+ workBlock.combined = `${workBlock.timeStart} - '`;
+ workBlock.long = `${workBlock.dtstart.format('{Weekday}')}, ${workBlock.timeStart} - `;
}
workBlock.combined = workBlock.combined + workBlock.summary;
workBlock.longcombined = workBlock.long + workBlock.summary;
@@ -228,7 +225,7 @@ function processICAL(ical) {
workBlock.timeEnd = workBlock.dtend.format('{24hr}:{mm}:{ss}');
}
if (workBlock.dtstart !== null && workBlock.dtend !== null) {
- var elapsedTime = new Elapsed(workBlock.dtstart, workBlock.dtend);
+ const elapsedTime = new Elapsed(workBlock.dtstart, workBlock.dtend)
workBlock.duration = elapsedTime.optimal;
workBlock.combined = workBlock.combined + ', ' + elapsedTime.optimal;
workBlock.longcombined = workBlock.longcombined + ', ' + elapsedTime.optimal;
@@ -237,14 +234,16 @@ function processICAL(ical) {
return workBlock;
}
- var lines = ical.split('\r\n'), l = lines.length, counter = 0;
+ const lines = ical.split('\r\n'), l = lines.length
+ let counter = 0
- var alarmed = false;
+ let alarmed = false
while (counter < l) {
if (lines[counter].indexOf(segments.begin) < 0) {
counter++;
} else {
- var subcounter = 0, subBlock = [];
+ let subcounter = 0
+ const subBlock = []
alarmed = false;
while (subcounter < 75) {
if (lines[counter + subcounter].indexOf(segments.end) < 0) {
@@ -265,7 +264,7 @@ function processICAL(ical) {
}
}
counter = counter + subcounter;
- var b = processBlock(subBlock);
+ const b = processBlock(subBlock)
if (Array.isArray(b)) {
logger.error('!returned an array...');
} else {
@@ -293,11 +292,11 @@ module.exports = {
getTodaysSimple: function() {
'use strict';
logger.info('+ getTodaysSimple');
- var today = {
+ const today = {
entries: []
- };
+ }
- for (var t = 0; t < this.jsonBlock.length; t++) {
+ for (let t = 0; t < this.jsonBlock.length; t++) {
if (this.jsonBlock[t].dtstart.isToday()) {
today.entries.push(this.jsonBlock[t]);
@@ -309,11 +308,11 @@ module.exports = {
getTomorrow: function() {
'use strict';
logger.info('+ getTomorrow');
- var today = {
+ const today = {
entries: []
- };
+ }
- for (var t = 0; t < this.jsonBlock.length; t++) {
+ for (let t = 0; t < this.jsonBlock.length; t++) {
if (this.jsonBlock[t].dtstart.isTomorrow()) {
today.entries.push(this.jsonBlock[t]);
@@ -325,10 +324,10 @@ module.exports = {
getWeek: function() {
'use strict';
logger.info('+ getWeek');
- var today = {
+ const today = {
entries: []
- };
- var now, twoDays, sevenDays;
+ }
+ let now, twoDays, sevenDays
now = Date.create('today');
// logger.debug(now);
@@ -338,7 +337,7 @@ module.exports = {
// logger.debug(now, twoDays, sevenDays);
- for (var t = 0; t < this.jsonBlock.length; t++) {
+ for (let t = 0; t < this.jsonBlock.length; t++) {
if (this.jsonBlock[t].dtstart.isBetween(twoDays, sevenDays)) {
today.entries.push(this.jsonBlock[t]);
@@ -350,12 +349,12 @@ module.exports = {
getTodaysMeetings: function() {
'use strict';
logger.info('+ getTodaysMeetings');
- var today = {
+ const today = {
previous: [], upcoming: [], current: {}
- };
- var now = new Date();
+ }
+ const now = new Date()
- for (var t = 0; t < this.jsonBlock.length; t++) {
+ for (let t = 0; t < this.jsonBlock.length; t++) {
if (this.jsonBlock[t].dtstart.isToday()) {
if (this.jsonBlock[t].dtstart.isAfter(now)) {
@@ -374,7 +373,7 @@ module.exports = {
return today;
}, getSimpleCalV2: function(url, cb) {
'use strict';
- var self = this;
+ const self = this
// Var calJson = [];
try {
@@ -388,7 +387,7 @@ module.exports = {
self.jsonBlock = processICAL(body);
// logger.debug(self.jsonBlock);
- var st = self.getTodaysSimple();
+ const st = self.getTodaysSimple()
if (typeof cb === 'function') {
cb(st);
@@ -405,7 +404,7 @@ module.exports = {
}, getSimpleCalV3: function(url) {
'use strict';
- var self = this;
+ const self = this
return new Promise(function(resolve, reject) {
try {
@@ -419,7 +418,7 @@ module.exports = {
self.jsonBlock = processICAL(body);
// logger.debug(self.jsonBlock);
- var st = self.getTodaysSimple();
+ const st = self.getTodaysSimple()
return resolve(st);
}, function(error, response, body) {
@@ -440,9 +439,9 @@ module.exports = {
}, getAdvancedCalV3: function(url) {
'use strict';
- var self = this;
+ const self = this
- return new Promise(function(resolve, reject) {
+ return new Promise(function(resolve, reject) {
try {
request(url, function(err, res, body) {
if (err) {
@@ -454,12 +453,11 @@ module.exports = {
self.jsonBlock = processICAL(body);
// logger.debug(self.jsonBlock);
- var st = self.getTodaysSimple().entries;
- var tom = self.getTomorrow().entries;
- var week = self.getWeek().entries;
+ const st = self.getTodaysSimple().entries
+ const tom = self.getTomorrow().entries
+ const week = self.getWeek().entries
-
- var obj = {today:st, tomorrow:tom, week:week};
+ const obj = {today: st, tomorrow: tom, week: week}
logger.debug(obj);
return resolve(obj);
diff --git a/lib/today/test.js b/lib/today/test.js
index b165341..3427c87 100644
--- a/lib/today/test.js
+++ b/lib/today/test.js
@@ -5,15 +5,21 @@
* Time: 23:22
*
*/
-var quotes = require('./quotes');
+const calHandler = require('./calHandler');
+const logger = require('log4js').getLogger();
-
-quotes.GetQuotes()
- .then((d) => {
- 'use strict';
- console.log('Quotes: ', d);
- })
- .catch((e)=> {
- 'use strict';
- console.error(e);
- });
+for (let t = 0; t < calHandler.calendars.length; t++) {
+ calHandler.getAdvancedCalV3(calHandler.calendars[t])
+ .then((d) => {
+ 'use strict';
+/*
+ todayCache.data.cal.today = todayCache.data.cal.today.concat(d.today);
+ todayCache.data.cal.tomorrow = todayCache.data.cal.tomorrow.concat(d.tomorrow);
+ todayCache.data.cal.week = todayCache.data.cal.week.concat(d.week);
+*/
+ })
+ .catch((e) => {
+ 'use strict';
+ logger.error(e);
+ });
+ }
\ No newline at end of file
diff --git a/package.json b/package.json
index 1618cd8..7dcad62 100644
--- a/package.json
+++ b/package.json
@@ -4,11 +4,20 @@
"devDependencies": {
"babel": "^6.23.0",
"babel-core": "^6.24.0",
- "babel-eslint": "^7.2.0",
+ "babel-eslint": "^7.2.1",
"babel-preset-es2015": "^6.24.0",
"cheerio": "^0.20.0",
"dateformat": "^1.0.12",
"ejs": "^2.3.4",
+ "eslint": "^3.18.0",
+ "eslint-config-defaults": "^9.0.0",
+ "eslint-config-standard": "^7.1.0",
+ "eslint-plugin-import": "^2.2.0",
+ "eslint-plugin-node": "^4.2.2",
+ "eslint-plugin-promise": "^3.5.0",
+ "eslint-plugin-react": "^6.10.3",
+ "eslint-plugin-standard": "^2.1.1",
+ "eslint-watch": "^3.0.1",
"fitbit-oauth2": "0.0.1",
"forecast.io": "0.0.9",
"gulp-autoprefixer": "^3.1.1",
diff --git a/serverV2.js b/serverV2.js
index 7da58d9..e74b5fc 100644
--- a/serverV2.js
+++ b/serverV2.js
@@ -32,10 +32,8 @@ const SocketHandler = require('./lib/wshandlerv2');
let webSocket = new SocketHandler(busEmitter, wss);
-
// train = require('lib/train')
/* ,submit = require('./routes/mongo/submit') */
-;
let fs = require('fs');
const config = require('./config/config.json');
diff --git a/views/pages/slackV2-min.ejs b/views/pages/slackV2-min.ejs
index 7887376..440d7ac 100644
--- a/views/pages/slackV2-min.ejs
+++ b/views/pages/slackV2-min.ejs
@@ -1,4 +1,4 @@
-<% include ../partials/head %>
+<% include ../partials/head-min %>