00:02:02  * stlsaintquit (Quit: leaving)
00:02:48  <rowbit>SubStack, pkrumins: These encoders are STILL down: 173.203.67.76(free3)
00:04:38  * dominictarrquit (Ping timeout: 244 seconds)
00:09:31  * mikealquit (Quit: Leaving.)
00:14:09  * mikealjoined
00:16:46  * stlsaintjoined
00:46:28  * ryanseddonjoined
00:58:51  <rowbit>Hourly usage stats: []
01:04:55  * mikealquit (Quit: Leaving.)
01:16:04  * stlsaintquit (Ping timeout: 250 seconds)
01:34:25  * mikealjoined
01:39:38  * stlsaintjoined
01:39:38  * stlsaintquit (Changing host)
01:39:39  * stlsaintjoined
01:50:46  * mikealquit (Quit: Leaving.)
01:54:11  * mikealjoined
01:58:51  <rowbit>Hourly usage stats: []
02:02:48  <rowbit>SubStack, pkrumins: These encoders are STILL down: 173.203.67.76(free3)
02:12:32  * wiwilliajoined
02:20:47  * AvianFluquit (Quit: Leaving)
02:29:27  * stlsaintquit (Quit: leaving)
02:58:51  <rowbit>Hourly usage stats: []
03:05:01  <isaacs>http://gist.io/3200554
03:05:03  <isaacs>anyone want to play?
03:05:33  * timoxleyjoined
03:06:21  * timoxleyquit (Client Quit)
03:07:15  <maxogden>isaacs: haha
03:08:58  <maxogden>isaacs: sure ill play, though my regex knowledge is probably way worse than yours
03:09:59  * timoxleyjoined
03:11:47  <isaacs>ok, so, come up with a regex, say < 10 chars (not including the starting and ending /), in js
03:14:54  <isaacs>> crypto.createHash('sha1').update(myRe.toString()).digest('hex')
03:14:55  <isaacs>'463f9df377bbff3f145e5c79afdb832b16db1188'
03:15:00  <isaacs>and do that^
03:15:18  * isaacshas never played this game before
03:15:21  <maxogden>werd
03:15:24  <isaacs>but it sounds like it might be fun
03:15:33  <isaacs>the hash is just for verification later :)
03:15:57  <isaacs>if it's cool, i might write a little webapp to play it online
03:16:55  <isaacs>> myRe.toString().length < 12
03:16:55  <isaacs>true
03:30:35  <isaacs>> [ myRe.test('foo'), myRe.test('foo ') ]
03:30:36  <isaacs>[ false, true ]
03:33:06  * isaacsis writing up a node module for this now.
03:33:53  * ryan_stevensjoined
03:34:19  <guybrush>isaacs: > [myRe.test('gnagdihag'),myRe.test('google')]
03:34:19  <guybrush>[ false, false ]
03:34:20  <maxogden>haha
03:34:57  <isaacs>guybrush: if you wanna play, provide a sha1 hash, one passing string, and one failing string.
03:35:04  <guybrush>> require('crypto').createHash('sha1').update(myRe.toString()).digest('hex')
03:35:04  <guybrush>'125eb16e12771e25808ddba342f00bdbe2720023'
03:35:26  <guybrush>ah lol
03:35:27  <isaacs>guybrush: so, one string that passes?
03:35:52  <guybrush>wait a second my regex isnt good :p
03:36:20  <isaacs>guybrush: then i try to guess your regexp. you then say either: a string that passes my guess, but not your regexp; or a string hat passes your regexp, but not my guess; or "congratulations, that's it"
03:36:40  <isaacs>and then you try to guess, etc.
03:37:35  <maxogden>passes: "☃☃☃☃☃", fails: "☃", crypto: 'b3d43bb3ebe7ab61d475844e96eb27f80bb706b5'
03:37:43  <ik>c/,,\
03:38:05  <isaacs>maxogden: i think your bytes got a little weirded
03:38:35  <maxogden>isaacs: ill gist it
03:38:50  <maxogden>https://gist.github.com/84f2352774d0668d7ba5
03:39:02  <isaacs>maxogden: https://skitch.com/isaacschlueter/ejtg5/1-powerblock
03:39:18  <isaacs>haha
03:39:28  <isaacs>is your regexp /☃☃+/?
03:39:33  <maxogden>weird
03:39:40  <isaacs>/<snowman><snowman>+/
03:40:05  <maxogden>snowmen show up fine for me
03:40:16  <isaacs>yeah, probably irssi being dumb
03:40:26  <maxogden>weird, i use irssi
03:40:28  <maxogden>ok to answer you
03:40:57  * isaacs_homejoined
03:40:59  <ik>omar comin' y'all
03:41:01  <ik>it's omar
03:41:25  <isaacs>
03:41:34  <isaacs_home>ah, ok, it shows up fine in colloquy
03:41:34  <maxogden>woot
03:42:09  <isaacs>i'll keep that window open over there :)
03:42:35  <maxogden>by agreeing that the guess is correct (defined as, matches the same set of strings as player 2's Regex)
03:42:38  <maxogden>by providing a string that is matched by the guess but not by player 2’s Regex
03:42:41  <maxogden>by providing a string that is matched by player 2's Regex but not by the guess
03:42:47  <isaacs>yes
03:43:07  <isaacs>if your regexp was /<snowman>{2,}/ for example, that'd be equivalent
03:43:08  <maxogden>so your guess is correct if i cant provide either of the last two
03:43:34  * wiwilliaquit (Ping timeout: 264 seconds)
03:43:49  <maxogden>ok yea it was <snowman>{5,}
03:43:52  <maxogden>i GET IT NOW!
03:43:58  <isaacs>oh, dude
03:44:17  <isaacs>no, you could have provided <snowman><snowman><snowman> which passes my guess, but not your regex
03:44:26  <maxogden>ohhh
03:44:54  <isaacs>ok, try to guess mine:
03:44:54  <isaacs>> [ myRe.test('foo'), myRe.test('foo ') ]
03:44:55  <isaacs>[ false, true ]
03:46:31  <maxogden>isaacs: is yours /w+\s/
03:47:17  <isaacs>> [ guess.test(' '), myRe.test(' ') ]
03:47:18  <isaacs>[ false, true ]
03:47:39  <isaacs>> [ /w+\s/.test(' '), myRe.test(' ') ]
03:47:39  <isaacs>[ false, true ]
03:48:25  <maxogden>isaacs: is yours /.+\s/
03:48:52  <maxogden>oh wait
03:49:03  <isaacs>> [ /.+\s/.test(' '), myRe.test(' ') ]
03:49:03  <isaacs>[ false, true ]
03:49:06  <maxogden>isaacs: is yours /.+\s$/
03:49:10  <maxogden>OH WAIT
03:49:10  <LOUDBOT>HEY I THINK YOUR WEBSITE IS BROKEN
03:49:23  <isaacs>yeah, the .+ is not strictly necessary, apparently
03:49:52  <maxogden>isaacs: /.*\s$/
03:52:14  <isaacs>> [ /.*\s$/.test('\\1'), myRe.test('\\1') ]
03:52:15  <isaacs>[ false, true ]
03:52:31  <maxogden>isaacs: i have to run cause chai thai noodles closes at 930
03:52:36  <maxogden>isaacs: but i will finish after
03:52:37  <isaacs>oh, kewl, have fun :)
03:52:45  <isaacs>you're so close :)
03:56:51  * stlsaintjoined
03:58:51  <rowbit>Hourly usage stats: []
03:59:45  * st_lukejoined
04:03:18  <rowbit>SubStack, pkrumins: These encoders are STILL down: 173.203.67.76(free3)
04:29:42  * mikealquit (Quit: Leaving.)
04:36:48  <rowbit>SubStack, pkrumins: Developers waiting in the queue for ie9 (Queue length: 1 on 1 servers. Total servers: 5)
04:47:31  * ryan_stevensquit (Quit: Leaving.)
04:58:51  <rowbit>Hourly usage stats: []
05:29:22  * st_lukequit (Remote host closed the connection)
05:33:46  * AvianFlujoined
05:56:54  * mikealjoined
05:58:51  <rowbit>Hourly usage stats: []
06:00:46  * mikealquit (Client Quit)
06:03:18  <rowbit>SubStack, pkrumins: These encoders are STILL down: 173.203.67.76(free3)
06:32:55  * mikealjoined
06:58:51  <rowbit>Hourly usage stats: []
07:28:54  * mikealquit (Quit: Leaving.)
07:58:51  <rowbit>Hourly usage stats: []
08:03:48  <rowbit>SubStack, pkrumins: These encoders are STILL down: 173.203.67.76(free3)
08:17:49  * dominictarrjoined
08:22:19  * mikealjoined
08:58:51  <rowbit>Hourly usage stats: []
09:48:28  <rowbit>/!\ ATTENTION: (default-local) [email protected] successfully signed up for developer browserling plan ($20). Cash money! /!\
09:48:38  <SubStack>oh no, didn't upgrade!
09:50:46  <SubStack>pow done
09:53:02  <SubStack>email sent
09:58:51  <rowbit>Hourly usage stats: []
09:59:19  <dominictarr>SubStack, do you use JSONStream from the browser?
09:59:28  <SubStack>yes
09:59:43  <SubStack>example: https://github.com/substack/graph-stream/blob/master/example/resizable/main.js
10:00:49  <dominictarr>so, hmm, http-browserify is still streamy in a decent browser?
10:01:00  <SubStack>yep
10:01:09  <SubStack>http://browserling.com:9005/
10:01:12  <SubStack>is that code live
10:02:23  <SubStack>connection might be a bit slow since that's just ssh tunneled from my laptop
10:02:59  <SubStack>although with slow connections streaming parsing really shines!
10:03:43  <dominictarr>is seems pretty good, from the way the colours are moving.
10:04:10  <dominictarr>and subjective is what counts
10:04:16  <SubStack>the server is just doing random samples from a dataset too
10:04:19  <rowbit>SubStack, pkrumins: These encoders are STILL down: 173.203.67.76(free3)
10:04:23  <SubStack>so it's an infinite stream of json
10:16:43  <dominictarr>SubStack, why not just send line-seperated json, rather than a never-ending stream of (if it ever ends) json?
10:17:21  <SubStack>because I don't want to write a line splittery thing
10:17:32  <SubStack>and this way I can reuse the same code to handle static json files that are large
10:17:56  <SubStack>and I'm also using JSONStream to pick out the parts of the json doc that I care about
10:18:20  <SubStack>I'd need to use JSONStream server side to pick out the parts and then send the pieces separately
10:18:42  <SubStack>but here I'm emulating just pulling down a big json doc with no server-side assistence
10:20:50  <dominictarr>after some nice pull requests, I'm pretty confidant that I have the best linesplitter right here https://github.com/dominictarr/event-stream#split-matcher
10:22:06  <SubStack>that'd still require the server to parse the json first
10:23:03  <dominictarr>it's up to you of course, I've just noticed that parsing json in js is way slower than regexp + JSON.parse.
10:23:41  <SubStack>parsing is really fast, fetching data over http is the slow part
10:27:26  <dominictarr>I last tested this about a year ago, I'll check again.
10:29:06  <dominictarr>I think if you are reading from disk to makes a noticable difference, may be that was it.
10:58:51  <rowbit>Hourly usage stats: []
11:04:05  <dominictarr>SubStack, you are right, parsing makes no difference if you are streaming over http.
11:25:49  <SubStack>dominictarr: you should make one of these https://www.gittip.com/github/dominictarr/
11:26:03  <SubStack>I am already getting money from people somehow!
11:27:09  <SubStack>recurring revenue streams rock
11:27:19  <SubStack>especially relatively passive ones
11:29:18  <dominictarr>you can nearly afford one of those massive sandwiches from safeway
11:29:24  <SubStack>correct
11:29:29  <SubStack>per week
11:30:31  <dominictarr>oh, they have this backwards
11:30:48  <dominictarr>you have to create a page before any one can tip you?
11:31:00  <SubStack>people can actually tip you before you create an account
11:31:11  <SubStack>it just shows up as "unclaimed" and they don't charge until you claim it
11:31:12  <dominictarr>GOOD
11:31:21  <dominictarr>that is how this should work.
11:31:30  <dominictarr>how does it notify them?
11:31:39  <SubStack>I don't think it does notifications yet
11:32:00  <SubStack>but there's https://www.gittip.com/about/unclaimed.html
11:32:24  <dominictarr>it needs to tweet at them, so everyone sees it, and thinks that is a good cause.
11:32:30  <SubStack>yeah that would rock
11:32:47  <SubStack>I think the guy putting it together it still iterating on the concept
11:32:56  <SubStack>lots of room for improvement
11:33:10  <dominictarr>do you know who it is?
11:34:48  <rowbit>SubStack, pkrumins: Developers waiting in the queue for ie9 (Queue length: 1 on 1 servers. Total servers: 5)
11:34:50  <SubStack>Chad Whitacre the about page says
11:34:56  <SubStack>there's also #gittip
11:35:49  <SubStack>wow it's only 1 month old
11:35:49  <rowbit>SubStack, pkrumins: Developers waiting in the queue for ie8 (Queue length: 1 on 1 servers. Total servers: 3)
11:36:13  <dominictarr>oh I just realized this is a weekly pledge
11:36:24  <dominictarr>that changes a lot
11:38:14  <SubStack>the about page is really neat https://www.gittip.com/about/
11:39:18  <dominictarr>I found it
11:41:24  <SubStack>oh neat, stallman was a macarthur fellow in 1990
11:41:25  <dominictarr>SubStack, JSONStream slows down streaming from the disk, but not from http.
11:41:40  <SubStack>dominictarr: good to know!
11:41:51  <SubStack>disk is pretty fast, especially with os caching
11:43:31  <dominictarr>although, of course, if your have http on the other end, it probably doesn't matter.
11:47:12  <dominictarr>sometimes it's faster to go slow
11:47:34  <dominictarr>consider for example twitter (not saying that twitter is fast)
11:47:53  <dominictarr>no, lets use facebook because facebook is fast.
11:48:31  <dominictarr>when displaying the user page, you only need to send the messages to fill up the first screen
11:48:53  <dominictarr>which is probably < 10
11:58:51  <rowbit>Hourly usage stats: []
12:04:49  <rowbit>SubStack, pkrumins: These encoders are STILL down: 173.203.67.76(free3)
12:13:20  <SubStack>https://browserling.com:9000/queue?browser=explorer&version=9.0
12:13:30  <SubStack>new queue ui progress
12:14:04  <SubStack>try resizing!
12:14:55  <SubStack>I should spin this thing off into a separate module, it's pretty sweet
12:16:12  <dominictarr>that actually works pretty well
12:16:41  <dominictarr>I have a small screen, so I'm often resizing. many websites don't do it this nicely.
12:17:12  <SubStack>all it took was some mathemagic!
12:17:40  <SubStack>var base = Math.pow(1 - 100 / window.innerWidth, 1.1)
12:17:47  <SubStack>var w = 120 * Math.pow(base, n - 1)
12:17:52  <SubStack>elem.width(w)
12:20:42  <dominictarr>oh, we are talking about something different I think... this is the perspective effect
12:20:48  <dominictarr>that you mean
12:25:36  <SubStack>well to the perspective takes into consideration the window.innerWidth
12:25:54  <SubStack>so I can listen on resize and just recompute the widths for all the spots
12:26:50  <SubStack>the avatars further away are also more transparent to increase the distance illusion
12:30:01  <dominictarr>oh rite, I see now. as you step back, you are actually walking to the side as well, keeping the whole queue in shot.
12:30:12  <dominictarr>that is good camera work
12:30:53  <dominictarr>substack, you should add chat so that you can talk to the other people in the queue
12:31:11  <SubStack>that is a lot easier to add now
12:31:12  <dominictarr>with speach bubbles above which avatar represents you
12:32:41  <SubStack>that'd be a good ui for it
12:33:01  <dominictarr>it would be _so_ cute
12:35:59  <SubStack>I like how silly our product is considering how dull the problem it solves is
12:37:03  <SubStack>browser testing might be a chore, but at least you can be a dinosaur while you wait for your browser to spin up!
12:37:15  <SubStack>or not spin up so much as just become available
12:38:42  <SubStack>making the world a more interesting place
12:52:23  <dominictarr>I especially like the combination of dinosaurs, aliens, robots, and 19th century scientists.
12:58:51  <rowbit>Hourly usage stats: []
13:09:32  * wiwilliajoined
13:14:04  <Nexxy>speech bubbles and avatars?! KAWAII DESU~!1
13:50:49  <guybrush>is this component-stuff from tj already public somewhere?
13:52:02  <guybrush>i still like the yarnify-approach actually..
13:56:32  * wiwilliaquit (Ping timeout: 240 seconds)
13:58:51  <rowbit>Hourly usage stats: []
14:00:27  <dhoss>is /w #shitgames
14:00:29  <dhoss>gah
14:04:49  <rowbit>SubStack, pkrumins: These encoders are STILL down: 173.203.67.76(free3)
14:11:37  <guybrush>oh i found the article, its very well hidden on http://tjholowaychuk.com :)
14:12:06  * AvianFluquit (Quit: This computer has gone to sleep)
14:18:28  * yhuangjoined
14:19:02  <yhuang>Good Morning. I can't seem to run my tests, are the server all right?
14:19:15  <SubStack>checking
14:19:52  <SubStack>yep servers are fully operational!
14:31:38  <yhuang>thanks. was there something changed? my test code worked before but now it doesn't , i didn't change anything
14:46:03  * ryan_stevensjoined
14:52:42  * wiwilliajoined
14:58:51  <rowbit>Hourly usage stats: []
15:03:00  * rannmannquit (Read error: No route to host)
15:04:00  * dsfadfjoined
15:04:00  * rannmannjoined
15:04:00  * rannmannquit (Changing host)
15:04:00  * rannmannjoined
15:04:27  * dsfadfquit (Remote host closed the connection)
15:12:01  * st_lukejoined
15:12:40  * AvianFlujoined
15:22:43  * st_lukequit (Remote host closed the connection)
15:22:59  * st_lukejoined
15:31:11  * _sorensenjoined
15:44:48  <rowbit>SubStack, pkrumins: Encoders down: 50.57.226.209(free4)
15:51:18  <rowbit>SubStack, pkrumins: Encoders down: 50.57.226.209(free4)
15:53:49  <rowbit>SubStack, pkrumins: Developers waiting in the queue for ie9 (Queue length: 1 on 1 servers. Total servers: 5)
15:58:51  <rowbit>Hourly usage stats: []
15:59:48  <rowbit>SubStack, pkrumins: Developers waiting in the queue for ie8 (Queue length: 1 on 1 servers. Total servers: 3)
16:05:18  <rowbit>SubStack, pkrumins: These encoders are STILL down: 173.203.67.76(free3)
16:11:18  <rowbit>SubStack, pkrumins: Developers waiting in the queue for ie6 (Queue length: 2 on 2 servers. Total servers: 2)
16:24:37  <rowbit>/!\ ATTENTION: (default-local) [email protected] successfully signed up for developer browserling plan ($20). Cash money! /!\
16:24:38  <rowbit>/!\ ATTENTION: (default-local) paid account successfully upgraded /!\
16:29:10  <ik> o
16:29:13  <ik>/!\
16:29:15  <ik>/ \
16:29:18  <ik>SubStack: ^^ make it happen
16:29:51  <ik><rowbit> o o
16:30:08  <ik><rowbit> /!\ ATTENTION: stuff /!\
16:30:16  <ik><rowbit> / \ / \
16:30:25  <ik>like that except lined up right :(
16:58:51  <rowbit>Hourly usage stats: []
16:59:21  * yhuangquit (Ping timeout: 244 seconds)
17:06:13  * yhuangjoined
17:07:25  * mikealquit (Quit: Leaving.)
17:22:43  * mikealjoined
17:23:48  <rowbit>SubStack, pkrumins: Developers waiting in the queue for ie8 (Queue length: 1 on 1 servers. Total servers: 3)
17:36:21  * mikealquit (Quit: Leaving.)
17:42:19  * stlsaintquit (Read error: Operation timed out)
17:56:13  * xaqjoined
17:58:51  <rowbit>Hourly usage stats: []
17:58:57  * mikealjoined
18:03:24  * stlsaintjoined
18:05:19  <rowbit>SubStack, pkrumins: These encoders are STILL down: 173.203.67.76(free3)
18:07:19  * munroquit (Quit: WeeChat 0.3.8)
18:10:12  * munrojoined
18:58:51  <rowbit>Hourly usage stats: []
19:25:50  <isaacs>dominictarr: How would you feel about if i made config-chain async and had it default to ini-style files, and use json if the file ends in .json only?
19:27:04  * isaacsthinks dominictarr is sleeping or something
19:29:34  <dominictarr>isaacs, hey, sorry.
19:29:47  <isaacs>oh, hey
19:30:00  <dominictarr>yeah, I mean, it's mostly your protolist thing anyway
19:30:09  <isaacs>there you are :) i thought youw ere like substack, one of these people who just never sleep except in little 15 minute increments here and there
19:30:59  <dominictarr>I don't have a notification on my irc (although i probably should) because I have hid my taskbars.
19:31:22  <isaacs>i see
19:31:34  <isaacs>i have irssi make a <thunk> noise
19:31:48  <isaacs>\007 or whatever
19:32:27  <dominictarr>yeah, I'd been meaning to do this. just turned it on
19:33:06  <dominictarr>yeah, well i figured that config files are normally small, so there is not really a probablem loading them sync,
19:33:24  <dominictarr>I mean, js files are way larger, and they are loaded sync.
19:33:30  <isaacs>dominictarr: so, anyway, this means, i'm going to rip out exports.find, and guess about the type, and support something like {type:url, value:http://blahblahblah
19:33:41  <isaacs>dominictarr: right, but if you need to re-load them at run-time, then that fails.
19:33:50  <dominictarr>true
19:33:53  <isaacs>or fetch them from http
19:34:00  <dominictarr>doubly true
19:34:23  <isaacs>actually, maybe filenames should just be strings, and you can pass in a stream for http or <whatever.
19:34:26  <dominictarr>but at start up sync does keep you code a bit cleaner.
19:34:55  <isaacs>i wantto use this in the website, is why
19:35:22  <isaacs>and also, i want to be able to pass in a config-chain object as the last thing in the config-chain
19:35:50  <isaacs>so i can do: req.npmConfig = new ConfigChain({username:foobarz, ...}, config.npmConfigs)
19:36:55  <isaacs>and have the npm-registry-client take a ConfigChain object as its configurationer rather than {big,pile,o,stuff}
19:37:05  <dominictarr>kinda like the express of configurations.
19:37:08  <isaacs>since most of npm's configs are actually for the registry client interaction
19:37:21  <isaacs>yeah, i mena, it's all just a prototype chain anyway, right?
19:37:43  <dominictarr>indeed.
19:39:40  <isaacs>whoa, dude, you added me to the repo?
19:39:41  <dominictarr>cool, I just added you as a git hub collaborator and npm owner. I'm sure whatever changes you want to do will be completely reasonable.
19:40:18  <isaacs>ok, thanks. i'll still run it by you, it's your thing.
19:40:41  <dominictarr>sure, no prob.
19:41:39  <dominictarr>just keep the sync interface, and my stuff will still work.
19:41:57  <isaacs>hmm.. ok
19:42:12  <isaacs>so, if you pass in a string, it does fs.readFileSync() and parses as json
19:42:25  <isaacs>dominictarr: can you guarantee that your json files always end in '.json'?
19:43:04  <dominictarr>that sounds pretty reasonable.
19:44:47  <dominictarr>or use a getter when store is accessed
19:44:55  <dominictarr>and have a async function to call?
19:45:27  <isaacs>dominictarr: or we can just try json, and if that fails, then try ini
19:46:00  <isaacs>dominictarr: or better yet, kill the sync interface, treat them as filenames, and bump the version number to reflect the breaking change
19:46:46  <dominictarr>if that comes out cleaner, do that.
19:46:55  <isaacs>and support taking a stream as an argument for http and fs and whatnots
19:48:19  <dominictarr>how many places do you need to get config from?
19:48:52  <dominictarr>silly question, a stream is everything.
19:52:26  <dominictarr>but why not take a stream, and if it's ../ or / it's a file, and if it's http:// load from there and if it's an plain object, just use that.
19:53:49  <isaacs>dominictarr: because the userconfig on Windows is something like "C:\Users\Dominic Tarr\npm-config"
19:54:47  <isaacs>dominictarr: but, to answer the question, 3 files, sometimes package.json data object when publishing, the env, and the cli
19:54:48  <dominictarr>oh, right, that problem has been out of my life for some time now.
19:58:29  <dominictarr>you should be using path.join to assemble the file name though, right? and wont that check what os it's on?
19:58:48  <isaacs>sure
19:58:51  <rowbit>Daily usage stats: []
19:58:51  <rowbit>Hourly usage stats: []
19:58:59  <isaacs>so, let's look at the use cases we actually have..
19:59:08  <isaacs>you load JSON from files. i load INI from files.
19:59:21  <isaacs>we parse the env, and pass in a default object
19:59:27  <isaacs>anything else?
19:59:34  <isaacs>oh, writing the files *back* with changes.
19:59:51  <dominictarr>now, THAT is complicates things.
20:00:11  <isaacs>since you want to do stuff like config.set('foo', 'baz', '/Users/isaacs/.npmrc'); config.save('/Users/isaacs/.npmrc', cb)
20:00:42  <dominictarr>oh, that works.
20:00:46  * yhuangquit (Quit: ChatZilla 0.9.88.2 [Firefox 14.0.1/20120713134347])
20:00:52  <isaacs>i mean, with a slightly less terse API, we could do this stuff pretty straightforwardly, then decide the sugar to add to it.
20:01:06  <isaacs>but i really want to rip out all the "interact with config files" junk from npm
20:01:16  <isaacs>so that i can reuse it easily in the npm-www project
20:01:22  <dominictarr>yup.
20:01:25  <isaacs>without using npm itself as a dep
20:03:07  <dominictarr>but with the site you want to be able it edit the config and reload on the fly?
20:03:24  <dominictarr>you mentioned something like that before?
20:03:40  <isaacs>well, i don't know about that
20:03:47  <isaacs>i mean, i can already do it with th cluster stuff
20:04:08  <isaacs>but that just means that each worker will load the configs before listening, which they already do, but usin npm.load()
20:04:36  <isaacs>if you want to reload the master's configs, though (ie, to change the filename of the worker or the number of workers) then that takes a restart
20:05:11  <dominictarr>thats probably for the best
20:05:18  <isaacs>yeah
20:05:21  <isaacs>way simpler that way
20:05:49  <rowbit>SubStack, pkrumins: These encoders are STILL down: 173.203.67.76(free3)
20:07:05  <isaacs>dominictarr: but, yeah, everything in npm's lib/utils/ini.js, has gotta go
20:07:39  <dominictarr>yeah, "utils" folder.
20:14:49  <dominictarr>I originally wrote config-chain in anger, after getting tired of nodejitsu/nconf
20:15:19  <jesusabdullah>pffsht
20:15:24  <jesusabdullah>nconf's not bad now
20:15:42  <jesusabdullah>and I'm pretty sure part of that was because you went back afterwards and made the api less awkward
20:16:04  <dominictarr>yeah, after I lost the battle to use config-chain.
20:16:11  <jesusabdullah>I mean
20:16:16  <jesusabdullah>did you really think you'd win that one?
20:16:27  <jesusabdullah>You gotta pick your battles
20:16:47  <jesusabdullah>and usually in nodejitsu that means working with "the library" and doing your best to "be the change you wish to see" within context
20:16:51  <jesusabdullah>frustrating I'm sure
20:17:02  <jesusabdullah>but c'est la vie I guess
20:17:03  <jesusabdullah>or whatever
20:17:28  <dominictarr>totally, it's all water under the bridge now.
20:17:37  <jesusabdullah>indeed
20:18:36  <dominictarr>but anyway, this is why I don't really mind isaacs doing whatever with config-chain.
20:18:45  <jesusabdullah>fo' sho'
20:18:54  <jesusabdullah>config-chain looked pretty nice truth be told
20:19:03  <jesusabdullah>solved a problem simply
20:20:06  <dominictarr>that was my frustration with nconf. it solved several problems we didn't even have.
20:21:15  <dominictarr>like it had all this stuff for using redis as a configuration server, and doing atomic updates to particular properties.
20:21:35  <jesusabdullah>I feel that
20:21:44  <jesusabdullah>"overengineered" is a term that comes to mind
20:21:57  <jesusabdullah>I tolerate overengineered pretty well though
20:22:08  <jesusabdullah>as I'm an engineer by training
20:22:25  <dominictarr>yeah, and you always want to build a bridge too strong
20:22:50  <jesusabdullah>You have to admit though
20:22:58  <jesusabdullah>Even if the bridge has a retarded amount of concrete and rebar
20:23:01  <jesusabdullah>it ain't movin'
20:23:07  <jesusabdullah>that fucker's bridge as fuck
20:23:11  <jesusabdullah>haha
20:23:18  <dominictarr>haha.
20:23:50  <dominictarr>config-loaders arn't quite bridges though.
20:24:04  <jesusabdullah>Not quite
20:24:20  <jesusabdullah>I mean, in civil engineering you don't really get the opportunity to do agile
20:24:20  <dominictarr>I wouldn't describe it as over-engineered, necessarily
20:24:41  <dominictarr>because I can agree it seemed like a good idea at the time.
20:24:47  <jesusabdullah>for sure
20:25:34  <dominictarr>but then the evisioned features never got used.
20:26:27  <dominictarr>and like every project has ~200 lines that wrapped nconf in a particular way and I had to read all that to understand that project.
20:26:55  <dominictarr>_that_ is where the problem lay.
20:27:36  <dominictarr>with the right configuration layer, each module just uses it nearly exactly the same way.
20:29:33  <ik>BRIDGE AS FUCK
20:29:33  <LOUDBOT>SO WHO OF YOU IDIOTS WANTS SOME HELP WITH PERL
20:30:19  <rowbit>SubStack, pkrumins: Encoders down: 50.57.226.209(free4)
20:42:25  <isaacs>jesusabdullah, dominictarr: you know, nconf was originally born from a desire to abstract out npm's config system.
20:42:46  <isaacs>and it got over-engineered, and i was like, "i can't use that, just do this instead" and charlie and paolo were all, "but this is cool"
20:43:12  <isaacs>i mean, using redis as a configurator is kinda nice in ome ways.
20:43:18  <dominictarr>and now we have come full circle.
20:43:22  <isaacs>especially if you have a distributed clustering scalable thingie
20:43:26  <isaacs>which they do.
20:43:34  <isaacs>config files are sorta weak then.
20:43:48  <rowbit>SubStack, pkrumins: Developers waiting in the queue for ie7 (Queue length: 1 on 1 servers. Total servers: 3)
20:44:11  <isaacs>it's kinda the same with winston, imo.
20:44:37  <isaacs>if you want a stream of data events from your logger, then it should dump json to stdout.
20:44:54  <isaacs>if you want more fanciness up front, then just write a logger that logs.
20:45:41  <isaacs>anyway, i'm just getting all kids-on-my-lawn-cane-shaking and grumpy because i haven't had lunch yet.
20:45:45  * isaacsaway!
20:49:18  <rowbit>SubStack, pkrumins: Developers waiting in the queue for ie7 (Queue length: 1 on 1 servers. Total servers: 3)
20:54:19  <rowbit>SubStack, pkrumins: Developers waiting in the queue for ie7 (Queue length: 1 on 1 servers. Total servers: 3)
20:58:51  <rowbit>Hourly usage stats: []
20:59:48  <rowbit>SubStack, pkrumins: Developers waiting in the queue for ie7 (Queue length: 1 on 1 servers. Total servers: 3)
21:04:30  <rowbit>/!\ ATTENTION: (default-local) [email protected] successfully signed up for developer browserling plan ($20). Cash money! /!\
21:04:30  <rowbit>/!\ ATTENTION: (default-local) paid account successfully upgraded /!\
21:04:48  <rowbit>SubStack, pkrumins: Developers waiting in the queue for ie7 (Queue length: 1 on 1 servers. Total servers: 3)
21:07:48  <rowbit>SubStack, pkrumins: Encoders down: 50.57.223.161(dev5)
21:08:18  <rowbit>SubStack, pkrumins: Developers waiting in the queue for ie9 (Queue length: 1 on 1 servers. Total servers: 5)
21:08:40  * xaqquit (Remote host closed the connection)
21:09:08  * xaqjoined
21:09:18  <rowbit>SubStack, pkrumins: Encoders down: 50.57.223.161(dev5), 50.57.174.117(dev2), 184.106.106.46(dev-ie8-1)
21:10:19  <rowbit>SubStack, pkrumins: Encoders down: 50.57.223.161(dev5)
21:10:27  * timoxleyquit (Ping timeout: 244 seconds)
21:11:04  * xaq_joined
21:12:02  * timoxleyjoined
21:14:08  * xaqquit (Ping timeout: 250 seconds)
21:15:18  <rowbit>SubStack, pkrumins: Encoders down: 50.57.174.117(dev2), 173.203.68.112(dev3), 184.106.106.46(dev-ie8-1), 50.57.171.229(dev-ie6-2), 50.57.174.105(dev-ie8-2), 184.106.99.27(dev-ie7-3)
21:21:18  <rowbit>SubStack, pkrumins: Developers waiting in the queue for ie9 (Queue length: 3 on 3 servers. Total servers: 5)
21:21:50  * xaq_quit (Read error: Connection reset by peer)
21:22:23  * xaqjoined
21:26:48  <rowbit>SubStack, pkrumins: Developers waiting in the queue for ie9 (Queue length: 3 on 3 servers. Total servers: 5)
21:32:18  <rowbit>SubStack, pkrumins: Developers waiting in the queue for ie9 (Queue length: 3 on 3 servers. Total servers: 5)
21:33:21  * timoxleyquit (Quit: Computer has gone to sleep.)
21:39:30  * stlsaintquit (Quit: leaving)
21:43:10  <rowbit>/!\ ATTENTION: (default-local) [email protected] successfully signed up for developer browserling plan ($20). Cash money! /!\
21:43:10  <rowbit>/!\ ATTENTION: (default-local) paid account successfully upgraded /!\
21:47:18  <rowbit>SubStack, pkrumins: Developers waiting in the queue for ie8 (Queue length: 2 on 2 servers. Total servers: 3)
21:51:33  * dominictarrquit (Quit: Leaving)
21:53:47  * dominictarrjoined
21:58:51  <rowbit>Hourly usage stats: []
22:06:18  <rowbit>SubStack, pkrumins: These encoders are STILL down: 173.203.67.76(free3)
22:16:14  * mikealquit (Quit: Leaving.)
22:19:54  * mikealjoined
22:26:46  <SubStack>dominictarr: oh neat config thing, you had a similar idea as me for loading config files from parent dirs and folding the results together with a preference for the most local config file
22:26:56  <SubStack>mine is at http://github.com/substack/node-confuse
22:27:31  <isaacs>dominictarr, SubStack: are you actually using that find() deal for config files anywhere?
22:29:02  <SubStack>isaacs: I wrote a specialized lib for that https://github.com/substack/node-parents
22:29:13  <SubStack>windows makes it actually quite tricky
22:34:12  <dominictarr>isaacs, not any more.
22:35:39  <dominictarr>now i just follow the unix standard of like ~/.thing /etc/thing and so on.
22:37:18  <isaacs>dominictarr: k
22:37:24  <isaacs>so, really, just needs to be a list of files
22:37:30  <isaacs>dominictarr: are you attached to json?
22:37:55  <isaacs>dominictarr: ini can support most things json can, and is a bit more humane to write with human parts
22:40:13  <dominictarr>the advantage is json is very familiar. i'd have to read something to do ini
22:40:45  <isaacs>dominictarr: nah, you'd get it right away. key = value
22:40:47  <isaacs>it's so easy
22:40:52  <dominictarr>although... you probably get less syntax errors, I'm guessing?
22:41:10  <dominictarr>is the whitespace significant?
22:41:25  <dominictarr>would key=value work?
22:43:24  <isaacs>dominictarr: yeah
22:43:25  <dominictarr>I mean, you should be able to detect what it is with a regexp
22:43:32  <isaacs>key=val is fine
22:43:46  <isaacs>dominictarr: it's like ~/.npmrc
22:43:48  <isaacs>that format
22:44:49  <dominictarr>\/\s*{\s*"/ -> json
22:44:53  <dominictarr> /\s*{\s*"/ -> json
22:47:48  <dominictarr>else ini ?
22:48:27  <dominictarr>have an injectable option which is the parse function.
22:48:39  <dominictarr>then anyone can use whatever they like.
22:53:37  <isaacs>dominictarr: try { data = JSON.parse(data); /*json*/ } catch (_) { data = ini.parse(data) }
22:53:46  <isaacs>dominictarr: then you have to use either json or ini
22:54:08  <isaacs> because that's waht config files are actually written in
22:54:25  <isaacs>and if you have something else, fetch it yourself, parse it yourself, and give the thing the data object, rather than the string or filename
22:54:45  <isaacs>making it pluggable just invites xml and yaml config files
22:54:46  <dominictarr>I like yaml... well, I like the idea of yaml.
22:54:56  <isaacs>dude, yaml is fucking insane.
22:55:05  <isaacs>yamlish that tap uses is kind of ok
22:55:28  <isaacs>but a full yaml implementation includes data types that have no correlary in javascript
22:55:36  <dominictarr>hey, but like what if i NEED circular references in my config?
22:55:45  <isaacs>dominictarr: then you are a bad person and deserve to suffer
22:56:29  <dominictarr>there was a time but I have learnt to be humbler since then.
22:56:48  <isaacs>but yeah, if not a try{json}catch{ini} approach, then the alternative is to make it pluggable in some fashion
22:57:07  <dominictarr>try/catch is fine.
22:57:16  <isaacs>ini is nice because it supports objects, but only one level of objects.
22:57:56  <isaacs>oh, i take that back
22:57:59  <isaacs>it does support that
22:58:03  <isaacs>> ini.encode({foo:{bar:{baz:123}}})
22:58:04  <isaacs>'[foo.bar]\nbaz = 123\n'
22:58:20  <isaacs>> ini.decode(ini.encode({foo:{bar:{baz:123}}}))
22:58:20  <isaacs>{ foo: { bar: { baz: '123' } } }
22:58:48  <dominictarr>yeah, also you could extend it slightly, key=[section.name] and then can have cyclic references, yay!
22:58:51  <rowbit>Hourly usage stats: []
22:59:16  <isaacs>sure, i mean, inasmuch as you could extend json the same way
22:59:21  <isaacs>then that's really just extending objects
22:59:30  <isaacs>(kinda what jsonlink does)
22:59:51  <isaacs>{foo:{bar:{baz:'@../boo'},boo:{this:'thing'
22:59:53  * xaqquit (Remote host closed the connection)
22:59:56  <isaacs>or something like that
23:00:04  <isaacs>magic strings
23:00:20  * xaqjoined
23:00:44  <dominictarr>on one needs cyclic configuration files, unless perhaps it's a java dependency injection framework.
23:10:52  <dominictarr>or as jesusabdullah would put it, a rube goldberg server
23:21:33  <jesusabdullah>You really want a rube goldberg cluster
23:21:47  * xaqquit (Ping timeout: 260 seconds)
23:22:39  <jesusabdullah>like, you run a cli command that pushes code to github which triggers a post commit hook to another server which then tweets about it which makes a bot repeat said tweet, sending an irc message to all your friends!
23:22:45  <dools>hey i've got a mate who just landed in San Fran - hacker + hustler. he's looking for intros to interesting people if anyone knows anyone interesting they'd be willing to do an intro for coffee + chat
23:23:12  <jesusabdullah>uhhh
23:23:17  <jesusabdullah>look up "hackers and founders"
23:23:48  <jesusabdullah>and programming meetups and hack nights
23:23:58  <jesusabdullah>best way to meet people other than a direct intro
23:25:34  <dools>nice one thanks
23:26:18  <rowbit>SubStack, pkrumins: Encoders down: 173.203.68.112(dev3)
23:40:05  * mikealquit (Quit: Leaving.)
23:46:34  * wiwilliaquit (Ping timeout: 264 seconds)
23:48:14  * wiwilliajoined
23:58:51  <rowbit>Hourly usage stats: []