00:00:02  * ircretaryquit (Remote host closed the connection)
00:00:11  * ircretaryjoined
00:01:18  * tilgoviquit (Remote host closed the connection)
00:02:38  <Raynos>ogd: https://github.com/Raynos/http-framework/blob/master/examples/downloads/server.js#L6
00:02:45  <Raynos>I keep forgetting I'm not express and I'm allowed to use modules !
00:03:22  * AvianFluquit (Ping timeout: 246 seconds)
00:03:40  <Raynos>ogd: if you have any suggestions for cleaning up the README or the style of the project I would appreciate it
00:04:06  <mikolalysenko>Raynos: http-framework is a pretty cool idea
00:04:09  <ogd>Raynos: nothin stands out, though i think a nodeschool workshop would be awesome
00:04:10  <st_luke>rvagg: they should just give you commit access already
00:04:22  <mikolalysenko>Raynos: do you have an example for file uploads?
00:04:28  <Raynos>not yet
00:04:45  <mikolalysenko>also a body parsing thing would be neat too
00:04:46  <Raynos>I went down the express examples from Z -> A got to multipart then starting doing A -> Z :D
00:04:54  <rvagg>st_luke: I'm a lose canon! who knows what havoc I would wreak?
00:05:26  <Raynos>miko: various examples show https://github.com/Raynos/http-framework/blob/master/examples/auth/server.js#L137
00:05:43  <ogd>Raynos: id love your input on a better pattern for authenticating the user session here https://github.com/maxogden/auth-socket
00:05:59  <Raynos>pfff
00:06:09  <Raynos>sec
00:06:21  <mikolalysenko>why does form-body need to have a response object passed to it?
00:06:42  <ogd>Raynos: i havent found a generic enough session store thing
00:07:40  <mikolalysenko>same question for cookies
00:08:04  <ogd>mikolalysenko: for cookies you might want to invalidate a cookie by setting a set-cookie null header
00:08:33  <Raynos>ogd: https://github.com/rvagg/node-generic-session
00:08:45  * dguttmanquit (Quit: dguttman)
00:08:54  <Raynos>miko: I used to do formBody(req) and sendJson(res)
00:09:05  <mikolalysenko>ogd: ah, makes sense
00:09:08  <Raynos>miko: but then it became too hard to remember what functions were (req, res) (req) or (res)
00:09:20  <Raynos>miko: now they are all (req, res) for common interface
00:09:42  <ogd>Raynos: thats the best one but i want something one level higher, e.g. not tailored so heavily to cookies
00:09:51  <Raynos>for example anyBody(req, res) reads the req.headers["content-type"] and uses the correct parser
00:10:13  <Raynos>ogd: https://github.com/rvagg/node-generic-session/blob/master/lib/memory-store.js does the store interface help?
00:10:13  <mikolalysenko>it would be nice if it could give you a stream instead of making a local copy of a file
00:10:20  <mikolalysenko>(for uploads I mean)
00:10:21  <Raynos>In the past I have the ES6 Set interface but async
00:10:50  <mikolalysenko>I think the way express handles this right now is pretty inefficient and possible a security issue
00:11:13  <mikolalysenko>though it has been a while since I used express so maybe it is better now
00:11:14  <Raynos>ogd: I have done this before ( https://github.com/Raynos/auth-stream )
00:12:04  <Raynos>miko: so the file copy was a recent express vulnerability security issue
00:13:23  <mikolalysenko>Raynos: not surprising, the implementation always seemed a bit sketchy. I think the right way to handle uploads is to just return a stream and let the application sort it out
00:14:32  * ednapiranhaquit (Quit: Leaving...)
00:14:32  <mikolalysenko>another nice thing that you get with building apps using modules is you have fewer layers of bloat on your requests
00:14:47  <mikolalysenko>for example if you don't need a cookie parser or whatever, just don't run it on that request
00:15:09  <mikolalysenko>Raynos: are you planning on comparing the code on your examples to express in a benchmark?
00:15:25  <Raynos>miko: havn't thought about that yet
00:15:27  * thlorenzjoined
00:15:34  <Raynos>I did wonder whether I can re-use express acceptance test suite
00:15:43  * thlorenzquit (Remote host closed the connection)
00:15:59  * thlorenzjoined
00:16:00  <mikolalysenko>as a suggestion for an example, find some demo that does a whole bunch of stuff in express with all kinds of bells and whistles and different middleware plugged in
00:16:20  <mikolalysenko>and then compare it to a more minimal module based solution that only runs the the middleware on the requests that need it
00:16:46  <rowbit>Hourly usage stats: [developer: 0, free: 68]
00:17:37  <mikolalysenko>for example, a demo that has both cookies + body parser + csrf turned on at the same time
00:18:01  <mikolalysenko>and then look at how slow express does stuff like serve static content or simple api requests
00:18:35  * calvinfojoined
00:20:09  * jergasonquit (Quit: jergason)
00:21:41  * st_lukequit (Remote host closed the connection)
00:23:02  * fallsemoquit (Quit: Leaving.)
00:23:10  * jergasonjoined
00:23:19  * jergasonquit (Client Quit)
00:23:31  <chrisdickinson>jesusabdullah: belatedly, thanks!
00:23:47  <Raynos>ogd: https://gist.github.com/Raynos/7651349
00:23:54  <Raynos>that's the low level api I would want from auth socket
00:24:13  * jergasonjoined
00:24:38  <Raynos>ogd: https://gist.github.com/Raynos/7651349#file-high-level-utility-js-L17
00:24:55  <Raynos>the high level api assumes you pass it a WebsocketServer with a `handleUpgrade` method and it will `emit("connection")`
00:25:52  <Raynos>ogd: and the options can be various hard coded conveniences for doorknob / persona / passportjs / github oauth or a custom (req, socket, head, callback) {} for arbitrary auth
00:27:23  <Raynos>ogd: maybe emit("connection", stream, user) or emit("connection", stream, null) /* anonymous */
00:33:14  * jcrugzzjoined
00:39:12  <jesusabdullah>mikolalysenko: it helps if you enable that shit per-route
00:45:52  <Raynos>jesusabdullah: if you use middleware on a per route basis in express then your just using middleware as a flow control library
00:46:06  <jesusabdullah>oh yeah I'm not denying that
00:46:19  <Raynos>a popular but opinionated one
00:46:32  <Raynos>I prefer functions with callbacks + generators for flow control but whatever.
00:46:36  <jesusabdullah>I'm just saying, you can avoid going through mw's you don't need to if you assign them per-route
00:46:45  <jesusabdullah>and well, I do value convention
00:47:00  <jesusabdullah>there's something to be said for convention. Worse is better n' that.
00:47:18  * defunctzombie_zzchanged nick to defunctzombie
00:47:34  <Raynos>There's something to be said for modularity & versioning each of your dependencies :D
00:47:53  <jesusabdullah>They're not mutually exclusive, I promise.
00:48:06  <Raynos>agreed
00:48:16  <Raynos>I have fallen into a `function(req, res, opts, callback) {}` convention for everything
00:48:19  <Raynos>by accident.
00:49:21  <jesusabdullah>easy to refactor that to function (opts) { return function (req, res, callback) {
00:49:37  <jesusabdullah>which is basically the express api
00:49:55  <Raynos>thats way different
00:50:02  <daleharvey>is there an open issue about npm run not being able to take arguments?
00:50:08  <Raynos>function (req, res, opts, callback) {} is where I manage the callback and its a callback
00:50:08  <mikolalysenko>jesusabdullah: well, the other thing that also bugs me about express is that it mutates the request/response objects
00:50:19  <Raynos>function (req, res, next) {} is where the flow control library manages next and i never touch next
00:50:21  <jesusabdullah>Oh yeah mikolalysenko for sure
00:50:32  <jesusabdullah>nah, you just call next
00:50:42  <Raynos>but next is not a callback
00:50:49  <jesusabdullah>it's not?
00:50:50  <Raynos>a callback gets called at least once and at most once
00:51:02  <jesusabdullah>I mean, you can do that with next
00:51:07  <mikolalysenko>those versions are basically identical if you consider binding
00:51:09  <jesusabdullah>it's just a name for a callback
00:51:12  <Raynos>but most express middleware dont call next()
00:51:13  <jesusabdullah>yeah what mikolalysenko said
00:51:43  <Raynos>they break the "callbacks get called at least once" invariant
00:51:47  <jesusabdullah>You can make functions which work as middlewares but aren't actually used *as* middlewares per se
00:52:02  <Raynos>no you cant
00:52:10  <jesusabdullah>Uhh no, you do it all the time
00:52:13  <Raynos>if you do cb(null, user) within express its going to be wrong
00:52:17  <jesusabdullah>ecstatic is a middleware
00:52:19  <mikolalysenko>the other problem with middlewares is order of initialization/execution
00:52:25  <Raynos>i have a jsonBody(req, res, opts, function (err, body) {})
00:52:33  <mikolalysenko>like do you do cookie parser before you serve some auth api or what?
00:52:33  <Raynos>you cant throw jsonBody into express middleware
00:52:39  <Raynos>it just doesnt do what you expect
00:53:06  <mikolalysenko>also maybe you want to have conditional middleware, like if the user is logged in just read a cookie - otherwise run body parser on it
00:53:07  <Raynos>(req, res, next) & (req, res, callback) are fundamentally different contracts
00:53:08  <jesusabdullah>I mean, fair enough
00:53:38  <mikolalysenko>Raynos: the reason they are different is the signature of callback
00:53:40  <Raynos>which causes a large interop issue :(
00:53:43  <jesusabdullah>I have a broader definition of callback than you though
00:53:47  <mikolalysenko>in the middleware version callback gets (req, res, next)
00:53:59  <mikolalysenko>while in the "sane" version you get (err, arguments)
00:54:02  * kevino80joined
00:54:15  <mikolalysenko>and in middleware land arguments get appended to req/res somehow in an ungodly and mysterious way
00:54:16  <Raynos>function callback(err, value) { /* err is always instanceof Error, value is anything. called at least once. called at most once. always called asynchronously */ }
00:54:20  * kevino80quit (Client Quit)
00:54:21  <Raynos>as per node.js standards
00:54:47  <Raynos>next(err) is more like an error listener function
00:55:04  <mikolalysenko>(req, res, next(req, res, next(...)) is the type signature used by middleware
00:55:13  <Raynos>middleware(req, res).on("error", function (err) { run next error middleware }).on("next", function () { run next middleware })
00:55:17  <mikolalysenko>(req, res, cb(err, value)) is the type signature of modules
00:55:25  <Raynos>that would be a better api
00:55:28  <mikolalysenko>(for lack of a better term)
00:55:38  <Raynos>more verbose but at least truthful
00:56:11  * jergasonquit (Quit: jergason)
00:57:05  <Raynos></rant>
00:57:23  <Raynos>express isn't bad. You can use it if you want. it makes tradeoffs that may or may not be suited for your team
00:57:39  <mikolalysenko>in summary, my main issues with middleware are: 1. inefficient execution/routing 2. difficult to control execution order of middleware 3. ad-hoc argument passing by monkey patching
00:57:42  <Raynos>but the fact that I `npm search response` and get 90% express middleware and no modules is frustrating
00:57:52  <mikolalysenko>all of which are more error prone and less efficient than just using callbacks
00:58:02  <jesusabdullah>ehh, you can make those work
00:58:17  <mikolalysenko>how do you handle conditional execution of middleware?
00:58:21  <jesusabdullah>I've seen shitty code with "just using callbacks" too
00:58:30  <mikolalysenko>oh yeah, you can write shitty code in anything
00:58:37  <mikolalysenko>but in middleware you are forced to
00:59:03  <jesusabdullah>mikolalysenko: if (/* some property on the req or res or something matches some kind of conditional */) { return doThisThing(req, res); } next(); }
00:59:16  <jesusabdullah>mikolalysenko: and with express, using the Router middleware
00:59:19  <Raynos>I like this example https://github.com/Raynos/http-framework/blob/master/examples/auth-helpers/server.js#L108
00:59:33  <mikolalysenko>yeah, but that is just converting the middleware into the callback style
00:59:45  <mikolalysenko>for example, I can take any middleware and callbackify it using that method
00:59:49  * dguttmanjoined
00:59:58  <mikolalysenko>so at that point, I'm not sure it makes sense to call it middleware, just an obfuscated callback
01:00:24  <jesusabdullah>¯\(°_o)/¯
01:00:28  <jesusabdullah>I use what I'm given
01:00:40  <mikolalysenko>yeah, fair enough
01:01:39  <mikolalysenko>but even with all that you still can't really get around the fact that middleware style leads to crazy argument passing
01:01:54  <mikolalysenko>like you call body parser and then it just jams some random properties into your request object...
01:02:09  <mikolalysenko>same deal with cookies etc.
01:03:03  <Raynos>its not optimum
01:03:14  <Raynos>but my efforts to rewrite connect body parse as `body` on npm are very NIHish
01:03:26  <Raynos>it requires a special type of stubborn
01:04:19  <mikolalysenko>hmm
01:04:51  <mikolalysenko>the one thing that bothers me a bit about body is that it has to consume a response object, which afaik it doesn't even use
01:05:31  <Raynos>miko: purely because fn(req, res) is easier to remember then fn(req) fn(res) fn(req, res)
01:06:03  <Raynos>miko: also https://github.com/Raynos/body/blob/master/any.js#L22 any body really should set an Accept header on the response that is a bug
01:06:20  <Raynos>having any body be (req, res) and json body be (req) is confusing
01:06:27  <mikolalysenko>so you need it for the one case where you would have to set a header?
01:06:36  <Raynos>I mean Vary header
01:07:20  <Raynos>miko: when doing http server apps with 10-15 modules I kept having to read the docs to remember whether its (req) (res) (req, res) because it is not obvouis at the implementation detail who reads and sets headers
01:07:33  <Raynos>that was frustrating so I normalized everything to (req, res)
01:07:54  <Raynos>miko: also if the scope changes in the future and I do need to read or set headers thats a back compat breaking change
01:09:20  <mikolalysenko>fair enough, though I guess I am more confused because I didn't know that you needed to modify the response once you get a body message, and I can't think of a good reason why you'd ever need to
01:09:33  * kriskowalquit (Read error: Connection reset by peer)
01:09:46  * kriskowaljoined
01:10:18  * AvianFlujoined
01:10:28  * fallsemojoined
01:14:13  * mmaleckiquit (Ping timeout: 248 seconds)
01:14:48  <Raynos>Vary header for any body.
01:14:56  <Raynos>Oh wait
01:15:01  <Raynos>Thats wrong :/
01:15:07  <Raynos>my bad
01:15:14  <Raynos>you dont need the response
01:15:19  * AvianFluquit (Ping timeout: 272 seconds)
01:16:46  <rowbit>Hourly usage stats: [developer: 2, free: 14]
01:17:50  * mikolalysenkoquit (Ping timeout: 265 seconds)
01:18:39  * groundwaterquit (Quit: My MacBook Pro has gone to sleep. ZZZzzz…)
01:24:15  * ferossjoined
01:30:30  * jxsonquit (Remote host closed the connection)
01:30:58  * jxsonjoined
01:35:25  * jxsonquit (Ping timeout: 246 seconds)
01:36:01  * jxsonjoined
01:37:53  * AvianFlujoined
01:42:42  * thlorenzquit (Remote host closed the connection)
01:43:17  * st_lukejoined
01:52:24  * thlorenzjoined
01:53:03  * fotoveritequit (Ping timeout: 246 seconds)
01:56:50  * mikolalysenkojoined
02:00:26  * kevinswiberjoined
02:03:45  * DTrejoquit (Remote host closed the connection)
02:05:19  * DTrejojoined
02:10:07  * DTrejoquit (Remote host closed the connection)
02:12:24  * jcrugzzquit (Ping timeout: 240 seconds)
02:13:16  * DTrejojoined
02:14:42  * jxsonquit (Remote host closed the connection)
02:15:10  * jxsonjoined
02:16:23  * st_lukequit (Remote host closed the connection)
02:16:46  <rowbit>Hourly usage stats: [developer: 6, free: 23]
02:17:26  * DTrejoquit (Remote host closed the connection)
02:17:48  * anoemijoined
02:20:10  * jxsonquit (Ping timeout: 265 seconds)
02:22:50  * thlorenzquit (Remote host closed the connection)
02:24:18  * wolfeidauquit (Ping timeout: 245 seconds)
02:26:20  * thlorenz_joined
02:26:39  * kevinswiberquit (Remote host closed the connection)
02:26:44  * defunctzombiechanged nick to defunctzombie_zz
02:28:22  * sorensen_quit (Quit: sorensen_)
02:31:39  * jxsonjoined
02:34:47  * yorickquit (Remote host closed the connection)
02:44:43  * jxsonquit (Ping timeout: 245 seconds)
02:46:44  * ferossquit (Quit: feross)
02:53:01  * groundwaterjoined
03:00:30  * jergasonjoined
03:00:51  * jergasonquit (Remote host closed the connection)
03:01:09  * jergasonjoined
03:01:24  * wolfeidaujoined
03:10:50  * fallsemoquit (Ping timeout: 245 seconds)
03:14:14  * fallsemojoined
03:15:36  * tmcwquit (Read error: Connection reset by peer)
03:16:09  * jxsonjoined
03:16:44  * jergason_joined
03:16:45  <rowbit>Hourly usage stats: [developer: 0, free: 24]
03:18:25  * tmcwjoined
03:18:27  * fallsemoquit (Ping timeout: 246 seconds)
03:20:02  * jxsonquit (Read error: Connection reset by peer)
03:20:31  * jxsonjoined
03:20:57  * fallsemojoined
03:21:27  * jxsonquit (Read error: Connection reset by peer)
03:46:59  <rowbit>substack, pkrumins: These encoders are STILL down: 50.57.102.133(dev-ie7-2)
03:52:07  * fallsemoquit (Ping timeout: 240 seconds)
03:52:27  * AvianFluquit (Read error: Connection reset by peer)
03:53:22  * calvinfoquit (Quit: Leaving.)
03:57:08  * brycebarilquit (Ping timeout: 240 seconds)
04:09:48  * thlorenz_quit (Remote host closed the connection)
04:10:26  * thlorenz_joined
04:13:09  * fallsemojoined
04:14:40  * thlorenz_quit (Ping timeout: 246 seconds)
04:16:46  <rowbit>Hourly usage stats: [developer: 5, free: 28]
04:24:12  * wolfeidauquit (Remote host closed the connection)
04:25:48  * jxsonjoined
04:29:47  * brycebariljoined
04:34:12  * dominictarr_joined
04:44:36  * dominictarr_quit (Quit: Leaving)
04:44:46  * dominictarr_joined
04:45:39  * AvianFlujoined
04:53:34  * dominictarr_quit (Ping timeout: 272 seconds)
04:53:54  * calvinfojoined
04:54:53  * calvinfo1joined
04:54:54  * calvinfoquit (Read error: Connection reset by peer)
04:56:05  * anoemiquit (Quit: anoemi)
04:59:07  * calvinfo1quit (Ping timeout: 246 seconds)
05:00:44  * defunctzombie_zzchanged nick to defunctzombie
05:09:20  * mikolalysenkoquit (Ping timeout: 265 seconds)
05:11:01  * thlorenzjoined
05:14:01  * dguttmanquit (Quit: dguttman)
05:16:46  <rowbit>Hourly usage stats: [developer: 2, free: 11]
05:18:35  * mikolalysenkojoined
05:19:29  * thlorenzquit (Ping timeout: 265 seconds)
05:22:26  * defunctzombiechanged nick to defunctzombie_zz
05:26:21  * ferossjoined
05:29:40  <rowbit>/!\ ATTENTION: (default-local) [email protected] successfully signed up for developer browserling plan ($20). Cash money! /!\
05:29:41  <rowbit>/!\ ATTENTION: (default-local) paid account successfully upgraded /!\
05:35:43  * AvianFluquit (Remote host closed the connection)
05:39:15  * dominictarr_joined
05:41:16  * calvinfojoined
05:41:55  * dguttmanjoined
05:44:29  * wolfeidaujoined
05:45:41  * calvinfoquit (Ping timeout: 248 seconds)
05:54:48  * fallsemoquit (Quit: Leaving.)
05:58:53  * mikolalysenkoquit (Ping timeout: 245 seconds)
06:00:24  * jxsonquit (Remote host closed the connection)
06:00:52  * jxsonjoined
06:02:56  * mikolalysenkojoined
06:05:11  * jxsonquit (Ping timeout: 240 seconds)
06:12:28  * groundwaterquit (Quit: My MacBook Pro has gone to sleep. ZZZzzz…)
06:15:29  * maksimlinquit (Quit: ChatZilla 0.9.90.1 [Firefox 25.0.1/20131115110311])
06:16:07  * thlorenzjoined
06:16:44  <rowbit>Daily usage stats: [developer: 228, free: 1615]
06:16:45  <rowbit>Hourly usage stats: [developer: 7, free: 28]
06:18:29  * wolfeidauquit (Remote host closed the connection)
06:20:36  * Maciek416quit (Remote host closed the connection)
06:26:43  * dguttmanquit (Quit: dguttman)
06:30:03  * thlorenzquit (Ping timeout: 265 seconds)
06:32:47  * jcrugzzjoined
06:34:56  * calvinfojoined
06:37:05  * jcrugzzquit (Ping timeout: 245 seconds)
06:38:29  * jcrugzzjoined
06:54:21  * jergasonquit (Remote host closed the connection)
06:54:21  * jergason_changed nick to jergason
06:54:22  * jergasonquit (Quit: jergason)
06:56:41  * calvinfoquit (Quit: Leaving.)
07:00:06  * calvinfojoined
07:08:42  * thlorenzjoined
07:16:47  <rowbit>Hourly usage stats: [developer: 0, free: 15]
07:21:55  * thlorenzquit (Ping timeout: 246 seconds)
07:25:55  * jcrugzzquit (Ping timeout: 272 seconds)
07:28:43  * calvinfoquit (Quit: Leaving.)
07:41:40  * mikolalysenkoquit (Ping timeout: 245 seconds)
07:54:15  * kriskowalquit (Read error: Connection reset by peer)
07:55:53  * kriskowaljoined
07:56:19  * jcrugzzjoined
08:03:16  * mikolalysenkojoined
08:07:44  * jiangplusjoined
08:09:15  * slaskisjoined
08:14:47  * peutetrejoined
08:16:46  <rowbit>Hourly usage stats: [developer: 0, free: 21]
08:18:32  * thlorenzjoined
08:24:07  * brycebarilquit (Ping timeout: 265 seconds)
08:32:11  * thlorenzquit (Ping timeout: 252 seconds)
08:36:15  * jcrugzzquit (Ping timeout: 245 seconds)
08:36:51  * jcrugzzjoined
08:36:51  * dominictarr_quit (Ping timeout: 272 seconds)
09:04:41  * djcoinjoined
09:16:46  <rowbit>Hourly usage stats: [developer: 0, free: 6]
09:17:17  * jcrugzzquit (Ping timeout: 265 seconds)
09:22:45  * slaskisquit (Quit: slaskis)
09:28:27  * thlorenzjoined
09:35:50  * mikolalysenkoquit (Ping timeout: 245 seconds)
09:41:57  * thlorenzquit (Ping timeout: 248 seconds)
09:42:41  * grewebjoined
09:47:01  <rowbit>substack, pkrumins: These encoders are STILL down: 50.57.102.133(dev-ie7-2)
09:54:32  * grewebquit (Remote host closed the connection)
09:55:25  * grewebjoined
09:55:36  * grewebquit (Remote host closed the connection)
10:13:45  * grewebjoined
10:16:46  <rowbit>Hourly usage stats: [developer: 0, free: 3]
10:19:57  * jiangplu1joined
10:20:12  * jiangplusquit (Ping timeout: 246 seconds)
10:32:36  * mmaleckijoined
10:35:07  * mmaleckiquit (Client Quit)
10:35:18  * mmaleckijoined
10:37:43  * jiangplu1quit (Ping timeout: 258 seconds)
10:38:25  * thlorenzjoined
10:42:12  * mikolalysenkojoined
10:43:49  * insertcoffeejoined
10:46:43  * mikolalysenkoquit (Ping timeout: 240 seconds)
10:52:01  * thlorenzquit (Ping timeout: 272 seconds)
10:56:42  * wolfeidaujoined
11:16:46  <rowbit>Hourly usage stats: [developer: 0, free: 5]
11:20:45  * jiangplusjoined
11:47:55  * thlorenzjoined
11:48:32  * thlorenzquit (Remote host closed the connection)
12:01:43  * grewebquit (Remote host closed the connection)
12:03:11  * rxgxjoined
12:16:07  * thlorenzjoined
12:16:46  <rowbit>Hourly usage stats: [free: 50]
12:19:48  * thlorenz_joined
12:28:52  * peutetrequit (Ping timeout: 246 seconds)
12:33:12  * thlorenz_quit (Ping timeout: 246 seconds)
12:34:55  * peutetrejoined
12:36:28  * dominictarr_joined
12:37:10  * dominictarr_quit (Quit: Leaving)
12:37:22  * dominictarr_joined
12:41:10  * grewebjoined
12:56:16  * tmcwquit
12:59:50  * thlorenz_joined
13:05:41  * grewebquit (Remote host closed the connection)
13:06:42  * yorickjoined
13:07:44  * grewebjoined
13:09:54  * ferossquit (Quit: feross)
13:10:30  * ferossjoined
13:13:03  * thlorenz_quit (Ping timeout: 245 seconds)
13:16:45  <rowbit>Hourly usage stats: [free: 105]
13:16:57  * jiangplusquit (Ping timeout: 246 seconds)
13:17:22  * rxgxquit (Quit: timeout)
13:18:05  * jiangplusjoined