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
| * maxogden | just 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
| * wiwillia | quit (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
| * devaholic | joined |
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
| * maksimlin | joined |
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
| * mikeal | quit (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
| * mikeal | joined |
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
| * mikeal | quit (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
| * isaacs | investigating 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
| * devaholic | quit (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
| * mikeal | joined |
02:24:31
| * joshwnj` | joined |
02:25:33
| * joshwnj | quit (Ping timeout: 245 seconds) |
02:26:17
| * joshwnj` | changed nick to joshwnj |
02:28:08
| * timoxley | quit (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> | !#@[email protected]$ windows. |
02:38:20
| <maxogden> | srsly |
02:38:41
| * mikeal | quit (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_stevens | quit (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
| * mikeal | joined |
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
| * devaholic | joined |
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
| * mikeal | quit (Quit: Leaving.) |
03:52:43
| * devaholic | quit (Ping timeout: 252 seconds) |
03:55:08
| * ryan_stevens | joined |
04:06:56
| <Raynos> | ugh |
04:07:04
| <Raynos> | I need to punch browserify-server |
04:29:41
| * timoxley | joined |
04:33:53
| * mikeal | joined |
04:47:45
| * thatguydan | joined |
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
| * timoxley | quit (Quit: Computer has gone to sleep.) |
05:00:43
| <mikeal> | sweet |
05:05:13
| * thatguydan | quit (Quit: thatguydan) |
05:12:54
| * thatguydan | joined |
05:16:18
| * ryan_stevens | quit (Quit: Leaving.) |
05:24:21
| * thatguydan | quit (Quit: thatguydan) |
05:46:34
| * timoxley | joined |
05:51:24
| * timoxley | quit (Client Quit) |
05:54:35
| * mikeal | quit (Quit: Leaving.) |
06:00:37
| * mikeal | joined |
06:07:14
| * maksimlin | quit (Quit: Page closed) |
06:07:42
| * thatguydan | joined |
06:12:17
| * joshwnj` | joined |
06:14:16
| * joshwnj | quit (Ping timeout: 265 seconds) |
06:14:19
| * joshwnj` | changed nick to joshwnj |
06:15:14
| * mikeal | quit (Quit: Leaving.) |
06:49:14
| <Raynos> | isaacs: Where is your gossip thing |
07:10:01
| * timoxley | joined |
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
| * AvianFlu | quit (Ping timeout: 246 seconds) |
07:25:37
| * AvianFlu | joined |
07:29:40
| * thatguydan | quit (Ping timeout: 252 seconds) |
07:35:05
| <substack> | phase 1 browser badges complete |
07:36:53
| <substack> | module coming soon |
07:36:59
| * devaholic | joined |
07:41:08
| * joshwnj | quit (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) [email protected] successfully signed up for developer browserling plan ($20). Cash money! /!\ |
08:07:17
| <substack> | yay |
08:33:34
| * timoxley | quit (Quit: Computer has gone to sleep.) |
09:40:09
| * mikeal | joined |
09:46:33
| <substack> | kerpow https://github.com/substack/browser-badge |
10:07:06
| * tilgovi | quit (Ping timeout: 268 seconds) |
10:30:10
| * Samot | joined |
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
| * Samot | quit (Quit: Page closed) |
10:47:42
| * AvianFlu | quit (Quit: AvianFlu) |
11:34:52
| * cablemort | quit (Quit: Connection closed for inactivity) |
12:25:18
| * timoxley | joined |
13:18:04
| * wiwillia | joined |
13:24:27
| * timoxley | quit (Quit: Computer has gone to sleep.) |
13:28:00
| * timoxley | joined |
13:33:32
| * timoxley | quit (Quit: Computer has gone to sleep.) |
13:43:46
| * devaholic | quit (Ping timeout: 265 seconds) |
14:34:02
| * timoxley | joined |
14:44:50
| * timoxley | quit (Quit: Computer has gone to sleep.) |
15:15:44
| * AvianFlu | joined |
16:16:00
| * wiwillia | quit (Ping timeout: 244 seconds) |
16:18:11
| * wiwillia | joined |
16:20:28
| * ryan_stevens | joined |
17:13:46
| * timoxley | joined |
17:25:01
| * st_luke | wants 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
| * timoxley | quit (Quit: Computer has gone to sleep.) |
17:45:00
| * SubStack | topic: http://browserling.com | http://testling.com | We put a browser in your browser! |
17:46:14
| * tilgovi | joined |
17:49:40
| * timoxley | joined |
17:50:04
| * tilgovi_ | joined |
17:50:33
| * tilgovi | quit (Ping timeout: 246 seconds) |
18:00:14
| * mikeal | quit (Quit: Leaving.) |
18:00:34
| * mikeal | joined |
18:01:25
| * mikeal | quit (Client Quit) |
18:03:13
| * mikeal | joined |
18:04:23
| * devaholic | joined |
18:05:48
| * mikeal | quit (Client Quit) |
18:19:56
| * devaholic | quit (Ping timeout: 260 seconds) |
18:21:38
| * mikeal | joined |
18:33:06
| * ryan_stevens1 | joined |
18:34:22
| * ryan_stevens | quit (Ping timeout: 248 seconds) |
18:35:08
| * _sorensen | joined |
18:41:47
| * AvianFlu | quit (Quit: AvianFlu) |
19:08:41
| * mikeal | quit (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
| * AvianFlu | joined |
19:28:49
| * ryan_stevens1 | quit (Quit: Leaving.) |
19:29:55
| * ryan_stevens | joined |
19:40:42
| * mikeal | joined |
19:53:09
| * mikeal | quit (Quit: Leaving.) |
20:26:01
| * tilgovi | quit (Ping timeout: 252 seconds) |
20:45:52
| * devaholic | joined |
20:50:47
| <rowbit> | /!\ ATTENTION: (default-local) [email protected] successfully signed up for developer browserling plan ($20). Cash money! /!\ |
20:50:48
| <rowbit> | /!\ ATTENTION: (default-local) paid account successfully upgraded /!\ |
20:51:41
| * devaholic | quit (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
| * tilgovi | joined |
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_luke | quit (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
| * tilgovi | quit (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
| * AvianFlu | quit (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
| * devaholic | joined |
22:49:11
| * simcop2387 | quit (Excess Flood) |
22:49:51
| * simcop2387 | joined |
23:11:59
| * devaholic | quit (Ping timeout: 240 seconds) |
23:20:35
| * ryan_stevens | quit (Quit: Leaving.) |
23:23:28
| * tilgovi | joined |
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_stevens | joined |
23:30:57
| <Raynos> | substack: fail @ test |
23:31:06
| <substack> | I'm aware |
23:32:02
| * ryan_stevens | quit (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_stevens | joined |
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_stevens1 | joined |
23:42:43
| * ryan_stevens | quit (Read error: Connection reset by peer) |
23:42:47
| * ryan_stevens1 | quit (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
| * joshwnj | joined |
23:53:18
| * ryan_stevens | joined |
23:58:06
| * ryan_stevens | quit (Ping timeout: 272 seconds) |
23:59:10
| * _sorensen | quit (Quit: _sorensen) |