Skip to content

Instantly share code, notes, and snippets.

View sco's full-sized avatar

Scott Raymond sco

View GitHub Profile
@sco
sco / gist:12089
Created September 22, 2008 18:32
class Array
def weighted_random(weight_method=:weight)
return nil if empty? # return nil if there's no elements
elements = sort_by { Kernel.rand } # shuffle the elements.
weights = elements.map(&weight_method) # get the weight for each element (e.g.: 5, 10, 2, 0, 1, 5).
point = Kernel.rand * weights.sum # pick a random point between zero and the sum of the weights.
elements.zip(weights).each do |e, weight| # walk through each element,
return e if weight >= point # and if its weight is >= the point, return it
point -= weight # otherwise subtract the element's weight from the point
@sco
sco / gist:12334
Created September 23, 2008 16:56
require 'timeout'
class RequestTimeout < Merb::Rack::Middleware
def initialize(app, seconds)
super(app)
@seconds = seconds
end
def deferred?(env)
@sco
sco / couchdb.yml
Created October 9, 2008 18:17
initializing couchrest in a merb app
---
development: &defaults
:url: http://0.0.0.0:5984/gathering
production: &production
<<: *defaults
:url: http://0.0.0.0:5984/gathering
@sco
sco / rack.rb
Created December 9, 2008 17:53
odds_server = Proc.new do |env|
if env['PATH_INFO'] == '/odds'
[200, {'Content-Type'=>'application/json'}, '{claim_code:"123-sdfjhsdf"}']
else
[404, {}, '']
end
end
run Rack::Cascade.new([odds_server, Merb::Rack::Application.new])
@sco
sco / jw-nav.html
Created January 31, 2009 21:37
minimal version of jacobswellchurch.org nav markup & styles
<html>
<head>
<title>JW Nav</title>
<style>
/* reset margins and padding on every element */
* { margin: 0; padding: 0; }
/* style the whole page */
require 'net/http'
require 'rubygems'
require 'json'
# Mimics the interface of RightAws::SdbInterface, using CouchDB for persistence.
#
# FS = FakeSimpleDB.new('myapp')
# FS.create_domain('mydb')
# FS.put_attributes('mydb', 'myitem', { 'Jon' => ['foo', 'bar'] })
# FS.get_attributes('mydb', 'myitem')
//
// StompService.h
// Objective-C Stomp Client
//
// Implements the Stomp Protocol v1.0, as described here: http://stomp.codehaus.org/Protocol
// Requires the AsyncSocket library: http://code.google.com/p/cocoaasyncsocket/
//
// This class is in the public domain.
// by Scott Raymond <sco@scottraymond.net>.
//
@interface CustomNavigationBar : UINavigationBar {
UIImageView *backgroundView;
}
@end
@implementation CustomNavigationBar
- (void)setBackgroundImage:(UIImage*)image {
if(image == NULL){
return;
require 'memcached'
# Provides a hybrid of memoization and memcacheing. Designed for storing an entire (small)
# table in memory, in every instance of the app. Works well for reference-type tables
# (e.g., Category) which won't ever get big or change often, but are read-heavy. This
# allows you to avoid joins, but also avoid the n+1 queries antipattern.
#
# A pure memoization solution fails when the data *does* change -- all app instances have
# to be restarted for the in-memory caches to be correct. A pure memcached solution solves
# that, but requires a largish amount of data to be retrieved from memcached for every
# Lo-fi client for the Facebook API. E.g.:
#
# fb = FacebookClient.new(:api_key => 'api-key', :secret => 'secret')
# fb.call 'users.getInfo', :session_key => 'session-key', :uids => 'user-id', :fields => 'birthday'
#
# by Scott Raymond <sco@scottraymond.net>
# Public Domain.
#
class FacebookClient
def initialize(default_params={})