Skip to content

Instantly share code, notes, and snippets.

@boronine
boronine / Run all
Created May 11, 2012 14:31
Run a list of commands (as strings) synchronously one after the other. Useful for Cakefiles
# Execute a list of commands one by one
run_all = (commands) ->
return if commands.length is 0
exec commands[0], (err, stdout, stderr) ->
console.log stdout + stderr
throw err if err
run_all commands.splice(1)
@boronine
boronine / fiddle.coffee
Created August 9, 2012 06:38
Synchronous and asynchronous form field validation using Ember.js bindings
window.App = Ember.Application.create()
App.Focusable = Ember.Mixin.create
# Don't let events spoil your Kool-Aid!
# Let's get these out of the way by turning them
# into a magical property:
focused: false
focusIn: (event) -> @set 'focused', true
focusOut: (event) -> @set 'focused', false
@boronine
boronine / generating.coffee
Created August 31, 2012 02:37
Password hashing and verifying with Node.js standard library (PBKDF2 + SHA1)
hasher {}, (err, result) ->
# Save as hex strings
user.salt = result.salt.toString 'hex'
user.key = result.key.toString 'hex'
user.save ->
postmark.send
From: "you@example.com"
To: user.email
Subject: "Thank you for signing up with Example.com"
TextBody: "Your temporary password is #{result.plaintext}"
@boronine
boronine / livefilter.js
Created September 25, 2012 22:06
Backbone collection live filtering (untested)
Backbone.Collection.prototype.liveFilter = function(attributes) {
// Make a clone of the collection instantiated with all the filtered items
var _org = this;
var _new = new this.constructor(this.where(attributes));
// What happens when you add to the original collection?
_org.on('add', function(model) {
// Unless one of the attributes doesn't match
for (key in attributes) {
if (model.get(key) !== attributes[key]) return;
}
# For a given Lightness, Hue, RGB channel, and limit (1 or 0),
# return Chroma, such that passing this chroma value will cause the
# given channel to pass the given limit.
maxChroma = (L, H) ->
hrad = H / 360 * 2 * Math.PI
sinH = Math.sin hrad
cosH = Math.cos hrad
sub1 = Math.pow(L + 16, 3) / 1560896
sub2 = if sub1 > 0.008856 then sub1 else L / 903.3
(channel) ->
class CompanyResource(ModelResource):
class Meta:
resource_name = 'companies'
api_name = 'v1'
detail_uri_name = 'domain'
queryset = Company.objects.all()
def prepend_urls(self):
return [
url(r"^(?P<resource_name>%s)/(?P<domain>[\w\d_.-]+)/$" %
self._meta.resource_name,
class MyResource(ModelResource):
# Workaround for this issue:
# https://github.com/toastdriven/django-tastypie/issues/518
def hydrate(self, bundle):
for field_name, field_obj in self.fields.items():
if field_name == 'resource_uri':
continue
if not field_obj.blank and not bundle.data.has_key(field_name):
raise ApiFieldError("The '%s' field has no data and doesn't allow a default or null value." % field_name)
return bundle
app.post '/api/verify', (req, res) ->
fail = ->
res.json status: 'failure'
if not req.body?
fail()
opts = {
host: "https://verifier.login.persona.org"
path: "/verify"
method: 'POST'
regectUnauthorized: true
// Asynchronous coding takes a bit of time to wrap your head around.
// I can't know for sure, but I think you misunderstand the general
// nature of a callback function. 'ajax.post' doesn't wait for the
// request to complete before returning, if it did so, there wouldn't
// be any need for a callback. **If you want something to happen AFTER
// the request completes, you have to put it in the callback function.**
// Don't think of a callback as some kind of icing on the cake, it is
// literally the continuation of your program's logic.
@boronine
boronine / generate-avatar.py
Created August 17, 2014 12:46
Colorful display pic with HUSL
import math
import png
from husl import *
def mix(h1, h2, t):
return h1 * t + h2 * (1 - t)
def spiral(radius, degree, number):
n = 1.0 / number