Skip to content

Instantly share code, notes, and snippets.


Jason Crawford jasoncrawford

View GitHub Profile
jasoncrawford / README
Created Sep 6, 2020
Twitter utilities
These are some Twitter utilities, written directly against their API.
Credentials are required. Sign up for a Twitter developer account.
To run these scripts, ensure the BEARER_TOKEN is in the environment. E.g., put it in a .env file and run with foreman.
jasoncrawford / pwdgen.js
Created Nov 5, 2016
XKCD-style password generator
View pwdgen.js
// Generates “correct horse battery staple”-style password:
// Usage: node pwdgen.js <file>
// File should contain common words, one per line.
// Params:
var minWordLength = 4;
var desiredEntropyBits = 30;
var fs = require('fs');
var crypto = require('crypto');
jasoncrawford / appError.js
Last active Nov 18, 2015
JS custom errors
View appError.js
var util = require('util');
var extendable = require('./extendable');
// AppError is an error constructor that inherits from Error but is more easily extendable.
// You can inherit from it using 'extend' just like with Backbone constructors:
// var SpecialError = AppError.extend({
// name: 'SpecialError',
// initialize: function (foo, bar) {
// this.message = foo + " " + bar + "!";
View asteroidWatcher.js
var fs = require('fs');
var _ = require('underscore');
var csv = require('csv');
var Twitter = require('twitter');
function die(error) {
console.error('fatal error');
if (error) console.error('error', error);
if (error.stack) console.error('stacktrace', error.stack);
View gist:4243e656851287c1d8c2
Verifying that +jasoncrawford is my openname (Bitcoin username).

Keybase proof

I hereby claim:

  • I am jasoncrawford on github.
  • I am jasoncrawford ( on keybase.
  • I have a public key whose fingerprint is 4AAB 4EB9 28FB 0CF1 045B 8BCC 5491 0264 6F74 0339

To claim this, I am signing this object:

jasoncrawford / routing.js
Last active Nov 23, 2018
Backbone flash mechanism
View routing.js
var Backbone = require('backbone');
// Flash ///////////////////////////////////////////////////////////////////////////////////////////
// The flash is a way for one controller to pass a small amount of information to the next
// controller, through a navigation event.
// The flash holds arbitrary parameters, and is cleared by the router after each navigation event.
var flash = exports.flash = {
params: {},
jasoncrawford / model.js
Last active Sep 5, 2016
Simple relations for Backbone models. Not as full-featured as Backbone-relational ( or Supermodel (, but pretty lightweight and concise. Disclaimer: I excerpted this from some other code I wrote and haven't tested it independently. Use at your own risk
View model.js
var relationEvents = ['add', 'change', 'remove', 'reset', 'sort', 'destroy', 'request', 'sync'];
var Model = exports.Model = Backbone.Model.extend({
hasMany: {
// Subclasses can override to set relations like this:
// key: function () { return new Collection([], options); },
hasOne: {
jasoncrawford / console.js
Last active Dec 24, 2015
Node REPL that doesn't clobber _
View console.js
var repl = require('repl')
var vm = require('vm');
var _;
var server = repl.start({
eval: function (cmd, context, filename, callback) {
try {
var match = cmd.match(/^\((.*)\n\)$/);
var code = match ? match[1] : cmd;
jasoncrawford / gist:5873309
Created Jun 27, 2013
Augment Mongoose with Q promises. In some cases the method is an alternative to an existing promise-returning methods, like `qexec` vs. Mongoose's native `exec`. In other cases it's providing an operation that Mongoose doesn't give promises for, such as `qsave` and `qcreate`.
View gist:5873309
var mongoose = require('mongoose');
// Workaround for the fact that chai-as-promised isn't working with Mongoose promises:
mongoose.Query.prototype.qexec = function () {
return Q.npost(this, 'exec', arguments);
mongoose.Model.qcreate = function () {
return Q.npost(this, 'create', arguments);
You can’t perform that action at this time.