Show enters and exits. Hide enters and exits.
| 00:05:54 | wayneeseguin | evan: http://rvm.beginrescueend.com/benchmarks/2010-02-02/ |
| 00:06:03 | evan | UPDATES! |
| 00:06:20 | wayneeseguin | sortof |
| 00:06:24 | wayneeseguin | The summaries are accurate but |
| 00:06:30 | wayneeseguin | the individual reports got borked |
| 00:06:38 | wayneeseguin | so I have to track down a logical bug in the code |
| 00:06:45 | wayneeseguin | might use it as an opportunity to refactor ;) |
| 00:07:03 | wayneeseguin | Also, the pathname wouldn't run under any ruby but MRI |
| 00:07:11 | wayneeseguin | whereas it ran before |
| 00:07:14 | wayneeseguin | 2/pathname |
| 00:07:22 | evan | huh? |
| 00:07:27 | evan | oh, the pathname one? really? |
| 00:07:29 | wayneeseguin | tiers/2/pathname |
| 00:07:30 | wayneeseguin | yeah |
| 00:07:30 | evan | what did everyone do? |
| 00:07:38 | wayneeseguin | I nuked it for this run so that it would complete |
| 01:27:04 | brixen | trying to figure out why mocks are broken is such a pita |
| 01:27:36 | brixen | works on 1.8.6, breaks on 1.8.7 |
| 01:27:43 | burkelibbey | that's like 50% of my day job >_< |
| 01:33:59 | brixen | ooohh hmm |
| 01:34:38 | brixen | mutable state is hard, let's go do haskell |
| 01:34:49 | evan | wooo! |
| 01:34:52 | brixen | heh |
| 01:34:54 | burkelibbey | yeah, that'll be much easier. |
| 01:34:57 | evan | thunk trunk trunk |
| 01:35:11 | evan | thunk trunk think thunk tank. |
| 01:35:23 | brixen | me thinks my mock's be out of sync |
| 01:37:34 | burkelibbey | So I'm trying to build rubinius from source. I run rake or rake build, and it complains about ext/digest/sha1/sha1. So then I run rake extensions, and rake build again, and I get dyld: Symbol not found: _capi_get_constant. How do I fix that? |
| 01:37:53 | brixen | are you building with 1.8.7? |
| 01:38:11 | burkelibbey | 1.9.1. do I need to use 1.8.7? |
| 01:38:14 | brixen | yes |
| 01:38:16 | burkelibbey | ok, thanks |
| 01:38:45 | brixen | http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/27522 |
| 01:39:12 | brixen | we'll fix the build for 1.9 eventually, but rvm makes it so deliciously easy to build, there's not much incentive atm |
| 01:39:22 | wayneeseguin | w00t |
| 01:39:22 | brixen | in fact, you can just use rvm to build rbx |
| 01:39:31 | brixen | wayneeseguin: :D |
| 01:39:37 | wayneeseguin | intends on keeping it that way ;) |
| 01:39:38 | wayneeseguin | ::grin:: |
| 01:39:41 | brixen | heh |
| 01:39:48 | brixen | be my guest :) |
| 01:39:52 | burkelibbey | three cheers for rvm? It's nice having 11 versions installed just in case :) |
| 01:40:03 | brixen | why stop at 11? |
| 01:40:06 | wayneeseguin | 11?! lol |
| 01:40:09 | brixen | heh |
| 01:40:23 | wayneeseguin | oh wait |
| 01:40:25 | wayneeseguin | I have 15 |
| 01:40:26 | wayneeseguin | nm |
| 01:40:28 | burkelibbey | haha! |
| 01:40:29 | wayneeseguin | can't talk |
| 01:41:04 | evan | ok! |
| 01:41:13 | evan | i've fixed the resolv specs to NOT depend on DNS anymore |
| 01:41:23 | brixen | oh sweet |
| 01:41:45 | evan | why might you ask? because i'm at a coffee shop that has a DNS server that seems to just not respond to queries it can't answer |
| 01:41:53 | evan | and thusly rake takes 220s |
| 01:42:03 | wayneeseguin | w00t |
| 01:42:07 | evan | Resolv has this built right in |
| 01:42:16 | evan | you can pass it the resolver objects to use |
| 01:42:18 | wayneeseguin | it's amazing how certain optimizations come about ;) |
| 01:42:30 | evan | so I only use Hosts (from /etc/hosts) or none |
| 01:45:15 | boyscout | Add Module#append_features spec for cyclic includes - c91a7a9 - Evan Phoenix |
| 01:45:15 | boyscout | Detect cyclic includes properly. Fixes #33. - ba1e1ff - Evan Phoenix |
| 01:45:15 | boyscout | Fix Resolv specs to not depend on DNS - 6eb3b43 - Evan Phoenix |
| 01:49:35 | boyscout | CI: rubinius: 6eb3b43 successful: 3041 files, 11836 examples, 36111 expectations, 0 failures, 0 errors |
| 02:20:26 | burkelibbey | If you had to describe rubinius in just one unicode character, which would you use? |
| 02:21:07 | burkelibbey | So far, I've arbitrarily chosen ☃, because snowman is awesome. |
| 02:21:26 | evan | snowman is good. |
| 02:21:32 | evan | esp. since my domain is fallingsnow.net |
| 02:21:36 | burkelibbey | done. |
| 02:21:46 | evan | if you want, i can get you ☃@fallingsnow.net |
| 02:22:00 | burkelibbey | ahaha, that's awesome. |
| 02:22:18 | evan | i wonder if exim4 supports unicode usernames... |
| 02:22:25 | burkelibbey | I have my terminal set up to show me a little graphic describing which ruby version I'm using: http://grab.by/26hX |
| 02:22:36 | burkelibbey | it's incredibly handy. |
| 02:23:13 | evan | thats awesome. |
| 02:23:30 | evan | you should get wayneeseguin to embed that into rvm |
| 02:23:46 | burkelibbey | hmm, that would be cool. |
| 02:23:55 | evan | PROMPT="$(rvm --prompt-char) >>" |
| 02:23:58 | burkelibbey | rather than having to write ugly stuff to parse rvm info |
| 02:24:18 | wayneeseguin | sexy, I'm game |
| 02:24:21 | wayneeseguin | it's short |
| 02:24:22 | wayneeseguin | <3 short |
| 02:24:29 | evan | i'm honored for rubinius the unicode snowman |
| 02:24:36 | evan | it is with great pride that I accept this award |
| 02:24:39 | burkelibbey | haha |
| 02:25:36 | wayneeseguin | dunno I'd probably go with ying-yang for that ;) |
| 02:25:54 | burkelibbey | I considered that too. |
| 02:25:54 | wayneeseguin | burkelibbey: I like the idea a lot so if you're game I'm game :) |
| 02:26:06 | wayneeseguin | or maybe the nuclear symbol ;) |
| 02:26:56 | evan | :) |
| 02:27:20 | evan | unicode snowman does well to exemplify the playful tone I try to keep up in here |
| 02:27:56 | burkelibbey | waynseeseguin: yeah, sure. my incredibly horrible shellscript is at http://github.com/burke/dotfiles/blob/master/.config.d/zsh/ruby.zsh |
| 02:28:08 | burkelibbey | there's essentially nothing to what I did. |
| 02:28:43 | burkelibbey | I'll look at the rvm source :) |
| 02:28:47 | evan | it's more fun to have it builtin :) |
| 02:29:03 | wayneeseguin | burkelibbey: I hang out in #rvm when you're ready :) |
| 02:29:13 | burkelibbey | k |
| 02:29:25 | wayneeseguin | Hopefully the 4.6K lines of bash don't make your eyes glaze ;) |
| 02:29:35 | wayneeseguin | gets that reaction a lot |
| 02:29:48 | burkelibbey | haha |
| 02:29:54 | evan | wayneeseguin: don't listen to them. |
| 02:29:57 | evan | keep up the good work. |
| 02:30:06 | wayneeseguin | evan: Thank you |
| 02:30:17 | evan | bash is like empire credits in scifi |
| 02:30:26 | evan | everyone dislikes them, but everyone takes them anyway. |
| 02:30:26 | wayneeseguin | I do get a LOT of criticism for not doing it in Ruby |
| 02:30:41 | wayneeseguin | which would deny a lot of my reasons for doing it in bash ;) |
| 02:31:51 | wayneeseguin | I have to say, it's been quite a challenge and good |
| 02:32:03 | evan | people tell me that about C++ too |
| 02:32:04 | wayneeseguin | That Monty guy from MagLev is a real treasure to work with |
| 02:32:08 | evan | i just keep going. |
| 02:32:19 | wayneeseguin | Yes! It's all about using the best tool for the job. |
| 02:32:29 | burkelibbey | So how about rvm-prompt --single-char or something? |
| 02:32:37 | evan | sounds good |
| 02:32:40 | evan | perhaps |
| 02:32:44 | evan | --unicode |
| 02:32:54 | burkelibbey | shorter. Shorter is good :) |
| 02:33:00 | wayneeseguin | burkelibbey: I'm thinking yours can be default ;) |
| 02:33:08 | wayneeseguin | and --verbose for the other maybe |
| 02:33:10 | burkelibbey | heh k |
| 02:33:13 | evan | then you can have --single-char be stuff like [6,7,8,x] |
| 02:33:22 | evan | ie, unicode and ascii versions |
| 02:34:53 | burkelibbey | yeah |
| 02:53:16 | burkelibbey | http://github.com/burke/rvm/commit/ad046cd84c2fb8a7e3a6aa0e748154178c61833c |
| 02:54:03 | maharg | see |
| 02:54:11 | maharg | any language where "[[ x$interpreter = xree ]]" is standard practice |
| 02:54:13 | maharg | is evil |
| 02:54:31 | burkelibbey | I agree. |
| 04:58:43 | burkelibbey | Wow. now I'm afraid. |
| 04:58:44 | burkelibbey | ~/src/rubinius/vm ✪ ❼ ▸ wc -l **/* 2>/dev/null | tail -n1 |
| 04:58:44 | burkelibbey | 790716 total |
| 04:59:18 | burkelibbey | runs back to MRI |
| 05:00:07 | brixen | haha |
| 05:00:22 | brixen | exclude vm/external_libs |
| 05:00:58 | burkelibbey | oh. ~/src/rubinius/vm ✪ ❼ ▸ wc -l **/* 2>/dev/null | tail -n1 |
| 05:00:59 | burkelibbey | 103132 total |
| 05:01:03 | burkelibbey | that's totally manageable. |
| 05:01:04 | burkelibbey | cool |
| 05:01:07 | brixen | better yet, check LOC of just .rb files :D |
| 05:01:27 | brixen | hasta pronto, pdx.rb is done |
| 05:01:46 | burkelibbey | heh, half a million lines of ruby |
| 08:12:26 | evan | I hope that facebook releases Hiphop sooner rather than later. |
| 08:12:38 | evan | i'd love to compare and constract it against the Rubinius JIT. |
| 08:12:41 | evan | contrast. |
| 08:13:09 | brixen | yeah, that'd be cool |
| 08:14:09 | scoopr | I'm sure digesting it will be a thrill-ride. |
| 08:15:04 | evan | like the tilt-a-whirl |
| 08:15:06 | evan | for an hour. |
| 08:15:09 | evan | on fast. |
| 08:15:16 | evan | after eating 3 hotdogs. |
| 08:53:30 | dbussink | morning |
| 09:24:29 | slava | hi evan |
| 09:24:33 | slava | fibers eh |
| 10:03:59 | dbussink | slava: i guess he's sensitive to people daring him ;) |
| 11:55:03 | rue | Dunno how a source translator compares |
| 14:22:40 | burkelibbey | the flip-flop operator seems like such a weird misfeature. |
| 14:23:42 | slava | yeah |
| 14:30:54 | burkelibbey | wow. BEGIN too. |
| 14:31:37 | burkelibbey | I've never seen that one before. |
| 14:45:00 | rue | scoopr: Tried out Ovi Maps yet? |
| 14:48:19 | wayneeseguin | and END ! |
| 16:35:33 | burkelibbey | I fixed a few failing specs in the C API, where should I send the patch? The website says the rubinius lighthouse, but I can't create an account there.. |
| 16:36:16 | burkelibbey | http://burkelibbey.org/0001-FIXED-failing-class-variable-related-specs-in-C-API.patch anyway |
| 16:36:54 | burkelibbey | Or should I just send a pull request? |
| 16:37:29 | rue | Sure |
| 16:37:36 | rue | Or make a ticket |
| 17:26:14 | brixen | burkelibbey: please make a github issue and include your link or you format-patch in a gist |
| 17:26:35 | burkelibbey | ok, will do |
| 17:29:26 | brixen | thanks |
| 17:30:17 | burkelibbey | http://github.com/evanphx/rubinius/issuesearch?state=open&q=C+API#issue/182 |
| 17:32:11 | evan | burkelibbey: i'll commit it shortly |
| 17:32:15 | evan | just finishing up something else. |
| 17:32:26 | evan | mainly, turns out that alias_method is weird. |
| 17:32:53 | burkelibbey | Cool, thanks. I'm in no hurry. Boring meeting :( |
| 17:33:02 | evan | ha. |
| 17:33:04 | evan | sorry to hear that. |
| 17:33:38 | kronos_vano | evan, Are you about #180? |
| 17:33:50 | evan | kronos_vano: yeah |
| 17:34:07 | evan | turns out that alias doesn't just reference the same object in a different slot |
| 17:36:56 | kronos_vano | Heh. I found it when testing rubinius with 1.8.7 tests, there are also some bugs, I'll reported most of them due this week. |
| 17:37:29 | brixen | kronos_vano: please include rubyspecs with your patches unless there are already specs |
| 17:37:37 | brixen | or you are refactoring |
| 17:37:47 | brixen | and there are already specs :) |
| 17:38:41 | kronos_vano | brixen, ok! |
| 17:38:49 | brixen | thank you! |
| 17:39:02 | evan | i'm writing a spec for the alias behavior. |
| 18:07:18 | slava | yo evan |
| 18:07:23 | evan | hey slava. |
| 18:16:05 | dwaite | good morning |
| 18:17:10 | brixen | hey dwaite |
| 18:38:33 | slava | evan: how do you switch fibers? |
| 18:39:03 | evan | with the Fiber#resume method |
| 18:39:05 | evan | :) |
| 18:44:19 | slava | // Beware here, because the GC has probably run so GC pointers on the C++ stack |
| 18:44:22 | slava | // can't be accessed. |
| 18:44:34 | evan | yep. |
| 18:44:44 | evan | that should be "pointers set before this can't be accessed" |
| 18:44:46 | slava | how does it work? |
| 18:44:52 | slava | I mean, don't you mix C++ and rbx frames? |
| 18:44:59 | evan | yeah, i do. |
| 18:45:09 | slava | what happens if a fiber is suspended, and there's a C++ frame in it which references a GC pointer? |
| 18:45:57 | evan | well, it's the same as normal |
| 18:46:13 | jvoorhis | hello |
| 18:46:37 | slava | evan: I'm going to do fibers without set_context() |
| 18:46:38 | evan | if they're accessed after a call that might GC, they have to be registered |
| 18:46:44 | evan | otherwise, it's fine. |
| 18:46:52 | slava | ah, ok |
| 18:47:43 | slava | evan: do FFI calls run on the fiber's stack? |
| 18:47:49 | evan | yeah |
| 18:47:54 | slava | but its so small |
| 18:47:56 | slava | this could cause issues |
| 18:48:03 | evan | *shrug* |
| 18:48:06 | evan | it's experimental |
| 18:48:13 | evan | i don't claim to have worked out all the kinks. |
| 18:48:19 | slava | I'm going with an approach where it switches back to the main C stack for calls into C |
| 18:48:48 | evan | but then you can't suspend a one while it's doing a call to C, yes? |
| 18:48:55 | evan | so you can't call mix frames |
| 18:49:03 | evan | won't that break your callback stuff? |
| 18:49:18 | slava | well, callbacks are already funny because of continuations |
| 18:49:38 | slava | when a C callback runs, its effectively making a new green thread |
| 18:49:46 | slava | if you capture a continuation, the bottom is at the innermost call from C |
| 18:50:01 | slava | so it won't break it, no. callbacks will run in a new fiber |
| 18:50:09 | evan | oooh |
| 18:50:11 | evan | thats a great idea! |
| 18:50:18 | evan | i'll support ffi callbacks with fibers |
| 18:50:23 | evan | you're so smart. |
| 18:50:26 | evan | thats why we keep you around |
| 18:50:36 | slava | it only works if you don't have too many levels of callback nesting, though |
| 18:50:53 | evan | true |
| 18:52:04 | dbussink | burkelibbey: i wonder, did you also work in the specs to make sure your changes work ok? |
| 18:52:57 | burkelibbey | dbussink: I just made the changes because there were a few failing specs. They're no longer failing with these changes |
| 18:54:55 | dbussink | burkelibbey: ah ok, i see |
| 18:57:19 | jvoorhis | evan: check it out :) |
| 18:57:21 | jvoorhis | mod.types[:list] = Type.rec { |t| Struct(Int, Pointer(t)) } |
| 18:57:26 | jvoorhis | produces this |
| 18:57:36 | jvoorhis | %list = { i32, *%list } |
| 18:58:47 | evan | jvoorhis: nice! |
| 18:58:59 | jvoorhis | i need to mess with it a little longer, but i have structs, arrays and pointers handled now |
| 18:59:11 | jvoorhis | Type.rec doesn't do any magic |
| 18:59:33 | jvoorhis | it yields an opaque type and then refines it with the value from the block |
| 18:59:47 | evan | nice |
| 18:59:50 | jvoorhis | i haven't tried yet, but i imagine it works fine nested |
| 19:00:09 | boyscout | FIXED failing class variable-related specs in C API. - b5d1674 - Burke Libbey |
| 19:00:09 | boyscout | Remove tags for now passing specs - 35aae59 - Dirkjan Bussink |
| 19:00:17 | dbussink | burkelibbey: there you go :) |
| 19:00:29 | burkelibbey | :) |
| 19:00:59 | evan | dbussink: thanks |
| 19:01:21 | dbussink | evan: stuff like this is easy for other people to pick up :) |
| 19:01:28 | evan | :D |
| 19:04:35 | boyscout | CI: rubinius: 35aae59 successful: 3041 files, 11841 examples, 36116 expectations, 0 failures, 0 errors |
| 19:10:31 | evan | man, alias is fucking tricky. |
| 19:12:03 | jvoorhis | the keyword? |
| 19:12:21 | evan | how you actually alias a method. |
| 19:12:41 | evan | it's not as easy as taking something from one method_table and put in in another under a different name |
| 19:12:45 | evan | which is what we did before |
| 19:13:03 | evan | because the place where it was originally from has to be maintained |
| 19:13:07 | evan | otherwise super breaks. |
| 19:13:22 | jvoorhis | oh, interesting |
| 19:15:04 | rue | #180 seems straightforward, behaviourwise |
| 19:15:12 | boyscout | Implement 'w' directive for String#unpack - 6594450 - Ivan Samsonov |
| 19:15:18 | evan | rue: it's not. |
| 19:15:29 | evan | if you follow it through. |
| 19:15:55 | evan | um |
| 19:15:58 | evan | who commited that? |
| 19:16:02 | evan | because i twas already in there I thought.... |
| 19:16:21 | dbussink | evan: i did, only packing it was in |
| 19:16:24 | dbussink | evan: not unpacking it |
| 19:16:28 | jvoorhis | evan: so it does! |
| 19:16:29 | evan | mm, ok. |
| 19:16:30 | jvoorhis | class B < A; def a; super end; alias :b :a end |
| 19:16:37 | jvoorhis | B.new.b # calls A.a |
| 19:16:53 | dbussink | evan: the ber packing was actually my first contribution :) |
| 19:16:55 | jvoorhis | A#a even |
| 19:17:42 | rue | It is a full copy of the original, including the super chain |
| 19:17:57 | jvoorhis | how is the super chain represented? |
| 19:17:59 | rue | It carries the same "immutability" |
| 19:18:12 | rue | Not that it is straightforward to *implement* |
| 19:18:29 | evan | it's more complicated than that |
| 19:18:39 | evan | when you alias a method defined in a superclass |
| 19:18:43 | evan | and call the alias |
| 19:18:59 | evan | the "module the method is from" must be set to the superclass |
| 19:19:06 | evan | not the subclass, where you actually found the alias. |
| 19:19:33 | boyscout | CI: rubinius: 6594450 successful: 3041 files, 11842 examples, 36122 expectations, 0 failures, 0 errors |
| 19:19:55 | evan | so i guess it depends on your defintion of "module the method is from" |
| 19:20:19 | evan | the simple answer is the one you find the an entry in, which was what rubinius did |
| 19:20:24 | evan | ie, it made it the subclass |
| 19:20:37 | evan | if you run #180 under rbx |
| 19:20:43 | evan | you'll see it goes into an infinite loop though |
| 19:21:00 | evan | because of the complicated interaction between alias/the module the method is from/super |
| 19:22:45 | dbussink | evan: i can close this one right? http://github.com/evanphx/rubinius/issues#issue/77 |
| 19:22:58 | evan | yep. |
| 19:23:15 | dbussink | burkelibbey: you can ask evan for commit access btw |
| 19:23:32 | rue | Right, because it is not really a method, it is an alias to one |
| 19:23:54 | evan | sure |
| 19:24:03 | evan | depends on definition |
| 19:24:15 | evan | it's complicated to implement because there has to be this new check in the method lookup logic |
| 19:24:23 | evan | to detect an alias and handle it differently |
| 19:24:30 | rue | Right |
| 19:25:08 | evan | and before we have first class method_tables |
| 19:25:14 | evan | it's possible to do |
| 19:25:19 | evan | @method_table.lookup(name) |
| 19:25:29 | evan | and get a Bucket that has an Alias object for it's method |
| 19:25:46 | evan | which complicates logic that manipulate method_tables |
| 19:32:30 | dbussink | evan: i think stuff like this fine, right: http://gist.github.com/287185 |
| 19:32:48 | evan | it's already in |
| 19:32:52 | evan | i pushed it last night |
| 19:33:09 | evan | did the ticket not close automatically? |
| 19:33:34 | dbussink | evan: hmm, then it probably wasn't pushed properly |
| 19:33:39 | dbussink | evan: since i don't see it here |
| 19:33:42 | dbussink | just did a pull |
| 19:33:50 | kronos_vano | I'm too. |
| 19:34:31 | dbussink | evan: that could also explain your confusion with the ber decompression, if you though you pushed it too |
| 19:35:08 | evan | hrm |
| 19:35:13 | evan | i'll bet i forgot to push. |
| 19:35:19 | kronos_vano | ))) |
| 19:35:20 | evan | yeah |
| 19:35:20 | evan | crap. |
| 19:35:21 | evan | fuck. |
| 19:35:26 | evan | now i'll have a big conflict |
| 19:35:30 | evan | dbussink: please wait. |
| 19:36:18 | dbussink | evan: ok, won't do anything |
| 19:51:04 | dbussink | evan: big conflicts? |
| 19:51:11 | dbussink | kronos_vano: flaky internet? |
| 19:51:21 | kronos_vano | dbussink, very :( |
| 19:54:14 | kronos_vano | oh, I found new bug. But first Lost, then patch :) |
| 20:06:26 | evan | alias macrib="echo 'The McRib is back!'"; macirb" |
| 20:07:02 | burkelibbey | I made some more specs pass. Should I submit another patch, or can I have commit access? |
| 20:07:12 | burkelibbey | boring day at work :P |
| 20:07:43 | evan | all the better for us! |
| 20:09:11 | dbussink | burkelibbey: maybe get a more interesting job, although that would be bad for us then ;) |
| 20:09:49 | burkelibbey | dbussink: heh, it's plenty interesting, but our sprint is over today, so I have essentially nothing to do until our next sprint planning meeting tomorrow morning. |
| 20:09:52 | burkelibbey | oh, SCRUM. |
| 20:16:05 | dbussink | burkelibbey: evan is the only one who can give you access btw |
| 20:16:18 | burkelibbey | k |
| 20:16:19 | evan | THE POWER |
| 20:16:22 | evan | FEEL THE POWER |
| 20:16:27 | burkelibbey | heh |
| 20:16:32 | dbussink | i bow for your might |
| 20:17:07 | evan | flexs and reality bends around him |
| 20:18:02 | burkelibbey | well, this fixes 4 or 5 specs in :language : http://gist.github.com/293983 |
| 20:18:33 | burkelibbey | I couldn't think of any better way to handle that |
| 20:26:31 | evan | burkelibbey: hm, thats probably ok. |
| 23:29:04 | burkelibbey | I'm pretty sure I found the coolest thing ever: http://www.etsy.com/view_listing.php?listing_id=39945774 </OT> |
| 23:34:03 | brixen | sweet |
| 23:38:45 | BrianRice-work | ah, too bad that won't work with a black macbook |
| 23:39:34 | BrianRice-work | maybe this: http://www.etsy.com/view_listing.php?listing_id=39713297 |
| 23:48:51 | burkelibbey | yeah that was a close runner-up for me |