Skip to content

Instantly share code, notes, and snippets.

@cramforce
cramforce / main.py
Created July 17, 2017 04:04
Google App Engine ADT Pulse alert email to IFTT webhook adapter
import logging
import re
# Receives alert emails from ADT Pulse and expects them to have
# an extra text of the form 'action=YOUR_ACTION' in the body.
# Calls IFTT with your key and the given action to trigger a webhook.
from google.appengine.ext.webapp.mail_handlers import InboundMailHandler
from google.appengine.api import urlfetch
import webapp2
(function() {
var events = ["load", "error"];
events.forEach(function(type) {
document.addEventListener(type, function(e) {
console.log('[Event] ' + type, e.target);
}, true);
});
})();
@cramforce
cramforce / merged-branches.sh
Created September 15, 2016 19:41
Find local git branches with a closed GitHub PR
#!/bin/bash
# Outputs commands to delete local branches that have an
# associated merged (really closed) PR.
# In particular, this also works if the remote branch was
# before merging rebased remotely.
# BIG CAVEAT: This will report branches that have a closed,
# but not merged PR for deletion.
@cramforce
cramforce / dig.txt
Created September 6, 2017 16:06
dig foo.cdn.ampproject.org
dig foo.cdn.ampproject.org
@cramforce
cramforce / es6-modules-and-bundling.md
Last active May 29, 2017 10:08
ES6 modules and bundling

Status quo

Current ES6 module usage (and general JS usage) in the browser relies on transpilation (due to non-widepread support in browsers) and bundling (to limit HTTP request count and HTTP waterfalls) for performance (module count easily goes into the 1000s which even with HTTP2 cannot be efficiently loaded in a module-per-request strategy; even when using Push to avoid HTTP waterfalls).

Bundling strategies

The bundlers use 2 large classes of strategies to bring N modules into a single JS file:

  1. (require.js, browserify, webpack): Each module gets put into a function that can be addressed by name. There is typically an export object per module where all exports are properties of that object.
  2. (closure compiler, rollup): Modules get compiled away and exported symbols become essentially global variables (at least within compilation unit) and directly accessed by other modules.
@cramforce
cramforce / on-idle.js
Created December 7, 2016 16:49
Wrapper around requestIdleCallback to wait for a minimum work budget
/**
* Delays calling the given function until the browser is notifying us
* about a certain minimum budget or the timeout is reached.
* @param {!Window} win
* @param {number} startTime When we started waiting for idle.
* @param {number} minimumTimeRemaining Minimum number of millis idle
* budget for callback to fire.
* @param {number} timeout in millis for callback to fire.
* @param {function()} fn Callback.
*/
@cramforce
cramforce / no-efficient-feature-detection.md
Created June 23, 2016 22:51
Things that cannot be feature detected efficiently
  • Supported allow- values in iframe sandbox attribute.
var sessions = [].map.call($$('tr[dir]'), function(row, i) {
if (i < 6) {
return;
}
row = [].map.call(row.children, function(td) {
return td.textContent;
});
var s = [{},{}];
s[0].time = row[1]
s[0].speaker = row[5]
@cramforce
cramforce / de.json
Created August 29, 2011 19:39
lang.json
{
"locale": "de",
"text": {
"#authors": [
{
"name": "Malte Ubl",
"screen-name": "cramforce"
}
],
"tweet": {
@cramforce
cramforce / gist:3431703
Created August 23, 2012 03:04
speaker-apps-script.js
var COLS = {
name: 0,
title: 11,
summary: 12,
imageSrc: 10
};
var TEMPLATE = '---\n\
layout: main\n\