[00:00] mtodd: or some good references for JS in general... still trying to find the go-to resources for JS hacking [00:00] mape: checked howtonode? [00:00] isaacs: mtodd: any sufficiently big nodejs program should work. npm, fab, express, connect, step, etc. [00:00] isaacs: there's lots [00:00] isaacs: just rtfs [00:01] isaacs: (the "f" is for "fantastic") [00:02] towski has joined the channel [00:03] JimBastard: mtodd: the wiki page for node [00:03] JimBastard: the modules page [00:07] ryan_gahl: aside: in a framework context, how does the community feel about a globally scoped namespace object for the framework? i.e. in the bootstrap.js (or main.js) do: global.myframework = {foo: ...}; so that in subsequent framework-specific files, myframework.doSomething() works? [00:09] isaacs: ryan_gahl: i disagree with that approach. [00:09] ryan_gahl: in the browser, that's the way... but in node, would it be better to pass the framework namespace object to the child files to build onto it and then tack it onto exports within bootstrap.js [00:09] isaacs: ryan_gahl: npm's modules just var npm = require("../npm") to get at the main object [00:10] ryan_gahl: talking about a web framework [00:10] isaacs: ryan_gahl: module exports are cached. everyone still gets the same thing, no need for browser-style global pollution. we're better than that. [00:10] isaacs: ryan_gahl: a web framework is still jsut a node program. maybe a bit one, but who cares? [00:11] ryan_gahl: k [00:11] isaacs: s/bit/big/ [00:11] isaacs: just my opinion. it's not necessarily universal. [00:11] ryan_gahl: makes sense. it's just a minor shift [00:12] exlt has joined the channel [00:15] ryan_gahl: yeah, I'll definitely be doing a bit of refactoring to Connect and/or node-jsgi style app composition rather than the old namespace object way [00:15] isaacs: ryan_gahl: you can still use the namespace style, just put "exports" as the root of your namespace, and then require("foo") to get at it somewhere else. [00:15] blowery: isaacs: just be careful or npm will turn into maven ;) [00:15] x_or has joined the channel [00:17] behmann: aww, mvn isn't so bad... as long is you don't go outside of its box :) [00:18] ryan_gahl: isaacs: well i think you pretty much put the nail in the coffin so to speak for convincing me. I think i'll go at it with the mindset that each framework service should work out of context generically... if i don't achieve perfection so be it, but that's a better way to go overall [00:18] behmann: go outside of its box and you are asking for a beating (that is a beating of your head against your computer monitor) [00:18] admc has joined the channel [00:19] isaacs: ryan_gahl: yeah, then you get cleaner interoperability as a bonus [00:21] ryan_gahl: isaacs: + granular testability [00:23] ryan_gahl: ACTION stops thinking of the server as a long running browser [00:25] blowery: behmann: mvn should come with a pillow and some whiskey [00:30] isaacs: ACTION never used maven [00:30] isaacs: isn't that a java thing? [00:35] stepheneb has joined the channel [00:39] gerad has joined the channel [00:45] softdrink has joined the channel [00:45] masuidrive has left the channel [00:48] LionMadeOfLions has joined the channel [00:48] blowery: ya [00:48] blowery: it's a package manager for java projects [00:48] blowery: ant on sterioids and crack [00:49] blowery: but.. things like mvn clean will download packages from the internet [00:49] blowery: as it needs to download things so it knows how to do a clean :) [00:49] blowery: i find it overly complicated, but some folks love it [00:54] tmpvar has joined the channel [00:56] ncb000gt: tmpvar: are you intending that people use glfw to house their opengl apps or are you thinking that people will tie them into something like GTK/QT? [00:56] ncb000gt: blowery: I'm not a fan of maven. And yes, it should come with whiskey, but most things should. ;D [01:05] isaacs: blowery: yeah, that sounds like a good fit for java [01:05] isaacs: blowery: i've tried to keep npm as simple as possible, but it's a somewhat necessarily complicated puzzle. [01:12] reid1: isaacs: is there any way i can tell npm to install everything in my project's lib/* directory in .node_libraries? [01:12] reid1: instead of .node_libraries/project-name/* [01:12] isaacs: reid1: nope [01:13] isaacs: reid1: everything gets namespaced to the package name. [01:13] reid1: isaacs: that sucks for narwhal-lib [01:13] isaacs: reid1: but you can make them all one project, and then put ~/.node_libraries/project/ into your NODE_PATH [01:13] isaacs: reid1: tell me about it. [01:14] reid1: isaacs: how do you determine where to link packages? check for require.paths? [01:14] Tim_Smart has joined the channel [01:14] reid1: i'm wondering if it's safe to assume that's where narwhal-lib will live in npm [01:14] isaacs: reid1: i use the "root" config, which defaults to ~/.node_libraries if you're not sudo, or $PREFIX/lib/node if you are [01:15] softdrink has joined the channel [01:15] reid1: isaacs: ok, thanks [01:17] fictorial: ACTION wishes for node-summarize-irc-channel [01:17] reid1: isaacs: or, maybe i could link narwhal-lib in my project, then add that path to require.paths… that way i don't need to muck around with checking npm's config [01:17] fictorial: (scrollback is like 4000 lines now; ouch) [01:18] reid\work has joined the channel [01:18] isaacs: reid\work: : that could work [01:18] isaacs: reid\work: i do plan to support narwhal on npm eventually. [01:18] ryan_gahl: fictorial: "node, npm, connect, node, http, tcp, node, npm, whiskey" [01:19] reid\work: isaacs: horray [01:19] isaacs: reid\work: http://github.com/isaacs/narwhal-npm-meta [01:20] isaacs: reid\work: it doesn't work, yet, though [01:20] riottaba has joined the channel [01:20] jedschmidt: isaacs: sorry if i missed this, but is there anything like namespacing in npm? [01:20] fictorial: ryan_gahl: :) I'm sure you've been asked this, but, is that your real name? [01:20] ditesh|cassini has joined the channel [01:20] isaacs: jedschmidt: sure. there's a namespace. just one. [01:20] isaacs: jedschmidt: :) [01:20] isaacs: jedschmidt: the name of your package is your namespace. [01:21] isaacs: jedschmidt: it's a landgrab. i'm ok with that. [01:21] jedschmidt: isaacs: can i require certain things from within it? [01:21] jedschmidt: like mylib/sublib1? [01:21] isaacs: jedschmidt: sure. it maps the folder to the lib folder. [01:21] ryan_gahl: fictorial: yes, i have, and yes it is :) [01:21] isaacs: jedschmidt: require("npm/utils/semver") [01:21] SamuraiJack has joined the channel [01:21] reid\work: isaacs: ah, yeah—having the narwhal packages on npm actually install might help. (narwhal vs. narwhal-node vs. node-narwhal) [01:22] isaacs: reid\work: the idea is to do "npm install narwhal" and then have it work [01:22] jedschmidt: isaacs: can these submodules themselves be dependencies of other modules? [01:22] isaacs: jedschmidt: check out the man npm-json page [01:23] fictorial: reid\work: "reid escape work" heh [01:23] jedschmidt: isaacs: cool, thanks. [01:24] isaacs: jedschmidt: so you can link a dependency into a specific place in your package, or you can do some other cool stuff. [01:25] ncb000gt has joined the channel [01:26] jedschmidt: isaacs: so something like { dependencies: "mylib/sublib1": "*" } is valid? [01:26] isaacs: jedschmidt: it's not "submodules" per se, just modules inside a folder. [01:26] isaacs: jedschmidt: no, that's not valid [01:26] isaacs: jedschmidt: you'd just do { dependencies: { "mylib" : "*" } } and then do require("mylib/sublib1") [01:26] ncb000gt: tmpvar: had you answered the glfw question? seems I missed it (was dc'd). [01:27] jedschmidt: isaacs: cool, much appreciated. i might ping you later this week. [01:28] isaacs: jedschmidt: np [01:32] boaz has joined the channel [01:32] jxson_ has joined the channel [01:37] riottaba has joined the channel [01:38] TommyM has joined the channel [01:41] gerad has joined the channel [01:44] richcollins has joined the channel [01:45] mscdex has joined the channel [01:47] riottaba has joined the channel [01:49] LionMadeOfLions has joined the channel [01:49] jxson has joined the channel [01:51] stratospark has joined the channel [01:53] x_or has joined the channel [02:03] AndChat has joined the channel [02:04] TommyM has left the channel [02:07] AndChat has joined the channel [02:07] grahamalot has joined the channel [02:09] halorgium: sechrist: you online? [02:13] tjholowaychuk has joined the channel [02:16] mtodd has joined the channel [02:18] richcollins has joined the channel [02:23] riottaba_ has joined the channel [02:25] phiggins has joined the channel [02:31] gerad has joined the channel [02:31] sanderjd has left the channel [02:34] mikeal has joined the channel [02:36] stepheneb has joined the channel [02:37] riottaba has joined the channel [02:40] mtodd: I asked this earlier but got disconnected, but... what's some of the go-to resources for JavaScript documentation? [02:40] mtodd: API, that is [02:40] mjijackson has joined the channel [02:40] mtodd: also, what is a great example of setting up a Node.js library insofar as defining a class (do I use prototypes, Class.create, etc), et al [02:41] mtodd: just looking for a resource that isn't w3schools or whatever... a pointer in the right direction [02:41] tlrobinson_ has joined the channel [02:49] AndChat has joined the channel [02:50] JimBastard has joined the channel [02:51] JimBastard: man, we had a bit of a parsing war over here [02:51] JimBastard: take in a string of HTML and return JUP [02:52] JimBastard: i choose using the DOM and JSDOM, tmpvar went loops and string replacement, fernmicro and indexzero went crazy 10 line regex [02:52] riottaba_ has joined the channel [02:52] JimBastard: im kinda winning, but i started yesterday [02:55] saikat: in node.js, i know that http requests get processed asynchronously, but do i have assurance that they will get processed in the order that the requests came? [02:55] saikat: so, for example, if one client sends request A and request B after request A, my node server will handle request A before request B? [03:00] inimino: mtodd: mozilla developer center [03:00] x_or has joined the channel [03:00] inimino: JimBastard: "JUP"? [03:00] Tim_Smart: saikat: If request A had more db processing to do, it would return afterwards [03:00] JimBastard: yeah man [03:00] JimBastard: its bad ass [03:00] JimBastard: http://github.com/marak/JUP [03:00] JimBastard: im on a fork the author is here too [03:01] Tim_Smart: Otherwise you can implement a basic queue,, saikat [03:01] saikat: i see, thanks Tim_Smart [03:01] JimBastard: its quite possibly, the smallest fastest possible way to represent html markup in javascript [03:01] JimBastard: i dont see it getting more succint [03:02] softdrink has joined the channel [03:03] inimino: JimBastard: ah, I see [03:08] mtodd: inimino: will check it out. Thanks! [03:09] sechrist: halorgium: ya [03:09] sechrist: now [03:10] halorgium: sechrist: did you opensource the lib for twitter? [03:10] sechrist: uh it's super hacky and there's probably something better [03:10] sechrist: so no [03:11] halorgium: sechrist: lol, i just wanted a link to the buftok ;) [03:11] sechrist: oh heh [03:11] sechrist: you said you'd lose it [03:13] sechrist: https://gist.github.com/95b4ea093263dea118f9 [03:13] sechrist: halorgium: ^^ [03:14] tlg has joined the channel [03:14] x_or has joined the channel [03:14] halorgium: sechrist: danke [03:15] tlrobinson_ has joined the channel [03:17] SvenDowideit has joined the channel [03:18] jbrantly has joined the channel [03:23] fictorial: hmm, does node.js support named pipes (FIFOs)? I don't see it. [03:24] fictorial: I'm looking for an efficient means to do IPC between 2 local processes, a non-node.js process and a node.js process. [03:26] gerad has joined the channel [03:28] AndChat has joined the channel [03:29] riottaba has joined the channel [03:30] sechrist: node-thrift plz [03:31] halorgium: fictorial: mkfifo ? [03:32] fictorial: halorgium: node can r/w to a named pipe? [03:33] whoahbot has joined the channel [03:33] halorgium: net.Stream to a file? [03:35] tlrobinson_ has joined the channel [03:36] whoahbot has joined the channel [03:36] AndChat has joined the channel [03:36] fictorial: ACTION goes to play around [03:36] gerad: Yo, anybody know of whether there's an OpenID library in progress out there? [03:40] siculars has joined the channel [03:41] Tim_Smart: gerad oauth? [03:41] fictorial: gerad: I looked when I was learning OAuth... No. [03:41] Tim_Smart: There are plenty of oauth libraries now [03:41] fictorial: and GitHub supports OAuth2 :) [03:48] fictorial: halorgium: fs.ReadStream and fs.WriteStream works with a FIFO. FWIW, http://beej.us/guide/bgipc/output/html/multipage/fifos.html [03:48] fictorial: no reason why it *shouldn't* work actually. the interface is just open/read/write as usual. glad to see it does work as expected though. [03:49] gerad: yeah, I noticed a couple oauth ones [03:49] gerad: I guess that people are going with OAuth over OpenID now anyway [03:49] gerad: :-) [03:49] chilts: OAuth and OpenID are two completely different things [03:50] chilts: OAuth is about Authorisation, OpenID is about authentication and identification [03:50] chilts: so you don't choose one over the other, you choose what you need for the job [03:50] gerad: chilts: sure, I agree in principal [03:50] Aria: Except that authorization depends on authentication and identification [03:50] gerad: but in practice, people use oauth for identification [03:50] Aria: And so, OAuth can be used for all three. [03:51] chilts: disagree [03:51] chilts: but ho-hum, am not too worried [03:52] gerad: though, if you're thinking about writing an openid library… it could be useful [03:52] gerad: :-) [03:53] fictorial: ditto here... I am using oauth for identification since there's no openid for node at this time. silly. [04:05] SamuraiJack has joined the channel [04:07] JimBastard: i think saxjs might win the battle of parsing [04:14] devinus_ has joined the channel [04:17] mjr_ has joined the channel [04:26] creationix has joined the channel [04:26] hammerdr has joined the channel [04:33] boaz has joined the channel [04:34] riottaba_ has joined the channel [04:35] hammerdr has joined the channel [04:35] devinus_ has joined the channel [04:36] SteveDekorte has joined the channel [04:39] riottaba has joined the channel [04:40] nsm has joined the channel [04:42] mjijackson has joined the channel [04:42] Validatorian has joined the channel [04:43] x_or has joined the channel [04:44] SteveDekorte has joined the channel [04:45] riottaba_ has joined the channel [04:46] boaz has joined the channel [04:48] Validatorian: fictorial: you around? [04:48] Validatorian: i swear this isn't about the MULTI stuff :) [04:49] fictorial: hey [04:49] fictorial: heh, ok :) [04:49] Validatorian: I'm having a bit of trouble with the return of smember -- isn't it an array? [04:49] fictorial: what does sys.puts(sys.inspect(...)) give you? [04:50] fictorial: It's likely an array of Buffer objects [04:50] Validatorian: weird stuff -- when I .toString() it, it looks right -- yea, it seems to be a buffer object [04:50] Validatorian: hmm.. is there a toArray()? *checks* [04:50] fictorial: is it a Buffer or array of Buffer? [04:50] fictorial: there's a test for all the commands [04:50] fictorial: see test/test.js [04:51] Validatorian: yea, I've been using that a lot, I suppose I don't understand what you are doing in there in this case :-/ [04:51] Validatorian: I'm basically trying to check if an integer exists withing the sorted set, if(members.indexOf(5) === -1) [04:51] Validatorian: or doesn't exist, in this case ;) [04:51] fictorial: hmm, couple of things there [04:52] fictorial: so it's returning an array of Buffer ... Buffer is used since it does not assume anything (binary safe) [04:52] fictorial: there's redisclient.convertMultiBulkBuffersToUTF8Strings() to convert each element to a UTF-8 encoded string... it's a convenience since that's common. [04:53] fictorial: in your case... do you really have a _sorted_ set? a zset? [04:53] Validatorian: sorry, no -- I'm using sadd [04:53] fictorial: if you want to just test set-membership on a regular set, use SISMEMBER. [04:53] Validatorian: oh yea... hrm. [04:53] fictorial: no need to pull down the entire set and check membership on the client; let Redis do it for you. [04:54] Validatorian: indeed. Dunno what I was thinking :) [04:54] Validatorian: thanks fictorial [04:54] fictorial: np! [04:54] Tim_Smart has joined the channel [04:56] b_erb has joined the channel [04:57] fictorial: bah, I actually need bidirectional ipc and it seems that FIFOs are limited to 65KB buffer in Linux 2.6.11+ ... I should just use sockets. Anyone know _for sure_ that using the loopback interface is really optimized without all the things TCP usually has to deal with? [04:57] riottaba has joined the channel [04:58] boaz has joined the channel [05:03] riottaba_ has joined the channel [05:09] jetienne has joined the channel [05:14] x_or: creationix: Are you there? You mentioned looking at the multitouch demo for an example of pubsub/chat type functionality in connect. I am using it, it is interesting, but I cannot tell what it is doing beyond just a nice example of raphael.js. I have it loaded with two browsers, but don't see anything being transmitted between the two. Am I missing something? [05:19] aoeeae has joined the channel [05:19] riottaba has joined the channel [05:27] cedricv has joined the channel [05:31] isaacs has joined the channel [05:34] gerad has joined the channel [05:34] jetienne: q. what is the common way to provide inline help with nodejs programm ? just --help ? man page ? other ? [05:37] stratospark has left the channel [05:38] isaacs: hey, where did pump end up? is it in the code somewhere, or was that just a tease on the mailing list? [05:41] abadr has joined the channel [05:41] jetienne: ok i will stick to --help :) [05:43] nsm has joined the channel [05:43] riottaba_ has joined the channel [05:45] isaacs: jetienne: i like making man pages with ronn [05:47] jetienne: isaacs: ok so man page. usually i use pod (perl doc stuff) to do man page, but this is the same thing [05:47] isaacs: jetienne: ronn lets you write markdown, and then it converts it to roff files [05:48] isaacs: ACTION <3 markdown [05:48] charlesjolley- has joined the channel [05:49] keyvan has joined the channel [05:54] jetienne: isaacs: i will look at it [05:59] richcollins has joined the channel [06:00] hammerdr has joined the channel [06:02] hammerdr: jetienne: there is a really nice built in arg parser in narwhal-lib that produces automatic help [06:02] dbloete has joined the channel [06:07] sh1mmer has joined the channel [06:07] hammerdr has joined the channel [06:15] jetienne: [08:14] nodejs (source: nodejs): Node.js event-based server-side javascript engine. In component universe, is extra. Version 0.1.97-1 (maverick), package size 345 kB, installed size 952 kB <- this line mean "nodejs will be in the next ubuntu repository" [06:23] jxson has joined the channel [06:25] jxson has left the channel [06:27] utgo has joined the channel [06:28] mikeal has joined the channel [06:29] jetienne: i send them a "request" to backport on current ubuntu version (as it will be maintained 3y for desktop and 5y for server) [06:29] neytema has joined the channel [06:30] felixge has joined the channel [06:35] x_or has joined the channel [06:38] micheil has joined the channel [06:41] mcarter has joined the channel [06:44] jetienne: requirejs is async, while commonjs require is sync.... would it be more logic for node it use requirejs ? i mean nodejs is all about async [06:45] micheil: the problem with async modules is you quickly get very deep closure levels [06:45] riottaba has joined the channel [06:46] jetienne: micheil: ? i dont understand. i mean this just a != syntax, no? you seem to imply it would reduce performance ? [06:47] micheil: rather, it gets difficult to manage [06:47] jetienne: ah ok [06:47] micheil: while it works, sync modules are generally better. [06:48] jetienne: well i could point to ryan slide on how evented networking is just another way to do it :) [06:48] micheil: think about it, for X requests, how often are you going to load a module up? [06:48] jetienne: micheil: once [06:49] micheil: also, think: node's modules get cached, so if you call require(mod) 5 times, 4 out of those 5 go straight to memory, not disk [06:49] micheil: jetienne: were you after websockets? [06:49] jetienne: micheil: yep i want to play with it, why [06:50] micheil: k, just pushed a new packet parser [06:50] jetienne: micheil: do you include a demo code ? [06:50] micheil: um, yeah [06:51] micheil: jetienne: check this out: http://github.com/miksago/node-websocket-server/commit/bbae408af3768636d8c1c7da0fd125878c30d1e2#L1R261 [06:51] micheil: that's the parer I now use [06:51] micheil: s/parer/parser [06:52] micheil: it does have some memory issues, but it works overall better then the later parsers [06:52] micheil: * earlier parsers [06:54] nicolaerusan has joined the channel [06:56] jetienne: micheil: "Uncaught Error: INVALID_STATE_ERR: DOM Exception 11" from chrome 5.0.375.70 beta linux [06:56] micheil: that's known [06:57] jetienne: micheil: "Error during WebSocket handshake: 'sec-websocket-origin' header is missing" from chromium 6.0.427.0 (49012) Ubuntu [06:57] micheil: known. [06:57] jetienne: micheil: ok which version works ? :) [06:57] micheil: if you open up chrome's console, then you should note that the last websocket object that was logged should have a readyState attribute of 0 [06:58] jetienne: oh maybe this is because the websocket html is on file:/// and not html ? [06:58] micheil: yeah [06:58] micheil: that'd be one issue [06:58] micheil: wrong origin, possibly [06:59] jetienne: micheil: the last websocket is readyState: 2 [06:59] micheil: hmm.. so, there should be a message: onClose [07:00] jetienne: micheil: i get client.html from a normal apache server on localhost:80 and the websocket from node echo-server.js [07:00] micheil: yeah [07:00] micheil: I don't think I set a restricted origin in the websocket server [07:00] ewdafa has joined the channel [07:01] jetienne: Started Connection. [07:01] jetienne: client.html:56 [07:01] jetienne: WebSocket [07:01] jetienne: Error during WebSocket handshake: 'sec-websocket-origin' header is missing [07:01] jetienne: client.html:41onclose [07:01] micheil: yeah [07:01] jetienne: micheil: how can i make it work ? [07:01] micheil: one sec. I'll push a patch to fix that, it's draft76 incompat. [07:01] jetienne: chromium 6.0.427.0 is supposed to support last protocol, no ? [07:02] jetienne: another issue, is that if i close the server, no error is notified [07:02] micheil: yeah, chrome 5+ is on draft76 [07:02] jetienne: new connection: using draft75 <- i got this from server log [07:03] micheil: websocket server version? [07:03] jetienne: micheil: a git pull from 10min ago [07:03] micheil: okay, git checkout development [07:03] kuya has joined the channel [07:03] micheil: that'll give you what I'm currently working again. [07:03] micheil: *against [07:04] kuya: hello, im slightly confused - the example on the fron page uses require('tcp') and so does some other code im looking at - but the api docs dont seems to mention it. which is out of date? [07:04] micheil: kuya: replace tcp with net [07:04] kuya: thanks [07:05] kuya: i figured as such [07:05] jetienne: micheil: this is the error in chrome+chromium Uncaught Error: INVALID_STATE_ERR: DOM Exception 11 [07:06] jetienne: micheil: rejected. Reason: Invalid version. <- this is the error on the server [07:06] micheil: let me test.. [07:06] micheil: yeah [07:06] micheil: it should've closed the socket [07:06] micheil: in which case the client shouldn't be able to write [07:07] jetienne: micheil: server report a "close" just after the invalid version [07:07] micheil: yeah [07:07] jetienne: micheil: which browser do you use ? [07:07] micheil: I currently have it working on chrome ~5 [07:08] jetienne: micheil: on mac ? [07:08] virtuo has joined the channel [07:09] micheil: yeah [07:09] virtuo has joined the channel [07:10] jetienne: INVALID_STATE_ERR (11) If an attempt is made to use an object that is not, or is no longer, usable http://kobesearch.cpan.org/htdocs/HTML-DOM/HTML/DOM/Exception.pm.html#INVALID_STATE_ERR_11 [07:11] jetienne: conn.send("Test Message"); <- on this line [07:11] micheil: yeah [07:14] jetienne: client_version=draft76 [07:14] jetienne: server_version=draft75 [07:14] micheil: yeah [07:14] jetienne: micheil: this is in check version... this explain why the bad version. how come this is not "auto" ? [07:15] micheil: if you open up examples/echo-server.js [07:15] micheil: on line 9, change the value to "auto" [07:15] micheil: currently I only support draft75, as I haven't written the new handshake code [07:16] riottaba_ has joined the channel [07:16] jetienne: btw i dont get "onopen" reported in the browser [07:17] micheil: yeah [07:17] micheil: like I said, draft76 isn't supported. [07:18] jetienne: ah ok [07:18] derbumi has joined the channel [07:22] micheil: okay.. [07:22] mcarter has joined the channel [07:22] micheil: just about to push a change to fix that slightly. I'm now forcing a close() on draft76 connections, regardless of versions. [07:23] micheil: jetienne: catch. #f61b848 [07:24] teemow has joined the channel [07:24] siculars has joined the channel [07:24] javajunky has joined the channel [07:25] jetienne: micheil: no progress [07:25] micheil: no? [07:25] Validatorian: gah, javascript date object is driving me crazy :( [07:25] micheil: http://github.com/miksago/node-websocket-server/commit/f61b84894a79bd7437c6dc6e137eb88d4d956a33 [07:25] micheil: that should auto reject draft76 connections for now. [07:26] BBB has joined the channel [07:27] jetienne: micheil: in ws.js i added a lot of log in the this.server.addListener() handlers... and listening is the only one triggered [07:28] micheil: it shouldn't be [07:28] micheil: I think. [07:29] jetienne: micheil: maybe this is in node itself [07:29] micheil: I'm not sure [07:30] jetienne: i run 0.1.97 [07:30] micheil: I'm busy working on draft76 handshaking. [07:30] micheil: while serving normal HTTP is allowed on this server, I don't necessarily support it 100% [07:30] jetienne: ws.emit("listening"); <- this is only to notify the websocket caller, correct ? [07:31] jetienne: function handleUpgradeRequest(req, socket, upgradeHead){ [07:31] jetienne: handleUpgradeRequest.apply(ws, arguments); [07:31] jetienne: this doesnt seem right... no ? [07:32] Validatorian: if anyone needs a break from all this heavy work, you could help out this simpleton by telling me why this doesn't work like I want it to: http://pastebin.com/3Ceqc4yf -- basic premise is, the server time is off, and I need to convert it to my local time to input into my database [07:33] isaacs: w00t. npm 0.1.16 pushed live. fixed a buncha stuff [07:34] micheil: jetienne: no. all those ws.emit() are events on the server, so that the server responds to similar events as http.createServer [07:35] cataska has joined the channel [07:36] Validatorian: n/m to my question -- i'm an idiot (should be date1 - date2, not date2 - date1) [07:36] micheil: Validatorian: gotta love that. ;P [07:36] jetienne: i was writing the fix ;) [07:37] Validatorian: *sigh* [07:38] micheil: jetienne: well, for one handeRequest only get's called when the client asks to upgrade the connection [07:38] ithinkihaveacat has joined the channel [07:38] kuya: is there a reference for V8 somewhere? something i can look up core object methods/attributes? [07:38] micheil: no [07:38] kuya: ACTION looking to find if he can use String.trim... [07:39] micheil: unless you try the Ecmascript reference [07:39] micheil: kuya: just try using it. if it doesn't work, you'll soon know [07:39] kuya: which version of ecmascript is implemented? [07:39] micheil: uhh... [07:39] kuya: of course i tried that ;) [07:39] jetienne: node> " blabla ".trim() [07:39] jetienne: 'blabla' [07:39] kuya: hrm [07:40] kuya: in which case iv messed up somewhere else ... [07:40] kuya: sorry :) [07:40] micheil: no worries. [07:41] felixge: I want a good mysql lib for node [07:41] felixge: now [07:41] felixge: :| [07:42] SubStack: build it [07:42] jetienne: use postgress until somebody else build it :) [07:42] felixge: SubStack: why me? I want other people to build stuff for me sometimes :| [07:43] felixge: I build enough stuff already [07:43] SubStack: but database connectivity libraries are so boring [07:43] felixge: going to try: http://github.com/masuidrive/node-mysql now [07:44] felixge: the lack of tests scare me so [07:44] felixge: and the fact it still uses promises internally [07:44] mape: felixge: it worked fine when I used it [07:44] mape: though I just did simple selects so that probly doesn't count for much [07:45] mape: and it was a while ago [07:46] felixge: mape: well, I need select & insert [07:46] felixge: that's it [07:46] mape: Then go for it :) [07:47] felixge: mape: grep 'escape' comes up empty in the src dir :( [07:47] felixge: not good [07:47] mape: you want it to escape input for you? [07:48] felixge: mape: ofc [07:48] mape: wussy [07:48] mape: ;) [07:48] felixge: unless you want sql injections ... [07:48] felixge: it's part of pretty much any mysql lib [07:48] felixge: because it's not so trivial as most people think [07:48] mape: I guess that is why there are 13 of them in php [07:48] mape: no_for_reals_this_time_escape_string [07:49] SubStack: people still escape sql inputs by hand? [07:50] mape: SubStack: most don't [07:50] mape: escape at all that is [07:50] SubStack: I meant instead of using placeholders or ORM [07:51] felixge: SubStack: there are a lot of programmers working in isolation of the world we live in :) [07:52] SubStack: internet <3 [07:58] markwubben has joined the channel [08:04] nicolaerusan: hey guys [08:05] nicolaerusan: whats the standard way of including an external js file into your server file [08:05] nicolaerusan: (i.e. not a module) [08:05] nicolaerusan: for example, i want access to json2.js in my node server [08:05] hellp has joined the channel [08:05] micheil: I'm not sure [08:05] nicolaerusan: copy and paste seems clunky [08:06] nicolaerusan: there should just be an include statement written for node [08:07] hammerdr: well, it doesn't need to be a module to be added to NODE_PATH? If the file exists on the server just add the location to NODE_PATH and then you can require("json2.js") [08:07] micheil: you could try doing a fs.readFile() then use process.compile(string) [08:07] micheil: file extensions are no longer accepted [08:08] micheil: you can also load a module over http, but it requires a callback [08:08] nicolaerusan: hmm i did that [08:09] nicolaerusan: but seems i don't have access to the object in that file [08:09] nicolaerusan: JSON.parse() throws an erro [08:09] hammerdr: ops.. you're also going to run into the issue that it needs to be 'exported' [08:09] micheil: nicolaerusan: best bet is to fs.readFileSync() then process.compile() the file. [08:10] TomY_ has joined the channel [08:10] nicolaerusan: micheil: kk, will try that [08:11] nicolaerusan: thx [08:11] nicolaerusan: gonna crash now and hammer at all this tmw. take care guys [08:11] nicolaerusan has left the channel [08:11] felixge has joined the channel [08:11] felixge has joined the channel [08:14] micheil: wooo.. just got an experimental handshaking of draft76 working! [08:16] felixge: micheil: nice [08:16] micheil: it actually took me shorter to implement then I expected. [08:16] neurodamage has joined the channel [08:17] neurodamage: anyone tried running this on a freebsd box [08:17] neurodamage: worked on mine [08:17] neurodamage: save of course the linuxy stuff (inotify.h) [08:19] micheil: so.. my websocket server maxes out at about 9%cpu usage, and 50mb memory for my "spam" test [08:20] micheil: chrome & chromium on the other hand almost die trying to render the messages as they come in. [08:20] neurodamage: micheil: what's the test? [08:20] micheil: one client sends 1 million messages very very quickly [08:20] neurodamage: nbio + libevent like select+epoll [08:21] micheil: when idle after doing that, the server sits at 11mb of RAM [08:22] micheil: so, basically, your browsers should die before my server goes down. [08:24] micheil: also, if you do try sending 1 million packets, then your browser locks up for a fair bit. [08:24] neurodamage: micheil: that's a good direction for it to be :) [08:24] neurodamage: plus you should instantaly rate limit someone [08:25] neurodamage: but for the sake of benchmarking cool [08:25] hassox has joined the channel [08:25] micheil: and really. accepting > 10000 packets / client / second seems a bit insane. [08:25] jetienne: i think this is more about latency and would everybody receive the msg you send at the same time [08:26] neurodamage: well implementation, what about a fake stream :)? [08:26] neurodamage: the ability to genereate a DHT fs [08:27] micheil: well, based on my tests, that would be a pretty much "yes" [08:27] micheil: using 2 clients, one sends the spam test, the other listens for a while, then disconnects. [08:27] nicolaerusan has joined the channel [08:27] jetienne: micheil: after the server, will you do the client ? [08:28] micheil: the disconnect is almost instantaneious [08:28] micheil: jetienne: it's on the to-do list at some stage [08:30] sh1mmer has joined the channel [08:32] neurodamage has left the channel [08:32] riottaba has joined the channel [08:53] mAritz has joined the channel [09:00] hammerdr has joined the channel [09:00] slaskis has joined the channel [09:01] slaskis: i'm trying to track down what headers is actually sent by nodejs http client by using wireshark, but i only seem to get the response not the request (although i get it from other apps) any suggestions? [09:02] ivan: right click -> follow tcp stream? [09:02] slaskis: ivan: omg, that's what i was looking for, thanks :) [09:03] riottaba_ has joined the channel [09:11] sh1mmer has joined the channel [09:12] riottaba has joined the channel [09:12] hammerdr has joined the channel [09:16] Tim_Smart has joined the channel [09:17] dabreaka has joined the channel [09:18] riottaba_ has joined the channel [09:18] hammerdr has joined the channel [09:23] SvenDowideit_ has joined the channel [09:24] nsm has joined the channel [09:26] SvenDowi- has joined the channel [09:27] voodootikigod has joined the channel [09:33] slaskis: how can i make my prototype method non-enumerable? [09:35] micheil: uhh.. you can't. [09:36] micheil: well, atleast, not easily, I think. [09:37] hassox has joined the channel [09:40] mitkok has joined the channel [09:41] ctp has joined the channel [09:43] slaskis: micheil: allright, too bad [09:46] riottaba has joined the channel [09:49] ithinkihaveacat_ has joined the channel [09:51] sh1mmer has joined the channel [09:52] peutetre has joined the channel [09:52] xla has joined the channel [09:54] eleanor has joined the channel [09:54] eleanor: what UP [09:54] eleanor: real question [09:54] eleanor: how do I do json [09:55] SubStack: JSON.{parse,stringify} [09:57] eleanor: ty [09:57] eleanor: do i have to require it [09:57] eleanor: or is it gonna just be there [09:57] SubStack: seems to just be there [09:58] riottaba_ has joined the channel [09:59] eleanor: kk [10:05] eleanor: it worked [10:06] SubStack: \o/ [10:06] eleanor: how do I collect the stream into a legit object> [10:06] eleanor: the chunk code doesnt make sense to me [10:06] SubStack: you can add a listener for data events [10:07] SubStack: and then buffer those up accordingly [10:08] grahamalot has joined the channel [10:11] riottaba has joined the channel [10:11] eleanor: is the chunk the whole thing [10:11] eleanor: i can keep +ing it cant i [10:11] eleanor: hmm [10:11] slaskis: what's the recommended way to check if an argument is a readable stream? should i just make sure it has resume and pause methods? or can i instanceof ReadableStream or something? [10:12] riottaba__ has joined the channel [10:15] SubStack: eleanor: the buffer from the callback is just a piece [10:15] eleanor: how do I collect it all properly [10:15] eleanor: im familiar with chunk [10:15] eleanor: i just wanna stream it to memory until i have the full object [10:16] eleanor: then JSON parse [10:16] tlrobinson_ has joined the channel [10:16] SubStack: I wrote http://github.com/substack/node-bufferlist for just that problem [10:16] eleanor: really [10:16] eleanor: im a n00b [10:17] eleanor: can you explain to my ruby mind how this might work [10:17] eleanor: i keep adding buffers to an array [10:17] eleanor: correct> [10:17] eleanor: and then use your plugin on it [10:17] eleanor: and haver the string [10:17] Tim_Smart: eleanor: What chu doin yol? [10:17] eleanor: querying twitter public feeds API json [10:18] slaskis: eleanor: if you know the data won't be binary you could just append the chunks to a string [10:18] eleanor: thats what im trying but i think im getting it wrong [10:18] sh1mmer has joined the channel [10:18] eleanor: i pastie code now? [10:18] eleanor: << n00b [10:18] Tim_Smart: buffer.toString('utf8') or something [10:18] SubStack: slaskis: but the buffer might span a newline [10:18] slaskis: and on the "end" event you know it's done [10:18] slaskis: SubStack: why is that a problem? [10:19] eleanor: http://pastie.org/999098 [10:19] Tim_Smart: You can either merge it all into one buffer using copy(), or append it to a string [10:19] eleanor: how do I append to stringf [10:19] eleanor: i would like to know both ways actually [10:19] eleanor: lol [10:19] eleanor: nooooooode [10:20] Tim_Smart: string = ''; string += buffer.toString() [10:20] SubStack: http://github.com/substack/dnode/blob/master/dnode.js#L67-85 [10:20] eleanor: oy [10:20] SubStack: really just need an async getline [10:20] eleanor: ies buffer and chunk the same [10:22] slaskis: eleanor: didn't try this but something like this? http://pastie.org/999103 [10:22] Tim_Smart: eleanor: Haha you have fallen into the sync trap :p [10:22] SubStack: eleanor: in your case you can just slurp up all the data into a single buffer or string, then add an end listener that parses all the pieces [10:23] riottaba has joined the channel [10:24] Tim_Smart: pretty much the same as slaskis http://pastie.org/999104 [10:24] eleanor: i Believe SubStack [10:24] eleanor: lol [10:24] eleanor: looking [10:25] Tim_Smart: I'll make you an example that uses one big buffer :) [10:27] riottaba_ has joined the channel [10:30] rnewson has joined the channel [10:31] joshbuddy has joined the channel [10:31] eleanor: is it evil to run eval on the result [10:31] eleanor: to create my hash [10:31] eleanor: if its only twitter [10:31] slaskis: eleanor: use JSON.parse() [10:33] awenkhh has joined the channel [10:33] eleanor: ok [10:36] eleanor: stringify creates a json string correct [10:36] eleanor: and parse creates the object or hash [10:37] Tim_Smart: eleanor: I think this is right http://pastie.org/999113 (someone better +1 it first) [10:38] riottaba has joined the channel [10:38] eleanor: cool [10:39] Tim_Smart: forgot to include the Buffer prototype >.> [10:39] Tim_Smart: check again :p [10:41] rnewson has joined the channel [10:43] Tim_Smart: Makes me curious though if it is any faster / slower than simple text appending [10:44] eleanor: benchmark it, u cant tho twiter will ratelimit [10:44] eleanor: i wanna make a twiiter in node [10:44] eleanor: pure evented twitter [10:44] Tim_Smart: There are a few around [10:44] SubStack: twitter is such a boring problem ;) [10:45] Tim_Smart: Yeah its fits node too well :p [10:45] eleanor: so whst'] [10:45] javajunky: eleanor: http://openmicroblogger.org/ would be a good place to start [10:45] SubStack: ACTION is using node to manage virtual machines [10:45] eleanor: i bought a netbook today [10:46] eleanor: eee pc 1005e [10:46] eleanor: gonna linux it [10:46] eleanor: and node / ruby [10:46] eleanor: with it [10:46] eleanor: sick of my heavy laptop [10:46] eleanor: and this thing gets power [10:46] riottaba_ has joined the channel [10:46] eleanor: sick of my 5.5 pound laptop [10:46] SubStack: ! [10:46] eleanor: on a eee right now [10:46] eleanor: theyre all light [10:47] Tim_Smart: eleanor: http://github.com/polotek/evented-twitter , http://github.com/mikeal/tweetstream , http://github.com/ryanmcgrath/twitscript [10:47] polyrhythmic has joined the channel [10:49] eleanor: i was just doing this for fun lol [10:49] eleanor: to learn node [11:00] hassox has joined the channel [11:05] stepheneb has joined the channel [11:09] riottaba has joined the channel [11:09] awenkhh has joined the channel [11:13] riottaba_ has joined the channel [11:14] ithinkihaveacat has joined the channel [11:20] Tim_Smart has joined the channel [11:23] Ori_P has joined the channel [11:24] riottaba has joined the channel [11:32] ditesh|cassini has joined the channel [11:37] hellp has joined the channel [11:40] riottaba_ has joined the channel [11:40] stepheneb has joined the channel [11:41] MattJ has joined the channel [11:44] micheil: hmm.. would an autoload for modules work in node? [11:48] polyrhythmic has joined the channel [11:55] quirkey has joined the channel [12:00] riottaba has joined the channel [12:02] pgriess has joined the channel [12:05] innu: node.js has a function for dir patterns? like Dir.glob in ruby. [12:08] micheil: it doesn't have a Dir.glob [12:09] micheil: I did have an experimental one, but the trouble is working out cross platform stuff [12:09] nsm has joined the channel [12:23] riottaba_ has joined the channel [12:31] caolanm has joined the channel [12:31] egorFiNE has joined the channel [12:32] egorFiNE: Hello! Is there any way to get RAW utf-8 string out of JSON.stringify? I mean raw utf-8 chars, not escaped as \uXXXX. [12:32] riottaba has joined the channel [12:32] egorFiNE: I need to serve JSON to internal mobile application which can handle raw data, and I'm trying to save some traffic for the users that way. [12:42] mjijackson has joined the channel [12:42] SubStack: egorFiNE: could probably .replace on it [12:43] riottaba_ has joined the channel [12:43] egorFiNE: SubStack: hmm. Could be, thanks! Let me check. [12:43] SubStack: .replace(/\\u\d{4}/,function (m) { return String.fromCharCode(Number('0x' + m.slice(2))) }) [12:43] SubStack: or something like that [12:47] egorFiNE: ACTION trying various forms of it [12:48] egorFiNE: it's /\\u[0-9a-f]{4}/g [12:48] SubStack: oh right [12:48] SubStack: silly hex [12:48] egorFiNE: perfect! SubStack, thank you! [12:49] SubStack: also can just do parseInt(n,16) instead of that silly Number('0x'+n) [12:50] SubStack: sys.puts(JSON.stringify({ pi : 'π' }).replace(/\\u[0-9a-f]{4}/g,function (m) { return String.fromCharCode(parseInt(m.slice(2),16)) })) [12:50] SubStack: seems to work [12:50] Ori_P has joined the channel [12:50] SubStack: ACTION gets back to whatever he was doing [12:51] steadicat has joined the channel [12:51] egorFiNE: true. [12:53] jbrantly has joined the channel [12:53] spoob has joined the channel [12:53] phiggins has joined the channel [12:55] jherdman has joined the channel [12:58] perdix has joined the channel [13:00] davidsklar has joined the channel [13:01] behmann has joined the channel [13:02] ditesh|cassini has joined the channel [13:03] polyrhythmic has joined the channel [13:03] boaz has joined the channel [13:04] boaz has joined the channel [13:07] stepheneb has joined the channel [13:08] ncb000gt has joined the channel [13:15] gf3 has joined the channel [13:16] femto has joined the channel [13:22] JAAulde has joined the channel [13:24] ryan_gahl has joined the channel [13:25] tekky has joined the channel [13:25] boaz has joined the channel [13:26] sanderjd has joined the channel [13:27] ithinkihaveacat has joined the channel [13:40] rtl has joined the channel [13:41] behmann has joined the channel [13:45] creationix has joined the channel [13:46] micheil: creationix: draft76? [13:46] siculars has joined the channel [13:46] creationix: micheil: what about it? [13:46] micheil: well, node-websocket-server now supports it [13:47] creationix: nice [13:47] micheil: yeah, took me a little bit to implement [13:47] micheil: had to rewrite the packet / message parser too. [13:47] micheil: ends up parsing messages faster then it can receive them [13:48] micheil: also supports for broken packets, and will be able to support binary data when websockets implement it [13:49] drudge: i can't get the hummingbird demo to work on safari 5 [13:49] micheil: hmm.. it should work [13:49] micheil: iirc, safari 5 was a draft75 client [13:50] micheil: Resource interpreted as font but transferred with MIME type application/octet-stream. [13:50] micheil: sale_listFailed to load resource: the server responded with a status of 500 (Internal Server Error) [13:50] micheil: favicon.icoFailed to load resource: the server responded with a status of 404 (Not Found) [13:50] micheil: is what I get.. so maybe it is broken [13:53] charlesjolley- has joined the channel [13:57] drudge: huh http://github.com/aslakhellesoy/rednode [13:59] creationix: drudge: that's pretty crazy [14:00] drudge: interesting stuff [14:00] creationix: but why would you ever use node's api without node's purity and speed [14:01] creationix: seems like the worst of both worlds to me [14:01] drudge: i'm not sure really, i'm not a ruby guy [14:02] bradleymeck has joined the channel [14:02] creationix: kinda reminds me of my php-rack hack I made a while back [14:03] creationix: I could run php apps on webbrick! [14:03] creationix: not sure why anyone would want to do that, but it worked [14:03] kriszyp has joined the channel [14:04] micheil: creationix: it's just like why does everyone seem to want to run unprivileged code on a node.js server? [14:04] creationix: I guess so, but that actually seems useful in some cases [14:05] creationix: has anyone here looked as the connect email I send last night? [14:05] micheil: why? I've not understood it yet [14:05] creationix: micheil: for shared hosting in the "cloud" maybe [14:05] ewdafa: THE CLOUD [14:06] creationix: I should write an article "Real-Time Node.js Games in the CLOUD" [14:06] creationix: that's got some buzwords [14:06] creationix: oh, and add "mobile" in there [14:06] ewdafa: not enough [14:06] drudge: add social too [14:06] micheil: the cloud is beginning to sound like more bullshit. [14:07] micheil: everything's cloud because it scales & it's on ec2. :F [14:07] ewdafa: "Enterprise Social Networking P2P Business Collaborative MMO Gaming on the Cloud" [14:07] drudge: real-time node.js-based mobile social gaming provided by cloud synergies [14:07] creationix: I saw a good talk on what the "cloud" really is and how people misuse the word [14:08] bradleymeck: you can always add 'data transforms' to the end to make it sound fancy [14:09] creationix: basically it's when you only expose service APIS as your platform and never give the developer access to the hardware [14:10] ewdafa: no. it's when you pin the word to your front page and say you've launched a cloud service for only $$$ and then buy adwords for anything with "cloud" in it [14:11] ph^ has joined the channel [14:16] creationix: bleh, writing abstractions is hard [14:17] maushu has joined the channel [14:18] jwa has joined the channel [14:19] bradleymeck: lies and slander creationix [14:20] steadicat has joined the channel [14:23] fictorial: creationix: mobile real-time node.js games in the cloud is what I'm doing ... lol [14:23] steadicat has joined the channel [14:23] fictorial: buzzword bingo extravaganza [14:23] creationix: fictorial: you should propose a talk somewhere about it, you'll get in for sure [14:24] fictorial: nah, I'm too busy trying to monetize these new synergistic platforms in our always-on, next-generation, agile marketplace. [14:25] fictorial: I thoroughly loathe the moniker "cloud" ... it's so stupid. [14:26] mjijackson has joined the channel [14:26] fictorial: rednode? ha! he should port nodered to run on rednode. then the universe will just cancel out. [14:26] softdrink has joined the channel [14:27] pgriess has joined the channel [14:27] maushu: fictorial, you divided by zero! YOU BASTARD! [14:29] fictorial: :) [14:29] fictorial: creationix: playrelay.io [14:30] creationix: pretty [14:30] fictorial: teaser for now [14:30] fictorial: launching in septemberish [14:30] fictorial: (only in part based on node.js) [14:30] creationix: fictorial: which websocket lib did you end up using? [14:31] fictorial: the same one discussed earlier here [14:31] creationix: micheil's new one? [14:31] fictorial: but I'm not using it for anything atm [14:31] fictorial: yes [14:31] pgriess: speaking of websockets, does anyone have a websocket client written in node? [14:31] micheil: what'd-y what? [14:31] fictorial: some other people are using nodered with dev channel chrome and draft76 was needed [14:32] micheil: pgriess: I have plans for it, but not time to work on it right now. [14:32] slaskis_ has joined the channel [14:32] fictorial: pgriess: that would be pretty nifty [14:32] pgriess: micheil: interested in taking code contributions from me? [14:32] micheil: fictorial: yeah, I now support draft76 [14:32] pgriess: micheil: i want to use WS as a replacement for msgpack in web workers [14:32] pgriess: micheil: since i mostly just use it for framing anyway [14:32] fictorial: micheil: thanks! master branch? [14:32] pgriess: micheil: and WS is good at that [14:32] micheil: wouldn't you be better with a raw file scoket? [14:33] micheil: fictorial: yeah [14:33] micheil: fictorial: I think. [14:33] pgriess: micheil: i need framing support, which i'd have to build myself. ws has it built in [14:33] sveisvei has joined the channel [14:33] micheil: version 1.1.00 in the package.json [14:33] fictorial: pgriess: whoa, I'm not sure about that for web workers... sounds pretty heavyweight. [14:33] pgriess: micheil: not that this is difficult, but seems better to take a standards-based approach rather than yet another framing protocol [14:33] micheil: pgriess: ws framing is kinda.. shit. [14:33] pgriess: micheil: how so? [14:33] micheil: because, have you seen what I need to do to parse out messages? [14:34] pgriess: fictorial: the handshake is more heavyweight than raw sockets, but after that its just bytes with really light frame support [14:34] behmann has joined the channel [14:34] pgriess: micheil: no, not yet. maybe i'll change my mind ;) what in particular sucks about it? [14:34] fictorial: pgriess: seems strange to me to use WS for this. but, are workers potentially *remote*? [14:34] micheil: http://github.com/miksago/node-websocket-server/blob/master/lib/ws/connection.js#L213-243 [14:35] micheil: check that out. [14:35] pgriess: fictorial: they could be remote in theory [14:35] pgriess: micheil: thx, i will [14:35] fictorial: pgriess: ok [14:35] micheil: pgriess: websockets can do both binary and utf8 [14:35] tlg has joined the channel [14:35] micheil: and there's nothing sent to indicate it, other then a high order byte [14:35] pgriess: micheil: binary support is TBD, right? [14:35] pgriess: micheil: isn't that enough? [14:35] micheil: not really. [14:36] micheil: it's really awkward to parser still [14:36] pgriess: micheil: ok let me read the code before i comment further. gimme a sec [14:36] micheil: pgriess: you'd be better off with a format designed explicitly for the type of communication you want [14:37] pgriess: micheil: btw, how did you hilight a range w/ that code snippet? [14:37] tlg has joined the channel [14:37] micheil: #L131-136 [14:37] micheil: on the url [14:37] pgriess: micheil: yeah, but manually entered? or is there a way to select that via the ui? [14:37] micheil: you can only select one line to my knowledge [14:37] micheil: bbl [14:37] pgriess: ah [14:37] pgriess: shift click [14:37] pgriess: sweet [14:39] micheil: ooh.. nice [14:39] maushu: Hmmm, Utah is where there is the biggest consumption of porn... isn't there where the astronauts come from? [14:39] behmann has joined the channel [14:40] jetienne: maushu: you are the one behind _announcer ? is the source avail ? [14:41] maushu: Somewhat. [14:41] jetienne: maushu: like opensource but ugly so you fear the shame ? :) [14:41] maushu: Exactly. [14:41] bradleymeck: mmm whats the best way to synchronously check for a file existing (whole app has to wait on that check) [14:42] jwa: how can I use a shebang for my node files? "#!/usr/bin/env node" doesnt seem to be working [14:42] jetienne: maushu: what about putting it on github under a not too clear name, and not make noise about it ? [14:44] fictorial: bradleymeck: there's a synchronous stat [14:45] fictorial: jwa: node in your PATH? chmod +x thatfile? [14:45] maushu: jetienne, http://graphnode.com/stuff/ircbot.js [14:45] ph^ has joined the channel [14:45] jetienne: maushu: thx [14:45] CIA-77: node: 03Jérémy Lal 07master * rce34712 10/ doc/api.markdown : The underscores are not meant to emphasize. Escape them. - http://bit.ly/b6TNyv [14:46] maushu: Needs gf3 IRC library. [14:46] fictorial: //Twitter [14:46] fictorial: var tweets = []; [14:46] jwa: fictorial, thanks, forgot chmod [14:46] fictorial: maushu: best comment ever [14:46] maushu: And some base64 lib. [14:46] fictorial: maushu: thanks for sharing this [14:46] gf3: mmm [14:46] Yuffster has joined the channel [14:46] maushu: fictorial, xD [14:46] gf3: http://github.com/gf3/IRC-js [14:47] fictorial: nice use of Levenshtein [14:48] maushu: fictorial, that comment was supposed to split sections, one for twitter and another for stack overflow. [14:48] nsm has joined the channel [14:48] maushu: stack overflow was deleted. [14:49] maushu: On another news for your awe, that file was served by a pure node.js http server. [14:53] ryah: maushu: awe [14:53] maushu: Was that sarcasm? :p [14:53] jetienne: see no shame at all [14:53] ryah: maushu: a little :) [14:54] richcollins has joined the channel [14:54] ryah: maushu: but, cool :) [14:56] ceej has joined the channel [14:58] pgriess: micheil: you still around? [14:58] micheil: yeah [14:58] CIA-77: node: 03Ryan Dahl 07master * r0e390d6 10/ src/node_stdio.cc : Don't use bzero - http://bit.ly/bXKedm [14:59] pgriess: micheil: the high-bit framing type for ws looks like a totally decent framing protocol [14:59] pgriess: micheil: is your objection to the 0x00-0xff framing type? [14:59] micheil: I just don't think that for something like webworkers you would need something like websockets [15:00] ryah: i agree [15:00] ryah: 0x00 - 0xff is not a good framing protocol [15:00] fictorial: fwiw, I agree - if you want very simple framing, use netstrings [15:00] ryah: netstrings are [15:00] fictorial: hehe [15:00] chadj has joined the channel [15:00] pgriess: totally 0x00 - 0xff sucks. but the length-prefixed framing type is almost exactly what someone would implement if building their own custom framing protocol [15:01] fictorial: that's netstrings in a nutshell [15:01] ryah: pgriess: it just avoids a scan through each byte [15:01] mjijackson has joined the channel [15:01] fictorial: (and the old .3ds file format) [15:01] pgriess: ryah: yeah i understand why 0x00 - 0xff sucks. but there are other framing options in ws that are just length-prefixed byte strings [15:02] ryah: pgriess: yeah, i think 0x01 (netstring) is also ws? [15:02] ryah: that'd work [15:02] pgriess: ryah/micheil: why use yet another framing protocol when we could continue to build on http standards? [15:02] ryah: or is it 0x80 (netstring) ? [15:02] pgriess: ryah: no clue. never used netstrings [15:02] ryah: netstring = (length) (data) [15:03] pgriess: i think there's a lot of value in continuing to build on top of what's becoming an http standard [15:03] pgriess: ryah: yeah, that's basically what the alternate framing type is in ws [15:03] pgriess: of course, its not implemented by any of the node impls yet [15:03] pgriess: (afaict) [15:03] pgriess: but i think that's the right protocol [15:03] gerad has joined the channel [15:03] ryah: sure - but 0x00 - 0xFF is sufficently crappy to warrent rejecting :) [15:04] pgriess: no argument from me on that one ;) [15:04] ryah: *warrant [15:04] chadj: Does anyone know if libxml.js (http://libxmljs.squishtech.com/) blocks while parsing and returning document objects (i.e. var doc = libxml.parseXmlFile([filename]); )? [15:04] pgriess: other than to suggest that it'd be worth using ws before length-prefixing is supported in the node impls just to get on a standard platform [15:04] pgriess: and get some non-custom framing support even if it doesn't perform well [15:04] pgriess: and get off of msgpack [15:04] pgriess: so i still think ws is the right answer in the short term, as long as we're getting off of that soon [15:04] pgriess: (erm, getting off of 0x00 - 0xff) [15:05] fictorial: won't web workers run 99% of the time on the same server host? [15:05] pgriess: fictorial: yeah. but you still need an IPC mechanism to exchange messages. which needs some form of data framing. [15:05] fictorial: that's correct [15:05] fictorial: but http and ws is probably one of the most ill-performant choices for IPC on the same box [15:06] fictorial: no? [15:06] pgriess: fictorial: with ws, no. [15:06] pgriess: fictorial: ws uses http to negotiate a thin layer on top of tcp, tunneled through http [15:06] fictorial: exactly! [15:06] pgriess: fictorial: the protocol looks like it will perform reasonably well [15:06] fictorial: TCP for IPC is a little weird [15:06] pgriess: fictorial: how so? [15:06] fictorial: reasonably well, sure [15:07] stevendavie has joined the channel [15:07] pgriess: so, minus the initial http hanshaking nonsense, its basically just a tcp socket w/ some framing mumbo-jumbo [15:07] fictorial: why do want all the extra overhead of TCP for processes on the same box? [15:07] pgriess: heh [15:07] pgriess: well [15:07] pgriess: so i was going to use WS over a UNIX socket [15:08] fictorial: ah... now you're talking. [15:08] pgriess: i guess i forgot to mention that ;) [15:08] fictorial: yes :) [15:08] fictorial: ACTION stops pestering then [15:09] ryah: so if we have the ipc protocol be websockets, then we can farm out work to web browsers? :) [15:09] ryah: kind of a cute idea [15:10] pgriess: ryah: ooh yeah i like that [15:10] fictorial: nodered on rednode, web workers on the server in the browser, turducken! [15:10] pgriess: ryah: hadn't thought of inverting it like that [15:12] pgriess: fictorial: lol. turducken is a pretty apt metaphor [15:12] fictorial: ACTION watches ryah and pgriess collectively jump the shark [15:12] maushu: [Wed Jun 09 2010 15:44:25 GMT+0000 (UTC)] Twitter stream timed out. Restarting... [15:12] maushu: Caught exception: Error: ECONNREFUSED, Connection refused [15:12] maushu: WHY?! [15:13] fictorial: failwhale [15:14] ryah: everyone is waking up and checking thier tweets [15:14] ryah: checking out what had been twat during the night [15:14] fictorial: hey now [15:14] ryah: what? it's the past participle of 'tweet' [15:15] ryah: ^^ [15:15] gf3: it's twat'd in every tense [15:16] kevwil has joined the channel [15:16] pgriess: ryah: your tweet has a busted url [15:16] pgriess: http://nodeknoc [15:16] whoahbot has joined the channel [15:16] pgriess: http://nodeknockout.com/ i assume? [15:18] bradleymeck: oooo nice, now i just need to join a team [15:18] ryah: pgriess: yeah [15:19] maushu: ryah, where can I find the structure of exception? [15:19] maushu: Or is the same as the javascript one? [15:20] devinus_ has joined the channel [15:20] fictorial: ryah: my kids read this channel! http://imgur.com/rTvIa.jpg lol [15:22] ryah: maushu: ? [15:22] gerad: ryah: "so if we have the ipc protocol be websockets, then we can farm out work to web browsers?" that just blew my mind [15:22] ryah: fictorial: heh [15:22] maushu: ryah, I want to get the "ECONNREFUSED" from err in uncaughtException. [15:22] fictorial: gerad: the work could only be pure JS in that case though [15:23] ryah: maushu: err.errno ? [15:23] gerad: you might be able to do something gross with opengl [15:23] maushu: No idea. [15:23] ryah: maushu: err.errno == process.ECONNREFUSED [15:23] maushu: Okay, thanks. [15:24] whoahbot has joined the channel [15:25] mindeavor has joined the channel [15:26] _announcer has joined the channel [15:28] whoahbot has joined the channel [15:29] _announcer: Twitter: "'node' now runs a readline REPL and '#!/usr/bin/env node' for shell scripts. perl's days are numbered? #nodejs" -- Will Moffat. http://twitter.com/hamstersoup/status/15857905233 [15:30] maushu: I should probably update the shebang. [15:31] jetienne: btw is it possible to run nodejs on google app ? [15:32] sanderjd has joined the channel [15:32] jetienne: hmm thinking about this is unlikely :) [15:32] fictorial: echo "127.0.0.1 nodejs.appspot.com" >> /etc/hosts [15:33] jetienne: could be... if i lived in a google data center :) [15:33] maushu: People live there? Weird. [15:34] jetienne: the internet-bit people... they are even smaller than pygmy [15:35] _announcer: Twitter: "Node knockout - Rails Rumble для тех, кто хочет посоревноваться, но с использованием #nodejs - http://nodeknockout.com/" -- Anton Byrna. http://twitter.com/itrelease/status/15858341238 [15:38] ajpiano has joined the channel [15:39] kriszyp_ has joined the channel [15:41] _announcer: Twitter: "@redsquirrel Node.js Knockout: http://nodeknockout.com/" -- Frederick Polgardy. http://twitter.com/polgfred/status/15858742433 [15:42] rtl has joined the channel [15:43] creationix has joined the channel [15:43] _announcer: Twitter: "Node.js knockout, like rails rumble but with node.js http://nodeknockout.com/ seems interesting" -- Indrek Juhkam. http://twitter.com/indrekj/status/15858881630 [15:44] _announcer: Twitter: "@jalbertbowdenii i need to figure out a node project and try out that heroku node.js support. sounds nice" -- Zach Young. http://twitter.com/young_zach/status/15858938049 [15:45] richcollins has joined the channel [15:45] ph^ has joined the channel [15:45] behmann has joined the channel [15:46] tjholowaychuk has joined the channel [15:49] weepy has joined the channel [15:49] weepy: hellllllooooooooo [15:49] fictorial: yes [15:49] weepy: is there an easy way to do a an http request ? [15:49] mape: weepy: check out request [15:50] weepy: the google.com example in the docs seems like overkill [15:50] weepy: 10 lines [15:50] mape: http://github.com/mikeal/node-utils/tree/master/request/ [15:50] javajunky: if you're in express there's a simplified variant also [15:50] weepy: oh i see - request like that! [15:50] weepy: yes in express [15:52] javajunky: weepy: http://pastebin.com/mgH63xHG [15:53] weepy: nice thanks ! [15:53] _announcer: Twitter: "playing lazeriods running on node.js - no workie in firefox but still amusing - http://bit.ly/dgZp6J" -- jalbertbowdenii. http://twitter.com/jalbertbowdenii/status/15859556437 [15:55] kriszyp_ has joined the channel [15:55] ceej has joined the channel [15:59] _announcer: Twitter: "just installed node.js for first time, this is going to be fun to tinker with..." -- Sam Keen. http://twitter.com/samkeen/status/15859905368 [15:59] jetienne: http://github.com/mikeal/node-utils <- good thing, over time this kind of easy api is nice if properly implemented. one of the advantage of ruby is that they got a lot of thing like that [16:00] kriszyp_ has joined the channel [16:00] mikeal: the docs are here http://github.com/mikeal/node-utils/tree/master/request/ [16:01] mikeal: npm install request [16:02] rtl has joined the channel [16:03] whoahbot has joined the channel [16:03] Astro: has anyone heard of any dates from heroku when they'll open node.js hosting to the public? [16:03] x_or has joined the channel [16:03] probablyCorey has joined the channel [16:04] jetienne: mikeal: just feedback, what i liked in ruby fileutils is that the function name was clear like FileUtils.mkdir_p or FileUtils.rm_rf .... exports.mkdirs = function (_path, mode, callback) { <- this is a lot less, in my opinion [16:04] mikeal: i didn't write the file util [16:04] mikeal: aconbere has been working on that [16:05] jetienne: mikeal: well this remains my feedback :) [16:05] gerad: Astro: talked to one of the Heroku PMs on Monday [16:05] gerad: they don't have a solid date [16:05] Astro: thanks for the information [16:05] gerad: but I think you can e-mail them and get an invite pretty easy [16:05] Astro: I'm not even a Heroku customer yet [16:06] Astro: it's just their free basic package that inspires me :) [16:06] creationix has joined the channel [16:09] mape: Astro: well they are supporting the node knock out [16:09] mape: and all entries are suppose to be able to be deployed there [16:15] sanderjd has left the channel [16:16] Astro: if only my friends liked node.js... all python wimps [16:17] bradleymeck: node.js is not 'pythonic' < hate that word [16:17] grahamalot has joined the channel [16:17] jetienne: on cpu, i bet this is significantly faster than cpython [16:17] stepheneb has joined the channel [16:18] sanderjd has joined the channel [16:21] mikeal: im about 90% sure that Python isn't "pythonic" [16:22] jakehow has joined the channel [16:22] MattJ: Astro: I think Javascript still has a general bad reputation after the abuse it received in the late 90s :) [16:23] Astro: agreed [16:23] mape: MattJ: Who cares about the rep as long as enough people know it is good? [16:23] mikeal: you don't like hammer the monkey ads scrolling across your web pages? [16:23] mape: Windows isn't better because it has the largest userbase [16:24] Astro: mikeal: they still exist? [16:25] linuxsable has joined the channel [16:26] MattJ: mape: I certainly don't care :) [16:27] MattJ: I have a habit of using niche technologies and languages :) [16:27] mape: To each and their own :) [16:27] gerad: mape: we're also offering joyent as a deployment platform for node knockout [16:27] hammerdr has joined the channel [16:27] mape: Jup, saw that [16:27] gerad: for the people who need more than what heroku offers [16:28] mape: I thought joyent was for larger deployments though [16:28] gerad: but yeah, heroku said that they'll give everybody accounts for the knockout [16:28] ivan has joined the channel [16:28] devtime has joined the channel [16:28] gerad: it kinda comes down to what you need [16:28] _announcer: Twitter: "EC2 + Node.js + mongoDB -> Real Time Web Traffic Visualization http://bit.ly/9lhlzO" -- linyows. http://twitter.com/linyows/status/15861871561 [16:29] stevendavie has joined the channel [16:29] gerad: heroku is simple and quick to get started and deploy to [16:29] mape: So it isn't ok to user my own server? [16:30] devtime: I heard that "load" worked to bring a module in -- but I get "ReferenceError: load is not defined" ?! [16:30] gerad: probably not… but we'll consider it if you have a strong argument why you need it [16:31] mape: gerad: hmm k [16:31] gerad: it's just simpler for us if everything is hosted on one of the platforms [16:31] mape: yeah makes sence [16:32] gerad: it also helps us make sure that there's no cheating [16:32] softdrink has joined the channel [16:32] gerad: not that I don't trust you, it's the other guys I'm worried about:-) [16:32] mape: like using php? :P [16:32] gerad: hahaha [16:34] charlesjolley- has joined the channel [16:37] ncb000gt: gerad: it sounds like with node knockout you're focusing on web apps. is the contest limited to web apps? [16:37] mape: how about stuff using ncurses? [16:38] ncb000gt: heh [16:38] ncb000gt: mape: all that does is make eyes bleed [16:38] mape: I wouldn't mind irssi i node [16:38] ncb000gt: but, that was my point, there is work going on with opengl, ncurses, gtk, etc. [16:38] ncb000gt: mape: agreed [16:38] gerad: ncb000gt: we're focusing on web apps because of judging [16:39] gerad: it's hard for judges (especially the general public) to fairly evaluate non-web apps [16:39] ncb000gt: gerad: because of judging what? because you don't want to ./configure; make; make install; [16:39] ncb000gt: ? [16:39] ncb000gt: ok [16:39] ncb000gt: sounds good [16:39] gerad: so, if you want to enter to hack on a non-web app for 48 hours [16:39] ryah: mape: ncurses! [16:39] gerad: you're welcome to [16:40] gerad: but you aren't likely to get judged fairly [16:40] mape: ryah: are you judging? ;) [16:40] ryah: mape: yeah [16:40] ncb000gt: gerad: sounds good. thanks. [16:40] creationix: gerad: did you get my email? [16:40] gerad: yep [16:40] rolfb has joined the channel [16:40] gerad: in the middle of a response [16:40] gerad: almost done [16:41] creationix: cool [16:41] stepheneb has joined the channel [16:43] _announcer: Twitter: "working on my node.js -Fu today for my lunchtime activity" -- Scott Walker. http://twitter.com/pragma_tech/status/15862856472 [16:44] gerad: creationix: sent! :-) [16:45] creationix: gerad: awesome, I'll see what I can do [16:46] devtime: how can I use a module both in Node and in the browser? [16:47] gerad: creationix: thanks! we think it'd be cool for ext.js to be involved, since they're already such a big part of the node community [16:47] creationix: :) [16:48] gerad: devtime: highest level: just require it in node and include it as a script tag in the browser :-) [16:49] creationix: devtime: there are several loaders that emulate commonjs modules too, if you don't mind async, then ajax it in and then wrap it in a function and eval it [16:50] creationix: then you get exports working on both ends [16:50] gerad: devtime: here's lazeroids application.js which is used both backend and front end http://github.com/gerad/lazeroids-node/blob/master/views/application.js.coffee [16:50] gerad: it's coffeescript, but you get the gist [16:50] gerad: or what creationix said [16:52] devtime: I do need it to be sequentially, so I'll check that lazeroids application.js [16:53] kriszyp: devtime: you can use http://github.com/kriszyp/transporter to wrap modules for async loading in the browser with requirejs or yabble so you can share modules across the browser and server [16:53] kriszyp: and transporter works with nodules if you want more robust package-based sets of modules to be accessible to the browser [16:55] devtime: in one of my modules, I'm adding functions to String's prototype... so I need to load it first... [16:55] Validatorian has joined the channel [16:56] fictorial: anyone here experienced with vx32? [16:56] Validatorian: hrm, woke up this morning to one of those ETIMEDOUT errors :-/ [16:57] Validatorian: thought that was fixed? [16:59] slaskis has joined the channel [17:00] tjholowaychuk has joined the channel [17:06] _announcer: Twitter: "Node.js is in production at Rubicon Project. Great piece of software. Kudos to Ryan Dahl" -- nealrichter. http://twitter.com/nealrichter/status/15864310885 [17:08] _announcer: Twitter: "Férias = Mixxx && TelEduc && (Processing.js || html5 || node.js || Ruby on Rails || Objective-C || Ableton)" -- Bruno Buccolo. http://twitter.com/buccolo/status/15864445822 [17:13] aglemann has joined the channel [17:14] aglemann: is there an easy way to import + eval a json object from the local filesystem? [17:19] awenkhh has joined the channel [17:21] ryah: aglemann: no [17:22] aglemann: tks! [17:22] ryah: fs.readFile(fn, 'utf8', function (err, data) { if (err) throw err; JSON.stringify(data); } [17:22] aglemann: gotit.. thats what i thought! [17:23] jetienne: JSON.parse() no ? [17:24] jetienne: but all those library could be done in a pure js fashion, and i think this is the way to go. Thus people still have the ease to use. while nodejs remains slim [17:24] tlg_ has joined the channel [17:24] jetienne: cf node-util [17:25] pgriess: micheil: ryah: basic websocket client up at http://github.com/pgriess/node-websocket-client [17:25] pgriess: landing in 20m so will be offline the rest of the day. happy hacking. [17:25] micheil: pgriess: spec complaint? [17:25] pgriess: micheil: it connects to your node-websocket-server, but that's about it [17:25] micheil: okay [17:25] pgriess: micheil: haven't gotten beyond handshaking [17:25] ryah: pgriess: coming to sf? [17:26] pgriess: ryah: nah. visiting family in lax [17:27] micheil: ryah: do you recall if we had the upgrade event on requests? [17:28] micheil: pgriess: have a look at... [17:28] micheil: http://whatwg.org/specs/web-apps/current-work/complete.html?slow-browser=1#network [17:28] micheil: that should give you the full client side spec. [17:28] micheil: but it may crash your browser. [17:28] ryah: micheil: no, i don't believe that's working [17:28] micheil: okay [17:28] micheil: we'll have to test it out properly sometime. [17:29] pgriess: micheil ryah: yeah i'm going to trip over that pretty soon, i think [17:30] pgriess: micheil: is that the same as http://dev.w3.org/html5/websockets/ ? [17:30] pgriess: micheil: (which does not crash my browser) [17:31] reid1 has joined the channel [17:31] reid\work has joined the channel [17:31] micheil: pgriess: nup, different [17:33] qFox has joined the channel [17:33] mikeal has joined the channel [17:34] sudoer has joined the channel [17:34] jbrantly has joined the channel [17:34] cloudhead has joined the channel [17:35] saikat has joined the channel [17:36] rnewson has joined the channel [17:37] isaacs has joined the channel [17:37] micheil: pgriess: this looks to be fairly recent: http://www.whatwg.org/specs/web-socket-protocol/ [17:38] stephenlb has joined the channel [17:38] pgriess: micheil: yeah that's what i've been going off of [17:38] micheil: k [17:39] pgriess: micheil: and its not scrambled w/ a bunch of other html5 stuff [17:39] micheil: in which case you should be good [17:39] pgriess: thx [17:39] micheil: pgriess: could you add in a line: req.addListener("upgrade" [17:40] micheil: that does the same as the current got a response handler [17:40] pgriess: micheil: yeah, will do [17:40] micheil: k [17:40] pgriess: micheil: ack, seatbacks and tray tables up. gotta go [17:40] pgriess: l8 [17:40] jxson has joined the channel [17:40] micheil: k [17:40] micheil: have fun :) [17:41] brianmario has joined the channel [17:43] tlg has joined the channel [17:47] Gruni has joined the channel [17:50] richcollins has joined the channel [17:50] ph^ has joined the channel [17:50] isaacs: ryah: having drain on the http client is a godsend. [17:51] isaacs: ryah: last night i saw like half a dozen weird little edge case race conditions and heisenbugs all go away. [17:51] micheil: gotta love the heisenbugs [17:53] perdix has joined the channel [17:54] x_or has joined the channel [17:56] reid\work has joined the channel [17:59] gwoo has joined the channel [18:01] _announcer: Twitter: "@hamstersoup Perl's days are numbered. They were 2322302, and with yesterday's nodejs announcement, it's 2322301. ;-)" -- Beej Jorgensen. http://twitter.com/beejjorgensen/status/15867622838 [18:02] _announcer: Twitter: "Ärligt - någon med lite tid över borde starta svenska node.js-föreningen." -- psvensson. http://twitter.com/psvensson/status/15867639543 [18:03] jbrantly has joined the channel [18:04] _announcer: Twitter: "В туалете треснул унитаз: я писаю кипятком от Node.js!" -- Alexey Gromov. http://twitter.com/phpinfo/status/15867747223 [18:04] mattly has joined the channel [18:05] charlesjolley- has joined the channel [18:06] _announcer: Twitter: "Intrigued... “@node_knockout: Node.js Knockout will be 8/28-8/29. Registration starts next week. More at http://j.mp/cn9vKP" -- Joel Dart. http://twitter.com/joeldart/status/15867899038 [18:06] bradleymeck: what happened to the auto translate? [18:08] devtime: "The special variable _ (underscore) contains the result of the last expression." -- is this a good idea? won't it conflict with Underscore.js ? [18:08] SteveDekorte has joined the channel [18:08] bradleymeck: are you thinking of perl devtime? [18:08] devtime: that's from Node.js' REPL API doc [18:09] tmpvar has joined the channel [18:10] jxson has joined the channel [18:10] saikat: If I have this code (untested) - http://gist.github.com/433383 and I have a situation where Client A sends a "load" message and client B sends an "edit" message at the same time, is the following situation possible: Client A subscribes to the pubsub, then Client B's edit gets handled and published to client A, then client.send(value) occurs for Client A? [18:11] saikat: assuming Client A and Client B are both operating on the same message hash [18:11] saikat: in other words, if i am running a single instance of node [18:11] isaacs: hm, node ko sounds fun, but why limit it to web apps? [18:11] isaacs: it'd be cool to see an opengl irc+xmpp client or something. [18:11] MattJ: :) [18:11] bradleymeck: yea, imma hope to do me some openal hacking soon, would like a team for that lol [18:11] saikat: is there a chance to have a context switch out between lines 12 and 13 while node processes another callback? or am i guaranteed that, within a callback, context switches to a different callback don't happen? [18:12] isaacs: also, i'm wondering what the rules are for taking an existing non-web thing, and then webifying it up. [18:12] tmpvar: yo [18:12] bradleymeck: within a callback there are no context swaps from JS side [18:12] isaacs: (that's actually on my todo list for npm, but i feel like that'd TOTALLY be cheating) [18:13] mjijackson has joined the channel [18:13] saikat: thanks bradleymeck - so is the way to think about it just that node has only one extra thread that it's using to process callbacks, and whenever a callback happens, it gets added to a queue of callbacks to get processed [18:13] bradleymeck: yes, it uses an eventqueue [18:13] saikat: and then node goes through and processes those while being synchronous within each callback [18:13] saikat: ah ok [18:14] saikat: thanks bradleymeck [18:17] gerad: yo, seems I missed a bit of node knockout discussion [18:17] gerad: we still haven't completely finalized the rules [18:18] gerad: but they'll be similar to rails rumble [18:18] isaacs: gerad: hey [18:18] gerad: http://blog.railsrumble.com/rules [18:18] isaacs: gerad: i can see the point of saying "if it's a web app, it must be deployed to heroku or joyent", since those are the sponsors. [18:18] gerad: it's also to help us prevent cheating [18:19] gerad: "Developing a plugin or library before the competition that provides your application's general functionality is considered cheating. Developing a plugin or library that is publicly available and provides a general purpose publicly usable function (such as accessing an API) can be done before the competition begins." [18:19] isaacs: gerad: sure [18:19] gerad: so npm is totally cool [18:19] isaacs: interesting [18:19] gerad: isaacs: anyway, you were saying… [18:19] isaacs: what about "deploying" it on my local machine, and spending the next 2 months hacking on it, then showing up, spending the first day pushing to joyent, and then schmoozing for 24 hours? [18:20] gerad: hahaha [18:20] isaacs: people do that for yahoo hack days all the time. [18:20] gerad: the code has to be in github [18:20] isaacs: it's kind of frowned upon, but you can't really prevent it [18:20] gerad: and we'll be keeping an eye on it [18:20] isaacs: gerad: i have git locally. i can create a new repo. [18:21] gerad: specifically it's growth over time [18:21] abadr has joined the channel [18:21] isaacs: gerad: you're dealing with programmers. we're like professional cheaters. [18:21] gerad: hahahaha [18:21] gerad: we also somewhat mitigate the problem by not offering very good prizes:-) [18:21] isaacs: honestly, i'm not interested in cheating, just that i habitually poke at every rule i see. [18:21] gerad: isaacs: but yeah, I'm sure it might happen [18:22] gerad: isaacs: uh huh, I know to keep a special eye on you now [18:22] isaacs: hehe [18:23] MattJ: [ ] Do you intend to cheat during this contest? [ ] Are you isaacs? [18:23] isaacs: gerad: how about we say that, if an app is not a web site, but some library, utility, or desktop program, then it must be deployed to the npm registry? [18:23] mjijackson has joined the channel [18:23] gerad: isaacs: hmm… that's interesting [18:23] isaacs: gerad: iow, how do i get npm on that sponsor list? especially considering that npm is a labor of love, and broke? [18:24] isaacs: gerad: then the opengl irc client could be a competitor, even though there's not a line of html anywhere in it [18:24] mape: isaacs: get a logo? ;) [18:24] isaacs: mape: hm. yeah, that'd probably help :) [18:24] isaacs: mape: i'll bug my web ui guy about that. [18:25] mape: Jup, he is probly totally stoked to do it [18:25] jetienne: isaacs: npm is freezing at the end when i publish [18:26] jetienne: npm written to uploading stream /home/jerome/.node_libraries/.npm/.cache/neoip/0.0.1/package.tgz <- isaacs and then it is never coming back... even if apparently the package is actually published [18:26] tilgovi has joined the channel [18:26] isaacs: jetienne: do you have the latest npm? that should be fixed in 0.1.16 [18:26] isaacs: jetienne: updated last night [18:27] gerad: isaacs: so we're not (yet) explicitly encouraging non-web apps, because they're unlikely to be judged fairly [18:27] jetienne: isaacs: the man page changelog goes up to 0.1.16... anyway to get the version from the exec ? [18:27] isaacs: jetienne: npm install --auto-activate always npm [18:27] gerad: as there will be general public judging [18:27] WALoeIII has joined the channel [18:27] mape: gerad: think he means sponsor like github/joyent not participation [18:28] jetienne: isaacs: updated, and still frozen [18:28] isaacs: jetienne: gist the log, please? [18:29] visnup has joined the channel [18:30] admc has joined the channel [18:30] jetienne: http://gist.github.com/433423 <- isaacs [18:30] isaacs: jetienne: this is weird. [18:30] jetienne: isaacs: btw i just found out it is NOT frozen for ever... it seems to go out after a while... around 1 min [18:30] saikat: bradleymeck: i'm not guaranteed any order of tha callbacks being processed though right (or at least someone told me this yesterday). for example, if Client A sends a request before Client B, the callback for the database fetch for client B could get called before the callback for the database fetch for Client A? [18:30] jetienne: isaacs: this smells like a timeout. i got a very fast inet connection so this is not the issue [18:30] isaacs: jetienne: yeah, that's what happens when it floods the http socket and then eventually craps out. [18:31] isaacs: jetienne: that was happening a lot before i did the drain stuff. [18:31] bradleymeck: no guarantee to my knowledge [18:31] isaacs: jetienne: it should be waiting for each 16kb chunk to be done before it sends another one. [18:31] perdix has joined the channel [18:32] jetienne: isaacs: i can output 130kbyte/s without a sweat. my isp is not the issue here [18:32] isaacs: jetienne: i don't think it's the isp's problem, i think it's something in node or OS [18:32] jetienne: isaacs: os = linux ubuntu 10.04. node = 0.1.97 [18:33] isaacs: jetienne: i've got 50Mbit service at my house, and i was seeing this problem. [18:33] behmann has joined the channel [18:33] isaacs: jetienne: yeah, it's just disappointing because i thought this bug was fixed. [18:34] jetienne: isaacs: ok. sorry no more time to investigate [18:36] hammerdr: saikat: you working on OT now? [18:37] visnup: ohhh, I like the idea of a non-webapp prize for knockout [18:38] maushu: non-webapp? Hmmm. [18:38] maushu: No idea. [18:38] mape: visnup: Well it should be the best one [18:39] mape: Not the pretty colors [18:39] saikat: hammerdr: not yet at OT, but soon i hope [18:40] saikat: trying to just get real-time edits to get saved and appear properly first [18:41] jetienne: isaacs: total time to publish 1m2sec. time to "npm written to uploading stream" 3sec [18:41] jetienne: isaacs: it seems like the timeout is 60sec [18:42] visnup: mape: right, a prize for best non-webapp [18:42] mape: Well best overall [18:43] mape: Isn't it about node? [18:43] visnup: there will be prizes for different categories [18:43] visnup: best overall, most innovative, best design [18:44] visnup: since judging will also need criteria [18:44] mape: Oh k [18:45] mape: don't think that is mentioned on the page [18:45] jakehow has joined the channel [18:45] visnup: a lot isn't mentioned on the page yet :P [18:45] mape: yeah.. [18:45] visnup: also likely a prize for best solo effort for those one-man teams [18:49] stephenlb: prize! where do I get them? [18:51] agent-x has joined the channel [18:51] _announcer: Twitter: "Asked about node.js support for uh, smartsharedthings on @joyent's forums, which used to be full of usefulness. Nada. Um, @davidpaulyoung?" -- J.C.Burns. http://twitter.com/jcburns/status/15870545762 [18:55] abadr: I'm trying to check out node.js from github, but it keeps failing with an error. Is it just me? [18:55] saikat: abadr: try using the git read-only URL [18:55] saikat: instead of the HTTP one [18:55] saikat: i've had trouble cloning the repo using the HTTP url before too [18:56] steadicat has joined the channel [18:58] abadr: saikat: that worked, thanks [19:01] reid\work: isaacs: I can see why narwhal-npm-beta doesn't work yet… it's kind of a PITA. [19:02] b_erb has joined the channel [19:03] steadicat has joined the channel [19:05] steadicat_ has joined the channel [19:07] bradleymeck: mmm whats the best way to return a Buffer from a c++ function... or better yet, cast a Buffer* to a Handle [19:07] ryah: bradleymeck: buffer->handle_ [19:07] bradleymeck: well thats convenient [19:08] isaacs: reid: yeah [19:08] phazm has joined the channel [19:08] isaacs: reid: i think it might just be a case of outputting a message asking you to add .../narwhal/ to your NODE_PATH [19:10] aglemann has joined the channel [19:10] isaacs: ryah: how would you feel about supporting a config file or something to set the NODE_PATH? [19:12] reid\work: isaacs: I keep getting problems with narwhal/binary not found, etc. [19:12] hellp has joined the channel [19:12] isaacs: reid: right, because it assumes that binary.js is in your NODE_PATH [19:13] reid\work: Which is ~/.node_libraries, right? (for require.paths) [19:13] creationix: why not just set NODE_PATH in your bash environment [19:14] reid\work: isaacs: I'm trying to get ~/.node_libraries/narwhal to link to both narwhal-node and narwhal-lib files [19:14] isaacs: creationix: the issue is that npm would need to add {root}/narwhal/ to the node_path when installing it [19:14] isaacs: reid: what you need is to just have both in the path. [19:14] isaacs: reid: ie, both in the $NODE_PATH env var [19:14] reid\work: isaacs: yeah. that would make it easy :) [19:15] ryah: isaacs: i donno [19:15] ryah: i think env var is okay for now [19:15] ryah: or? [19:15] reid\work: bbl [19:15] reid\work: lunch [19:16] _announcer: Twitter: "Hey, visual peoples! Wanna draw a logo for npm? You'll get a contributor nod on a popular #nodejs project :)" -- Ⓘⓢⓐⓐⓒ. http://twitter.com/izs/status/15871956033 [19:16] _announcer: Twitter: "@jcburns works great on SmartMachines (Accelerators) though: http://horrell.ca/archive/installing-nodejs-on-a-joyent-smartmachine" -- Christopher Horrell. http://twitter.com/chorrell/status/15871973063 [19:16] isaacs: ryah: yeah, reading a config file at startup is a pita. [19:18] davidsklar has joined the channel [19:18] isaacs: ryah: it's just tricky getting narwhal to work on npm, since narwhal *requires* that the NODE_PATH be updated to include its stuff. [19:18] mjr_ has joined the channel [19:19] mjr_: noders [19:19] isaacs: mjr_: [19:19] mjr_: isaacs: did ryah tell you his decree that npm must be finished before the Node Nockout? [19:19] isaacs: mjr_: npm is finished. [19:19] mjr_: nice [19:19] WALoeIII has joined the channel [19:19] isaacs: mjr_: and never finished. [19:19] mjr_: well, that was easy [19:20] isaacs: mjr_: it is like a child, who is always as growing, even as he becomes a man. [19:20] mjr_: that's so moving. [19:20] mjr_: I'm tearing up a bit. [19:21] kriszyp: btw, isaacs what do you think about the package mappings right now? are you anticipating implementing it in npm or thinking that you won't do that? want to try to keep nodules and npm well-aligned... [19:22] isaacs: kriszyp: haven't even gotten that far down the stack yet. [19:22] isaacs: kriszyp: still on my "todo after vacation" pile [19:22] kriszyp: :) [19:22] kriszyp: np [19:22] kriszyp: good vacation? [19:23] blowery: npm is a teenager? [19:24] isaacs: kriszyp: wonderful [19:24] isaacs: blowery: yeah. pimples and squeaky voice and all. [19:26] x_or has joined the channel [19:26] isaacs: kriszyp: certainly, though, i think that referring to packages as a url does not map well to npm's way of doing things. [19:26] mjijackson has joined the channel [19:26] isaacs: kriszyp: especially if that url is a root folder, rather than a tarball. [19:27] kriszyp: oh, yeah, a root folder is out of the question for a package manager [19:27] kriszyp: I don't think that is very central concept, due to the lack of portability [19:27] kriszyp: I wouldn't think any think but a zip/tarball would be reasonable to give to a pacakge manager [19:28] isaacs: kriszyp: it'd be nice if dependencies could be a tarball, since npm can install that, but that gets tricky, anyway [19:28] isaacs: kriszyp: because then i have to keep track of where stuff came from, which i currently dont. [19:28] agent-x has left the channel [19:28] kriszyp: I was thinking that it seems like it would actually make npm (publishing at least) simpler, since you have a url to assert authority, you wouldn't really even need to bother with auth/user/passwords [19:29] kriszyp: well the package identity == location, they don't really need to separated [19:29] isaacs: kriszyp: i actually went that route originally. you had to put the tarball somewhere, and then when you publish that, it just references it. [19:29] isaacs: kriszyp: it was pretty universally complained about, and a pita to use. [19:29] isaacs: kriszyp: plus, every time github hiccuped, npm was useless. [19:29] kriszyp: I would not have complained ;) [19:29] kriszyp: oh, you mean the tarballs weren't in npm? [19:29] isaacs: kriszyp: yeah [19:29] isaacs: kriszyp: the tarballs stayed wherever you put them. [19:30] kriszyp: oh, I see [19:30] isaacs: kriszyp: in most cases, that meant github. [19:30] kriszyp: I had meant that publishing meant that npm could grab from the location [19:30] isaacs: kriszyp: npm publish http://github.com/isaacs/npm/tarball/v0.1.6 etc [19:30] kriszyp: git only needs to be up for the publish stage, once it is in npm, the install would come direct from npm [19:30] kriszyp: that seems like it is part of the value of npm [19:30] isaacs: kriszyp: that's how it works now. [19:30] kriszyp: you don't need to download from git [19:31] kriszyp: yeah, and that seems right to me [19:31] isaacs: kriszyp: you can do npm publish now [19:31] kriszyp: oh, ok [19:31] isaacs: kriszyp: it jus tdownloads it and then does a local publish [19:31] kriszyp: oh, ok [19:31] kriszyp: but you can't reference by url, right? [19:31] isaacs: kriszyp: so it's not to different from npm publish , which tars the folder, and then publishes it, or npm publish which uploads the tarball [19:31] kriszyp: (in package.json) [19:32] isaacs: kriszyp: the dist-url in the registry still points to the registry url, eyah [19:32] isaacs: kriszyp: you can install a tarball url, though [19:32] isaacs: kriszyp: but once i have the package.json, i've also got the package contents, so who cares where it came from? [19:32] kriszyp: so you are preserving the location? so if you ran into a mapping in package.json, npm would easily be able to find the correct package from the npm repo? [19:33] conset has joined the channel [19:33] isaacs: kriszyp: npm does nothing with "mapping" right now [19:33] isaacs: kriszyp: but it'd be an interesting addition to the dependencies hash. [19:33] kriszyp: right, but it has all the necessary information (the original location/url of the package)? [19:34] isaacs: kriszyp: well, it just gets the location from the registry if it doesn't already know it. [19:34] isaacs: kriszyp: ie, if you do npm install foo@latest, it looks in the registry to figure out what url that refers to. [19:34] isaacs: kriszyp: the goal is always to find the tarball that has the contents. [19:35] kriszyp: the canonical url (like the git source url) or the mirror url in the npm repo? [19:35] isaacs: kriszyp: the url to the tarball, in the npm repo [19:35] _announcer: Twitter: "@geraldfullam, I'm using miksago's node-websocket-server over at github, which runs on node.js -- I have node.js running on Ubuntu" -- Aaron Shafovaloff. http://twitter.com/aaronshaf/status/15873138665 [19:35] isaacs: http://registry.npmjs.org/irc/0.1.2 note the dist.tarball field [19:36] fdmanana has joined the channel [19:36] ryan_gahl: before i post this to the mailing list - is anyone aware of node bindings to cassandra yet? [19:37] kriszyp: i see [19:37] isaacs: kriszyp: so, if npm is asked to install something that is not a file, and not a folder, and not a url, then it looks it up in the registry, gets the dist.tarball field, and installs that url. [19:38] kriszyp: "not a url"... does that mean that you can have a url in the dependencies hash? [19:38] kriszyp: does dependencies trigger npm to install all the dependent packages? [19:38] kriszyp: I haven't tried that yet... [19:38] isaacs: kriszyp: dependencies must be a name : version hash [19:39] isaacs: kriszyp: so, no, that won't work. [19:39] kriszyp: name can't be a url? [19:39] isaacs: nope. [19:39] kriszyp: /[\w-]+/? [19:39] isaacs: kriszyp: because the whole point is to make sure that npm has installed that thing already. since i don't keep track of where stuff comes from, how would i know if that url is something i have or not? [19:39] isaacs: kriszyp: the name is the name of a package. ie, the "name" field in the package.json [19:40] kriszyp: you mean that you are getting the *identity* of the package from the package.json's name field, right? [19:41] isaacs: kriszyp: yes. name+version is the identifier [19:41] kriszyp: and does that identity have to /[\w-]+/ or something? [19:41] isaacs: kriszyp: it's assumed that you have control over your system, so if you installed something with that name and version, then it must be the thing you want. [19:41] isaacs: and if you break it, whatever. [19:41] isaacs: kriszyp: something like that. i think i don't allow /, since it's mapped to a folder name. [19:41] isaacs: kriszyp: but it's pretty liberal. [19:42] kriszyp: but the colons and slashes in a url would break it? [19:42] isaacs: kriszyp: oh, yeah [19:42] isaacs: kriszyp: you can't name a package a url. urls and names aren't the same sort of thing at all. [19:43] isaacs: kriszyp: if we move to naming things with urls, then a) that sucks, cuz it's ugly, and b) i don't know whether or not to check the registry or just download the url you gave me. [19:43] kriszyp: because you give them folder names? [19:43] isaacs: yeah [19:43] isaacs: because that's now node's require() works [19:43] isaacs: folder and filenames. [19:43] Ori_P_ has joined the channel [19:43] kriszyp: ACTION things urls are pretty :) [19:43] isaacs: so i create a {name} folder that links to {name}/{lib} [19:44] isaacs: and a {name}.js that is a shim to {name}/{main} [19:44] kriszyp: right [19:44] javajunky has joined the channel [19:46] dji has joined the channel [19:46] derbumi_ has joined the channel [19:47] b_erb has joined the channel [19:49] awenkhh has joined the channel [19:49] everton has joined the channel [19:50] hammerdr has joined the channel [19:52] richcollins has joined the channel [19:52] bradleymeck: best way to convert a Handle to a Handle? [19:53] tjholowaychuk has joined the channel [19:59] ryan_gahl: based on this c++ wrapper http://github.com/posulliv/libcassandra, can anyone speak to how difficult it would be to wrap node on top of it? I'd like to take a stab (first c++ node binding project), but could definitely use some help [20:01] bradleymeck: not too bad, just have to map a lot of stuff using functiontemplate and objecttemplate (use the internal fields) from a glance [20:02] ryan_gahl: what would be a good reference project in your estimation? [20:02] sechrist has joined the channel [20:03] mikeal: so long as it's non-blocking [20:03] creationix: isaacs: does ejsgi handle streaming bodies? [20:03] mikeal: if libcassandra is a blocking API then you're kind of screwed [20:03] creationix: of jsgi with promises [20:03] creationix: s/of/or/ [20:03] ryan_gahl: and should i fork the above repo and mod the source files directly or pull it in to a new repo as a submodule and code in a layer above it (treat libcassandra as a library) [20:04] kriszyp: jsgi w/ promises supports streaming [20:04] kriszyp: I use it in my static middleware module [20:04] kriszyp: static file... [20:04] creationix: I'm trying to find something between jsgi and connect in terms of abstraction [20:04] creationix: but it's really hard to find [20:05] creationix: kriszyp: code link? [20:06] kriszyp: I am using forEachable streams; so I have a fs-promise module that wraps node's fs module with promises, and returns foreachable streams from files, so in static.js, this is how I transfer it to a the jsgi handler: http://github.com/kriszyp/pintura/blob/master/lib/jsgi/static.js#L53 [20:07] kriszyp: the jsgi body takes a foreachable stream, which is what the fs-promise's open module returns, so the static middleware just passes it right on through [20:07] _announcer: Twitter: "@barryhawkins: ha, I tried to hide from the camera earlier, they were demoing there nodejs support in that photo" -- BrianEhmann. http://twitter.com/codelotus/status/15875097918 [20:07] creationix: kriszyp: it is impressive you guys have been able to map wsgi and rack onto node [20:08] kriszyp: maybe its easier becuase I have never used wsgi or rack ;) [20:08] fdmanana has joined the channel [20:08] creationix: kriszyp: but you didn't design jsgi either right, just made libraries that implemented/used it? [20:09] kriszyp: yeah, tlrobinson was more of the originator of jsgi. My main efforts/contributions have been making it async [20:10] hammerdr has joined the channel [20:10] creationix: yeah, there are a lot of parts in jsgi that simply don't matter in a node-only system. I'm trying to make something optimized for node [20:10] kriszyp: what parts don't matter (I am sure you are right, just wondering)? [20:11] creationix: well, the easy ones are multithread, multiprocess, and run_once but they are so little it hardly matters [20:12] kriszyp: ah, yeah, definitely [20:12] kriszyp: servers shouldn't even get a choice on those ;) [20:12] kriszyp: I wanted multithreaded to just be outlawed, but apparently others wanted to be able to do that [20:13] joshbuddy has joined the channel [20:14] x_or has joined the channel [20:14] creationix: mainly the overall feel seems very non-node [20:14] creationix: might explain why it was never popular [20:14] kriszyp: I guess multiprocess actually is kind of relevant on node (whether or not you have multiple workers servicing requests), with the eventual support of fd passing to workers [20:14] creationix: yeah, true [20:14] bradleymeck: so no clue on the how to make a Handle to a Handle in c++? [20:14] creationix: I'm actually adding that as a flag to connect [20:14] kriszyp: what does it mean to feel non-node, just out of curiousity? [20:15] creationix: kriszyp: the idoms and style mainly [20:15] kriszyp: and we have a good group of users using this stuff [20:15] bradleymeck: non-node is attempting to make blocking operations viable imho [20:15] creationix: kriszyp: that's good [20:15] kriszyp: I guess most aren't on this channel... [20:15] kriszyp: like prefixing variable with commas? [20:16] creationix: kriszyp: my main goal with connect isn't to compete with jsgi, but to make a middleware stack that the core community will want to embrace [20:16] kriszyp: I haven't adopted some of the node coding styles because I am foremost a dojo contributor, which has a set coding style, and I don't like switching back and forth [20:16] _announcer: Twitter: "Technologies I'd definitely want to check out/doing more of: #gaelyk #nodejs #cassandra #html5 (offline & more)" -- Richard Paul. http://twitter.com/rapaul/status/15875642459 [20:17] creationix: kriszyp: yeah, I talked with a bunch of dojo people last week (swdc and txjs) [20:17] mde: kriszyp: The comma-first thing isn't necessarily Node. [20:17] kriszyp: It seems like it would be possible to make adapters for connect<->jsgi<->node-native<->fab<->, etc... [20:17] mde: There are a bunch of people doing it, but the main thing with Node is just the async. [20:17] mde: I'm a Dojo contributor from a long time back, too. [20:18] kriszyp: right, that's why I was curious about how soemthing that is async would feel non-node [20:18] creationix: node-like means to me things like using callbacks instead of promises, being stream focusses vs forEachable [20:18] kriszyp: ah, i see [20:18] mde: Yes, using callbacks seems more idiomatically Nodish to me. [20:18] creationix: but the whole goal of callbacks was to put that burden on framework developers anyway [20:18] kriszyp: right [20:19] kriszyp: so jsgi is node-framework-ish, but not node-ish? :) [20:19] creationix: yeah, dunno [20:19] mde: Sometimes callbacks aren't right either -- you might want to rely on events. [20:19] creationix: well, yeah, events are very nodish when it's appropriate [20:19] mde: I mean, right now Geddy isn't compatible with any kind of connector. [20:20] mde: Right, exactly. [20:20] maushu: Oh man, I just found a great scene in minecraft. [20:20] kriszyp: yeah, events and callbacks are very appropriate based on the situation [20:20] mde: I'm building on Node because it's the best SSJS platform for me right now. [20:20] mjr_: creationix: thanks for initiating the nodeup last night. It was great to get people together in person. [20:20] mde: But eventually there's no reason you wouldn't want something like Geddy running on other platforms too. [20:20] creationix: mjr_: no problem [20:21] mde: Yeah, nice to get to shake some hands. [20:21] ryah: yes, and i'm excited to see a upd module [20:21] ryah: udp [20:21] creationix: :D [20:21] ryah: which now that we talked about it - seems exceptionally easy [20:22] ryah: mostly because it doesn't need to touch the rest of the network stuff [20:22] mjr_: Yeah, I was always planning on just staying up late some night and doing UDP. [20:22] mjr_: But now pquerna is on it. [20:22] steadicat has joined the channel [20:22] mjr_: Seems like he's going to do it this weekend even. [20:23] mde: I loved the grilling he got on "why UDP." :) [20:23] mjr_: nerd wars [20:23] kevwil_ has joined the channel [20:23] mde: Haha [20:24] creationix: so do you guys think I should leave Connect as is and move on building layers on top of it or change the api to be more abstracted and more like jsgi? [20:24] ryah: mjr_ has a personal beef with people who throw around UDP too loosely [20:25] mjr_: Yeah, UDP to me is like threads to ryah. [20:25] creationix: and abstraction to me ;) [20:25] mjr_: It's best handled by experts. [20:25] mde: creationix: That's a tough one -- you want something that works well for Node first. [20:25] creationix: of course [20:25] mde: But it should play nicely with others. [20:26] mde: And you'll get more traction the less work it is to make it work for both styles of connectors. [20:26] ryah: i like the idea of udp heartbeats [20:26] mjr_: But anyway, I was really impressed by the brainpower in one room last night. The fact that all y'all are all working on node things is really encouraging. [20:26] mikeal: creationix: where is that mime-type map that you've got? [20:26] mikeal: for your fileserver [20:26] mde: The more similar you make them, the more attractive it is to build something that works well with both. [20:26] creationix: all over [20:27] mikeal: hehe, link? [20:27] creationix: mikeal: here is one http://github.com/creationix/node-router/blob/master/lib/node-router.js#L370 [20:27] tjholowaychuk: mikeal: can grab Express` as well [20:27] kevwil has joined the channel [20:28] dji_ has joined the channel [20:28] creationix: mikeal: http://github.com/extjs/Connect/blob/master/lib/connect/providers/static.js#L94 [20:28] jbrantly has joined the channel [20:28] mjr_: Yeah, I like UDP heartbeats also. [20:28] creationix: mde: so you're saying make it jsgi like, and that will be close enough [20:29] mjr_: I find that most people that want UDP do so because they think it is "faster", but don't really know what they are trading off. [20:29] mde: I'm saying the less work I have to do to make it work with both, the more likely I'll be to do it, sooner. [20:29] mjr_: But clearly there are some very good reasons to use UDP. [20:29] isaacs: creationix: the intent of ejsgi was to make the bodies of the request and the response into Stream objects. [20:29] ryah: mjr_: yes i'm torn on what to do with my imaginary MQ server [20:29] isaacs: creationix: so, yes [20:30] isaacs: creationix: not only can it stream bodies, it can't not stream bodies [20:30] creationix: isaacs: but what if I wanted to buffer the body and parse it in a layer [20:30] ryah: zeromq does udp messages [20:30] isaacs: creationix: you can do that. just hook up to the upstream server, and then create a new stream to send out. [20:31] mjr_: ryah: do they explicitly ack? [20:31] conset has left the channel [20:31] isaacs: creationix: i think i even have an example in the ejsgi repo that does exactly that. it takes the postbody in, and then passes it through a rot13 filter. [20:32] isaacs: kriszyp: back to the conversation that i so hungrily abandoned... [20:33] isaacs: kriszyp: i'd love to see a mapping field in the package.json that doesn't replace the dependency hash, but sits alongside it [20:33] isaacs: kriszyp: maybe something like { "dependencies" : {"foo":"0.1.2"}, "mapping":{"foo":{"0.1.2":"http://url/"}}} [20:34] isaacs: kriszyp: so your package.json could contain like a little mini-registry of the things it cares about, and nodules can just use that, or npm can use it if the stuff isn't in the registry already, and so on. [20:34] kriszyp: ok [20:34] isaacs: kriszyp: not in <3 with that specific syntax, but i hope you get the idea. [20:34] kriszyp: yeah [20:35] isaacs: that might actualy provide a lot of benefit to npm, especially if you depend on things that haven't been published, and which you don't own so shouldn't publish yourslef. [20:36] mikeal: thanks creationix, that did the trick [20:36] creationix: mikeal: you're welcome :) [20:36] isaacs: i don't wanna get super verbose, but do you think there's a way to have a link to the tarball as well as a link to the raw js module root? [20:36] isaacs: kriszyp: or, can nodules fetch and unpack a tarball? [20:36] kriszyp: so for now, I should probably make a depedencies hash and a mapping hash for maximum portability so I can have my packages work in npm and nodules, I suppose... [20:37] kriszyp: I always point at the archive (not a raw js module root) [20:37] isaacs: kriszyp: you can also use the overlay hacky thing [20:37] isaacs: kriszyp: oh, awesome, i didnt' realize that [20:37] saikat: I have an app where I need to handle requests that modify a DB value synchronously (so, for example, when client A sends a request before client B, client A's request needs to get a db value, modify it, then set it before client B's request gets the DB value) [20:37] perdix has joined the channel [20:37] saikat: conceptually i understand that i should be doing this using some kind of queue [20:37] kriszyp: I don't have support in nodules for gzip/tarball yet, just zip, but obviously that could be added [20:38] saikat: (or rather, i think i should be) [20:38] isaacs: kriszyp: then yeah, i can totally get behind mapping as an addition to dependencies. how hard is it to unpack zips? i just use gzipped tars because gzip and tar are so widely used and straightforward on the command line. [20:38] saikat: but at the end of each request, I need to broadcast a message from my node server on a socket - so i don't think i can just offload it to a non-node queue to process (unless i can somehow communicate back to my node server that the item on the queue is done) [20:38] creationix: saikat: yeah, just add the pending requests to a queue, and then the db is ready for more queries, pull from the queue [20:39] isaacs: kriszyp: but i use dist.tarball specifically to leave the door open to other formats. [20:39] saikat: creationix: would the queue just be something i'm implementing within node? and then don't i need to fork a separate thread to consume this queue? [20:39] saikat: well not fork, but just have a separate thread [20:39] creationix: saikat: yeah, just use an array in node [20:39] kriszyp: http://github.com/kriszyp/nodules/blob/master/lib/nodules-utils/unzip.js and http://github.com/kriszyp/nodules/blob/master/lib/nodules.js#L457 [20:40] saikat: does node have support for separate threads? [20:40] creationix: saikat: no threads [20:40] saikat: i thought that was something that, by design, node doesn't want to do [20:40] kriszyp: obviously you can steal my module/code if you want it [20:40] isaacs: kriszyp: neato. maybe i'll add zip support in npm. is there a straightforward way to know whether a file is a zip or a tgz? [20:40] creationix: saikat: but we are getting worjers [20:40] creationix: *workers [20:40] kriszyp: the content-type header? [20:40] isaacs: kriszyp: like, npm install ./foo.archive.tar.gz.zip [20:40] saikat: creationix: then how do i consume my queue without blocking my main node server? [20:40] isaacs: kriszyp: how would i know which thing that is? [20:40] bradleymeck: saikat just use array push() and shift(), only c++ has multithreaded v8 does not support it currently for js execution you can however spawn children [20:40] kriszyp: oh, you mean from a local file? [20:41] isaacs: kriszyp: yeah [20:41] fictorial: isaacs: making a logo for NPM now... just saw your tweet. [20:41] kriszyp: whichever doesn't fail? :P [20:41] bradleymeck: also modify the queue from a callback [20:41] creationix: saikat: maybe I'm not understanding the problem [20:41] isaacs: fictorial: there's a few competitors. good to know [20:41] isaacs: fictorial: the requirements are: look good at smallish sizes, and must contain the letters "npm" in lower case [20:41] saikat: creationix: i'm probably explaining it poorly - here is a gist of a very naive implementation of what i want to do - http://gist.github.com/433383 [20:41] creationix: as long as consuming the queue doesn't do anything blocking you won't block the main event loop [20:41] fictorial: I was done until you said lowercase. [20:41] isaacs: hahah [20:41] fictorial: it's an acronym; why lowercase? [20:42] _announcer: Twitter: "npm logo contest: 1. Look good at smallish sizes. 2. Must contain the letters "npm" in lowercase. #nodejs" -- Ⓘⓢⓐⓐⓒ. http://twitter.com/izs/status/15877215903 [20:42] bradleymeck: cause uppercase is aggressive? [20:42] isaacs: fictorial: cuz I always write npm in lowercase. [20:42] saikat: creationix: so in that implementation, there are no queues, but the following could happen: client A and client B both send an edit, the callback gor the redis GET happens for client A and then for client B, and then client B applies its edit to a version of the data that existed before client A's edit got applied [20:42] fictorial: BRADLEYMECK: MAYBE YOU ARE RIGHT. [20:42] isaacs: fictorial: uppercase sets expectations of seriousness and stability. [20:43] saikat: so the redis get/set calls are of course blocking (so they happen asynchronously in this case) - but how can i make sure that client A gets and sets a value [20:43] kocolosk has joined the channel [20:43] saikat: before client B gets its value [20:43] isaacs: fictorial: NPM makes me think of a post office. "npm" is more pleasingly rounded and nice. [20:43] saikat: if client A's request came before client B's? [20:43] isaacs: fictorial: also, the command is "npm" so i see it written like that a lot. "NPM" looks weird to me. [20:43] creationix: saikat: ok, so you need a very minimal state system... [20:43] fictorial: isaacs: ok, I bet you won't like mine then if you aren't into, you know, post offices. it uses a "package" theme. [20:44] mjr_: Yeah, and if you set "npm" in Helvetica Bold, it looks nicer than NPM. [20:44] creationix: when a request comes in, first check if the db is busy [20:44] creationix: if so, put the request in the queue, and the db function will check the queue after finishing each query [20:44] saikat: basically, some minimal locking? i see [20:44] isaacs: you may notice from the email threads that i even write it lower-case when it starts a sentence, whereas i'm otherwise very particular about proper punctuation in email. [20:44] mde: Visa's logo is all uppercase, and it's not an acronym for anything. [20:44] saikat: that's what i was thinking, i was wondering if tehre is a more elegant way people do this [20:44] creationix: saikat: yeah, and it's really easy since the logic is single threaded [20:44] mde: So you can all-uppercase or all-lowercase for stylistic reasons in a logo. [20:45] isaacs: mde: totally [20:45] mde: But that's a logo. :) [20:45] creationix: saikat: you could make a mini library that manages such locks for you, but I usually just inline it [20:45] mde: When you talk about the project, technically it should be NPM, to distinguish from the commmand-line utility, npm. [20:45] saikat: creationix: and the db function would just be a function i call manually per request that i receiev, right? [20:45] mde: But that's splitting copy-editing hairs. [20:45] isaacs: mde: but the command-line utility IS the project. [20:46] saikat: creationix: so it's not some separate queue consuming thread/child processing the queue [20:46] mjr_: Someday when node grows up, it'll have to address these superficial capitalization issues as well. Is it node, node.js, Node, Node.js, Node.JS, or some other permutation? [20:46] isaacs: mde: npm is lowercase. so sayeth me. [20:46] tjholowaychuk: mjr_: nodejs NodeJS as well haha [20:46] mde: No, it's like the difference between talking about Node and talking about node. :) [20:46] mde: Or Ruby and ruby. [20:46] mde: Etc., etc. [20:46] creationix: saikat: no, nothing seperate, just a sec, I'll make a quick gist. But I think you understand what I mean [20:47] mjr_: I like calling it "node", all lower case, but that's un-googleable. [20:47] saikat: creationix: thanks a lot =) [20:47] mde: And in English, we do have *both* sizes of letters. :) [20:47] reid\work: isaacs: so i have narwhal-node locally installed and a package that depends on it won't build because "narwhal-node" isn't in the repository [20:47] reid\work: isaacs: why is the remote check done? [20:47] mjr_: You can pick your type blocks from either the lower or the upper case in your drawer. [20:47] derbumi has joined the channel [20:48] mde: It's a proper noun, like Washington DC or Jesus H. Christ. [20:48] SvenDowideit_ has joined the channel [20:48] fictorial: isaacs: http://i.imgur.com/o9pFW.png [20:48] isaacs: reid\work: you can install narwhal-node@latest i think [20:48] reid\work: (n.b. i think the @remote package is called "node-narwhal") [20:48] isaacs: reid\work:ah. [20:49] mape: isaacs: I assume the logo should be vector and work in print? [20:49] isaacs: vector or large png [20:49] isaacs: mape: i prefer not to kill trees. [20:49] ryah: what's jesus's middle name? [20:49] fictorial: ryah: node [20:49] jakehow has joined the channel [20:49] mape: isaacs: hehe yeah, but less colors more character [20:50] isaacs: fictorial: kewl. can you make it so that the letters are easier to see? [20:50] mde: ryah: He didn't have one. He didn't even really have a last name. [20:50] fictorial: isaacs: yeah [20:50] isaacs: psha.. he didn't have ANY name. [20:50] isaacs: dude was invented around 100 AD [20:50] mde: It was just "Bar Joseph," which is "Son of Joseph." [20:50] mde: Even though that it supposedly kind of questionable. [20:50] isaacs: his real name was "Mithras" [20:51] isaacs: or, no wait, Dionysus [20:51] mjr_: wow, zing [20:51] ryan_gahl: ryah: re: node-cassandra, couldn't the .node layer be implemented in such a manner as to pass calls asyn and marshal results in a non-blocking manner? [20:51] mjr_: Take that, 2 thousand year tradition! [20:51] mde: Dionysis, nice. [20:51] ryan_gahl: s/asyn/async/ [20:51] isaacs: mjr_: no, 4 thousand [20:51] ryah: ryan_gahl: could [20:51] isaacs: mjr_: Mithras's death and rebirth was celebrated around the winter solstice at least as early as 1400 BC [20:51] hammerdr has joined the channel [20:52] ryah: ryan_gahl: would be more difficult than just writing a new client. [20:52] isaacs: Mithra was born on December 25th as an offspring of the Sun [20:52] ryah: also slower [20:52] mjr_: isaacs: speaking of node, yeah, I know. That's why it's such a zing against the 2Kyr re-implementation of mithrianism. [20:52] x_or1 has joined the channel [20:52] isaacs: mjr_: i have *no* idea what this has to do with nodejs. i'll shut up. [20:53] fictorial: isaacs: wait, Mithras was a pagan god? I think I was at a very old church in Italy last year that had discovered a temple to Mithras way underground. [20:53] isaacs: fictorial: Mithra (or Mithras or Mythra) was an ancient indo-european hero-diety [20:54] mjr_: isaacs: I think you just need to mention node in every line somewhere, or possibly that OSX sucks for systems programming, JSON is great, and uhhh, I dunno, it's hard to rely on the value of "this"? [20:54] fictorial: damn, that was easy to find. http://www.sacred-destinations.com/italy/rome-san-clemente [20:54] fictorial: spookiest place ever [20:54] isaacs: fictorial: born Dec 25 to a virgin, both human and divine, killed on a tree, reborn 3 days later, followers ate a symbolic meal representing his flesh, the whole bit. [20:54] fictorial: heh [20:55] creationix: saikat: sorry, I got sidetracked, something like this http://gist.github.com/433623 [20:55] ryan_gahl: ryah: so, you think either fork libcassandra and re-implement or start from scratch? [20:55] saikat: creationix: no worries - and i assume the busy flag gets set to true in doQuery? [20:56] ryah: you start from scratch [20:56] ryah: apparently casandra will (does?) have the ability to speak avro instead of thrift [20:56] ryah: if that's possible now or will be possible shortly i would use that [20:56] fictorial: isaacs: http://imgur.com/CTCWE.png [20:56] ryah: that's the rumor i have frm my twitter connections [20:56] perdix has joined the channel [20:56] ryah: because thrift is a big huge pile of shit [20:57] isaacs: fictorial: neat. [20:57] ryah: ryan_gahl: tmpvar i believe has been working on avro bindings. [20:57] isaacs: fictorial: what about a side-view of the box with a bigger label? need something that's readable when it's about 16px tall. [20:58] fictorial: isaacs: 16px? wow [20:58] fictorial: ok [20:58] isaacs: fictorial: or just the letters, even. [20:58] ryah: ryan_gahl: i think bringing those to completion and then writing the casandra layer in JS is the best way [20:58] isaacs: fictorial: i'm ok with different incarnations. [20:58] ryah: ryan_gahl: depending on what the status of avro in casandra is ... [20:58] ryah: which i'm not sure about [20:58] ryan_gahl: hmm, ok, definitely glad i asked before starting [20:59] isaacs: fictorial: something on par with http://nodeknockout.com/images/sponsors/github.png or http://nodeknockout.com/images/sponsors/joyent.png [20:59] mjr_: fictorial: I think the text should be most of the image. [20:59] isaacs: right [20:59] isaacs: mjr_: +1 [20:59] ryah: ryan_gahl: find out what the story regarding avro vs thrift is for casandra [20:59] isaacs: maybe even ALL of the image. [20:59] fictorial: yeah I didn't realize 16px ... ok, np [20:59] ryah: ryan_gahl: and if at all possible avoid thrift completely [20:59] isaacs: fictorial: 16px is extreme. but the point is that it should shrink pretty far before it starts to be unrecognizable. [20:59] ryah: ryan_gahl: or maybe they're doing a native protocol [21:00] ryah: i don't know... [21:00] fictorial: isaacs: ok, what kind of style? classic? modern? I'm bored [21:00] isaacs: fictorial: sure. those sound good. [21:00] fictorial: oh like github - ok [21:00] isaacs: fictorial: make as many as you can as fast as you can :) [21:01] fictorial: ok! [21:01] isaacs: fictorial: also, there are a few other takers, i think, so we'll see what you guys all come up with [21:01] fictorial: indeed [21:01] jbrantly has joined the channel [21:01] ryan_gahl: thanks for the pointers, it looks like step 1 is grokking the avro/thrift config [21:03] stephenjudkins has joined the channel [21:04] jeffreyt has joined the channel [21:06] bradleymeck: mmm requires are all done synchronously right? [21:06] isaacs: bradleymeck: yes. [21:06] isaacs: bradleymeck: at startup time, that's acceptable. [21:07] isaacs: bradleymeck: don't do require() after startup. [21:07] bradleymeck: but i wanna~ [21:11] isaacs: bradleymeck: doing require() for built-in node modules is fine. they're super fast. [21:12] fictorial: isaacs: I grow weary... maybe later I'll make others. [21:12] bradleymeck: working on aiding that isaacs => http://gist.github.com/433642 [21:12] ryan_gahl: ryah: to clarify, are you saying the ideal bindings looks like this: cassandra > avro > node-avro > node-cassandra, where node-avro is c++/js and node-cassandra only has to be in js? [21:13] admc has joined the channel [21:13] ryah: ryan_gahl: that is what i suggested [21:14] isaacs: bradleymeck: line 4 is problematic. [21:14] gwoo has joined the channel [21:14] isaacs: String#length !== Buffer.byteLength(str) [21:14] isaacs: except accidentally [21:14] bradleymeck: a lot is problematic right now but its working so far [21:14] ryah: ryan_gahl: one should really go to the cassandra irc channel or mailing list and find out what they're plans are [21:14] ryan_gahl: k, just making sure i understood :) - I whole-heartedly expected to be in c++ with this [21:14] ryan_gahl: true, will do [21:14] _announcer: Twitter: "@jcroft Since LESS was ported to node.js, it can run in-browser and potentially support runtime values for percentages. Just sayin! =)" -- Handsome Greg. http://twitter.com/xdissent/status/15878981250 [21:15] isaacs: bradleymeck: ie, rather than Buffer::new(src->Length()) it should be something like Buffer::new(Buffer::byteLength(src)) [21:15] ryah: they're - -meh [21:15] fdmanana has joined the channel [21:20] rgahl has joined the channel [21:21] rgahl has left the channel [21:22] abadr has joined the channel [21:22] _announcer: Twitter: "@davidpaulyoung @chorrell Thanks, looking forward to a (potential) future filled with javascripty parallelness. #nodejs" -- J.C.Burns. http://twitter.com/jcburns/status/15879384448 [21:22] sechrist: it's not parallel at all! [21:23] slaskis has joined the channel [21:24] probablyCorey has joined the channel [21:24] bradleymeck: neither are threads though really :P, unless you have multiple core threads which idk if any userthreads do that? [21:25] creationix: it's parallel waiting ;) [21:25] sechrist: they're more parallel than an event loop [21:25] creationix: but yeah, no parallel execution [21:26] Ori_P has joined the channel [21:26] ryah: concurrent! [21:26] mjr_: The IO may very well be happening in "parallel" by the kernel. Hopefully. [21:27] ryah: should we geek out on recently defined nominclture? [21:27] ryah: 'parallel' vs 'concurrent' [21:27] sechrist: yes [21:27] isaacs: ryah: what's the difference? [21:27] mde: Heheh [21:27] sechrist: yes, what is the difference? [21:27] isaacs: don't they both mean "at the same time"? [21:28] hammerdr: no [21:28] sechrist: ^ [21:28] ryah: http://blogs.sun.com/yuanlin/entry/concurrency_vs_parallelism_concurrent_programming [21:29] sechrist: oh pssh [21:29] mjr_: Also, we should stop saying "bandwidth," because it doesn't really refer to the frequency range of the baseband. [21:30] mjr_: When really we mean "bitrate." [21:30] mjr_: Hang on, lemme get a Kleenex. [21:31] ryah: mjr_: :) [21:31] ryah: http://my.opera.com/Vorlath/blog/2009/10/08/parallel-vs-concurrent [21:33] creationix: while we're at it, what about async [21:33] creationix: is that the same as concurrent [21:33] sechrist: I would think so [21:33] sechrist: the same thing applies, polling but nonblocking [21:33] ryan_gahl: 42 [21:33] ryah: once i saw a great little square [21:33] ryah: it had 4 part [21:33] ryah: non-blocking was in there, and async [21:34] sechrist: ryan_gahl: that's the answer to the question we don't know yet [21:34] ryah: and some other crap [21:34] ryah: but it gave you the percetion of understanding when you saw it [21:34] ryan_gahl: i just thought i'd shortcut the discussion... it was heading that way [21:34] jxson has joined the channel [21:34] sechrist: fucking threads, how do they work? [21:35] creationix: preemption [21:35] mde: Async can be just one thing, so it's different from concurrent. [21:35] creationix: mde: true [21:35] ryah: creationix: the term "async" has a lot to do with the context [21:36] mjr_: async just means you don't get immediate confirmation of whether something worked or not. [21:36] mde: Just means "don't have to answer right then." [21:36] inimino: it means "not sync" [21:36] ryah: but usually it refers to something like a function call or RPC or request, which does not block the current thread of execution [21:36] mjr_: async isn't necessarily a programming term. [21:36] creationix: so async really applies to functions mostly, not to general architectures [21:37] sechrist: sony is gearing up for PS4? what? [21:37] mde: Right, e-mail and microblog are async. [21:37] ryah: you would usually use it in the case where you execute something blocking in another thread [21:37] mde: IM is sync. [21:37] creationix: so a concurrent architecture will likely have many non-blocking and async function calls [21:37] mjr_: phone calls and PTT radios are sync. Nearly every other communication technology is async. [21:38] ryah: e.g. fs.write() is a fairly canonical example of an async function [21:38] isaacs: im isn't sync [21:38] isaacs: mde: ^ [21:38] mape: love isn't sync [21:38] ryah: non-blocking refers to sockets usually [21:38] isaacs: we don't have to both be focused on the message at the same thing [21:38] isaacs: *time [21:38] ryan_gahl: wife's b-day, time to go get groceries for dinner :) - l8r [21:38] mape: it is blocking though.. :P [21:38] ryah: file i/o => async, socket i/o => non-blocking [21:39] mape: ryan_gahl: hehe have a good time [21:39] isaacs: ryah: i thought non-blocking means that if you make a call that would block, it throws an error [21:39] isaacs: rather than block [21:39] mde: isaacs: It's a contiuum. :) IM is *more* sync than say, Twitter. [21:39] isaacs: mde: IM is not sync. walking by my desk to have a conversation is sync. [21:39] oleg__ has joined the channel [21:39] mde: That can be async too, if you're in the middle of something. :) [21:39] isaacs: mde: there's a difference of kind. it' snot a continuum at all. [21:39] mjr_: non-blocking just means that something won't block. The return value can be interpreted as an error if you like. [21:39] creationix: ryah: but I thought the point of node was to blur the distinction between file IO and socket IO [21:39] ryah: isaacs: c doesn't have exceptions, but yeah, i guess [21:40] isaacs: ryah: returns an error code, i mean [21:40] mde: Nah, the base use case for IM is to go back and forth in real time. [21:40] isaacs: mde: if i'm in the middle of something, it doesn't wait, it interrupts. [21:40] sechrist: this just got nuts [21:40] mape: blocking == exception == the alert stating this script is taking to long? [21:40] mde: No, you wave your hand, and keep working for a minute or two. [21:40] isaacs: mde: but i can't keep working indefinitely. [21:40] ryah: creationix: yes - bcause basically no one on earth understand this nonsense [21:40] mde: Even an async function call with a callback returns. [21:40] ryah: that file i/o is different than socket i/o [21:40] mde: That's the hand-wave. [21:41] ryah: and 'on earth' i mean, web programmers [21:41] mde: isaacs: You could keep working, if it were important enough. :) [21:41] ryah: obviously the kernel people are very familar with all this [21:41] mjr_: isaacs, mde the confusing part about applying sync and async to communications technologies is that they span both technology and human factors. The humans require truly synchronized attention to have a phone call, and progressively less synchronized attention as they move toward email. [21:41] isaacs: mde: once the flow is broken, an interrupt has occurred, it's not the same any more. [21:41] mde: mjr_: Right, even a phone call can be async. [21:41] ryah: creationix: the reason file i/o is that way is just a mistake though [21:41] isaacs: a phone call is async if you don't pick it up [21:41] ryah: no one wants it that way [21:41] mde: Right. :) [21:42] mde: Or if you put the phone down to go take a leak. [21:42] mde: So it's not cut-and-dried. [21:42] creationix: ryah: yeah, I mean disks are faster than internet usually, but still way slower than CPU cycles [21:42] ryah: well, at least i don't want it that way :) [21:42] isaacs: mde: that's still sync, though, it's just paused (or ignored, dropping packets) [21:42] mde: Nah, you could just never come back. [21:42] ryah: creationix: yeah, so it's not as noticable [21:42] mjr_: isaacs: a phone call is an attempt to synchronize human attention. That's the signaling / ringing part. If attentions are synchronized, then the call happens. If it doesn't, then it doens't happen. [21:42] ryah: creationix: but when it bites it bites hard [21:42] isaacs: mde: the fact that it can fail doesn't mean it isn't sync [21:42] mde: There's no guarantee you'll be back. [21:42] isaacs: mjr_: a phone call is nonblocking [21:43] ryah: the only true solution is to put all disk access into threads [21:43] isaacs: mde: just becasue it can fail doesn't mean it isn't sync [21:43] mde: Doesn't mean it's a failure. [21:43] creationix: ryah: yeah, too bad it's not async in posix from the beginning [21:43] isaacs: mde: fail in the sense of the communication not happening [21:43] mde: The conversation picks right back up the next time you talk. [21:43] ryah: creationix: yep [21:43] isaacs: mde: that's a pause, not an async [21:43] mde: Right, the phone rings, you don't pick it up. It's async. [21:44] isaacs: mde: no, it's nonblocking [21:44] mde: You pick it up, it's sync. [21:44] isaacs: mde: voicemail is async [21:44] mde: Until you put it down. [21:44] creationix: ryah: so what does the threadpool in node, is it just custom c code somewhere? [21:44] creationix: for file I/O [21:44] isaacs: mde: the phone call itslef is synchronous [21:44] ryah: creationix: libeio [21:44] ryah: creationix: it's really simple and easy to read [21:44] isaacs: ACTION waves hands [21:44] creationix: ok, so that's part of libeio, but you're not using evcom anymore right? [21:44] ryah: just like start a thread, execute some crap [21:44] ryah: send it back [21:44] mde: No, because like somebody mentioned, there are human factors, so it can switch to async when you take off for a while. [21:45] ryah: evcom was replaced by net.js [21:45] ryah: evcom = net.js in c [21:45] mde: Just because the phone is still connected doesn't make the communication synchronous. [21:45] creationix: ok, now I see the progression [21:45] ryah: but maybe i need to do net.js in c again :) [21:45] mikeal has joined the channel [21:45] creationix: and libev just provides the event loop, but no IO stuff [21:46] mde: All that's required for synchronous communication is for both parties to continue responding right waway. [21:46] ryah: libev is just an abstraction of select and epoll [21:46] creationix: ahh, yes, very useful [21:46] ryah: so i don't have to write two versions [21:46] mjr_: What's wrong with net.js? [21:46] creationix: mjr_: performance [21:46] ryah: worried it's creating too many objects [21:46] ryah: making gc run too often [21:47] creationix: ryah: even with freelist huh? [21:47] sveisvei has joined the channel [21:47] fictorial: mjr_: it's synchronously concurrent but sometimes parallel. big no-no. [21:47] mjr_: What are the objects, temporary Buffers? [21:47] ryah: needs more poking [21:47] mjr_: ACTION pokes ryah  [21:48] ryah: mjr_: maybe like the arrays for the outgoing data [21:48] kevwil has joined the channel [21:48] tjholowaychuk has joined the channel [21:49] mjr_: I really like the way that net.js has ended up. It'd be sad to see it go back to C++. [21:49] mjr_: But if it's too slow, it's too slow. [21:51] ryah: yeah. i have dreams of specing the binding layer [21:51] ryah: and being able to detach from v8 [21:52] ryah: but, well, who cares about that right now. [21:52] ryah: :) [21:52] mjr_: You should stop having so many dreams, or you'll never realize your other dream of finishing node in a year. [21:55] isaacs: what's require("uri")? [21:55] isaacs: i thought we got rid of that [21:55] isaacs: oic, it's a deprecation warning, but a broken one. [21:56] ceej: tjholowaychuk: how's it going? [21:56] tjholowaychuk: aceej: not bad you? [21:56] tjholowaychuk: fuck [21:56] tjholowaychuk: ceej: not bad u haha [21:57] ceej: tjholowaychuk: lol whats up? good...just working on a companies iphone app [21:57] mape: ryah: Things that work is the opium for the community [21:58] tjholowaychuk: ceej: nice man, just got my ipad! but now i need snow leopard apparently [21:58] _announcer: Twitter: "@martoche Dude, node.js Dev server?!?! ... SWEET!" -- Geoffrey Donaldson. http://twitter.com/geoffreyd/status/15881333942 [21:58] ceej: tjholowaychuk: sweet, ye that's where apple is really good at getting $$ out of you :) [21:59] mjr_: Anybody in here that Apple isn't really goodat getting money out of? [21:59] sechrist: I'm preordering the iphone 4 next week [21:59] ceej: how's the new express coming along, or have you been too busy like myself :) [21:59] sechrist: bite me [22:00] sechrist: apple deserves my money with that kind of build quality [22:00] ryah: ACTION laughing [22:01] mjr_: stand by for software quality invalidation [22:01] ceej: tjholowaychuk: just asking because I really wanted to get my corporate site up this weekend using node/expres/heroku and building a simple blog to prove to my business partner how awesome node is :) [22:01] tjholowaychuk: ceej: to busy sorry man :( aaron got a few commits in that should help with the heroku issue [22:01] sechrist: software quality invalidation? [22:01] sechrist: the only competition is android [22:01] ceej: ye I noticed that..... I'll have to check them out [22:01] tjholowaychuk: ceej: also I added a "rest" provider to Connect today which adds express-like routing if your interested [22:02] sechrist: and quite frankly that's becoming the windows of the mobile phone world. -- runs on all hardware configurations -- none that well [22:02] creationix: ceej, that kind of app [22:02] creationix: s/that/what/ [22:02] mjr_: ryah has a macro for quickly pasting in how bad OSX is for doing Unix things. [22:02] mjr_: I thought he would have invoked it by now. [22:02] ceej: creationix? [22:02] ryah: :) [22:02] creationix: ceej: what kind of app are you wanting to launch? [22:03] creationix: my sousaball exampleis a fairly complete, yet simple app [22:03] bradleymeck: mmm unix semaphore in os x are *pleasurable* [22:03] ceej: creationix: It's going to be a basic wordpress type site for our company, using monogodb/express [22:03] creationix: database backend, html templates [22:03] ceej: tjholowaychuk: is there an example ? [22:04] tjholowaychuk: ceej: not yet but check out the tests for it, pretty self explanatory [22:04] isaacs: anyone else get a bunch of EADDRINUSE errors runnign make test-all? [22:04] creationix: ceej: http://github.com/extjs/Connect/blob/master/examples/sousaball/app.js [22:04] creationix: (same project as tjholowaychuk btw) [22:05] ryah: isaacs: killall node [22:05] tjholowaychuk: ceej: and this is the functionality of rest http://github.com/extjs/Connect/blob/master/test/connect.providers.rest.test.js [22:05] saikat has joined the channel [22:05] creationix: someday "killall node" will shutdown the os [22:05] isaacs: ryah: yeah, no other nodes running. [22:05] sechrist: node-os [22:06] creationix: tjholowaychuk: ohh, is rest pushed to master? [22:06] isaacs: JOBS=1 make test-all [22:06] isaacs: ryah: ^ and it still flips out when it gets to the net/http stuff [22:06] ceej: tjholowaychuk: o nice, it's almost got everything express bar the templating [22:06] tjholowaychuk: creationix: it was just an empty file before [22:06] SteveDekorte has joined the channel [22:06] ceej: creationix: I'll check it out [22:06] tjholowaychuk: ceej: and sessions / cookies / views / few other things [22:06] saikat: in node, when I make an asynchronous call like a fetch from a database, i know that this gets put on an event queue and processed later. Does Node have multiple workers that consume the event queue? [22:08] stephenjudkins: saikat: someone correct me if i'm wrong, but I believe that it is largely dependent on the library doing I/O [22:08] ceej: tjholowaychuk: express isn't going to get deprecated those is it? You're just going to change the core to connect when you get the spare time? Will the syntax change at all? [22:09] ceej: though* [22:09] creationix: but templates are pretty easy to pull in from other stuff [22:09] bradleymeck: asm in my node addon makes me a sad panda [22:09] tjholowaychuk: ceej: yeah the idea is that it can just sit on top of Connect, and plugins can hopefully be mostly removed from express [22:09] creationix: tjholowaychuk: I think I'm going to give up on trying to streamify the connect interface for now [22:09] tjholowaychuk: ceej: if it does not fit properly it wont be integrated with connect, shall have to see [22:09] saikat: i see - in that case: fictorial - if i'm using redis-node-client, does redis-node-client process multiple async calls (like gets and sets) in parallel? [22:10] tjholowaychuk: creationix: alright let me know if you come up with anything [22:10] tjholowaychuk: ill try and think in a bit [22:10] creationix: I can't find a good abstraction that works for all the use cases [22:11] creationix: maybe we can do some minimal tweaking on the current interface instead [22:11] ceej: tjholowaychuk: I get you [22:16] jwa: wee [22:17] jwa: ACTION got a simple irc bot working in just a day [22:18] ceej: tjholowaychuk: I just tried that static update on heroku, i can confirm it works :) [22:18] tjholowaychuk: ceej: yay :D [22:18] creationix: tjholowaychuk: what should I call the connect flag to set the number of child processes? [22:18] saikat: in this gist: http://gist.github.com/433720 - is it possible that the output would be "new_value" followed by "set successfully"? basically, could the order in which things happen be that: 1. r.get is called, 2. r.set is called, 3. some_hash is set to new value, 4. the actual blocking get operation happens and the callback for the get is called, 5. the callback for the set is called [22:18] tjholowaychuk: creationix: -n [22:18] tjholowaychuk: creationix: haha :) ummm... [22:18] _announcer: Twitter: "wrote a #node.js irc bot in a couple of hours, javascript seems like it was just intended for that purpose! :D" -- Julian Wachholz. http://twitter.com/julianwachholz/status/15882436535 [22:19] ceej: tjholowaychuk: It's still serving twice as slow as apache, but at least it serving the whole file now :) [22:19] tjholowaychuk: creationix: or maybe just -s, --servers N [22:19] creationix: -w --workers [22:20] ceej: express - style.css - 181ms / apache - style.css - 51ms [22:20] tjholowaychuk: creationix: that works, i think we should allow -n too, looks better for the small switch i think [22:20] ryah: ^-- this tweet makes me happy [22:20] ryah: and i agree with it completely [22:20] creationix: :) [22:20] tmpvar has joined the channel [22:20] sechrist: javascript: the bot language [22:20] creationix: tmpvar: did you hear that, non website uses of node make ryah happy? [22:21] creationix: ceej: try it with connect's static file server [22:21] mjr_: Yep, sorry web-people. [22:21] tjholowaychuk: ceej: we still dont do any buffer caching [22:21] jeffreyt has left the channel [22:21] sechrist: I use node for a lot of non-webby things [22:22] sechrist: quicker to build utility apps in node than py/perl/php [22:22] mjr_: I dunno about quicker to build for me anyway, but certainly more pleasurable to build. [22:23] sanderjd: sechrist: what kinds of utility apps do you find to be quicker? [22:23] sanderjd: what about vs. ruby? [22:23] mape: sechrist: though php has more string functions [22:23] mape: but yeah, js is alot nicer [22:23] pedrobelo has joined the channel [22:23] tlrobinson_ has joined the channel [22:23] ceej: creationix: you mean setup another project using connect to just server the static file? [22:24] pedrobelo has joined the channel [22:24] creationix: yeah, it should be really fast [22:24] mjr_: Perl's inline variable interpolation makes it easy to write small programs quickly. [22:25] mape: use regex to solve a problem, and you have two? ;) [22:25] mjr_: But fuck perl. Too clever, and nobody but the author understands the code. [22:25] tjholowaychuk: fuck, i always think there is ServerRequest [22:25] isaacs: npm is a non-web use of node :) [22:25] creationix: ceej: http://gist.github.com/433726 [22:25] isaacs: of course, npm is also completely derivative. [22:26] _announcer: Twitter: "Messing around with node.js" -- Lee Semel. http://twitter.com/semel/status/15882834345 [22:26] mjr_: I'm working on an implementation of TCP/IP in node. [22:27] ceej: creationix: i'll have to add it to my vendors [22:27] mjr_: Which I should really get back to, but I'm really distractable today. [22:27] mape: isaacs: aren't you adding web to npm by adding local repo through web? ;) [22:27] ceej: creationix: i could technically just use connect to serve static files in my project instead of express and use express everything else? [22:27] isaacs: mape: sure, but that's not really a thing yet. [22:27] creationix: probably [22:27] isaacs: mape: eventually [22:27] mape: isaacs: The future holds a lot of things [22:28] creationix: once all frameworks use the same middleware stack we can share things like static file serving and move on to more interesting stuff [22:28] ceej: creationix: connect doesn't have any submodules does it? [22:28] isaacs: mape: indeed :) [22:28] creationix: ceej: nope [22:28] tjholowaychuk: ceej: just for testing [22:29] ryah: i can't get writeFile to crash [22:29] tjholowaychuk: which has expresso / sass [22:29] jakehow has joined the channel [22:33] ceej: creationix: how would i serve it? http://localhost:8080/public/css/style.css [22:33] mikeal: it was a lot simpler than i thought to write a file server [22:33] creationix: ceej: yeah, relative to whatever path you put in the "root" param [22:34] dji has joined the channel [22:34] creationix: mikeal: how did it go, I was wondering what you wanted the mime database for [22:34] derbumi has joined the channel [22:34] mikeal: yeah [22:34] mikeal: that mime map is like twice the size of the file server :) [22:34] mikeal: and that includes a pump function [22:34] creationix: I know [22:35] ceej: creationix: i have http://pastie.textmate.org/private/oisb3sc988x9s68khuyxxw http://localhost:8080/public no go... [22:35] creationix: ceej: dirname doesn't end in "/" [22:35] creationix: need to add it [22:35] creationix: or use path.join [22:35] ceej: even added no go [22:35] creationix: and __dirname is the path to the js file, not cwd [22:36] creationix: ceej: you're getting 404 right? [22:36] mikeal: process.cwd [22:36] creationix: hmm, I wonder if connect runs on heroku's old node version [22:36] creationix: isn't it like 0.1.94 or something? [22:37] ceej: creationix: I'm trying it locally [22:37] creationix: no, it's v0.1.92, wow [22:38] creationix: ceej, what error are you seeing? [22:38] ceej: http://screencast.com/t/ZjZiYmExMm [22:38] ctp has joined the channel [22:38] ceej: but it's showing in the logs i'm hitting the server [22:38] ceej: 127.0.0.1 - - [Thu, 10 Jun 2010 22:38:49 GMT] "GET /favicon.ico HTTP/1.1" 404 24 "" "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.70 Safari/533.4 [22:38] creationix: yeah, that's normal 404 [22:38] tjholowaychuk: can addListener() take a context obj? would be cool to req.addListener('data', res.write, res) or something [22:38] tjholowaychuk: maybe [22:38] creationix: browsers don't show the real 404 content if the body is too short [22:39] o_o has joined the channel [22:39] creationix: ceej: put sys.debug in the static.js file to see what path it's trying to hit on your filesystem [22:39] creationix: looks like a bad "root" config [22:40] thebot has joined the channel [22:40] ceej: {provider: "static", root: __dirname+"/public"} [22:40] ceej: ooo [22:40] ceej: http://localhost:8080/css/frontend/style.css works :) [22:40] creationix: nice, now benchmarkit [22:40] creationix: should be quite fast [22:43] sudoer has joined the channel [22:43] _announcer: Twitter: "Cider easily install (mysql, postgres, redis, memcached, mongodb rvm node.js, Ruby, Sinatra, Rails) http://bit.ly/aDmQyG" -- kazu. http://twitter.com/ktlacaelel/status/15883794035 [22:44] creationix: ceej: yeah, connect static file doesn't work with v0.1.92 because fs.readFile is giving strings there [22:45] creationix: so anything binary gets corrupted [22:45] creationix: hopefully you're heroku has a newer version of node [22:45] hassox has joined the channel [22:49] ceej: creationix: ye mines newer it ran.... they actually serve my 2.1kb file at the same speed, 115ms average [22:50] devinus_ has joined the channel [22:51] tjholowaychuk: i had a stream implemented before so that you dont have like a 5GB file in memory haha [22:51] tjholowaychuk: but it was pretty slow [22:52] tjholowaychuk: now it works with the stat size, if its huge it will stream, if its not huge we just use fs.readFile [22:57] JimBastard has joined the channel [22:57] JimBastard: ACTION is reporting in from NYC.js [22:57] _announcer: Twitter: "Had nice food and tea at @pingpongdimsum. Brainstormed our @hackcamp project. Will it be NodeJS + Solr? http://twitpic.com/1vne74" -- Johan. http://twitter.com/freenerd/status/15884545116 [23:00] creationix: ceej: well, connect will run on older node, but it won't use buffers and will be slower and corrupt binary stuff [23:01] creationix: ceej, I could patch the static provider to use buffers on heroku too if you wanted [23:02] bradleymeck: mmm should we try to make a standard semi-compiled js format? (v8 ScriptData + a minimized src packed into a single file?) [23:02] ceej: creationix: for connect? [23:02] creationix: ceej: yeah, for connect [23:02] ceej: creationix: ye I could give it another benchmark if you do that [23:04] hammerdr_ has joined the channel [23:08] _announcer: Twitter: "I wonder if anyone has considered writing an SSH server with node.js? (similar to conch and twisted)" -- Michael Prasuhn. http://twitter.com/mikey_p/status/15885191752 [23:09] creationix: ceej: ok, I patched it to convert the string to a buffer for v0.1.92 [23:10] ceej: k I'll try it out.... [23:10] ryah: ssh server on node.js [23:10] devinus_ has joined the channel [23:10] creationix: ceej: I get 33MB/sec on my machine with a 116KB file [23:11] creationix: ryah: sounds like fun huh [23:11] isaacs: that'd be rad [23:12] fdmanana has joined the channel [23:12] ryah: still need help with writeFile... [23:12] ryah: seems to beo broken [23:12] ryah: http://github.com/ry/node/issues#issue/156 [23:13] ryah: ^-- if anyone wants to work on it [23:13] ryah: ACTION bbl [23:13] JimBastard: lol creationix, jquery.haml.js is just like JUP [23:14] creationix: JimBastard: told'ya [23:14] JimBastard: hee hee did you [23:14] JimBastard: its gonna be a battle of the parsers [23:14] creationix: except jquery.haml does dom operations and bind events on the fly [23:15] creationix: I think JUP is a text generator [23:15] devinus_ has joined the channel [23:15] JimBastard: yeah, we dont want dom operations or binding [23:15] JimBastard: thats for the view engine to handle [23:15] JimBastard: JUP returns text or arrays [23:16] creationix: JimBastard: http://static.creationix.com/jquery-haml/examples/ [23:16] creationix: yeah, jquery-haml was never meant for server-side, it's a dombuilding lib [23:17] JimBastard: creationix: lol nice you parsed the jquery ui [23:17] JimBastard: i gotta pay attn to this speaker [23:17] creationix: it's pretty simple html [23:19] ceej: creationix: whoa http://www.softwaredevs.com/public/images/logo.png [23:20] ceej: express doesn't like serving that image file on heroku.... [23:20] ceej: it's only 16kb [23:20] tjholowaychuk: haha [23:20] tjholowaychuk: use [23:20] tjholowaychuk: set('static buffer size', ...) ( i think that is what aaron named the option) [23:21] gerad has left the channel [23:21] tjholowaychuk: to disable chunked all together set it to Number.MAX_VALUE [23:21] ceej: like set('static buffer size',Number.MAX_VALUE) [23:22] hassox has joined the channel [23:22] tjholowaychuk: yup [23:22] tjholowaychuk: might want to double check his commit cant remember what he called it [23:23] creationix: kriszyp: licensing liability of association with extjs? [23:23] creationix: good idea in the email though :) [23:23] derbumi has joined the channel [23:24] kriszyp: sorry, shouldn't have been so rude [23:25] ceej: tjholowaychuk: still no go :/ [23:25] tjholowaychuk: drrr [23:26] tjholowaychuk: ceej: http://github.com/visionmedia/express/commit/32cd51d3a5e07bcdb38e67b744996c6b4ef7978f#L0R73 [23:26] tjholowaychuk: or pass bufferSize [23:26] creationix: kriszyp: I'm not sure how I would glue the different types together though [23:27] creationix: they are quite different in concept [23:27] kriszyp: I was thinking you could have a registry of converts [23:27] kriszyp: require("connect").adapter.connect.jsgi would be a converter from connect to jsgi [23:27] kriszyp: require("connect").adapter.jsgi.connect and would be vice versa [23:27] creationix: hmm, but what would they do [23:28] tlg has joined the channel [23:28] ceej: tjholowaychuk: that's what i have.... [23:28] tjholowaychuk: ceej: hmm not sure :( [23:29] kriszyp: require("connect").adapter.connect.jsgi = function(jsgiMiddleware){ return function(err, req, resp, next) { .. make jsgi request. .. return jsgiMiddleware(request);};}; [23:30] ceej: tjholowaychuk: do you just do this.... http://pastie.textmate.org/private/n1cxe4hn8cg100c7gc53og [23:30] creationix: kriszyp: so you think it's possible to convert between then at a module by module basis? [23:30] kriszyp: require("connect").adapter.jsgi.connect = function(connectMiddleware){ return function(request) { .. make connect request. .. return connectMiddleware(err, req, resp, next);};}; [23:30] kriszyp: I think so [23:30] kriszyp: from what I saw of your interface... [23:30] tjholowaychuk: ceej: hmm yeah should work [23:30] kriszyp: And I presume it would work for fab too [23:30] creationix: hmm, then that would be great, I'm just not sure it's possible [23:31] ceej: tjholowaychuk: works locally.... [23:32] tjholowaychuk: ceej: do a curl -v .. against it [23:32] tjholowaychuk: maybe it still has some funky headers [23:33] devinus_ has joined the channel [23:35] ceej: tjholowaychuk: http://screencast.com/t/OGJmMzA5NGI [23:35] derbumi has joined the channel [23:35] ceej: ye... [23:35] ceej: saying it's html [23:35] ceej: not an image.... [23:36] ceej: o nm that's cause it's giving back that error [23:39] ceej: tjholowaychuk: i tried a gif, still same issue [23:42] hassox has joined the channel [23:44] aglemann has joined the channel [23:45] ceej: man this is annoying :/ [23:50] _announcer: Twitter: "Doesn't node.js suffer the same problem as all event driven network stacks in that the programmer ends up with complicated state machines?" -- Sandy Walsh. http://twitter.com/TheSandyWalsh/status/15887529449 [23:50] gerad has joined the channel [23:52] Validatorian has joined the channel [23:52] gerad: haml.js doesn't support "else"? [23:53] gerad: http://gist.github.com/433831 [23:53] gerad: bah [23:58] isaacs: kriszyp: HAHAHAH!!! [23:58] isaacs: lol [23:58] isaacs: kriszyp: "unfortunately I don't think I could directly contribute to this project due to the licensing liability of association with extjs." [23:58] isaacs: that's so deliciously evil and hilarious. [23:59] kriszyp: hey, I work for sitepen, I would get shot for contributing to something that has "Copyright (c) 2010 Ext JS" on it [23:59] isaacs: oh, you meant it. [23:59] kriszyp: :) [23:59] isaacs: i thought you were poking at the private/GPL history [23:59] [[zz]] has joined the channel [23:59] kriszyp: well, yeah, of course