00:08:09  <isaacs>substack: hey. you don't happen to have a module handy to find the longest overlap between two strings do you?
00:08:24  <substack>negatory
00:08:28  <isaacs>k.
00:08:35  <isaacs>actually, i think i don't need that anyway. nbm.
00:09:10  <maxogden>if substack didnt write it yet it means its not a valid problem
00:09:50  <substack>actually I have messed with that problem
00:09:55  <substack>string matching algorithms are super boring
00:10:02  <substack>knuth pratt something
00:10:22  <pkrumins>knuth is boring
00:11:20  <substack>unsure about a longest match algorithm though
00:11:28  <substack>string intersection
00:11:55  <isaacs> for (var i = 0, al = a.length, bl = b.length; i < al && i < bl && a[i] === b[i]; i++);
00:12:01  <isaacs>turns out i know that it starts at 0
00:12:04  <isaacs>so it's pretty easy
00:12:24  <isaacs>substack: i know you've said that 10 lines is enough for a module... but is one?
00:12:48  <isaacs>if you aren't sure where the start is, then it's much more complicated.
00:13:02  <maxogden>enter http://epeli.github.com/underscore.string/
00:13:04  * maxogdenjust sayin
00:13:20  <isaacs>maxogden: well, it's not a string here
00:13:32  <isaacs>and also, fuck underscore. srsly.
00:13:44  <Raynos>substack: what do you use to minify js? as a CLI
00:13:45  <isaacs>may as well use jquery or `npm install hoarders`
00:13:48  <Raynos>uglify ?
00:13:59  <substack>isaacs: 10 is a bit much
00:14:02  <substack>ideally 4
00:14:14  <substack>1 is even better
00:14:16  <maxogden>isaacs: underscore, jquery and hoarders have basically nothing in common
00:14:48  <substack>Raynos: yes
00:14:56  <Raynos>`echo "module.exports = 'substack'" > index.js && npm publish substack`
00:15:06  <substack>underscore is just a subset of hoarders
00:15:21  <Raynos>man
00:15:48  <Raynos>I got to add a stackoverflow answer "just use `require("hoaders").xtend(global, require("hoaders"))`"
00:15:48  <maxogden>can someone tell me why underscore is a detriment again?
00:16:03  <Raynos>maxogden: the same reason jQuery is a detriment
00:16:17  <maxogden>it introduces horrible abstractions?
00:16:24  <Raynos>its bloatware
00:16:29  <maxogden>what does that even mean
00:16:32  <substack>it's just a bucket of stuff
00:16:34  <Raynos>it means its bloated
00:16:37  <substack>it's not bad as such
00:16:40  <maxogden>that isnt a reason
00:16:42  <Raynos>it has too much shit in it
00:16:45  <substack>but it's encroaching on npm's job
00:16:46  <Raynos>the same reason I dislike async
00:16:52  <Raynos>async has too much shit in it
00:17:04  <maxogden>none of these answer my question they are just opinions
00:17:24  <Raynos>for any solution underscore provides there is a better smaller alternative
00:17:30  <substack>underscore is a collection of discrete components
00:17:35  <Raynos>the main problem with underscore is that it gets all over your code base
00:17:45  <Raynos>you start using it in places where you don't need it
00:17:51  <Raynos>and its a pain in the ass to remove from your codebase
00:17:58  <Raynos>small singular modules are easy to swap out
00:17:59  <substack>it's much nicer for discrete components to have their own entries in npm
00:18:03  <substack>so that it's easier to find them
00:18:08  <substack>and it's easier to contribute to them
00:18:19  <Raynos>like for example when mikeal/watch or balupton/watchr is broken, I can easily swap it out for hound
00:18:26  <substack>and it's not obvious what belongs in a grab-bag module and what doesn't belong
00:18:36  <substack>so like underscore has no concat-map
00:18:46  <substack>even though there have been pull requests for it
00:18:48  <Raynos>the only thing you can swap underscore out for is lodash
00:18:50  <substack>it's harder to draw the line
00:19:10  <substack>but with npm it's easier because you can draw the line at discrete components each having their own package
00:19:33  <substack>yes and discrete components are much easier to swap
00:20:06  <maxogden>so its a detriment because the switching cost is high
00:20:34  <maxogden>but it is popular because it simplifies enumerability
00:20:57  <maxogden>nobody is going to search npm for half an hour to find 5 modules that might each have their own api jsut so they can avoid switching costs during a refactor in 4 months
00:21:03  <substack>I don't see how it simplifies enumerability
00:21:16  <maxogden>write a loop that emits the numbers 0 through 9
00:21:32  <substack>like range?
00:21:34  <substack>npm search range
00:21:41  * wiwilliaquit (Ping timeout: 244 seconds)
00:21:43  <Raynos>substack: If you have a recommendation on how to modularize this guy ( https://github.com/Raynos/discovery-network ) ?
00:21:48  <substack>I think you're thinking about underscore from the perspective of knowing the api really well
00:22:02  <substack>consider the case of people who don't know what underscore has
00:22:05  <Raynos>maxogden: underscore solves the same problem npm solves
00:22:11  <substack>^^^^^^
00:22:13  <Raynos>npm is just clearly better
00:22:15  <substack>(poorly)
00:22:19  <maxogden>i totally disagree
00:22:29  <maxogden>underscore is ruby's enumberable class in JS
00:22:29  <substack>also you get separable versioning for the components
00:22:37  <substack>so you can piece-wise upgrade components
00:22:44  <Raynos>underscore, grab-bags & frameworks solve the "I dont want to search or discover modules, give me a bunch of useful things in one container"
00:22:56  <Raynos>maxogden: Array.prototype is ruby's enumerable
00:23:10  <maxogden>no its not
00:23:14  <substack>all you need is map filter and reduce most of the time
00:23:23  <substack>and now and then a few other things
00:23:32  <substack>but you can pull the other stuff from npm
00:23:57  <substack>npm is my core library!
00:24:14  <maxogden>thats nice but you have the most biased opinion of anyone in the world on that subject
00:24:41  <substack>that objection doesn't seem substantive
00:24:44  <Raynos>...
00:24:55  <substack>not even sure how to respond to that
00:24:59  <maxogden>im trying to point out that underscore is 'a bunch of useful things in one container'
00:25:05  <maxogden>and that is a good thing
00:25:20  <substack>npm is also a bunch of useful things in one container
00:25:29  <Raynos>maxogden: http://stackoverflow.com/questions/7989116/javascript-library-for-sequence-programming/7989140#7989140
00:25:36  <Raynos>you don't need underscore, map / filter / reduce are enough
00:25:37  <substack>it's less useful to have collections of useful things inside of collections of useful things
00:25:43  <maxogden>yes the difference is underscore tries to make enumerable programming and looping easy whereas npm is any program ever
00:25:55  <substack>much nicer from a discoverability and contribution standpoint to flatten out the functionality
00:26:07  <maxogden>how is it easy to find thigns on npm right now?
00:26:11  <maxogden>that is the biggest complaint i hear
00:26:13  <substack>npm search
00:26:26  <Raynos>npm defiantly has a serach problem
00:26:32  <substack>whatevs, npm search is great
00:26:59  <Raynos>substack: `npm search watch` try to find a good file watching library from those 30
00:27:14  <maxogden>file watching libraries are more complex than any single function in underscore
00:27:19  <substack>Raynos: works really well for more targetted queries
00:27:22  <maxogden>so i dont think those are fair comparison (referring to eaarlier when you brought it up)
00:27:34  <substack>if there are too many entries, add more search terms
00:27:53  <maxogden>to me underscore is just a bunch of stupid simple looping algorithms that i dont want to write or look up on npm every time i want to use them
00:27:58  <maxogden>its a finite set of problems
00:28:04  <maxogden>therefore it cant be the kitchen sink
00:28:43  <maxogden>if you disaggregate too much you piss people off because you increase the amount of otential for shitty package maintainers
00:28:48  <maxogden>potential*
00:28:52  <substack>so the problem here
00:29:06  <substack>is that you'll hit the limits of underscore at some point
00:29:12  <maxogden>what? when?
00:29:13  <mikeal>underscore is the only valid "grab bag" library I've seen
00:29:18  <substack>and need to use separate modules
00:29:30  <substack>and then you need to remember if something is in underscore or a separate module
00:29:37  <substack>or a completely different grab bag
00:29:41  <maxogden>i think you all are arguining against 'huge modules' but i am arguing about underscore
00:29:49  <mikeal>there isn't another functional toolkit grab bag :)
00:29:56  <substack>perl has this problem with List::Util vs List::MoreUtils vs List::AllUtils
00:30:05  <mikeal>maxogden is right
00:30:14  <substack>which grab bag is the correct grab bag?
00:30:27  <maxogden>i dont know what those modules are
00:30:28  <mikeal>i agree with your principals and asthetics about modules, but underscore is a rather useful library
00:30:35  <substack>if we promote grab bags then people will write grab bags and those get really unworkable
00:30:44  <mikeal>substack: if another doesn't exist, why does this argument exist
00:30:59  <substack>mikeal: I'll write one then
00:31:01  <maxogden>what defines a 'grab bag'
00:31:04  <Raynos>What's the windows equivelant of `#!/usr/bin/env node` ?
00:31:05  <mikeal>no you won't
00:31:08  <mikeal>cause then you'll hate yourself
00:31:10  <mikeal>:)
00:31:12  <substack>pfft
00:31:18  <substack>I write plenty of modules I don't believe in
00:31:22  <mikeal>hahahah
00:31:37  <Raynos>underscore is still useless :?
00:31:47  <Raynos>Why would you use it when you can have Array.prototype
00:31:50  <mikeal>it's very useful, i use it often
00:32:02  <Raynos>:(
00:32:03  <mikeal>i use it as a tool over objects as well as arrays
00:32:10  <Raynos>I use iterators for that
00:32:13  <Raynos>>_>
00:32:17  <substack>mikeal: case in point, hashish
00:32:22  <Raynos>at least iterators only does iterating
00:32:24  <substack>I wrote that but I don't believe in that approach anymore
00:32:38  <Raynos>substack: do you do the Object.keys(...).forEach dance ?
00:32:47  <substack>Raynos: yep
00:32:54  <substack>I don't see a problem with it
00:33:01  <Raynos>substack: the problem with that is you need to get the object as an upvalue
00:33:06  <Raynos>which forces you to have a closure
00:33:06  <substack>I probably write as many reduces as I write forEaches
00:33:22  <mikeal>i use object.keys and foreach were applicable
00:33:28  <mikeal>it's always faster to use builtins
00:33:40  <mikeal>i use underscore for stuff like _.uniq
00:33:48  <substack>mikeal: npm install nub
00:33:53  <mikeal>no
00:33:57  <mikeal>it's not installing
00:34:01  <mikeal>it's finding all that shit
00:34:08  <mikeal>if i need an iteration tool, it's in underscore
00:34:08  <maxogden>finding + reading the api
00:34:09  <Raynos>substack: https://gist.github.com/b4a9721dcfae31b515f3
00:34:18  <substack>"iteration tool"
00:34:19  <mikeal>yeah, having the chaining is useful as well
00:34:21  <substack>why is that a thing
00:34:36  <Raynos>mikeal: your better of investing the time to search for them in the long run rather then using underscore
00:34:37  <mikeal>lets talk about this instead http://www.theonion.com/articles/republicans-condemn-akins-comments-as-blemish-on-p,29259/
00:34:43  <maxogden>substack: you have many things and you want to run a function on them in useful ways
00:34:48  <maxogden>substack: that is the problem space
00:35:01  <mikeal>i'm better invested in writing code for my app than finding a function
00:35:22  <substack>I would rather invest my mental map in npm than a particular library's curated collection of routines
00:35:33  <mikeal>and the truth is, most of the time you wont
00:35:40  <mikeal>you'll write a new function inline
00:35:46  <mikeal>and not in a module, that does this one thing
00:35:51  <mikeal>and that's even worse
00:36:03  <substack>I don't really do that
00:36:18  <mikeal>i'm sure i can find somewhere that you've done that
00:36:55  <substack>probably
00:36:58  <maxogden>https://github.com/substack/ever/blob/master/index.js#L32-37
00:37:09  <maxogden>could be 1 line with underscore :)
00:37:12  <maxogden>or maybe 2
00:37:34  <substack>that is for browsers
00:37:40  <substack>no way in fuck do I want underscore as a dep there
00:37:54  <substack>maxogden: it would be a 1-liner with es5 too
00:38:02  <substack>but that's not es5 code
00:38:43  <substack>pulling in all of underscore for a tiny reusable library is such a bad idea
00:38:47  <maxogden>so its a leaky abstraction to use a dependency that handles cross browser enumerability?
00:38:54  <substack>yes
00:39:19  <substack>if it inflates the file size by a lot for a very marginal benefit
00:39:28  <maxogden>that assumes every programmer cares more about squeezing bytes out of code than they do wasting time learning cross browser apis
00:39:43  <substack>well the thing about that
00:39:53  <substack>is I could use a cross-browser lib for just the part that I need
00:39:56  <substack>underscore has everything
00:40:13  <substack>I could just take underscore and cleave off the part that I need and put it on npm
00:40:33  <maxogden>at what point does it start mattering? 1KB? 2KB? underscore is 4kbn
00:40:36  <maxogden>kb*
00:41:31  <maxogden>there is a project called "jquery in pieces" which broke jquery up into modules
00:41:38  <maxogden>and that makes sense because jquery is monolithic
00:41:44  <maxogden>but underscore is a completely different type of library
00:41:53  <substack>actually that makes less sense than breaking up underscore
00:41:57  <mikeal>i just use jquery
00:42:01  <mikeal>fuck all that work
00:42:18  <maxogden>you dont write our mobile code
00:42:20  <maxogden>:)
00:42:41  <substack>underscore is not monolithic so it can be trivially broken into separate pieces
00:42:41  <maxogden>substack: how would you break up underscore? each function gets a module?
00:42:46  <mikeal>what changed today?
00:42:46  <substack>maxogden: yep
00:42:54  <substack>but actually most of the functions are already on npm
00:43:02  <substack>the functions that browsers don't already have at least
00:43:04  <mikeal>i mean, underscore has always been aesthetically displeasing to you, what happened today?
00:43:20  <substack>I didn't bring up the issue
00:43:21  <maxogden>substack: cool so now i get to learn 50 different apis and find 50 different modules on npm search
00:43:46  <mikeal>most of the time, i don't know what i'm looking for either
00:43:49  <substack>maxogden: it's unlikely that you would need 50 modules in a single project
00:44:04  <mikeal>like, i need to do some thing, and i'm pretty sure underscore can help, so i look through the docs and see something that makes my life easier
00:44:32  <maxogden>substack: i didnt say in a single project
00:44:42  <substack>mikeal: I can s/underscore/npm/ and make the same case
00:45:14  <maxogden>there are 12000 things on npm across the entire range of computing
00:45:14  <substack>maxogden: well you had to learn those 50 function signatures in the first place, I don't see how it's any different
00:45:27  <substack>you are approaching underscore with the mindset that you already know its api very well
00:45:32  <maxogden>no i dont
00:45:37  <maxogden>i know its _.something
00:45:48  <substack>npm search something
00:45:50  <maxogden>so i have to put 1 thing in my package.json, add 1 require line, then look at the docs
00:46:05  <maxogden>cool lets write a thing that writes out 0 through 9
00:46:10  <mikeal>you're saying you don't know the question until you're asking it
00:46:16  <maxogden>i would try npm search interator
00:46:20  <mikeal>you go on underscore to find out what the question even is
00:46:20  <maxogden>or npm search increment
00:46:34  <mikeal>not everyone has a math degree and wrote haskell :)
00:46:42  <substack>maxogden: you could just use hoarders
00:46:45  <maxogden>"Background.js provides a background job queue and list with array iterators"
00:46:56  <maxogden>"shiterator Collect application errors and post to your favorite tracker"
00:47:02  <substack>I don't really see how underscore is fundamentally different than hoarders except that it has fewer entries and they are of higher quality
00:47:15  <maxogden>"http-agent A simple agent for performing a sequence of http requests in node.js"
00:47:41  <substack>also consider this:
00:47:51  <substack>if I `npm search range` underscore doesn't how up even though it has a range function
00:47:54  * devaholicjoined
00:48:00  <substack>all grab bags fundamentally have this problem
00:48:11  <substack>any curated system
00:48:27  <substack>might as well have an `underscore search` command
00:48:40  <substack>because underscore is basically a curated npm
00:48:44  <maxogden>no its not
00:48:50  <substack>for a very narrow problem domain
00:49:08  * maksimlinjoined
00:49:12  <maxogden>its a bunch of javascript functions that all solve the same type of problem
00:49:47  <maxogden>'huh, i need to write some stupid enumeration bullshit and i dont know the academic term for what i need'
00:50:23  <maxogden>'i bet that library that has all the enumeration functions in it has a thing i can use'
00:51:24  <maxogden>npm is not a very effective discovery mechanism. social networks are good at that.
00:51:27  <maxogden>same thing with the app store
00:52:11  <substack>I despise curation.
00:52:20  <substack>and walled gardens
00:52:31  <substack>which is exactly what the app store and underscore are
00:53:28  <maxogden>if your goal is to make a pure ecosystem then have fun, mine is to make it easy for people to write fun javascript programs
00:54:03  <Raynos>maxogden: Is async a bunch of javascript functions that all solve the same type of problem?
00:54:09  * mikealquit (Quit: Leaving.)
00:54:36  <substack>maxogden: it's not about purity, it's about sufficiently covering the solution space
00:54:37  <Raynos>or async a grab bag
00:54:39  <maxogden>i think async is one step broader than underscore
00:54:55  <substack>my approach is better for exploratory programming to get a feel for problem domains
00:54:57  <Raynos>maxogden: does that mean you don't use async because it's too bloated?
00:55:11  <maxogden>cause people argue way more about flow control than they do how to write looping code
00:55:20  * mikealjoined
00:55:37  <maxogden>the only things ive used in async are queue and parallel and there are like 30 modules that do the same exact thing with slightly different apis
00:55:41  <devaholic>there is no need for async
00:55:41  <substack>oh yeah and underscore has a template engine built in
00:55:43  <substack>so there's that
00:56:09  <substack>"sprawling" would be a good descriptor
00:56:13  <devaholic>the template engine in underscore is unexpected
00:56:16  <maxogden>i agree the ~10 line templating function shouldnt be in there
00:56:57  <maxogden>but that doesnt invalidate at all the rest of the utility value
00:57:20  <maxogden>devaholic: why would a library be wildly successful if there isnt a need for it? are you saying you personally dont need it?
00:57:20  <substack>it has utility
00:57:40  * mikealquit (Client Quit)
00:57:43  <substack>underscore was written before package managers were a viable option
00:57:54  <devaholic>maxogden: dunno, pretty much everything in async can be done with almost the same lines of code without async
00:58:41  <maxogden>devaholic: weird i wonder why async exists then
00:58:49  <devaholic>underscore seems like it should just be iterator and type checking stuff
00:59:31  <devaholic>maxogden: its not weird, just look at the node google group and you can see hundreds of people that dont know how to write async javascript
01:00:29  <maxogden>its not fun to write your own counter increment multiple callback crap all the time
01:00:50  <Raynos>maxogden: by that logic jquery is useful
01:01:04  <maxogden>deferreds? those introduce their own set of problems
01:01:20  <maxogden>the majority of underscore is iterator and type checking logic
01:01:42  <maxogden>then there are like 10 function helpers (For functions like debounce and memoize)
01:02:07  <maxogden>then theres the utility section which is random and has a couple functions that dont belong
01:03:37  <Raynos>meh
01:03:48  <Raynos>I wouldn't use underscore purely for the stupid library name
01:03:55  <Raynos>who uses `_` or `$` as their module token
01:03:57  <maxogden>thats a great reason
01:04:35  <Raynos>maxogden: we are allowed to dislike modules purely on purist grounds that it disaligns with our module development philosophy
01:04:51  <substack>maybe a tool where people could vote on npm search results
01:05:13  <Raynos>like star?
01:05:23  <substack>ranking by star would be handy too
01:05:45  <substack>but I'm thinking of results for a particular query
01:05:51  <devaholic>i made this
01:06:00  <substack>since highly starred modules might not be relevant for particular queries
01:06:07  <Raynos>Oh
01:06:17  <Raynos>I like the ideas of ranking the search results for `npm search watch`
01:06:24  <Raynos>I would use this
01:06:33  <substack>also it should work on the command line
01:07:49  <Raynos>what we need is different views on search
01:09:18  <maxogden>there is a very small number of problem sets that "grab bags" are a solution to so i dont know if fixing npm search to favor the long tail is a good investment of time
01:10:01  <substack>making npm search better is a great investment
01:10:13  <substack>this isn't about underscore
01:10:26  <substack>this is about search results being noisy
01:11:25  <substack>just ranking by stars would go a long ways
01:12:54  <Raynos>npm search is noisy and hard to use
01:13:06  <Raynos>npm is great for storing modules, it still sucks for discovering them
01:13:31  <Raynos>`npm solve x.js` should output a list of libraries that would increase my codebux on x.js
01:13:37  <substack>but it's still better for discovery than grab bags
01:13:44  <Raynos>`codebux solve x.js` should do that
01:13:45  <substack>because at least the functionality will show up at all
01:13:52  <substack>haha yes codebux rank
01:14:18  <substack>and +1 for having tests
01:14:27  <substack>and +10 for having passing tests on travis
01:15:23  <substack>and +(1 - Object.keys(require('module')).length)
01:16:23  <substack>the scoring engine could even be programmable to suit individual tastes
01:35:06  <isaacs>substack: so, i can do dependency flattening, but it's really safe (or even strictly possible) to do so in a general way without hitting the registry
01:35:39  <isaacs>mikeal: i would tell you this as well if you were here...
01:36:33  <substack>isaacs: couldn't you bundle the module dirs and compare hashes?
01:36:42  <substack>or is there dynamic metadata all up in there
01:37:32  <substack>I don't see any time-variant entries in the generated package.json data
01:38:10  <substack>or a module called dirhash that hashes all the file contents in a directory hierarchy
01:38:54  <substack>and only move directories around that are strictly equal to other directory dependencies
01:39:33  <isaacs>substack: well, i have my ghetto-fabulous version of that, which is "if the version and name match, it's the same thing"
01:40:01  <isaacs>substack: but, you frequently have cases where you have different versions of a thing in multiple places, but wnat to compress, and this means using some other version instead.
01:40:26  <chapel>isaacs: are you using elasticsearch for npm?
01:40:29  <substack>if you have different versions just leave them alone
01:40:37  <isaacs>substack: that's not satisfactory.
01:40:50  <isaacs>substack: the whole *point* is taht you have a bunch of different versions unneessarily
01:41:14  <isaacs>but, yes, if there is no suitable match, then it skips it
01:41:23  <isaacs>ie, no one version that satisfies all the deps for that thing
01:41:30  <substack>bundler does that and it's super silly and wrong
01:41:37  <isaacs>does what?
01:41:50  <substack>tries to satisfy dependencies by looking for version intersections
01:41:57  <substack>because that is all it can do
01:42:05  <substack>I would rather just merge exact matches
01:42:23  <isaacs>yeah, but just moving dirs around is actually kind of wrong a lot of the time
01:42:49  <substack>the use case I have in mind mostly involves browserify
01:43:03  <substack>it would work for that use case
01:43:06  <isaacs>right, but i mean, even if i move it from one place to another, i have to re-run all the same install logic.
01:43:18  <substack>not really?
01:43:23  <isaacs>yes really
01:43:24  <substack>if the directories are exact matches
01:43:26  <isaacs>otherwise bins are in the wrong places.
01:43:41  <isaacs>node_modules/.bin/coffee needs to move along with node_modules/coffee_script
01:44:02  <substack>could just check scripts for matching entries in .bin
01:44:20  <substack>without reinstalling
01:44:48  <isaacs>i COULD check to see if any of the existing versions are a match for all of them
01:45:16  <isaacs>but wht happens quite often is that you have 1.0.9 in one place, where it depends on 1.0.x and 1.0.10 in another place, where it depends on ~1.0.10
01:45:31  <isaacs>i'd like to just have 1.0.10 for both, in one place, in that situation
01:46:51  <isaacs>i guess, in this current implementation i've got, you migth end up with 1.0.11 for both
01:48:06  <isaacs>substack: what's your use case for browserify, exactly?
01:49:15  <substack>https://github.com/substack/node-browserify/issues/186
01:54:44  <isaacs>ok, so, this would work fine in that case, then
01:54:51  <isaacs>you'd just run `npm dedupe` before running `browserify`
01:55:11  * isaacsinvestigating moving folders now..
01:55:26  <isaacs>i think i might have a workaround for the "moving folders breaks shit" problem
01:55:42  <isaacs>the solution is to not deal with any dupes whose parents are also dupes, and instead just rescan until you get a clean bill of health.
01:56:51  * devaholicquit (Ping timeout: 252 seconds)
01:57:06  <isaacs>substack: the tricky thing is that you and mikeal want opposite behaviors here :)
01:57:23  <isaacs>substack: mikeal wants every dep installed at the top level, no matter what, and if you can't do that safely, then abort.
01:57:35  <isaacs>substack: you want teh minimal possible moving of things, and only if it's known safe.
01:58:22  <isaacs>i'm fine with installing stuff, because i always want the latest anyway, because i preer debugging in production with live users, and consider anything else just fake living.
01:58:45  <isaacs>piscisaureus was the other one asking about this, i should see what he likes...
02:00:17  <substack>so many cooks in the kitchen
02:01:52  <substack>all pulling isaacs every which way!
02:07:27  <isaacs>hahah
02:07:43  <isaacs>such is the life of the lowly platform developer!
02:07:50  <isaacs>i think i'm gonna probably do it my way.
02:07:59  <isaacs>i like the optimization of not fetching unnecessarily.
02:08:17  <isaacs>so if the version matches one of the existing versions, or if the fetch fails, it'll just move an existing one in.
02:08:43  * tblobaum_joined
02:23:11  * mikealjoined
02:24:31  * joshwnj`joined
02:25:33  * joshwnjquit (Ping timeout: 245 seconds)
02:26:17  * joshwnj`changed nick to joshwnj
02:28:08  * timoxleyquit (Quit: Computer has gone to sleep.)
02:37:49  <isaacs>ohhh.... right, another reason why we can't just move the folders...
02:37:55  <isaacs>the symlinks are not relative.
02:37:59  <isaacs>!#@$!@$ windows.
02:38:20  <maxogden>srsly
02:38:41  * mikealquit (Quit: Leaving.)
02:39:33  <isaacs>in fact, the only way to do this cleanly and portably, as strange as it sounds is to `npm install` one folder into the other location.
02:39:46  <isaacs>except... no, nvm, that won't work
02:40:25  <isaacs>fuckit. npm dedupe updates.
02:40:32  <isaacs>in fact, it's like a much cleaner and nicer version of update.
02:40:32  * ryan_stevensquit (Quit: Leaving.)
02:40:34  <isaacs>ITS A FEATURE!
02:40:35  <LOUDBOT>RUNNING CHEF IN VIM: TOTAL WIN
02:40:41  <substack>if (/^win/.test(process.platform)) console.error('fuck this')
02:40:45  <isaacs>LOUDBOT: you have disappointed me for the last time.
02:40:46  <LOUDBOT>isaacs: ACHIEVEMENT UNLOCKED: HTTP://PQR.IN/ACHIEVEMENT_UNLOCKED
02:42:09  <isaacs>actually, another option is to mv the folder, npm.build() in it, and say "who cares" about any .bin files left behind.
02:42:14  <isaacs>because honestly, who does care?
02:44:49  <maxogden>substack: so doing that would add a +1 to the tag 'enumerable' on underscores package page
02:45:50  <substack>yes that would rock
02:46:12  <maxogden>uhoh people in alameda are talking about dojo
02:47:21  <substack>the dream of the 90s
02:47:38  <substack>or early to mid 2000s at least
02:48:03  <dools>wow, dojo
02:50:10  <joshwnj>lol - i got a shock the other day when I opened up some client's files to see why it was taking so much disk space
02:50:22  <joshwnj>dojo: 193 MB
02:50:42  <maxogden>wow
02:50:54  <substack>!!!
02:50:57  <joshwnj>call me old fashioned.. but get off my lawn!
02:52:45  <joshwnj>and what's most disturbing is, this is not an old legacy project - it's only a couple of months old and somebody decided they wanted to include 200M of dojo in there
02:54:13  * tblobaum_part ("Leaving")
02:54:19  * tblobaum_joined
03:00:03  <Raynos>substack: What are the alternatives to yarnify
03:00:14  <Raynos>I can't get around how the css prefixing is a leaky abstraction :(
03:00:30  <substack>Raynos: DIY
03:00:46  <Raynos>substack: That's what I was thinking, but there might be other modules
03:04:20  * mikealjoined
03:07:45  * tblobaum_quit (Ping timeout: 245 seconds)
03:10:55  <joshwnj>Raynos: what's the problem you're trying to solve?
03:21:29  * devaholicjoined
03:25:29  <devaholic>Raynos: ping
03:27:23  <Raynos>joshwnj: creating dom elements is verbose
03:27:26  <Raynos>also style scoped
03:27:37  <joshwnj>right
03:28:10  <joshwnj>do you have an ideal syntax in mind? or you're just looking to see what's out there?
03:29:31  <Raynos>joshwnj: `var create = require("./x.html"), elem = create()`
03:30:45  <joshwnj>where `x.html` is a template?
03:31:05  <joshwnj>like would you possibly do `elem = create({ foo: "bar })` ?
03:32:19  <joshwnj>(oops syntax error lol) :)
03:37:41  <Raynos>joshwnj: x.html is a html file
03:38:05  <Raynos>I would do `var Fragment = require("./x.html"), frag = Fragment()`
03:38:22  <Raynos>Fragment is a function which returns the html file as a document fragment
03:39:47  <joshwnj>ok nice - that was my next question :)
03:40:58  <Raynos>I think this is waht I want
03:41:00  <substack>there's a module that does that on npm already
03:41:01  <joshwnj>and so with css selectors, you're trying to find a way to have clean scope?
03:41:08  <Raynos>substack: name?
03:41:12  <substack>just the fragment part
03:41:20  <Raynos>substack: I know, I wrote that
03:41:24  <substack>oh right
03:41:31  <Raynos>I need a module that does the require("x.html") part
03:41:40  <Raynos>either as a browserify hook-in
03:41:41  <substack>you could use .register()
03:41:44  <Raynos>or as a build step
03:41:48  <substack>or exportify
03:46:07  * mikealquit (Quit: Leaving.)
03:52:43  * devaholicquit (Ping timeout: 252 seconds)
03:55:08  * ryan_stevensjoined
04:06:56  <Raynos>ugh
04:07:04  <Raynos>I need to punch browserify-server
04:29:41  * timoxleyjoined
04:33:53  * mikealjoined
04:47:45  * thatguydanjoined
04:58:26  <isaacs>ircretary: tell mikeal npm 1.1.53 has a "dedupe" command you might like.
04:58:27  <ircretary>isaacs: I'll be sure to tell mikeal
05:00:38  * timoxleyquit (Quit: Computer has gone to sleep.)
05:00:43  <mikeal>sweet
05:05:13  * thatguydanquit (Quit: thatguydan)
05:12:54  * thatguydanjoined
05:16:18  * ryan_stevensquit (Quit: Leaving.)
05:24:21  * thatguydanquit (Quit: thatguydan)
05:46:34  * timoxleyjoined
05:51:24  * timoxleyquit (Client Quit)
05:54:35  * mikealquit (Quit: Leaving.)
06:00:37  * mikealjoined
06:07:14  * maksimlinquit (Quit: Page closed)
06:07:42  * thatguydanjoined
06:12:17  * joshwnj`joined
06:14:16  * joshwnjquit (Ping timeout: 265 seconds)
06:14:19  * joshwnj`changed nick to joshwnj
06:15:14  * mikealquit (Quit: Leaving.)
06:49:14  <Raynos>isaacs: Where is your gossip thing
07:10:01  * timoxleyjoined
07:12:04  <Raynos>dominictarr: crdt needs better docs
07:12:14  <Raynos>for example, I dont know what that sync flag does
07:25:11  * AvianFluquit (Ping timeout: 246 seconds)
07:25:37  * AvianFlujoined
07:29:40  * thatguydanquit (Ping timeout: 252 seconds)
07:35:05  <substack>phase 1 browser badges complete
07:36:53  <substack>module coming soon
07:36:59  * devaholicjoined
07:41:08  * joshwnjquit (Quit: ERC Version 5.3 (IRC client for Emacs))
07:46:53  <substack>oh goodness this is going to rock so hardcore
08:04:56  <rowbit>/!\ ATTENTION: (default-local) paid account successfully upgraded /!\
08:04:56  <rowbit>/!\ ATTENTION: (default-local) cyril.rohr@... successfully signed up for developer browserling plan ($20). Cash money! /!\
08:07:17  <substack>yay
08:33:34  * timoxleyquit (Quit: Computer has gone to sleep.)
09:40:09  * mikealjoined
09:46:33  <substack>kerpow https://github.com/substack/browser-badge
10:07:06  * tilgoviquit (Ping timeout: 268 seconds)
10:30:10  * Samotjoined
10:30:18  <Samot>uptoke! Card.findAll({ limit: 1, order: 'updatedAt ASC' }).success(function(projects) { // projects will be an array of all Project instances res.send(projects[0]); });
10:30:20  <Samot>ops
10:30:32  <Samot>uptoke! http://news.ycombinator.com/item?id=4412044
10:30:34  <Samot>lol
10:38:08  * Samotquit (Quit: Page closed)
10:47:42  * AvianFluquit (Quit: AvianFlu)
11:34:52  * cablemortquit (Quit: Connection closed for inactivity)
12:25:18  * timoxleyjoined
13:18:04  * wiwilliajoined
13:24:27  * timoxleyquit (Quit: Computer has gone to sleep.)
13:28:00  * timoxleyjoined
13:33:32  * timoxleyquit (Quit: Computer has gone to sleep.)
13:43:46  * devaholicquit (Ping timeout: 265 seconds)
14:34:02  * timoxleyjoined
14:44:50  * timoxleyquit (Quit: Computer has gone to sleep.)
15:15:44  * AvianFlujoined
16:16:00  * wiwilliaquit (Ping timeout: 244 seconds)
16:18:11  * wiwilliajoined
16:20:28  * ryan_stevensjoined
17:13:46  * timoxleyjoined
17:25:01  * st_lukewants substack to design his next tattoo
17:27:40  <AvianFlu>JUST GET THE FUCKING ROCKET TURTLE AND GET IT OVER WITH
17:27:40  <LOUDBOT>IM SO EXCITIED I FURGOT GRAMEMR
17:36:10  * timoxleyquit (Quit: Computer has gone to sleep.)
17:45:00  * SubStacktopic: http://browserling.com | http://testling.com | We put a browser in your browser!
17:46:14  * tilgovijoined
17:49:40  * timoxleyjoined
17:50:04  * tilgovi_joined
17:50:33  * tilgoviquit (Ping timeout: 246 seconds)
18:00:14  * mikealquit (Quit: Leaving.)
18:00:34  * mikealjoined
18:01:25  * mikealquit (Client Quit)
18:03:13  * mikealjoined
18:04:23  * devaholicjoined
18:05:48  * mikealquit (Client Quit)
18:19:56  * devaholicquit (Ping timeout: 260 seconds)
18:21:38  * mikealjoined
18:33:06  * ryan_stevens1joined
18:34:22  * ryan_stevensquit (Ping timeout: 248 seconds)
18:35:08  * _sorensenjoined
18:41:47  * AvianFluquit (Quit: AvianFlu)
19:08:41  * mikealquit (Quit: Leaving.)
19:11:28  * tilgovi_changed nick to tilgovi
19:14:44  <timoxley>substack what are you using to automate server setup i.e. puppet/chef
19:15:10  <timoxley>I see I can use propagit to get code onto the machine
19:15:18  <substack>I haven't used those
19:15:50  <substack>anyways pkrumins does most of the server setup
19:15:54  <timoxley>ah
19:16:35  <timoxley>substack ty
19:18:15  <pkrumins>we'll move to fleet soon
19:18:31  <pkrumins>for now i just run the services in tmux
19:18:52  <timoxley>pkrumins as in you manually set up the machines?
19:19:11  <timoxley>e.g. installing git, node, etc
19:19:19  <timoxley>or do you just use machine images
19:19:27  <pkrumins>use images
19:20:06  <timoxley>pkrumins that may be less error prone actually
19:20:08  <timoxley>hm
19:21:10  * AvianFlujoined
19:28:49  * ryan_stevens1quit (Quit: Leaving.)
19:29:55  * ryan_stevensjoined
19:40:42  * mikealjoined
19:53:09  * mikealquit (Quit: Leaving.)
20:26:01  * tilgoviquit (Ping timeout: 252 seconds)
20:45:52  * devaholicjoined
20:50:47  <rowbit>/!\ ATTENTION: (default-local) noel@... successfully signed up for developer browserling plan ($20). Cash money! /!\
20:50:48  <rowbit>/!\ ATTENTION: (default-local) paid account successfully upgraded /!\
20:51:41  * devaholicquit (Ping timeout: 252 seconds)
20:56:00  <substack>rawk
21:24:59  <Raynos>substack: what happens when I pass in a ports object from seaport.connect into mountie instead of seaport.createServer ?
21:34:58  <substack>it won't work
21:35:04  <substack>mountie needs a synchronous query
21:35:25  <substack>if you want to connect to a seaport server with mountie use pier
21:39:56  <Raynos>substack: -.- node-pier why do half your modules start with node-
21:53:34  * tilgovijoined
22:04:42  <isaacs>substack: i have you listed as a package maintainer on proto-list
22:04:48  <isaacs>substack: do you remember why?d
22:04:55  <isaacs>substack: or is that just a mistake or something?
22:06:38  <substack>not sure what proto-list is
22:10:30  <isaacs>substack: kewl.
22:11:11  <substack>I want remote-events to take an event emitter and return a stream
22:19:00  <Raynos>substack: I was thinking that too
22:19:06  <Raynos>dominictarr: feature requested
22:21:07  <substack>seems the only way is to overwrite .emit
22:21:13  <substack>in the source emitter
22:29:46  * st_lukequit (Remote host closed the connection)
22:30:22  <Raynos>substack: or return a new emitter
22:30:41  <substack>wondering if it should JSONStream or not
22:30:52  <substack>leaning towards should with an option to turn that off
22:30:56  <Raynos>oh your right
22:31:00  * tilgoviquit (Remote host closed the connection)
22:31:02  <Raynos>you would need to overwrite that emitter
22:31:16  <Raynos>substack: mux-demux JSONStreams by default
22:31:30  <Raynos>well not JSONStreams, but json parses & stringifies
22:31:39  * AvianFluquit (Quit: AvianFlu)
22:32:00  <substack>seems legit
22:35:23  <Raynos>substack: I don't think remote events should json stream
22:45:43  * devaholicjoined
22:49:11  * simcop2387quit (Excess Flood)
22:49:51  * simcop2387joined
23:11:59  * devaholicquit (Ping timeout: 240 seconds)
23:20:35  * ryan_stevensquit (Quit: Leaving.)
23:23:28  * tilgovijoined
23:26:42  <substack>Raynos: https://github.com/substack/emit-stream
23:26:47  <substack>except for the race condition
23:28:43  <isaacs>substack: added --no-opt for you
23:28:47  <isaacs>substack: to npm
23:28:52  * ryan_stevensjoined
23:30:57  <Raynos>substack: fail @ test
23:31:06  <substack>I'm aware
23:32:02  * ryan_stevensquit (Client Quit)
23:34:13  <substack>Raynos: fixed
23:34:22  <Raynos>o/
23:34:46  <Raynos>substack: http://travis-ci.org/#!/substack/bouncy/jobs/2174496
23:34:49  <Raynos>what about bouncy?
23:35:21  <substack>oh odd
23:35:39  <substack>but time for burritos
23:35:55  <substack>then I'll use emit-stream for this browserling queue server dashboard
23:35:58  <substack>REAL TIMEY WIMEY
23:36:00  <LOUDBOT>PEOPLE USING A NOT CLI GIT CLIENT
23:40:47  * ryan_stevensjoined
23:41:08  <isaacs>substack: emitStream is neat
23:41:29  <isaacs>it's like the EE version of dnode's functional style
23:42:00  <isaacs>substack: how much fidelity is there on the emit args?
23:42:17  * ryan_stevens1joined
23:42:43  * ryan_stevensquit (Read error: Connection reset by peer)
23:42:47  * ryan_stevens1quit (Client Quit)
23:43:00  <isaacs>like, if you do myEvStream.emit('beep', function boop (arg) { console.log('blerg!', arg) }) then can the other side do otherEvStream.on('beep', function (fn) { fn('calling you!') })
23:43:05  <isaacs>?
23:43:18  <isaacs>does it do the whole dnodey function sending stuff?
23:44:23  <isaacs>oh, nvm, i missed this: "The stream is parsed with JSONStream to re-create the event emitter arguments.
23:48:02  * joshwnjjoined
23:53:18  * ryan_stevensjoined
23:58:06  * ryan_stevensquit (Ping timeout: 272 seconds)
23:59:10  * _sorensenquit (Quit: _sorensen)