Show enters and exits. Hide enters and exits.
| 00:07:06 | jakedouglas | can a CallFrame get moved? |
| 00:28:08 | jakedouglas | it looks like it blows up when it's trying to mark the fiber->value() field |
| 00:28:21 | jakedouglas | not sure how it gets messed up tho |
| 00:28:24 | slava | call frames don't move in rbx iirc |
| 00:28:42 | slava | when would they? stacks are not allocated in the GC heap or anything |
| 00:28:54 | jakedouglas | yea i think i figured out that it's not related to the call frame. gdb was giving me a weird backtrace, i think its full of shit |
| 00:29:49 | jakedouglas | no idea. i'm not a VM genius or i wouldnt be asking stupid questions |
| 00:36:38 | jakedouglas | it indicates an accessor method in the backtrace in the 3rd frame but the method just returns a variable. i supposed its nonsense |
| 00:36:49 | jakedouglas | s/method/function |
| 00:38:38 | jakedouglas | bleh. hard to tell what's going on |
| 00:40:05 | jakedouglas | bbl |
| 01:58:40 | jakedouglas | sup |
| 02:25:28 | jakedouglas | if(target->value()->reference_p()) { |
| 02:25:50 | jakedouglas | if target->value() is 0x0 how is that true |
| 02:26:44 | jakedouglas | oh |
| 02:27:33 | jakedouglas | TAG_REF is 0x0 |
| 02:29:47 | jakedouglas | why does it try to mark that |
| 03:09:25 | jakedouglas | ah |
| 03:09:28 | jakedouglas | i think i got it |
| 03:12:19 | jakedouglas | yep |
| 03:28:51 | boyscout | Fix GC crash in Fiber. send() can return 0 - don't register it with the GC. - fa02af6 - Jake Douglas |
| 03:28:51 | boyscout | Add Fiber#alive? - 39c3bb4 - Jake Douglas |
| 03:55:44 | boyscout | CI: Commit 39c3bb4 failed. http://github.com/evanphx/rubinius/commit/39c3bb42b477582813e213d4a20538410bbcaef6 |
| 06:46:54 | boyscout | Tagged failing Fiber specs. - a64bb3f - Brian Ford |
| 06:55:29 | boyscout | CI: rubinius: a64bb3f successful: 3498 files, 14388 examples, 42166 expectations, 0 failures, 0 errors |
| 11:02:13 | mbuf | I have been able to compile rubinius-1.0.1, but, how do I byte-compile a .rb file? |
| 11:12:36 | kronos_vano | mbuf, ruby x.rb creates x.rbc |
| 11:13:46 | mbuf | kronos_vano: ruby x.rb executes the script |
| 11:13:55 | mbuf | kronos_vano: I have bin/rbx built |
| 11:14:37 | mbuf | kronos_vano: ok, bin/rbx creates a .rbc; how do I execute the .rbc ? |
| 11:14:55 | kronos_vano | For now you cannot execute rbc without rb |
| 11:15:02 | kronos_vano | dbussink, right? |
| 11:15:57 | mbuf | kronos_vano: what do I do after creating the .rbc ? |
| 11:16:00 | mbuf | kronos_vano: or how do I use it? |
| 11:16:14 | jarib | you don't need to think about it. just execute your .rb files as normal |
| 11:16:32 | mbuf | jarib: okay |
| 11:17:17 | mbuf | jarib: kronos_vano ahh! okay; with the .rbc file, the sys times are shorter |
| 11:17:37 | kronos_vano | yep |
| 14:59:02 | Mjiig | does rubinius have AOT and/or JIT compiling? I wasn't sure from the page i read about it |
| 15:01:29 | Defiler | Yes to both |
| 15:01:59 | Defiler | AOT compilation to rubinius bytecode, runtime JIT compilation using LLVM for frequently-taken paths |
| 15:02:18 | Defiler | No AOT to native code because it is a terrible idea with Ruby |
| 15:03:34 | Mjiig | okay thanks |
| 15:03:41 | Defiler | No problem |
| 15:03:46 | Mjiig | why do you say it's a terrible idea? |
| 15:03:50 | Mjiig | just out of interest |
| 15:04:01 | Defiler | Too many methods that only get called once, at startup |
| 15:04:08 | Defiler | and too many eval situations you can't compile AOT anyway |
| 15:04:20 | Defiler | So you'd spend a lot of time compiling all the files and then need to invoke JIT anyway |
| 15:04:57 | Mjiig | i see, i always wondered why no one had tried to compile ruby to machine code |
| 15:05:01 | Mjiig | thanks |
| 15:05:24 | Defiler | You can do it, you just need the information that is only available at runtime to do it well. |
| 15:05:47 | Mjiig | what sort of information? |
| 15:06:07 | Defiler | Which methods are called how often in which order |
| 15:06:46 | Mjiig | okay |
| 15:06:46 | Defiler | For example, if 'obj' is always a String in some particular method, you can take out the checks for 'make sure it's a string' and move the alternate case into, basically, a rescue clause |
| 15:06:56 | Defiler | (this is all under the hood, speaking figuratively) |
| 15:07:34 | Mjiig | i know i just wondered |
| 15:32:45 | brixen | jakedouglas: hi |
| 15:32:50 | jakedouglas | hey. |
| 15:33:04 | brixen | did you run the specs before the last push last night? |
| 15:33:26 | jakedouglas | hmm. i believe so, why |
| 15:33:39 | brixen | there were two failures, the SyntaxError ones |
| 15:33:42 | brixen | on both linux and os x |
| 15:33:49 | brixen | I tagged them |
| 15:34:01 | jakedouglas | did I remove the tags? |
| 15:34:04 | brixen | yeah |
| 15:34:15 | brixen | so, just be sure to run the specs |
| 15:34:15 | jakedouglas | uhmmmm |
| 15:34:27 | brixen | even a clean build run before pushing isn't a bad idea |
| 15:34:34 | brixen | since we try to keep master extremely sane |
| 15:34:43 | brixen | anyway, good catch on the fix! |
| 15:34:56 | brixen | if I'd known it was 0x0 I probably could have clued you in |
| 15:35:07 | brixen | do you know what 0x0 mean from the interpreter? |
| 15:35:12 | brixen | means* |
| 15:35:13 | jakedouglas | no |
| 15:35:24 | brixen | that's how it signals an exception was raised |
| 15:35:29 | jakedouglas | oh |
| 15:35:31 | brixen | since 0x0 can never be a Ruby value |
| 15:35:39 | brixen | yeah, it's pretty slick |
| 15:35:51 | jakedouglas | hey im confused about something |
| 15:35:53 | brixen | but it means you always have to check when you call an interpreter (like send) |
| 15:36:10 | brixen | (like calling send, I should say) |
| 15:36:26 | jakedouglas | i certainly ran the fiber specs before pushing |
| 15:36:33 | jakedouglas | and only got 2 failures |
| 15:36:37 | jakedouglas | which i left tagged iirc |
| 15:36:43 | brixen | they were untagged |
| 15:36:46 | jakedouglas | so im confused where those 2 came from |
| 15:36:57 | brixen | git show c1ba71342f5 |
| 15:37:04 | brixen | that's where they came from |
| 15:37:26 | brixen | so, the SyntaxError on break and return will have to be done in the interpreter |
| 15:37:33 | brixen | not sure how evan wants to do that |
| 15:37:49 | brixen | but there's no way for the bytecode compiler/parser to know |
| 15:37:52 | brixen | in all cases |
| 15:38:01 | jakedouglas | hmm |
| 15:38:04 | jakedouglas | im pretty confused |
| 15:38:08 | brixen | the interpreter will have to know (maybe it already does) that a Fiber is active |
| 15:38:18 | brixen | and if it handles a break/return, it will have to raise |
| 15:38:27 | brixen | confused about the tags? |
| 15:38:35 | brixen | are you running this with rvm? |
| 15:38:40 | jakedouglas | i deleted the tags and ran before pushing "bin/mspec spec/ruby/core/fiber". i only had 2 failures at the time. i certainly do have the additional 2 failures you're talking about now. |
| 15:38:58 | brixen | ok, you should have *no* failures when you run rake |
| 15:39:12 | brixen | and if working on a smaller set, you should use bin/mspec ci path/to/spec |
| 15:39:20 | jakedouglas | ok. ci. ill remember |
| 15:39:21 | brixen | and you should never have failures before pushing |
| 15:39:21 | jakedouglas | thanks |
| 15:39:38 | brixen | yeah, *never* assume you have "known failures" |
| 15:39:46 | brixen | always run ci :) |
| 15:39:59 | brixen | if we had a "dev" branch, it wouldn't be a big deal |
| 15:40:12 | brixen | but we keep master sane so we can all drink the freshest coolaid |
| 15:40:14 | jakedouglas | i dont understand how those specs hadn't run and failed when i ran all the fiber ones |
| 15:40:21 | brixen | dunno |
| 15:40:26 | jakedouglas | shrug. ill just rake from now on. |
| 15:40:48 | brixen | like I said, 'rake clean; rake', is a safe thing to do before each push |
| 15:40:53 | jakedouglas | (im making such a fuss because i tried to be very sure of what i was doing, so it annoys me that i fucked it up) |
| 15:41:06 | jakedouglas | anyway |
| 15:41:11 | jakedouglas | can you clarify something else for me |
| 15:41:11 | brixen | also, if you noticed you pushed something weird, just revert, push, fix it, and push again |
| 15:41:24 | brixen | sure |
| 15:41:34 | jakedouglas | i acknowledge that using the 0x0 returned from send is a problem but |
| 15:41:44 | jakedouglas | i think the backtrace i was getting indicated that the crash was coming from |
| 15:41:56 | jakedouglas | Fiber::Info::mark which was calling auto_mark |
| 15:42:35 | jakedouglas | and by my reasoning, leaving the field in question unset should cause the same crash when that gets run |
| 15:42:43 | jakedouglas | but in my testing i couldnt get it to crash |
| 15:42:54 | spastorino | hey guys |
| 15:42:59 | spastorino | brixen: how are you? |
| 15:43:06 | brixen | gdb could have been confused with optimizations |
| 15:43:08 | brixen | spastorino: hi! |
| 15:43:12 | brixen | spastorino: good, and you? |
| 15:43:22 | jakedouglas | ok well the code still looks like it could screw it up |
| 15:43:31 | brixen | jakedouglas: but, Fiber::Info::mark may have been the first to access that field |
| 15:43:38 | spastorino | brixen: fine, looking for evan to ask some things i've talked with Carl |
| 15:43:43 | spastorino | evan: you there? |
| 15:43:47 | brixen | jakedouglas: and what you got was a sigsev at some offset from 0x0 |
| 15:44:00 | jakedouglas | is there any convention that an Object* field must be set to Qnil instead of 0x0 when it's not being used or anything? |
| 15:44:01 | brixen | jakedouglas: like 0x000...21 or something |
| 15:44:09 | brixen | *must* be |
| 15:44:17 | brixen | it can *never* be 0x0 |
| 15:44:22 | jakedouglas | ok well |
| 15:44:24 | brixen | no reference to a Ruby object can ever be 0x0 |
| 15:44:45 | brixen | that's why it's used as a sentinel value to indicate exceptional return from an interpreter |
| 15:44:52 | brixen | every ruby method returns a Ruby value |
| 15:44:55 | brixen | that's ruby semantics |
| 15:45:15 | jakedouglas | like in Fiber::create, it does not set the 'value_' field |
| 15:45:29 | jakedouglas | is that dangerous/wrong? |
| 15:45:36 | brixen | spastorino: evan is at comic con, he may be in intermittently |
| 15:45:41 | brixen | jakedouglas: le'me check |
| 15:45:53 | spastorino | brixen: ohh ok |
| 15:46:02 | brixen | jakedouglas: objects used to be init'd to Qnil in the allocator |
| 15:47:20 | jakedouglas | brixen: so "state->new_object<Fiber>(G(fiber));" would probably set all of it's Object* fields to Qnil? |
| 15:49:12 | jakedouglas | i wonder why evan sets fib->prev_ = (Fiber*)Qnil then |
| 15:50:27 | brixen | jakedouglas: vm/oop.cpp:59 clear_fields |
| 15:50:33 | brixen | had to trace that through |
| 15:51:16 | jakedouglas | ok. so in this case that would certainly set fib->value_ for instance to Qnil? |
| 15:51:42 | brixen | yes |
| 15:52:14 | brixen | at one point, we discussed not init'ing the bodies, but not sure what evan decided on that |
| 15:52:23 | brixen | jakedouglas: gotta run, but I'm working on docs after I finish pack |
| 15:52:32 | brixen | so hopefully it won't be so confusing soon :) |
| 15:52:36 | jakedouglas | ok. so it should be safe as long as i dont set it to 0x0 later |
| 15:52:39 | jakedouglas | thanks |
| 15:52:59 | brixen | yes, you must always check that you don't set a reference to 0x0 |
| 15:53:12 | jakedouglas | yup. |
| 15:53:19 | brixen | the only place you'd get a 0x0 from in normal 'rbrx' stuff is the interpreter |
| 15:53:24 | brixen | er 'rbx' |
| 15:53:30 | jakedouglas | k |
| 15:53:47 | brixen | ok, I'll be online in a bit |
| 15:53:52 | jakedouglas | k |
| 15:53:56 | brixen | jakedouglas: thanks for hammering out the Fiber stuff! :) |
| 15:54:14 | jakedouglas | certainly. Fiber#transfer is next, seems a little daunting |
| 16:11:54 | mass- | heya brixen |
| 16:42:29 | evan | brixen: how did the talk go? |
| 16:51:17 | blowmage | sweet! |
| 16:53:06 | jakedouglas | evan: what does it mean when i call a primitive and get "ArgumentError: method 'foo': given 0, expected 1". it seems inconsistent |
| 16:53:33 | evan | |Blaze||: I heard that you volunteered to do most of the development! Thanks man! |
| 16:53:59 | evan | jakedouglas: means you didn't pass in the right number of arguments |
| 16:54:12 | evan | i'll bet you're trying to use a default value in a primitive |
| 16:54:17 | jakedouglas | evan: how come sometimes i don't have to pass arguments and other times I do |
| 16:54:17 | evan | which doesn't work |
| 16:54:21 | evan | you can't do |
| 16:54:32 | jakedouglas | evan: i'm not actually. hadn't tried that yet because I saw you weren't doing it. |
| 16:54:34 | evan | def foo(a=1); Ruby.primitive :foo; ...; end |
| 16:54:50 | evan | i don't know why then |
| 16:54:54 | evan | you'd have to show me a concrete example |
| 16:55:39 | jakedouglas | irb(main):013:0> Rubinius::Fiber.new { }.resume |
| 16:55:39 | jakedouglas | => nil |
| 16:55:42 | jakedouglas | irb(main):007:0> Rubinius::Fiber.current.resume |
| 16:55:42 | jakedouglas | ArgumentError: method 'resume': given 0, expected 1 |
| 16:56:26 | jakedouglas | where does the ArgumentError come from? args.as_array(state)? |
| 16:56:32 | evan | let me see... |
| 16:56:50 | jakedouglas | i changed the code so im always calling that. |
| 16:56:54 | evan | resue takes an argument |
| 16:56:57 | evan | resume |
| 16:56:57 | evan | rather. |
| 16:57:06 | jakedouglas | okay. so how come I can sometimes call it without one? |
| 16:57:11 | jakedouglas | like in the example i showed you |
| 16:57:19 | evan | mmm |
| 16:57:57 | evan | ok, so this is a bit of a screw up. |
| 16:57:59 | evan | on my part. |
| 16:58:16 | evan | the primitive fiber_resume takes basically a splat |
| 16:58:31 | evan | it picks apart all the arguments to create the value to pass |
| 16:58:56 | evan | whats probably happening is that #resume is failing |
| 16:59:06 | evan | because prev isn't nil or it's the root fiber |
| 16:59:17 | jakedouglas | why does that default to ArgumentError? |
| 16:59:19 | evan | in your above example, the root fiber in the 2nd example |
| 16:59:27 | evan | because it fails back to the ruby code |
| 16:59:32 | evan | which runs the argument handling |
| 16:59:37 | jakedouglas | ah, i understand. |
| 16:59:47 | evan | and says "oh, I'm defined to take one argument, but none were passed, raise ArgumentError" |
| 17:00:06 | evan | the primitive runs before any argument checking is done by the normal interpreter |
| 17:00:11 | jakedouglas | got it |
| 17:00:18 | evan | if the primitive fails, then the normal checking runs |
| 17:00:21 | jakedouglas | thanks. ill add the proper business there eventually to keep that from happening. |
| 17:00:28 | evan | so if you change line 22 to 'def resume(*args)' |
| 17:00:30 | evan | it will work fine. |
| 17:01:05 | jakedouglas | and by 'work fine' you mean it'll hit the 'raise PrimitiveFailure' |
| 17:01:10 | evan | yep |
| 17:01:13 | jakedouglas | k. |
| 17:02:39 | jakedouglas | amusingly, i just implemented #transfer on a guess and it seems to mostly work |
| 17:06:42 | evan | :) |
| 17:08:10 | jakedouglas | i added a 'root_fiber' to the VM object, make sure it's set during the lazy initialization of Fiber::current, and i set prev to that before doing the swapcontext. is that the correct approach? |
| 17:35:29 | jakedouglas | when send() returns a 0 indicating an exception, how do i get that exception and raise it? |
| 18:41:18 | brixen | jakedouglas: you either have to handle the 0x0 or you return 0x0 and the interpreter above you in the call stack handles it |
| 18:42:31 | brixen | jakedouglas: eg http://github.com/brixen/rapa/blob/master/actions/rubinius/pack_code.rl#L53-54 |
| 18:43:00 | brixen | where coerce is a call to pack::integer above |
| 18:44:53 | jakedouglas | i see |
| 18:47:11 | brixen | jakedouglas: gtg, but I'll try to be around probably after lunch |
| 18:47:17 | jakedouglas | thanks |
| 18:47:21 | jakedouglas | cya |
| 18:47:24 | slava | hi brixen |
| 18:48:02 | goyox86 | brixen: hi!, how was your talk? :] |
| 18:48:27 | jakedouglas | wow |
| 18:48:45 | jakedouglas | the rest of the fiber specs pass. |
| 18:48:48 | jakedouglas | yay. |
| 18:49:17 | goyox86 | jakedouglas: sweet! |
| 18:49:40 | brixen | hey slava |
| 18:49:47 | brixen | slava: I'm headed to 137 |
| 18:49:52 | brixen | goyox86: it went well, thanks! |
| 18:49:59 | brixen | goyox86: I'll post the slides shortly |
| 18:50:07 | brixen | jakedouglas: woot! |
| 18:50:07 | slava | brixen: is there a walgreens or cvs nearby? |
| 18:50:14 | slava | brixen: my travel-size toothpaste and shampoo ran out |
| 18:50:15 | brixen | hmm, I'd have to check |
| 18:50:19 | brixen | heh |
| 18:50:28 | brixen | um, google? |
| 18:50:32 | brixen | I'm sure there is one |
| 18:50:38 | slava | if you want to accomany me on this mission, I can go to the convention center first |
| 18:50:39 | brixen | there is a whole mall just up the street |
| 18:50:50 | slava | otherwise we can meet a bit later |
| 18:51:04 | brixen | I'll be here |
| 18:51:49 | BrianRice-work | yes there's a walgreens on grant and broadway |
| 18:51:56 | BrianRice-work | (to slava) |
| 18:52:54 | BrianRice-work | I'm unsure whether it's closer than the mall, though. I'd suggest using a map lookup |
| 18:53:23 | slava | I looked on the map and it looks like the lloyd center is closest |
| 18:53:24 | slava | thanks guys |
| 18:56:25 | BrianRice-work | sure |
| 19:07:32 | e- | Is it possible to compile rubinius 1.0 or 1.0.1 from rubinius 0.9 rather than MRI 1.8.7 ? |
| 20:09:20 | jakedouglas | damnit |
| 20:09:43 | jakedouglas | argument and return value handling gets confusing in here. |
| 20:12:42 | dbussink | jakedouglas: primitive handling? |
| 20:12:57 | jakedouglas | in fibers |
| 20:14:53 | jakedouglas | that a call can get its return value from a bunch of different places is confusing to implement (for me anyway) |
| 20:17:01 | jakedouglas | brain melt |
| 20:47:17 | dbussink | any tips here on debugging ffi stuff? |
| 20:50:07 | jakedouglas | like what |
| 21:09:58 | dbussink | jakedouglas: already found the bug :) |
| 21:10:04 | jakedouglas | cool. |
| 21:16:14 | boyscout | Fix serializing Float by including proper mantissa - 6906006 - Dirkjan Bussink |
| 21:16:14 | boyscout | Remove tag for now passing Marshal#dump spec - a785e7e - Dirkjan Bussink |
| 21:16:32 | dbussink | that's it for the night :) |
| 21:16:42 | jakedouglas | heh |
| 21:16:51 | jakedouglas | i think my fiber stuff is all working correctly now. cleaning it up. |
| 21:17:20 | dbussink | jakedouglas: nite! |
| 21:17:24 | jakedouglas | cya. |
| 21:21:25 | slava | brixen: ping |
| 21:22:44 | BrianRice-work | slava, are you guys meeting up this afternoon? |
| 21:24:47 | boyscout | CI: rubinius: a785e7e successful: 3498 files, 14389 examples, 42167 expectations, 0 failures, 0 errors |
| 21:30:50 | slava | BrianRice-work: probably |
| 21:31:07 | BrianRice-work | hm, I'd like to join, I suppose. if I can arrange it |
| 21:31:15 | slava | sure |
| 21:32:38 | slava | dan's back in irvine and joe's got another engagement |
| 21:32:50 | goyox86 | slava,brixen: did you accomplished the "shampoo/toothpaste" mission? :D |
| 21:32:55 | slava | yes |
| 21:33:26 | BrianRice-work | yeah the guys at the office are talking about seeing joe groff |
| 21:33:39 | BrianRice-work | so, I guess I already know about that engagement? |
| 21:33:58 | slava | I'm going to meet brixen at the convention center right now |
| 21:34:02 | BrianRice-work | but care less about that than about language/vm topics |
| 21:34:23 | slava | can you msg me your phone number? |
| 21:34:26 | BrianRice-work | ok. well both of you have my cel#. |
| 21:34:28 | BrianRice-work | oh |
| 21:34:30 | slava | I don't |
| 21:34:41 | slava | thanks |
| 21:34:45 | slava | what time do you finish work? |
| 21:35:31 | BrianRice-work | whenever I say so, if the reason is good enough. I'd just need to clock in later from home to finish some things |
| 21:36:14 | slava | ok well I'll call you soon then |
| 21:36:18 | slava | gotta go now though |
| 21:36:26 | BrianRice-work | cya |
| 21:44:51 | BrianRice-work | they'll want me out of the office anyway due to the coughing :P |
| 21:55:16 | boyscout | Implement Fiber#transfer and other fiber cleanup - 77d214c - Jake Douglas |
| 21:55:16 | boyscout | Enable :fiber_library feature in mspec and remove some tags for fiber specs - 36dca3c - Jake Douglas |
| 21:55:18 | jakedouglas | crosses fingers |
| 22:08:00 | boyscout | CI: rubinius: 36dca3c successful: 3498 files, 14391 examples, 42169 expectations, 0 failures, 0 errors |
| 22:08:06 | jakedouglas | yay! |
| 22:16:37 | dwaite | finally, I've been hoping rubinius would make this change for a while |
| 22:16:44 | dwaite | it looks like it is finally adding more Fiber |
| 22:16:46 | dwaite | :) |
| 22:17:01 | jakedouglas | lol |
| 22:18:34 | dwaite | things that make me wish this was not a java-based web application |
| 22:19:03 | dwaite | rather than reporting some sort of nice well-formedness error, a bad XHTML page gives me a server-side NullPointerException, without ever serving up said page's contents |
| 22:19:27 | dwaite | first time that took me nearly a day to figure out. Now I just break out xmllint |
| 22:21:31 | dwaite | but boy, you'd think that would be something they would find in testing. Or in everyday use |
| 23:52:22 | boyscout | Fix Fiber style and GC issue, tag failing specs. - df9f746 - Evan Phoenix |
| 23:52:57 | evan | jakedouglas: you still around? |
| 23:53:13 | slava | hi evan |
| 23:53:19 | slava | brixen is sitting right next to me |
| 23:53:33 | slava | anything I should do to him? :) |
| 23:53:36 | evan | hello brixen-via-slava |
| 23:55:51 | brixen | hi evan! |
| 23:55:52 | slava | <brixen>hi evan</brixen> |
| 23:55:58 | evan | nhah |
| 23:56:00 | evan | hah |
| 23:56:21 | brixen | evan: Factor just met Perl here |
| 23:56:30 | brixen | because slava is changing his name to Factor |
| 23:56:40 | slava | I'll have to grow that neckbeard out first |
| 23:57:14 | evan | haha |
| 23:57:16 | evan | who is Perl? |
| 23:57:22 | brixen | oh man, neckbeards are so in style at oscon |
| 23:57:26 | brixen | almost scary |
| 23:57:34 | brixen | Perl is a local perl programmer |
| 23:57:40 | brixen | eric wilhem |
| 23:57:42 | brixen | :) |
| 23:58:09 | evan | ah. |
| 23:58:12 | brixen | the joke part is that I introduced slava as "this is Factor" |
| 23:58:17 | brixen | um... oops :) |
| 23:58:19 | evan | aaah |
| 23:58:20 | evan | hehe |