Skip to content

Instantly share code, notes, and snippets.

@hraban
hraban / rinker.sh
Last active June 1, 2018 19:39
Fork of Easydns dyndns update script
#!/bin/bash
set -eu -o pipefail
#################################################################
## ChangeIP.com bash update script ##
#################################################################
## Written 3/18/09 by Tom Rinker, released to the Public Domain##
#################################################################
## This is a simple bash script to preform a dDNS update with ##
/* Open the .celtx file in an editor, look for the bit between <html> and </html>, put it in a new file (filename ending in .html), add this bit between one of the <style> and </style> tags. Open in a webbrowser, click print. */
body {
font-family: monospace;
font-size: 13pt;
line-height: 1.4em;
width: 190mm;
margin: 0;
padding: 1em;
@hraban
hraban / .nvmrc
Last active September 24, 2018 17:38
exploring signal handling in bash scripts, subshells and pipelines
8
@hraban
hraban / main.js
Created November 22, 2018 17:26
child process interruption and signal control
const child_process = require('child_process');
const process = require('process');
process.on('SIGINT', () => console.log("ooh this is sigint"));
process.on('SIGUSR1', () => console.log("oh this is sigusr1!!"));
function block4ever() {
setTimeout(() => {} , 1000000);
}
@hraban
hraban / workspace.sh
Created January 6, 2019 00:17 — forked from dixson3/workspace.sh
Create and manage a case-sensitive disk-image on OSX. This is great when you have a need to work with case-sensitive repos on a mac.
#!/bin/bash
set -eu -o pipefail
${DEBUGSH+set -x}
# where to store the sparse-image
NAME=civol
SPARSELOC=~/Documents/$NAME.dmg
FSTYPE="APFS"
@hraban
hraban / leanxml.js
Last active October 7, 2019 14:26
Lean XML DOM builder compatible with TypeScript's jsxFactory for Reactless .tsx files
/**
* Leanxml Runtime: lean TS jsxFactory runner for creating XML doms.
*
* N.B.: Doesn’t work on tagnames with uppercase first letter!
*/
const xmldom = require('xmldom');
function leanxml(tagname, attrs, ...children) {
return function leanxmlBuilder(doc) {
@hraban
hraban / interleave.js
Last active June 10, 2019 19:13
Interleaving two arrays in Javascript (using iterators & generators)
/**
* interleave([1,2], [8,7,6,5], [], 'abc')
* => [ 1, 8, 'a', 2, 7, 'b', 6, 'c', 5 ]
*/
function* interleave() {
const its = Array.from(arguments).map(x => x[Symbol.iterator]());
let done;
do {
done = true;
for (const it of its) {
@hraban
hraban / bash log
Last active August 9, 2019 10:40
Nice new Git feature: detect folder moves
$ cd /tmp
$ mkdir test
$ cd test
$ git init
Initialized empty Git repository in /private/tmp/test/.git/
$ git commit --allow-empty -m root
[master (root-commit) 6814cc9] root
$ mkdir foo
$ echo a > foo/a
$ git add foo
@hraban
hraban / index.css
Created November 21, 2019 10:52
halftone qr codes (backup of Lachlan Arthur's at http://jsfiddle.net/lachlan/r8qWV/ )
html, body {
height: 100%;
margin: 0;
}
body {
position: relative;
}
h1, h2 {
@hraban
hraban / dialog.html
Last active December 1, 2019 22:19 — forked from coinsandsteeldev/dialog.html
Google Sheets script to allow multi-select in cells with data-validation (adapted from https://www.youtube.com/watch?v=dm4z9l26O0I)
<!DOCTYPE html>
<html>
<head>
<script>
// https://github.com/reaxis/mu
(function(d){"object"===typeof exports?module.exports=d():"function"===typeof define&&define.amd?define(d):mu=µ=d()})(function(){function d(){}function m(a){return a.replace(/-(.)/g,function(a,c){return c.toUpperCase()})}function k(a){return"[object Array]"==={}.toString.call(a)}function g(a){return[].slice.call(a)}d.one=function(a){return document.querySelector(a)};d.all=function(a){return g(document.querySelectorAll(a))};d.create=function(a){return document.createElement(a)};var h={one:function(a){return this.querySelector(a)},all:function(a){return g(this.querySelectorAll(a))},each:function(a){a.bind(this)(0);return this},"µAddEventListener":Node.prototype.addEventListener,addEventListener:function(){this.µEventCache=this.µEventCache||[];this.µEventCache.push(arguments);this.µAddEventListener.apply(this,arguments)},on:function(a,b){this.addEventListener(a,b);return this},add:function(){return g(arguments).reduce(function(a,b){k(b)?a.a