Skip to content

Instantly share code, notes, and snippets.

@cmcaine
cmcaine / swap
Last active October 13, 2016 00:48
Swap two files reasonably safely
#!/bin/sh
# Swap two files safely.
#
# Under normal circumstances, just do the right thing. Under unusual
# circumstances, give a reasonably helpful error message.
#
# This was an exercise in thinking about how generally reliable functions might
# fail and what to communicate to users.
#
# Copyright Colin Caine. License: GPLv2

Keybase proof

I hereby claim:

  • I am cmcaine on github.
  • I am cmcaine (https://keybase.io/cmcaine) on keybase.
  • I have a public key ASCOMPSgeIAYH7NhsSc63AVMLrYu0yfC81zQa2aR21iungo

To claim this, I am signing this object:

@cmcaine
cmcaine / defaultlang.js
Created March 23, 2017 21:59
Set default language to "en"
// ==UserScript==
// @name Default language = en
// @namespace cmcaine
// @version 1
// @grant none
// ==/UserScript==
// So hyphens work better.
if (window.document.documentElement.lang == "") {
@cmcaine
cmcaine / justify-and-hyphenate.css
Last active March 23, 2017 22:38
Justify and hyphenate the web
p,ul,ol,dl,
div.thumbcaption /* wikipedia */ {
text-align: justify !important;
hyphens: auto !important;
}
@cmcaine
cmcaine / einsum-efficiency-problem.ipynb
Last active June 5, 2017 17:01
einsum-efficiency-problem.ipynb
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
@cmcaine
cmcaine / cruftless-webext-messaging.ts
Last active May 16, 2018 13:05
Is this as little cruft as possible?
/**
* Class C is loaded in two contexts: content and background. The decorators
* @content and @background replace the decorated function with a call to a
* messaging library if the current context is not the desired context for the
* function.
*
* The intention is that a developer can write code that is split between the
* content and background without having to think too much about where it is:
* calls that pass through messaging just look like regular async function
* calls.
using Base64: base64encode
# From Base64 but copied here for readability
const BASE64_ENCODE = [UInt8(x) for x in ['A':'Z'; 'a':'z'; '0':'9'; '+'; '/']]
encode(x::UInt8) = @inbounds return BASE64_ENCODE[(x & 0x3f) + 1]
encodepadding() = UInt8('=')
"""
Spec:
@cmcaine
cmcaine / MultipleLinearRegressionDemo.jl
Last active January 18, 2020 19:52
Simpler Flux demos
"""
Learn a linear model for a linear relationship of three variables
"""
module MultipleLinearRegressionDemo
using Flux: gradient, params
using Statistics: mean
function linreg(X, Y)
using Combinatorics
using Random
couples = 1:8
possible_groups = combinations(couples, 3)
function doit(couples, possible_groups)
has_not_met = [couple => setdiff(couples, couple) for couple in couples]
selected_groups = []
@cmcaine
cmcaine / alphametics.jl
Last active November 15, 2021 10:57
Brute force solver for alphametics
# See also https://github.com/exercism/julia/blob/3e57ea81abbff1882b263eb414fb0e453b07a17e/exercises/practice/alphametics/.meta/example.jl
using Combinatorics: permutations
using Test
function sum_expr(exprs)
if length(exprs) == 1
return only(exprs)
else