For excessively paranoid client authentication.
Organization & Common Name: Some human identifier for this server CA.
openssl genrsa -des3 -out ca.key 4096
openssl req -new -x509 -days 365 -key ca.key -out ca.crt
| const Promise = require('bluebird'); | |
| const request = require('request'); | |
| const requestAsync = Promise.promisify(request); | |
| const USER = process.env.GITHUB_USER; | |
| exports.handler = async (event, context) => { | |
| try { | |
| if (!USER) throw new Error('GITHUB_USER env missing'); | |
| const module = event.pathParameters.module; |
| FROM jupyter/scipy-notebook | |
| USER root | |
| RUN apt-get update | |
| RUN apt-get -y install software-properties-common | |
| RUN apt-get -y install apt-utils | |
| RUN conda install gdal -y | |
| USER jovyan | |
| RUN pip install rasterio |
For excessively paranoid client authentication.
Organization & Common Name: Some human identifier for this server CA.
openssl genrsa -des3 -out ca.key 4096
openssl req -new -x509 -days 365 -key ca.key -out ca.crt
| function encode64(data) { | |
| var BASE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; | |
| var PAD = '='; | |
| var ret = ''; | |
| var leftchar = 0; | |
| var leftbits = 0; | |
| for (var i = 0; i < data.length; i++) { | |
| leftchar = (leftchar << 8) | data[i]; | |
| leftbits += 8; | |
| while (leftbits >= 6) { |
This small script uses combinatory analysis to figure out the optimal denominations for given number of possible coins to minimize the coins required to produce any amount between 1 cent and 1 dollar. The candidate set of denominations is reduced to keep the combinatory possibilities within reason.
| // Get all k-combinations from array | |
| function combinations(arr, k){ | |
| if (k==1) return arr; | |
| var ret = []; | |
| arr.forEach(function(d,i) { | |
| combinations(arr.slice(i+1, arr.length), k-1) | |
| .forEach(function(sub) { | |
| var next = [].concat(sub); | |
| next.unshift(d); | |
| ret.push( next ); |
| // Get all possible states for a k length array | |
| function states(k) { | |
| if (k==1) return [0,1]; | |
| var ret = []; | |
| states(k-1).forEach(function(d) { | |
| ret.push([0].concat(d)); | |
| ret.push([1].concat(d)); | |
| }); | |
| return ret; | |
| } |
| <!DOCTYPE html> | |
| <meta charset="utf-8"> | |
| <body> | |
| <a style="font-size:10px" href="http://nyctmc.org/">Source: nyctmc.org</a><br> | |
| <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script> | |
| <script> | |
| var cams = [252,263,644,494,200,489,488,486,485,484,487,261,251,102,491,258,497,400,203,430,431,290,429,428,432,305,466,299,465,446,448,304,401,447,440,439,444,443,441,355,354,352,350,349,468,469,455,424,425,427,281,551,335,116,434,550,105,106,285,286,438,337,194,348,548,538,547,530,524,536,523,527,526,517,532,535,539,529,528,521,531,537,525,519,533,318,325,324,339,340,445,464,496,341,178,143,166,442,643,642,641,419,329,330,420,421,426,202,201,635,481,127,108,269,268,266,609,509,508,505,504,503,506,502,510,279,280,140,163,603,604,605,606,611,459,457,458,453,500,495,175,173,188,247,615,616,450,483,482,303,302,294,182,157,129,264,570,571,572,555,560,562,564,565,566,563,567,556,569,568,558,573,561,557,191,296,297,467,470,475,111,184,386,397,399,273,613,614,612,122,187,289,186,473,309,492,316,3 |
| <!DOCTYPE HTML> | |
| <style> | |
| body {font-family: Verdana, Geneva, sans-serif;font-size:14px;} | |
| th {font-weight:bold;text-align:left;} | |
| td,th {padding-left:5px;} | |
| </style> | |
| <body> | |
| <script> | |
| var data,pos,limit=10; |
| var promin = require("promin"); | |
| module.exports.adaptor = { | |
| fulfilled: function(value) { return promin().set(true, [value]); }, | |
| rejected: function(reason) { return promin().set(false, [reason]); }, | |
| pending: function() { | |
| var p = promin(); | |
| return { | |
| promise: p, | |
| fulfill: function(value) { |