Skip to content

Instantly share code, notes, and snippets.

@ryandotsmith
ryandotsmith / file.rb
Created July 2, 2010 16:19
prototype of a search engine i built for GS Enterprises
require 'extensions/all'
class String
def peel()
return nil if self.length.zero?
self.strip
end
end
class Seeker
attr_accessor :origin, :destination, :includes, :query
@ryandotsmith
ryandotsmith / sum_benchmark.rb
Created August 6, 2010 05:09
ruby #inject vs. #sum
data = (1..1_000).to_a
measure "sum" do
data.sum { |n| n }
end
measure "inject" do
data.inject(0) { |sum, element| sum + element}
end
@ryandotsmith
ryandotsmith / .screenrc
Created October 28, 2010 04:25
screenrc file
# copied from @solidsnack
nethack on
vbell on
defutf8 on
defscrollback 16384
backtick 1 1 1 date -u +%Y-%m-%dT%TZ
logtstamp on
(ns sicp
(:use clojure.test))
(defn square [num] (* num num))
(defn sum-of-squares [x y] (+ (square x) (square y)))
; assume x != y != z
(defn sum-of-larger-squares [x y z]
(cond
(and (< x y) (< x z));x is the smallest
(sum-of-squares y z)
@ryandotsmith
ryandotsmith / abba.js
Created November 23, 2010 05:50
simple palindrome function in JS
var palindrome = function(center){
var first = center.slice(0,1);
var last = center.slice(-1);
var mid = center.slice(1,-1);
if(mid == "") { print("true"); return;}
if(first == last) { palindrome(mid); }
else { print("false"); }
@ryandotsmith
ryandotsmith / lock_head.sql
Created April 2, 2011 06:17
lock_head with ctids
CREATE OR REPLACE FUNCTION lock_head() RETURNS SETOF jobs AS $$
DECLARE
unlocked integer;
job jobs%rowtype;
BEGIN
SELECT id INTO unlocked
FROM jobs
@ryandotsmith
ryandotsmith / out.sql
Created July 6, 2011 04:24
explain analyze on lock_head()
QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------
Limit (cost=21.03..21.04 rows=1 width=10) (actual time=0.063..0.063 rows=1 loops=1)
-> LockRows (cost=21.03..21.11 rows=6 width=10) (actual time=0.062..0.062 rows=1 loops=1)
-> Sort (cost=21.03..21.05 rows=6 width=10) (actual time=0.046..0.046 rows=1 loops=1)
Sort Key: id
Sort Method: quicksort Memory: 25kB
-> Seq Scan on queue_classic_jobs (cost=0.00..21.00 rows=6 width=10) (actual time=0.035..0.036 rows=1 loops=1)
Filter: (locked_at IS NULL)
Total runtime: 0.105 ms
@ryandotsmith
ryandotsmith / memstat.rb
Created July 29, 2011 05:04
I am using this to profile my workers (queue_classic)
module Memstat
extend self
def puts
"memory=#{real_mem_size} ruby_objects=#{num_objects}"
end
def real_mem_size
mb = `ps -o rsz #{$$}`.split("\n")[1].to_f / 1024.0
mb = mb.round(-2) # nearest 100 (i.e. 60.round(-2) == 100)
@ryandotsmith
ryandotsmith / worker.rb
Created August 19, 2011 17:03
A worker that forks
module QC
class Worker
MAX_LOCK_ATTEMPTS = ENV["QC_MAX_LOCK_ATTEMPTS"] || 5
def initialize
@running = true
@queue = QC::Queue.new(ENV["QUEUE"])
handle_signals
end
@ryandotsmith
ryandotsmith / exp_backoff.rb
Created August 21, 2011 04:48
2 different approaches to locking jobs in queue_classic
def lock_job
attempts = 0
job = nil
until job
job = @queue.dequeue
if job.nil?
attempts += 1
if attempts < MAX_LOCK_ATTEMPTS
sleep(2**attempts)
next