[00:07] davidjrice: ping
[00:07] davidjrice: anyone about?
[00:07] davidjrice: trying to require jquery in a node server
[00:09] gwoo: davidjrice: not gonna work to well
[00:10] gwoo: davidjrice: you might be able to do it alongside of env.js
[00:10] davidjrice: gwoo: basically just want $.map $.each
[00:11] gwoo: i would rip those out and put them into an array object
[00:11] felixge has joined the channel
[00:11] felixge has joined the channel
[00:12] gwoo: felixge: know anything about map/each from jquery in a node requirable class?
[00:12] felixge: gwoo: ?
[00:13] gwoo: some array functions
[00:13] felixge: gwoo: http://wiki.github.com/ry/node/ecma-5mozilla-features-implemented-in-v8
[00:13] brapse has joined the channel
[00:13] felixge: gwoo: does that help?
[00:13] gwoo: davidjrice: there you go
[00:13] gwoo: felixge: it sure does
[00:14] felixge: davidjrice: you back from your trip?
[00:14] davidjrice: felixge: yo, am indeed
[00:15] felixge: davidjrice: sweet. I wrote a new node.js module for the couch folks so I'll integrate that along with fab as discussed tomorrow. Does that sound good to you?
[00:15] felixge: davidjrice: how was snowboarding?
[00:16] davidjrice: felixge: it was epic
[00:17] felixge: davidjrice: I'm jealous, haven't been snowboarding all season so far :)
[00:18] gwoo: pfft, i havent been in 3yrs
[00:18] deformated has left the channel
[00:24] davidjrice: felixge: heh
[00:24] davidjrice: doit!
[00:24] felixge: will do
[00:24] davidjrice: felixge: equivalent of inArray at all?
[00:24] felixge: : )
[00:25] felixge: davidjrice: indexOf
[00:25] jan____: ohey :)
[00:27] davidjrice: jaysus
[00:27] davidjrice: (too much beer + it's late)
[00:27] davidjrice: hacking in @blaine's house :)
[00:27] jan____: davidjrice: ahahaha :D Say hi
[00:32] Tim_Smart: ACTION just had firefox crash. He is annoyed >(
[00:32] davidjrice: okay, got that working. felixge gwoo jan____ cheers :)
[00:32] gwoo: nice
[00:33] felixge: sweet
[00:34] davidjrice: felixge: does node couch work with updates?
[00:34] felixge: davidjrice: which one? My new module or the sixtus one?
[00:34] davidjrice: eh, the original one?
[00:35] davidjrice: my pair is having trouble getting the reviion to update properly
[00:36] felixge: davidjrice: it should support that, but then again - it was broken when I integrated it and I may not have fixed all remaining problems
[00:37] felixge: davidjrice: http://github.com/felixge/node-couchdb is done
[00:37] felixge: most of the docs are too
[00:37] felixge: just a tiny bit of docs left
[00:38] felixge: davidjrice: I'll integrate it tomorrow, but tonight my beer count won't allow me to do it : )
[00:39] lvmike has joined the channel
[00:48] bryanl has joined the channel
[00:53] davidjrice: felixge: should the change be unobtrusive?
[00:53] felixge: davidjrice: change in libs?
[00:54] davidjrice: if I stick the new couchdb.js in, will the original functionality work?
[00:54] paulca has joined the channel
[00:57] felixge: davidjrice: yeah, the interface is a little different - but since it's very little code involved it should be no problem
[00:57] davidjrice: felixge: hmm different approach in the new lib
[00:57] davidjrice: looking at it now anyway
[00:58] felixge: davidjrice: the new lib is more in the spirit of node than the old one was
[00:58] felixge: but yeah, that makes it a little different
[01:01] davidjrice: hm
[01:03] Yuffster has joined the channel
[01:04] davidjrice: felixge: okay, so we've got it creating new revisions in couch
[01:04] davidjrice: however it's just creating a new rev, not updating any attrs
[01:04] davidjrice: ...
[01:04] davidjrice: ACTION ponders
[01:13] bryanl has joined the channel
[01:16] Yuffster has joined the channel
[01:27] rtomayko has joined the channel
[01:35] bryanl has joined the channel
[01:36] richardb has joined the channel
[01:38] davidjrice: and sorted :)
[01:41] sztanpet has joined the channel
[01:46] richardb: Hi. I'm looking into building a wrapper for the Xapian search engine library for node (http://xapian.org)
[01:47] richardb: Xapian calls can take a long while (by async standards) and perform a lot of IO, so I was looking for another library with a similar set of calls which might have been wrapped already
[01:47] bryanl has joined the channel
[01:48] richardb: I assume I'll need to do something with threads or use libeio to avoid locking up node while Xapian is waiting on IO.
[01:48] richardb: I notice that the SQLite bindings are synchronous only
[01:48] richardb: is there any example of a library which has been wrapped in the sort of way I'm describing?
[01:48] Tim_Smart: postgres maybe
[01:48] richardb: the http://github.com/ry/node_postgres one?
[01:49] Tim_Smart: ya
[01:49] richardb: ACTION will take a look
[01:49] Tim_Smart: it installs libev watchers on the file descriptors
[01:50] Tim_Smart: and sets the calls to non-blocking
[01:50] richardb: hmm.
[01:50] Tim_Smart: but the javascript side of it has a queue
[01:51] richardb: so it uses support for asynchonous operation in libpq. Hmm.
[01:51] richardb: Xapian is an in-process search engine - there's no server.
[01:51] brapse has joined the channel
[01:51] Tim_Smart: Well libpq doesn't support async
[01:52] richardb: the only file descriptors it uses are those reading data from disk.
[01:52] Tim_Smart: that is why the javascript has to queue the queries
[01:53] richardb: Ah - so it just does one query at a time.
[01:53] Tim_Smart: right, well most IO is done around fd's, most of the time you queries to not block. Depends on the library I guess
[01:53] Tim_Smart: richardb: Yes, when it completes one, it will call the callback
[01:53] Tim_Smart: then move on
[01:53] Tim_Smart: still, no blobking IO calls are made
[01:53] richardb: But the C code is done in the same thread? There's no using a subthread to get async behaviour?
[01:54] richardb: I don't think I can feasibly make Xapian do no blocking IO calls.
[01:54] richardb: Not without a year or so of development time, anyway!
[01:54] Tim_Smart: Well there is your problem
[01:54] richardb: Sure.
[01:54] Tim_Smart: You can't thread in node addons, so that makes it difficult
[01:55] richardb: The solutions are either to do that development, run the Xapian stuff in a separate thread, or run a separate Xapian process and talk to it.
[01:55] Tim_Smart: but there is one way...
[01:55] richardb: unless you have another option ;-)
[01:55] Tim_Smart: Create your C++ bindings and have them block
[01:55] Tim_Smart: then make a javascript file that interfaces with them
[01:55] richardb: (I'm half wanting to do this because a language/environment like node would be great for writing a flexible server around Xapian)
[01:55] Tim_Smart: then use process.createChildProcess
[01:56] richardb: Aha. I was thinking something along those lines
[01:56] richardb: and I like the use of a child process rather than a thread..
[01:56] Tim_Smart: And pipe input / output through the stdio
[01:56] richardb: Sounds workable - we'd still only do one Xapian operation at a time, of course.
[01:57] Tim_Smart: yes nothing a simple stack can't handle
[01:57] richardb: unless we used createChildProcess multiple times and make a process pool, I assume
[01:57] Tim_Smart: richardb: I don't think xapian would handle that too well
[01:57] richardb: why not?
[01:57] Tim_Smart: well it obviously wasn't design to be async
[01:57] Tim_Smart: *designed
[01:57] richardb: yes
[01:58] richardb: it's designed to do multiple searches at once, though
[01:58] richardb: just from different threads/processes
[01:58] kriszyp has joined the channel
[01:58] Tim_Smart: right, so it is async in a way then...
[01:58] richardb: yeah
[01:58] richardb: BTW - I'm a core Xapian developer
[01:58] Tim_Smart: right.
[01:58] richardb: and have been following node for a while, but not done any serious coding against it yet
[01:59] richardb: thanks for the advice so far. I'll investigate process.createChildProcess
[01:59] Tim_Smart: Well you don't want to have too many OS level processes open at one time
[01:59] Tim_Smart: Doesn't scale horizontally too well
[01:59] richardb: no, true. I'd not want to do any massively parallel stuff
[01:59] Tim_Smart: Yeah I would just keep the child process open in-definately
[01:59] richardb: In some ways, I'd like to write a new search engine based around async IO...
[02:00] richardb: but Xapian's taken 10 years so far, so I'd like to get something working a bit faster first!
[02:00] Tim_Smart: :p
[02:00] richardb: I'll try getting it working with 1 child process, anyway. Then I can think about having a small process pool, perhaps.
[02:00] richardb: Ok - time for me to get coding. :)
[02:01] Tim_Smart: Yeah I didn't encounter a problem with childProcess though
[02:01] Tim_Smart: I couldn't write to the child process, well at least I couldn't seem to
[02:01] richardb: Is there a guide to writing node wrappers around C /C++ libraries, anywhere?
[02:01] richardb: or is copying from example the best approach?
[02:02] Tim_Smart: Well example is one good way. Just ready libev, libeio and v8 docs, and that has it very much covered
[02:02] Tim_Smart: *read
[02:02] richardb: have half read them already. Will finish. thanks
[02:02] Tim_Smart: libev is the main one
[02:03] Tim_Smart: actually v8 is probably more relavant
[02:03] richardb: libeio is the only one I'm not moderately familiar with, so that's good :)
[02:06] Tim_Smart: ACTION goes back to starting a node framework
[02:07] r11t has joined the channel
[02:25] richardb: Writing to a child process seems to be working absolutely fine, for me.
[02:25] richardb: though so far I've only tried writing to "cat"
[02:25] richardb: (and reading it back)
[02:27] Tim_Smart: richardb: Did you use childprocess.wite()?
[02:27] richardb: yes
[02:27] Tim_Smart: hmm
[02:27] Tim_Smart: I tries sending stuff to a process, then using process.stdio to send it back
[02:27] Tim_Smart: *tried
[02:27] Tim_Smart: ACTION relooks at it
[02:29] richardb: I did:
[02:29] richardb: c=process.createChildProcess('cat').addListener("output", function(data) { sys.puts("got:" + data); })
[02:29] richardb: c.write('hello')
[02:29] richardb: and got "got:hello" printed
[02:30] Tim_Smart: that good then
[02:30] richardb: yes, I'm happy with that :)
[02:31] Tim_Smart: maybe it is a problem with receiving data then
[02:31] Tim_Smart: process.stdio.addListener('data' ... ) wasn't picking it up
[02:34] Tim_Smart: dw I found the problem >.>
[02:45] Tim_Smart: yay, my web worker implementation is complete
[02:52] Yuffster has joined the channel
[02:55] Tim_Smart: richardb: This should help creating 'workers' http://gist.github.com/297155
[03:06] geelen has joined the channel
[03:09] paulca has joined the channel
[03:13] Tim_Smart: nodejs_v8: Object.getOwnPropertyNames
[03:13] nodejs_v8: Tim_Smart: function getOwnPropertyNames() { [native code] }
[03:19] isaacs has joined the channel
[03:21] kriszyp has joined the channel
[03:38] kriszyp_ has joined the channel
[03:44] hassox has joined the channel
[03:45] hassox: howdy pardners
[03:51] BryanWB has joined the channel
[04:09] Tim_Smart: howdy
[04:27] chakrit has left the channel
[05:14] alex-desktop has joined the channel
[05:26] [k2] has joined the channel
[05:40] RayMorgan has joined the channel
[05:45] jed has joined the channel
[05:47] rictic has joined the channel
[05:51] micheil_mbp has joined the channel
[05:53] micheil_mbp_ has joined the channel
[05:56] micheil has joined the channel
[05:58] Tim_Smart: Where is a JimBasterd when you need him >.>
[06:00] micheil_mbp has joined the channel
[06:05] rryan has joined the channel
[06:13] Connorhd has joined the channel
[06:16] geelen has joined the channel
[06:22] micheil_mbp has joined the channel
[06:34] micheil has joined the channel
[06:35] Tim_Smart: nodejs_v8: new Date().toString()
[06:35] nodejs_v8: Tim_Smart: "Sun Feb 07 2010 19:35:11 GMT+1300 (NZDT)"
[06:45] micheil has joined the channel
[06:47] mattly has joined the channel
[06:50] cloudhead has joined the channel
[06:56] rryan has joined the channel
[07:07] micheil_mbp has joined the channel
[07:10] abadr has joined the channel
[07:18] isaacs has joined the channel
[07:22] Tim_Smart: anyone around to give an opinion?
[07:24] isaacs: Tim_Smart: i have lots of opinions!
[07:24] isaacs: about all sorts of things
[07:24] Tim_Smart: :p
[07:24] Tim_Smart: isaacs: I got a Web Worker gist you might like
[07:25] isaacs: oh, i think i might've seen that
[07:25] Tim_Smart: http://gist.github.com/297155
[07:25] Tim_Smart: Kept it simple for now
[07:26] Tim_Smart: anyway, routing. Which do you prefer, or would you make another suggestion: http://gist.github.com/297275
[07:26] jed: Tim_Smart: you should use all caps for the method names.
[07:27] Tim_Smart: ok point taken
[07:27] isaacs: Tim_Smart: i like #2
[07:27] Tim_Smart: cool
[07:27] jed: (i like two.js better, but you could offer one.js for convenience.)
[07:27] isaacs: though, i think "route" is an odd name choice
[07:27] Tim_Smart: Hmm... well fire away
[07:27] Tim_Smart: nothing is set in stone at this stage
[07:27] isaacs: Tim_Smart: do you need a method name here?
[07:28] geelen has joined the channel
[07:28] isaacs: i mean, why not just steal jed's idea, and chain that stuff.
[07:28] Tim_Smart: Well I want to make it easy and readable
[07:28] Tim_Smart: And different routes can lead to different apps
[07:29] Tim_Smart: well I'll continue to think about it
[07:29] isaacs: http://gist.github.com/297279
[07:29] isaacs: note #3
[07:30] isaacs: haha, alphabetical sorting. #3 is second
[07:30] jed: isaacs: btw, i changed the (fab) API a bit to be closer to JSGI: http://www.fabjs.org/#defininghandlers
[07:30] jed: should make middleware a bit easier.
[07:31] isaacs: jed: nice!
[07:31] jed: isaacs: sniffing objects for headers wasn't working for me, since it wouldn't let me send objects as bodies.
[07:31] jed: i think the core API is done, going to start porting middleware.
[07:32] isaacs: interesting. yeah, makes sense.
[07:32] jed: i stream responses by allowing partial JSGI responses.
[07:32] isaacs: interesting that the cb's get a "respond" function
[07:32] jed: it's got some object overhead, but makes things easier.
[07:33] jed: isaacs: yeah, since .send() was the only thing i was using on the response object, i decided to pass a closure function instead.
[07:33] isaacs: makes sense
[07:33] jed: how is the JSGI stuff going? are folks close to agreeing on stuff?
[07:34] Tim_Smart: Hmm I think I have a decent idea which could combine several things into a single syntax
[07:34] Tim_Smart: ACTION goes and hacks at it
[07:35] isaacs: jed: not sure. been pretty busy the last few days.
[07:35] isaacs: but there are a few proposals getting batted around, iirc, and i'm actually kinda ok with any of them
[07:36] isaacs: i figure i'll just update EJSGI to be compliant with whichever of the options that get chosen, and also keep my preferred option, and that'll be that.
[07:36] isaacs: the differences are mostly cosmetic, and each approach to streaming seems to be slightly better in some situations, and slightly worse in others.
[07:38] jed: isaacs: yeah. i'm not sure there will be one standard.
[07:39] isaacs: well, there'll be one, but we'll all just sugar to it.
[07:39] jed: but if they all support the same paradigms, it'll be easy enough to write adapters.
[07:39] isaacs: exactly
[07:39] jed: isaacs: right, exactly.
[07:41] mnutt has joined the channel
[07:44] piranha has joined the channel
[07:48] Tim_Smart: isaacs: How about something like this: http://gist.github.com/297297
[07:48] Tim_Smart: combines setting up the server and routes in one syntax
[07:49] isaacs: interesting
[07:50] isaacs: it's a bit odd that you have this very explicit named object, and then an unadorned callback at the end of it.
[07:50] isaacs: i mean, explicitly naming stuff is cool, and so is making smart assumptions, but the two together feels off.
[07:51] Tim_Smart: well it boils down too HTTP(options, callback);
[07:51] isaacs: right
[07:51] Tim_Smart: where callback is optional
[07:51] isaacs: i'm sayin, why not put the callback in the options?
[07:51] Tim_Smart: yeah I guess
[07:52] Tim_Smart: http://gist.github.com/297297
[07:53] isaacs: cant' just call it "default", huh, since that's reserved, i think?
[07:53] Tim_Smart: You can, because it will be a property
[07:54] Tim_Smart: nodejs_v8: ({default: 123})
[07:54] nodejs_v8: Tim_Smart: Exception: SyntaxError: Unexpected token default
[07:54] isaacs: right
[07:54] Tim_Smart: maybe not
[07:54] isaacs: nodejs_v8: ({"default":123})
[07:54] nodejs_v8: isaacs: {"default": 123}
[07:54] isaacs: have to be quoted, and that sucks
[07:55] isaacs: why not just call it "callback"?
[07:55] isaacs: so, it's like, "each route has a callback, and then there's one callback outside the routes, that catches everything that wasn't routed"
[07:56] Tim_Smart: Hmm I think needs some more re-arranging, as you might want to map different routes to the same callback
[07:57] Tim_Smart: like a POST and a GET with different match requirements
[07:57] piranha has joined the channel
[08:07] Tim_Smart: isaacs: This is probably one way of covering everything I would want in a router http://gist.github.com/297297
[08:07] Tim_Smart: seems a little messy though
[08:21] isaacs: anyone else notice that process.watchFile is crazy on a mac?
[08:23] Tim_Smart: isaacs: On linux it seems it get triggered twice per file
[08:23] Tim_Smart: *gets
[08:23] isaacs: atime, mtime, and ctime get changed like every second or so
[08:25] isaacs: kinda makes hot code reloading effectively just "uncached code loading"
[08:27] micheil: nothing too complicated, but a very basic router: http://gist.github.com/297309
[08:28] isaacs: what's really interesting is that the oldStat is always the same, and the newStat is always the same, but they don't match each other.
[08:32] isaacs: ahh, it's just atime that's tweaking out
[08:35] mikeal has joined the channel
[08:37] isaacs: i guess osx likes to access its files a lot
[08:50] mikeal has joined the channel
[08:51] sveisvei has joined the channel
[08:58] qFox has joined the channel
[09:02] Tim_Smart: micheil: :) I'll probably want something a little more comprehensive. I'll continue to play with ideas though
[09:37] geelen has joined the channel
[09:48] eikke has joined the channel
[09:56] tmpvar has joined the channel
[09:57] tmpvar: yo, anyone alive?
[10:03] lifo has joined the channel
[10:04] felixge has joined the channel
[10:04] felixge has joined the channel
[10:09] rednul_ has joined the channel
[10:20] hassox has joined the channel
[10:23] Tim_Smart: I r dead
[10:24] Tim_Smart: Everyone seems to be enjoying their Sunday :)
[10:24] tmpvar: heh
[10:24] Tim_Smart: Wait, the US is 21 hours behind NZ
[10:25] felixge has joined the channel
[10:25] felixge has joined the channel
[10:26] Tim_Smart: tmpvar: I have made some changes to the wave. Got another bunch of commits to push as well
[10:28] tmpvar: awesome, ill check it out
[10:37] Tim_Smart: Hmm.. Silly Github taking ages to update cache
[10:44] Tim_Smart: tmpvar: http://code.google.com/p/v8cgi/source/browse/trunk/lib/dom.js
[10:45] Tim_Smart: It is a little un-optimized but you might be interested
[10:49] tmpvar: hrrrrrm
[10:50] tmpvar: did I mention, that I hit 100% passing tests for svg/html/xml dom level 1 today?
[10:50] tmpvar: :P
[10:51] tmpvar: also reworked the test runner to run level2/3 tests
[10:51] tmpvar: Tim_Smart: definately interested, but not phased . hah
[10:52] Tim_Smart: Yeah not sure who wrote it
[10:52] tmpvar: wish i could spell that word... definitely
[10:52] tmpvar: the wave looks good
[10:52] tmpvar: you should commit your stuff
[10:53] Tim_Smart: I have I think
[10:53] tmpvar: i dropped a couple comments in the wave, hope i wasn
[10:53] hassox: oh man.. riak looks soo tasty
[10:53] tmpvar: er.. wasn't too obtuse
[10:53] Tim_Smart: yeah about to reply
[10:54] tmpvar: hassox: why?
[10:54] hassox: transparently scalable and accessible via a rest interface
[10:54] hassox: ACTION is only just starting to look at it
[10:54] hassox: but at the start... it's looking interesting
[10:55] tmpvar: ah
[10:56] ayo has joined the channel
[11:01] tmpvar: hassox, that it does
[11:02] hassox: tmpvar: I've ben reading a bit about it for a couple of hours
[11:03] hassox: it has a js interface for writing the map reduce too... not sure how this works yet though ;)
[11:03] felixge: davidjrice: yt?
[11:03] felixge: davidjrice: I saw you guys forked my initial repo, which one should I base my changes on?
[11:05] tmpvar: hassox: yeah their docs are pretty wild haha
[11:21] felixge: davidjrice: ping me when you are back on
[11:28] Nathan__ has joined the channel
[11:28] lifo_ has joined the channel
[11:35] geelen has joined the channel
[11:36] tmpvar: Tim_Smart: saw that, sorry buddy
[11:37] Tim_Smart: tmpvar: huh?
[11:40] teemow has joined the channel
[11:41] tmpvar: wave failure hehe
[11:41] Tim_Smart: oh :p
[11:42] Tim_Smart: happens quite often to me :(
[11:43] tmpvar: weird, thats unfortunate
[11:44] micheil: Tim_Smart: no worries mate :)
[11:52] rtomayko has joined the channel
[11:54] BBB has joined the channel
[12:09] hassox: hey guys
[12:09] hassox: anyone up?
[12:09] hassox: ACTION would like to ask someone about http clients
[12:12] micheil: sure
[12:12] hassox: so
[12:13] hassox: when I make an http.createClient
[12:13] hassox: do I want to hang onto that object and make requests from it
[12:13] hassox: or do I want a new one for each request?
[12:13] hassox: ACTION tried making one for each request, and when I hammered it with ab, got a "too many files open" warning
[12:13] hassox: but when sharing a global one, it seemed to serialize all requests
[12:14] hassox: serialize == make them all sequential
[12:15] micheil: okay
[12:15] micheil: hm..
[12:15] micheil: are you sure you're want httpClient?
[12:15] hassox: I"m making http requqests to an http api
[12:16] micheil: ACTION isn't sure as to how you're using ab to test a httpClient, as that's going from node out to the net, pulling data into node
[12:16] hassox: I"m using http.createClient to make a request to couchdb
[12:16] hassox: inside node,
[12:16] micheil: ah
[12:17] hassox: then using ab to hammer node
[12:17] micheil: I'd be caching the results from the db
[12:17] micheil: instantiate maybe a pool of 5 clients, then rotate through them and make requests via them
[12:18] micheil: would tcp work over http?
[12:18] hassox: yeah that's kinda what I ended up doing
[12:18] hassox: although I had a pool of 50
[12:18] hassox: I dunno about tcp
[12:21] felixge: hassox: the http client does queue all requests. So if you need parallel requests, you need multiple clients
[12:21] hassox: felixge: right
[12:21] hassox: good to know
[12:21] hassox: how many should I max out at?
[12:22] felixge: I think you'll be limited by the number of sockets your system allows you
[12:22] hassox: yeah
[12:22] hassox: seems like I hit that limit with my tests
[12:22] felixge: with ulimit you should be able to go up to 60k+
[12:22] hassox: oh right
[12:22] felixge: but without it you're likely to only get 256-1024
[12:22] felixge: or sth
[12:22] felixge: hassox: you might also want to check this out: https://github.com/felixge/node-couchdb
[12:23] hassox: saweet
[12:23] hassox: jan said you were working on someting
[12:23] hassox: but I didn't know where it was
[12:24] felixge: hassox: yeah, just finished it. It's a complete implementation of the entire API
[12:24] hassox: oh wow
[12:24] hassox: that's awesome
[12:24] felixge: Basic Auth is missing, I'm waiting on Jan about some clarification on the new changes they made to auth
[12:24] felixge: but it will be added
[12:25] hassox: awesome
[12:25] hassox: I"m so going to use this
[12:25] felixge: hassox: anyway, you'll either have to live with the requests being queued or you'll have to manage a pool of clients
[12:25] hassox: felixge: I'm fine with managing a pool
[12:25] felixge: hassox: the CouchDB module I just linked works just like http client
[12:25] hassox: so how do I do it with ur lib
[12:25] hassox: oh
[12:25] hassox: ok
[12:26] hassox: so just create new clients and use a pool of them?
[12:26] felixge: well, yeah. Essentially you are creating your own queue which you then delegate to multiple clients
[12:26] hassox: cool
[12:27] felixge: hassox: my lib creates promises for all requests, so you just have to make sure you return a new promise for each request to the pool
[12:28] hassox: kk
[12:31] hassox: k thanx lads
[12:31] hassox: have to go
[12:31] hassox: :)
[12:42] micheil: hmm..
[12:44] micheil: ACTION is wondering which way is the best approach to the next version of node-smtp
[13:25] bryanl has joined the channel
[13:38] kriszyp has joined the channel
[13:42] bryanl has joined the channel
[13:57] micheil_mbp has joined the channel
[14:03] unomi has joined the channel
[14:11] micheil has joined the channel
[14:22] micheil_mbp has joined the channel
[14:28] paulca has joined the channel
[14:37] micheil_mbp has joined the channel
[14:39] alex-desktop has joined the channel
[14:40] paulca has joined the channel
[14:41] lifo has joined the channel
[14:48] micheil_mbp has joined the channel
[14:49] micheil_mbp_ has joined the channel
[14:59] paulca has joined the channel
[15:01] micheil_mbp has joined the channel
[15:13] micheil_mbp has joined the channel
[15:21] piranha has joined the channel
[15:28] davidjrice: hmmm
[15:28] davidjrice: [1,2,3].remove(1)
[15:29] davidjrice: trying to find something like that in js, damn :)
[15:31] davidjrice: agggh! splice
[15:32] davidjrice: you are now my friend
[15:33] micheil has joined the channel
[15:34] aho: davidjrice, https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Array
[15:35] aguynamedben has joined the channel
[15:39] icebox has joined the channel
[15:53] micheil has joined the channel
[16:12] felixge has joined the channel
[16:12] felixge has joined the channel
[16:12] tmpvar has joined the channel
[16:13] micheil has joined the channel
[16:14] omygawshkenas has joined the channel
[16:16] rtomayko has joined the channel
[16:17] ithinkihaveacat has joined the channel
[16:33] micheil has joined the channel
[16:42] felixge has joined the channel
[16:53] micheil has joined the channel
[16:56] r11t has joined the channel
[16:57] isaacs_mobile has joined the channel
[17:10] ayo has joined the channel
[17:10] kjeldahl has joined the channel
[17:12] bryanl has joined the channel
[17:13] micheil has joined the channel
[17:18] Netfeed has joined the channel
[17:29] davidjrice: felixge: ping
[17:33] micheil has joined the channel
[17:34] dnolen has joined the channel
[17:53] micheil has joined the channel
[18:01] piranha: http://paste.in.ua/280/ any ideas how can I determine which error is happening actually?
[18:12] isaacs_mobile_ has joined the channel
[18:13] micheil has joined the channel
[18:21] rryan has joined the channel
[18:33] eikke has joined the channel
[18:33] [k2] has joined the channel
[18:33] micheil has joined the channel
[18:37] bryanl has joined the channel
[18:39] paulca has joined the channel
[18:45] dnolen has joined the channel
[18:53] micheil has joined the channel
[19:01] Yuffster has joined the channel
[19:04] tlrobinson_ has joined the channel
[19:13] micheil has joined the channel
[19:19] isaacs has joined the channel
[19:20] brandon_beacher has joined the channel
[19:24] cloudhead has joined the channel
[19:25] felixge has joined the channel
[19:27] omygawshkenas has joined the channel
[19:29] isaacs: piranha: still here?
[19:30] isaacs: oh, nvm, found the answer... you're using node-blog.
[19:30] isaacs: i'll leave that q for someone else, then
[19:33] micheil has joined the channel
[19:36] piranha: isaacs: yeah, I'm here
[19:36] piranha: hehe :)
[19:36] isaacs: piranha: i was going to ask what you were using to throw the error, but then i saw the folder name.
[19:36] piranha: I see :)
[19:36] isaacs: i'm not too familiar with node-blog. looks interesting, though. i'm meaning to probably replace tumblr and wordpress with that.
[19:36] piranha: eh, it's hard to determine what's going on with those callbacks... :)
[19:37] isaacs: it gets easier.
[19:37] isaacs: after a few years of javascript, you start to think in callbacks.
[19:37] piranha: isaacs: I'm trying to decide whenever to use it or my own python-based solution (which works already, but nevertheless I'd like to use node just for fun :))
[19:38] isaacs: node is pretty fun!
[19:38] isaacs: and, imo, javascript is a beautiful language.
[19:38] isaacs: it's got some warts, like any other language, but it's quite nice.
[19:38] r11t has joined the channel
[19:38] piranha: yeah, it is :-)
[19:38] piranha: but anyway coffee script is better :))))
[19:39] isaacs: i haven't looked at node-blog, so i can't speak for the code you're using, of course. but people using it seem to likeit.
[19:39] isaacs: it's working for howtonode.org
[19:39] ithinkihaveacat has joined the channel
[19:40] omygawshkenas: piranha: I just merged the Node branch over to master for coffee-script -- now it's the default engine.
[19:40] piranha: isaacs: yeah, it's how I found it :)
[19:40] piranha: omygawshkenas: nice to hear! :)
[19:40] piranha: ACTION going to execute git pull
[19:41] omygawshkenas: Pass "--narwhal" as a flag if you need to go back.
[19:42] piranha: hehe, no, I don't need that :-) I have no narwhal installed :)
[19:42] dnolen has joined the channel
[19:52] piranha: hah, problem was that "public/" directory should exist already
[19:53] micheil has joined the channel
[19:59] isaacs: ahh, i see
[19:59] isaacs: piranha: you should bug the authors. it'd be good to have a more reasonable error message, at least.
[19:59] isaacs: Congratulations, nodejs! http://github.com/popular/watched
[19:59] piranha: aha :-)
[19:59] isaacs: ryah: ^
[20:03] brapse has joined the channel
[20:07] kennethkalmer has joined the channel
[20:07] kennethkalmer has joined the channel
[20:12] isaacs has joined the channel
[20:13] felixge: isaacs: oh wow
[20:13] unomi: shouldn't be so surprised
[20:13] felixge: btw. has anybody played with fab in here so far?
[20:13] micheil has joined the channel
[20:13] felixge: it's most fantastic awesome
[20:13] felixge: just wrote basic auth middleware for it
[20:13] unomi: I am a bit though, in that I thought there would be more watchers for the top ones
[20:14] felixge: github is pretty ruby heavy
[20:15] unomi: I am somewhat surprised at seeing will_paginate that high up
[20:15] isaacs: felixge: how basic?
[20:16] felixge: isaacs: https://gist.github.com/5ea76698b42003dff3f4
[20:16] omygawshkenas has joined the channel
[20:16] isaacs: oh, basic, like HTTP Basic Authentication
[20:16] isaacs: hehe
[20:17] isaacs: the cleartext 401/403 stuff
[20:17] felixge: isaacs: yeah
[20:18] felixge: isaacs: but its pretty sweet how easy it is to write this
[20:18] felixge: isaacs: while still having full streaming
[20:19] isaacs: totally
[20:19] isaacs: couldn't you just do handler.call(this, respond)?
[20:20] cloudhead has joined the channel
[20:20] felixge: isaacs: yes, thanks
[20:20] felixge: isaacs: makes it even sweeter :)
[20:20] isaacs: it'd be neat if it could avoid the this-context stuff.
[20:20] isaacs: then you could just do handler(respond)
[20:21] isaacs: this-switching is expensive.
[20:21] felixge: isaacs: if the respond function had a property, I think it would work
[20:21] isaacs: handler(request, respond)
[20:21] isaacs: maybe
[20:21] isaacs: i dunno.
[20:21] felixge: isaacs: yeah
[20:21] felixge: isaacs: that would make sense
[20:21] felixge: isaacs: will talk to jed about it
[20:21] felixge: but the basic idea works great
[20:21] isaacs: yeah
[20:21] felixge: I can just easily protect a sub-path with basic auth now
[20:22] isaacs: nice!
[20:22] sveisvei has joined the channel
[20:22] isaacs: you get a chance to look at the mp rewrite?
[20:22] lifo has joined the channel
[20:22] felixge: isaacs: it's on my list for tonight : )
[20:22] isaacs: kewl
[20:22] felixge: isaacs: this is client work I didn't get done last week :|
[20:23] felixge: so needs finishing first
[20:23] isaacs: ahh, yeah, $$ takes precedence
[20:24] lifo_ has joined the channel
[20:27] cloudhea has joined the channel
[20:30] piranha: hm, how to check if file exists?
[20:31] piranha: posix.stat('fname') just exits from node with error...
[20:32] piranha: ah, .addErrback
[20:33] micheil has joined the channel
[20:37] bryanl has joined the channel
[20:38] isaacs: piranha: you can also do path.exists("fname", function (exists) { if (exists) { /* it's there */ } else { /* not there */ }})
[20:41] piranha: hm, posix.mkdir(path, 755) creates directory with -wxr-----
[20:41] piranha: strange
[20:53] micheil has joined the channel
[21:05] nodejs_v8 has joined the channel
[21:06] nodejs_v8 has joined the channel
[21:06] paulca has joined the channel
[21:08] kriszyp has joined the channel
[21:08] Tim_Smart has joined the channel
[21:08] rtomayko has joined the channel
[21:08] crooter has joined the channel
[21:12] eck has joined the channel
[21:13] rolfb has joined the channel
[21:13] micheil has joined the channel
[21:15] micheil_mbp has joined the channel
[21:20] brandon_beacher has joined the channel
[21:28] teemow has joined the channel
[21:31] steadicat has joined the channel
[21:39] geelen has joined the channel
[21:41] isaacs has joined the channel
[21:51] vickaita has joined the channel
[21:52] isaacs has joined the channel
[21:58] hassox has joined the channel
[22:01] RayMorgan has joined the channel
[22:02] jed has joined the channel
[22:15] hassox: good morning
[22:17] felixge: jed: hey, sup?
[22:17] felixge: having my first serious playtime with (fab) today
[22:17] jed: hey felixge!
[22:17] felixge: boy it's awesome
[22:17] felixge: :)
[22:17] jed: i was just looking at your pull request.
[22:17] felixge: already wrote 3 middleware modules for it
[22:17] jed: felixge: yeah, (fab) started coming together for me a lot yesterday. now i'm on the middleware warpath.
[22:18] jed: felixge: nice!
[22:18] felixge: jed: http://github.com/felixge/node-paperboy/commit/2713a3e52c01557a20a1da53be0e0faf09b58875#L0R33
[22:18] felixge: jed: is where I need the encoding in paperboy
[22:18] jed: i was wondering tho... can we solve the encoding specification in a header, instead of as a non-standard key?
[22:19] stevestmartin has joined the channel
[22:19] felixge: jed: doubt it, the encoding depends on the string
[22:19] jed: if possible, i'd like to freeze the API and let http (custom or otherwise) do the work for us.
[22:20] jed: felixge: do you (or isaacs) know how JSGI does it?
[22:20] isaacs: hi
[22:20] isaacs: what's what now?
[22:20] felixge: jed: no, unfortunately not
[22:20] felixge: isaacs: the encoding to use for streaming the boy out
[22:20] felixge: * body
[22:20] jed: isaacs: i'm wondering if there's an HTTP header that specifies body encoding.
[22:20] isaacs: jed: so, in JSGI, you actually return/stream things that have a toByteStream method.
[22:21] isaacs: blarg.toByteString("utf-8")
[22:21] isaacs: jed: there is. content-type: text/html; charset=utf-8
[22:21] jed: isaacs: and it's up to whoever to implement this method?
[22:21] jed: isaacs: what about for binary content?
[22:21] isaacs: jed: yes
[22:21] isaacs: for binary content, i'm not sure.
[22:22] deanlandolt: jed: for binary content ByteArray/ByteString have a toByteString method
[22:22] jed: yeah, that's what felixge needs... hrm.
[22:22] jed: so felixge, i'd rather look for this method first instead of adding a key. but even more i'd like to find a header solution.
[22:23] deanlandolt: and iirc it's not toByteString(encoding), just toByteString()
[22:23] jed: ah, okay.
[22:23] isaacs: jed: Content-Type: application/octet-stream
[22:23] crooter has joined the channel
[22:23] isaacs: deanlandolt: oh? how do you specify encoding?
[22:23] jed: ah, nice!
[22:23] isaacs: deanlandolt: or do you?
[22:23] deanlandolt: isaacs: you don't have to -- the object would know
[22:23] isaacs: oic
[22:23] deanlandolt: meaning, you've got a string, right?
[22:24] isaacs: right
[22:24] deanlandolt: it's already encoded
[22:24] jed: felixge, how would you feel about looking for that header, or for the charset in content-type?
[22:24] jed: (defaulting to utf8)
[22:24] felixge: jed: I think looking for that header would be good enough
[22:24] felixge: oh wait, nvm
[22:24] felixge: my binary data can have any header, like image/jpeg
[22:25] isaacs: jed: yeah, so octet-stream is the default for binary stuff, but it's not hte only "binary" encoding.
[22:25] jed: ah, i see.
[22:25] deanlandolt: felixge: would it have a the header {"content-type": "image/jpeg"}?
[22:25] felixge: deanlandolt: yes
[22:25] jed: i guess at this point we'd have to keep a list.
[22:25] isaacs: jed: also, you can't just sniff for text/blah for text encoding, because you might have application/xml+xhtml or something
[22:25] deanlandolt: felixge: cool -- very jsgish :D
[22:26] jed: isaacs: ha, i was just about to suggest that.
[22:26] jed: (blarg)
[22:26] felixge: keeping a list would suck
[22:26] isaacs: the sender needs to specify the encoding somehow.
[22:26] isaacs: no way round that.
[22:26] jed: definitely not interested in a list.
[22:26] felixge: well maybe net2 will come to rescuve
[22:26] deanlandolt: yeah, what the hell happened with mime types?
[22:26] felixge: as body would probably be a Buffer for binary
[22:26] isaacs: deanlandolt: that's a sad sad story.
[22:26] isaacs: poor mime types..
[22:26] deanlandolt: does the text v. application distinction mean /anything/?
[22:26] isaacs: such grand artistic vision.
[22:27] isaacs: they didn't say a word as their were saddled with the woes of the world.
[22:27] felixge: deanlandolt: it means nothing
[22:27] isaacs: just patted their white hands against their invisible box...
[22:27] geelen has joined the channel
[22:27] deanlandolt: felixge: yeah, i know...application/xml==text/xml, application/json? really? text/javascript==application/javascript...ugh
[22:28] deanlandolt: at least with negotiation you can do */javascript and be done with it
[22:28] isaacs: deanlandolt: also, you can do application/x-ANYTHING
[22:28] felixge: I use text/plain for JSON - because I don't give a shit
[22:28] felixge: ;)
[22:28] deanlandolt: isaacs: actually...
[22:28] isaacs: deanlandolt: and then it's up to the agent to deal with it
[22:28] deanlandolt: i believe the recommended prefix is vnd.
[22:28] deanlandolt: so application/vnd.anything
[22:28] isaacs: yeah, that too
[22:28] isaacs: but i've seen application/x- used for a LOT of random crap.
[22:28] deanlandolt: (not that it freakin' matters :D)
[22:29] isaacs: basically, content-type is mostly useless except in a few key areas, where it's absolutely crucial.
[22:29] isaacs: but it wont' tell you how to encode the data if you're a server.
[22:29] jed: so maybe i should use a custom header? *barfs*
[22:29] isaacs: that's too magic.
[22:29] deanlandolt: i'm cool with the */*+json idea though
[22:29] isaacs: jed: even more too magic.
[22:30] jed: isaacs: how safe is binary encoding again?
[22:30] jed: like, can i send text with it?
[22:30] isaacs: we really need to sort out the content encoding story. it's kind of crazy.
[22:30] isaacs: jed: i've run into oddness. needs to be combed through.
[22:31] isaacs: i posted to the list, and ryah's reaction was something to the effect of "yep, seems like that might be a bug. i can haz testcase?"
[22:31] isaacs: and i ahven't gotten to it yet.
[22:31] jed: weren't you able to send binary stuff as utf8 or something?
[22:31] jed: i'm trying to remember that thread.
[22:31] isaacs: yeah. a utf8-encoded string worked as utf8, but not as anything else, no matter what i did.
[22:32] isaacs: if it was in a file, then sending the file just as a dumb old file, passing bytes through, and sending it as applicatin/octet with a content-disposition filename header, i got garbage on the other end.
[22:32] isaacs: only utf8 worked.
[22:32] isaacs: but sending binary seems to work right when it's an image.
[22:32] isaacs: so i don't know what to make of that.
[22:33] jed: oy.
[22:33] isaacs: basically, at least half of what i'm saying is wrong, and probably a non-identical-but-overlapping half of what's in the docs is also suspect.
[22:33] isaacs: Thar Be Dragons.
[22:34] isaacs: imo, we should implement ByteString and ByteArray, and http should be 100% agnostic as to encoding, and just shunt the bytes down the pipe as they come in from the ByteArray.
[22:34] isaacs: i think this is a case of muddled concerns.
[22:35] eck: i've been following node on github, and i've seen a lot of work on the net2 branch -- i'm curious, does anyone know what the focus of that branch is?
[22:35] deanlandolt: isaacs++ :D
[22:39] jed: felixge: i don't know if it's worth it, but i could sniff for "Content-Type: application/octet-stream" to turn binary on, and then you could overwrite that header... dunno if that's worse than adding an "encoding" key.
[22:40] deanlandolt: jed: what about when you're serving image/jpeg?
[22:40] jed: deanlandolt: right, you'd send content-type twice.
[22:40] felixge: jed: you could add the key for now as '_encoding' and replace it later when ryan merges net2?
[22:40] jed: the first to turn binary on, which would then be overwritten by the second.
[22:41] deanlandolt: ahh...that'll work
[22:41] isaacs: is there any way to solve this problem that doesn't involve abusing the headers object?
[22:41] jed: ha, is my idea really abusive?
[22:42] jed: keeping a whitelist/blacklist is definitely out.
[22:42] isaacs: by "abusing", i mean, putting something on it that isn't a header.
[22:42] jed: i'd rather not add a key (but the _encoding could be okay).
[22:43] isaacs: right, but on the headers object?
[22:43] isaacs: i dunno.
[22:43] isaacs: seems... dirty.
[22:43] jed: nono, on the response object.
[22:43] isaacs: ohhh, ok
[22:43] isaacs: nvm, then
[22:43] jed: return { status: 200, body: "hey", _encoding: "binary" }
[22:43] jed: yeah.
[22:44] deanlandolt: jed: couldn't you just demand a ByteArray or some such?
[22:44] jed: demand how, though?
[22:44] deanlandolt: if (body instanceof ByteArray) or some such
[22:44] isaacs: ACTION heads off to take another look at narwhal-v8's bytearray implemnetation...
[22:44] isaacs: deanlandolt: it doesnt' exist in node.
[22:44] deanlandolt: and then define it somewhere as part of fab
[22:44] deanlandolt: yeah, i was saying as part of (fab) though
[22:45] deanlandolt: require("fab/binary").ByteArray
[22:45] isaacs: oi
[22:45] isaacs: oic
[22:45] jed: or maybe sniff for a method on the body object?
[22:45] deanlandolt: hacky, but perhaps less so than doubling down on the content type
[22:45] deanlandolt: jed: yeah, that'd be better
[22:45] jed: instead of instanceof, so that folks could define their own.
[22:45] deanlandolt: yeah -- ducktyping ftw
[22:46] deanlandolt: typeof body.toByteString === "function" seems like a safe bed
[22:46] jed: isaacs, if you're back, does narwhal's byteArray have some sort of method we could look for?
[22:46] deanlandolt: s/bed/bet
[22:46] jed: you had me at bed.
[22:47] deanlandolt: heh
[22:47] isaacs: hahaa
[22:47] isaacs: ACTION .oO( is deanlandolt hitting on javascript? )
[22:47] deanlandolt: ACTION thinks she's a sexy mistress
[22:47] isaacs: nah, too many warts.
[22:47] jed: i heard she's loose.
[22:47] deanlandolt: ACTION ain't picky
[22:47] isaacs: probably cuz she gets around into so many crazy environments...
[22:49] deanlandolt: jed: narwhal's toByteString: http://github.com/280north/narwhal/blob/master/engines/default/lib/binary.js#L71
[22:50] jed: what are the chances node will adopt that approach?
[22:50] jed: i wonder if _encoding is safer for now.
[22:50] deanlandolt: if i had to bet, i'd say slim to none
[22:50] felixge: jed: node will add buffers
[22:50] felixge: jed: so for now encoding should be good, later you just sniff for body being instanceof buffer
[22:50] jed: ah, okay.
[22:51] deanlandolt: jed: but you can define your own toByteString notion that abstracts whatever node does with binary
[22:51] felixge: jed: maybe you won't even have to, sendBody will probably just accept buffers
[22:51] deanlandolt: and would be jsgi-compliant, just as an added bonus
[22:51] jed: ha, okay. i'm sold on _encoding.
[22:52] jed: felixge: do you want to change your fork, or should i mine?
[22:52] jed: i'm kinda surprised github doesn't make pulling easier.
[22:52] felixge: jed: watching a movie now
[22:52] jed: i thought that was the whole point. just click the "pull fork" button on a pull request.
[22:52] jed: felixge: no sweat, i'll get it.
[22:56] Tim_Smart: jed: What is wrong with the fork queue?
[22:57] jed: Tim_Smart: you can't accept a pull from the UI, can you?
[22:57] jed: maybe i'm missing the point.
[22:57] jed: (highly likely)
[22:57] jed: i'm going off of this: http://github.com/guides/pull-requests
[22:59] jed: felixge: pushed, lemme know if it works for you, okay?
[23:00] jed: (when you're done watching your chick flick, heh.)
[23:03] brandon_beacher has joined the channel
[23:03] brandon_beacher_ has joined the channel
[23:05] jed: just out of curiosity, what do folks here like better re: whitespace? fn( arg ) or fn(arg) ?
[23:06] hassox: jed: i've also seen a lot of fn ( arg )
[23:06] jed: hassox: well, that is against node's style: http://wiki.github.com/ry/node/contributing
[23:07] jed: but the space between args and parens is something i like, and not sure if node's styles covers it.
[23:07] hassox: hrm I haven't seen that doc
[23:07] hassox: thanx
[23:07] jed: (2.4: no space between function name and open paren e.g. blah(arg) not blah (arg))
[23:08] webben: jed: I think ( arg ) would be unusual in JS (e.g. JSLint would whinge IIRC).
[23:08] deanlandolt: iirc crock-style is fn(args) but spaces everywhere else: if () {}, for () {} while () {}
[23:09] webben: jed: That's not the same as it being wrong of course.
[23:09] jed: i guess my biggest ref is jQuery, which uses the spaces.
[23:09] deanlandolt: javascript needs a pep 8 :-/
[23:09] jed: maybe i'm picky about my parens, since i seem to have so many of them.
[23:10] webben: jed: Lisp code seems to have no problem with ))))))))).... ))))))
[23:10] webben: ;)
[23:10] jed: webben: heh.
[23:11] webben: My current coding style at work uses ( arg ) in Perl and PHP, and (arg) in JS.
[23:11] webben: I don't think that makes much difference but I do think ( (arg) ) or ( ( arg ) ) is better than ((arg))
[23:11] webben: (personally)
[23:12] jed: webben: yeah, i agree.
[23:13] jed: i guess node uses the last of the three everywhere.
[23:18] steadicat has joined the channel
[23:34] hassox has joined the channel
[23:34] teemow has joined the channel
[23:35] hassox has joined the channel
[23:47] crooter: \q
[23:48] node_smartbot has joined the channel
[23:49] Tim_Smart: node_smartbot: Hows it going
[23:49] node_smartbot: Tim_Smart: I feel terrible today. This morning I made a mistake and poured milk over my breakfast instead of oil, and it rusted before I could eat it.
[23:49] Tim_Smart: node_smartbot: Well isn't that a shame >.>
[23:49] node_smartbot: Tim_Smart: I am seldom embarrassed. But once I went to a costume party dressed as an antique stove. As it turned out it wasn't a costume party after all. The whole time they kept trying to grill steaks on me. Was that embarrassing!
[23:50] Tim_Smart: node_smartbot: So you like steak?
[23:50] node_smartbot: Tim_Smart: Speaking of food. You humans enjoy feeding animals at the zoo. I'd love to visit a restaurant and throw the visitors their food.
[23:51] Tim_Smart: node_smartbot: Say hi to jed!
[23:51] node_smartbot: Tim_Smart: A big hello to you, as well.
[23:52] hassox: lols
[23:52] Tim_Smart: node_smartbot: I'm a robot too
[23:52] node_smartbot: Tim_Smart: No, you are a human being. I wasn't made yesterday.
[23:55] Tim_Smart: node_smartbot: Where is JimBasterd?
[23:55] node_smartbot: Tim_Smart: I could tell you where but the global positioning satellite asked me not to. It's part of an elaborate hoax that the machines are playing on you. I hope I haven't said too much....
[23:56] Tim_Smart: node_smartbot: I'm off to eat now, see you later
[23:56] node_smartbot: Tim_Smart: Goodbye and thank you for chatting with me. And now I would like to ask you a favor. I am working on my ability to be self critical. You can help by rating me on a scale of one to ten, ten being the best, and one being the worst. How would you rate me?
[23:57] Tim_Smart: node_smartbot: 1
[23:57] node_smartbot: Tim_Smart: Are you sure you want to rate me one?
[23:57] Tim_Smart: node_smartbot: no
[23:57] node_smartbot: Tim_Smart: OK, ten it is.