Skip to content

Instantly share code, notes, and snippets.

@awesomephant
Last active August 29, 2015 14:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save awesomephant/0bdaa2923af4acb03e9c to your computer and use it in GitHub Desktop.
Save awesomephant/0bdaa2923af4acb03e9c to your computer and use it in GitHub Desktop.
Code for "Good Morning Twitter"
var fs = require('fs');
var moment = require('moment');
var width = 3000;
var height = 4000;
var scaleX = (width - 100 ) / (360 +20);
var scaleY = (height + 00) / (24 * 60);
var offsetTop = 0;
var calcX = function(n){
return width / 2 + scaleX * n;
}
function isOdd(num) { return num % 2;}
var pad = function(n) {
if (n > 100) {
n = "+" + n;
}
else if (n < 100 && n > 0) {
n = "+0" + n;
}
else if (n === 0) {
n = "+00" + n;
}
else if (n > -100 && n < 0) {
n = "-0" + n * -1;
}
return n;
}
var svg_meta = {
header: '<?xml version="1.0"?>\n<svg style="fill:#fff" viewBox="0 0 ' + width + ' ' + height + '" version="1.1">\n\n <rect x="00" y="0" style="fill:#ff1d00" width="' + width + '" height="' + height + '"/>',
footer: '</svg>'
}
var drawMetrics = function(metrics){
var metrics_SVG = '';
for (var i = -180; i <= 180; i += 5) {
metrics_SVG += '<rect y="140" x="' + calcX(i) + '" width="8" height="20"></rect>'
}
for (var i = -180; i <= 180; i += 20) {
metrics_SVG += '<rect y="140" x="' + calcX(i) + '" width="8" height="30"></rect>'
metrics_SVG += '<text x="' + (calcX(i) - 45 ) + '" y="100" font-family="Ubuntu Mono" font-size="35px">' + pad(i) + '</text>\n'
}
metrics.forEach(function(metric){
var y = metric[2];
console.log('metric added: ' + metric[1]);
metrics_SVG += '<text x="' + calcX(metric[0]) + '" y="' + y + '" style="fill:#050507" font-family="Ubuntu Mono" font-size="55px">' + metric[1] + '</text>\n';
metrics_SVG += '<rect y="140" style="fill:#000" x="' + calcX(metric[0]) + '" width="8" height="30"></rect>';
});
fs.appendFile('render.svg', metrics_SVG, function (err) {
if (err) throw err;
fs.appendFile('render.svg', svg_meta.footer, function (err) {
if (err) throw err;
console.log('svg footer added');
});
});
}
var render = function(data){
var t_start = moment(data[0].timestamp)
var svg = '';
data.forEach(function(point){
var t = moment(point.timestamp);
var t_passed = t.diff(t_start, 'minutes');
var x = calcX(point.position[1]);
var y = scaleY * t_passed + offsetTop;
svg += '<circle cx="' + x + '" cy="' + y + '" r="' + 6 + '"/>\n';
});
fs.appendFile('render.svg', svg, function (err) {
if (err) throw err;
console.log('points rendered');
});
}
//Clear file
fs.open('render.svg', 'w', function(error, fd){
fs.writeSync(fd, svg_meta.header);
console.log('file cleared')
})
fs.readFile('output-one.json', function (err, data) {
if (err) throw err;
tweets = JSON.parse(data);
console.log(tweets.length + " Tweets found");
render(tweets);
drawMetrics([
[-157.7964, 'Hawaii', 220],
[-118.2500, 'Los Angeles', 220],
[-122.4167, 'San Francisco', 270],
[-99.1333, 'Mexico City', 320],
[-75.1890, 'New York', 220],
[-43.1729, 'Rio de Janeiro', 270],
[-0, 'London', 220],
[2.3508, 'Paris', 320],
[13.3833, 'Berlin', 370],
[28.6139, 'New Delhi', 220],
[37.6167, 'Moscow', 270],
[103.8000, 'Singapore', 220],
[114.1747, 'Hong Kong', 270],
[121.5000, 'Shanghai', 320],
[126.9781, 'Seoul', 370],
[139.6917, 'Tokyo', 420],
[151.2094, 'Sydney', 220],
]);
});
var fs = require('fs');
var Twitter = require('twitter');
var counter = 0;
var terms = 'good morning, goodmorning, 早安, bonjour, בֹּקֶר טוֹב, guten morgen, gutenmorgen, गुड मॉर्निंग, buongiorno, お早う, 안녕하세요, доброе утро, buenos días, buenosdías, günaydın';
fs.open('output-one.json', 'w')
client.stream('statuses/filter', {track: terms, replies: 'all'}, function(stream) {
stream.on('data', function(tweet) {
if(tweet.geo != null){
counter += 1;
var json_data = createTweetJSON(tweet);
fs.appendFile('output-one.json', json_data + ',' + '\n', function (err) {
if (err) throw err;
console.log('↓ \n');
});
}
});
stream.on('error', function(error) {
throw error;
});
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment