00:00:00  * ircretaryquit (Remote host closed the connection)
00:00:08  * ircretaryjoined
00:00:35  * jergasonjoined
00:00:44  * thlorenzquit (Remote host closed the connection)
00:07:43  * mikolalysenkoquit (Ping timeout: 272 seconds)
00:09:16  * AvianFlujoined
00:11:02  <ogd>timoxley: nope, but iirc you just add a second client
00:16:45  <rowbit>Hourly usage stats: [developer: 0, free: 62]
00:21:08  * AvianFluquit (Read error: Connection reset by peer)
00:25:10  * foucistjoined
00:26:14  * fallsemojoined
00:30:41  * mikolalysenkojoined
00:31:52  * thlorenzjoined
00:45:00  * thlorenzquit (Ping timeout: 245 seconds)
00:52:51  * yorickquit (Remote host closed the connection)
00:56:31  * jergasonquit (Quit: jergason)
01:02:53  * ferossquit (Quit: feross)
01:08:03  * DTrejojoined
01:12:48  * AvianFlujoined
01:16:45  <rowbit>Hourly usage stats: [developer: 0, free: 52]
01:19:03  * calvinfojoined
01:19:10  * jcrugzzquit (Ping timeout: 245 seconds)
01:22:16  * Maciek416joined
01:26:00  * fallsemoquit (Ping timeout: 240 seconds)
01:27:36  * jcrugzzjoined
01:29:30  * anoemiquit (Quit: anoemi)
01:35:56  * calvinfoquit (Quit: Leaving.)
01:37:47  * calvinfojoined
01:40:50  * fallsemojoined
01:42:03  * thlorenzjoined
01:45:31  * fallsemoquit (Ping timeout: 272 seconds)
01:47:19  * fallsemojoined
01:55:19  <brianloveswords>ogd: I gotta document a bunch of changes, but sqlite driver backend for https://github.com/brianloveswords/streamsql is DONE
01:55:42  * thlorenzquit (Ping timeout: 265 seconds)
01:56:21  * fallsemoquit (Ping timeout: 248 seconds)
02:01:00  * fallsemojoined
02:02:01  * thlorenzjoined
02:05:23  * AvianFluquit (Read error: Connection reset by peer)
02:05:25  * fallsemoquit (Ping timeout: 245 seconds)
02:06:00  * AvianFlujoined
02:16:45  <rowbit>Hourly usage stats: [developer: 35, free: 47]
02:16:46  * fallsemojoined
02:23:57  * defunctzombie_zzchanged nick to defunctzombie
02:24:28  * AvianFluquit (Ping timeout: 264 seconds)
02:35:17  * jcrugzzquit (Ping timeout: 272 seconds)
02:52:58  * AvianFlujoined
03:04:24  <jesusabdullah>timoxley: haven't gotten that far, I spent like 2 days trying to get level-scuttlebutt and expiry-model to play nice together
03:04:54  * timoxleyquit (Remote host closed the connection)
03:06:58  * DTrejoquit (Remote host closed the connection)
03:16:46  <rowbit>Hourly usage stats: [developer: 0, free: 22]
03:20:52  * AvianFluquit (Read error: Connection reset by peer)
03:23:04  * ferossjoined
03:25:30  * thlorenzquit (Remote host closed the connection)
03:26:06  * thlorenzjoined
03:27:33  * AvianFlujoined
03:28:37  * jolissquit (Quit: joliss)
03:29:20  * jolissjoined
03:29:49  * AvianFluquit (Read error: Connection reset by peer)
03:30:25  * AvianFlujoined
03:30:32  * thlorenzquit (Ping timeout: 252 seconds)
03:34:32  * DTrejojoined
03:34:33  * AvianFluquit (Ping timeout: 252 seconds)
03:36:01  * timoxleyjoined
03:38:14  * DTrejoquit (Remote host closed the connection)
03:40:25  * timoxleyquit (Ping timeout: 245 seconds)
03:44:07  * timoxleyjoined
03:48:45  * anoemijoined
03:50:42  * calvinfoquit (Quit: Leaving.)
04:01:51  * jolissquit (Read error: Connection reset by peer)
04:08:57  * thlorenzjoined
04:09:30  * calvinfojoined
04:13:01  * jergasonjoined
04:16:46  <rowbit>Hourly usage stats: [developer: 1, free: 148]
04:17:13  * thlorenzquit (Ping timeout: 245 seconds)
04:23:13  * anoemiquit (Quit: anoemi)
04:26:07  * mikolalysenkoquit (Ping timeout: 272 seconds)
04:32:48  * mikolalysenkojoined
04:40:04  * insertcoffeequit (Ping timeout: 264 seconds)
04:43:45  <brianloveswords>ogd: docs updated, v0.4.0 published on npm https://github.com/brianloveswords/streamsql
04:56:52  <jesusabdullah>brianloveswords: oh sick
04:58:45  <jesusabdullah>brianloveswords: that looks really handy
04:59:06  <jesusabdullah>brianloveswords: /r/ pgsql
04:59:23  <brianloveswords>haha yeah pgsql is the next thing to tackle :D
05:00:03  <jesusabdullah>sweet
05:00:12  * jergasonquit (Quit: jergason)
05:00:16  <jesusabdullah>I just realized mongo broke my head :(
05:00:22  <jesusabdullah>I keep thinking in collections now -_-;
05:00:35  <jesusabdullah>need to get back to my couchroots
05:00:56  <brianloveswords>What's the couch model? I've not used that too much.
05:01:19  <jesusabdullah>flat documents
05:01:25  <brianloveswords>I have a bunch of stuff in mongo that we're trying to move off because we just do so much that's relational and we're getting slaughtered by performance.
05:01:38  <brianloveswords>(which is why I wrote this!)
05:02:09  <jesusabdullah>actually kiiinda like level + level-mapreduce
05:02:14  <jesusabdullah>+ rest
05:02:36  <jesusabdullah>so all documents are just resources, you REST it up (PUT/GET/POST/DELETE)
05:02:52  <jesusabdullah>and to do "queries" you write pre-cached mapreduces which iterate over all the resources
05:03:09  <brianloveswords>Ahhh rad rad, yeah, it's coming back to me now.
05:03:17  <jesusabdullah>and you have the _changes feed which I guess is kinda analogous to level's createReadStream
05:03:21  <brianloveswords>When I tried to use couch like 3 years ago it was horribly underdocumented.
05:03:26  <jesusabdullah>I bet
05:03:31  <jesusabdullah>I learned on the job (nodjatso)
05:03:38  <jesusabdullah>same with brongo (i.tv)
05:03:50  <jesusabdullah>obtw, are you using mongoose too, or mongodb-native?
05:03:57  <brianloveswords>mongoose
05:04:06  <jesusabdullah>cause according to AvianFlu mongoose itself slaughters perf
05:04:10  <ogd>brianloveswords: check out https://github.com/maxogden/dat-oaklandcrime, wrote it today
05:04:18  <brianloveswords>That is 100% true about mongoose.
05:04:24  <ogd>brianloveswords: its basically a scraper that dumps stuff into dat
05:04:37  <jesusabdullah>ogd: v cool, how useful is dat right now?
05:04:43  <ogd>brianloveswords: if you have ideas for datasets that you wanna share lemme know! im definitely gonna open up some mysql data using your module
05:04:50  <ogd>jesusabdullah: beta isnt out yet so its pretty rough
05:04:55  <jesusabdullah>uhuh
05:05:01  <jesusabdullah>well I'll keep an eye
05:05:03  <jesusabdullah>I, uhh
05:05:10  <jesusabdullah>I'd need to use it before I could really critique it
05:05:10  <brianloveswords>ogd nice!!
05:05:12  <ogd>jesusabdullah: bug e.g. http://oaklandcrime.dathub.org/, http://oaklandcrime.dathub.org/_changes?live=true&since=15866&include_data=true
05:05:22  <ogd>jesusabdullah: but*
05:05:31  <jesusabdullah>dathub, huh? nice
05:05:43  <jesusabdullah>also, most depressing civic data ever
05:05:51  <ogd>heh
05:06:10  <jesusabdullah>"Description":"POSSESS MARIJUANA/HASHISH FOR SALE"
05:06:36  <jesusabdullah>"Description":"ANNOYING REPEATED PHONE CALLS:RESIDENCE" lolol
05:06:41  <ogd>hah
05:06:42  <brianloveswords>hahhahaa
05:07:31  <brianloveswords>FIGHT/CHALLENGE IN PUBLIC PLACE
05:07:32  <LOUDBOT>GOOD NIGHT ROOM, GOOD NIGHT NICKS, GOOD NIGHT SILLY LUGGERS, LULZING FOR KICKS
05:07:32  <jesusabdullah>ahh, oak land
05:07:34  <brianloveswords>COME AT ME BRO
05:07:34  <LOUDBOT>LETS KIDNAP HIM AND SELL HIM TO THE SEX SLAVE TRADE IN NEPAL!
05:08:08  <jesusabdullah>FIGHT/CHALLENGE FIGHT PUBLIC PLACE is what I ctrl-f'd outta that
05:08:11  <jesusabdullah>which is almost better
05:08:55  <brianloveswords>"Description":"POSSESS HYPODERMIC NEEDLE/SYRINGE" – I didn't realized that was even a crime
05:09:14  <jesusabdullah>me neither
05:10:38  <brianloveswords>haha I kinda love this one, "Description":"GRAND THEFT:FIREARM/ANIMAL/ETC"
05:10:41  <brianloveswords>Grand theft horse
05:10:48  <jesusabdullah>giddyup
05:11:11  <ogd>https://gist.github.com/maxogden/7636668
05:11:54  * fallsemoquit (Quit: Leaving.)
05:12:10  <ogd>PIMPING FOR PROSTITUTE OVER 16
05:12:10  <LOUDBOT>WELL THEN YOU WERE A SICK FUCK FOR 2 REASONS.
05:12:11  <ogd>:(
05:13:11  <jesusabdullah>VIOLATE CIVIL RIGHTS BY FORCE OR THREAT OF FORCE
05:13:12  <LOUDBOT>I'M FEELIN' THE BEAT -- LET ME LOOSE!
05:13:34  <jesusabdullah>OPD arrested themselves?
05:13:36  <jesusabdullah>HEYOOOO
05:13:44  <ogd>ohho
05:13:54  * thlorenzjoined
05:15:10  <brianloveswords>ogd: something for NYC, building violations
05:15:51  <ogd>brianloveswords: o yea, do you know where that data is
05:15:53  <brianloveswords>ogd: I secondhand know some people who had to pick up and move basically overnight because their landlord was a slumlord, had like 50 violations on the place, didn't tell anyone and it got condemned basically.
05:15:57  <brianloveswords>I'm trying to find it.
05:16:02  <ogd>dang
05:16:28  <brianloveswords>I mean, there's this SUPER EASY TO USE FORM http://a810-bisweb.nyc.gov/bisweb/bispi00.jsp
05:16:45  <rowbit>Hourly usage stats: [developer: 0, free: 135]
05:17:05  <jesusabdullah>holy shit
05:17:15  <jesusabdullah>gotta love inept government desiloing
05:20:21  <ogd>if we can figure out the building information number format
05:20:23  <ogd>we can just brute force
05:20:32  <ogd>7 digits
05:20:39  <ogd>Building Identification Number - Unique 7-digit Building Identification Number,assigned by City Planning, to a specific building
05:21:24  * jcrugzzjoined
05:21:58  <brianloveswords>ogd: you probably already have something for this, but if you wanna do friendly brute-forcing/scraping when pulling data, https://github.com/brianloveswords/throttle-function
05:22:20  <brianloveswords>I quickly threw it together when I was scraping some twitter data.
05:22:42  <ogd>nice
05:25:40  * wolfeidauquit (Remote host closed the connection)
05:27:00  * thlorenzquit (Ping timeout: 246 seconds)
05:39:18  <ogd>rvagg: lol @ https://github.com/rvagg/dnt#what-about-mac-windows-solaris
05:43:37  * Maciek416quit (Remote host closed the connection)
05:46:56  <ogd>guys check out this dog https://www.youtube.com/watch?v=9ugWI5LnENU
05:47:10  * defunctzombiechanged nick to defunctzombie_zz
05:48:05  <jesusabdullah>holy shit localized youtube ads
06:03:24  * mikolalysenkoquit (Ping timeout: 246 seconds)
06:04:37  * mikolalysenkojoined
06:10:13  * calvinfoquit (Quit: Leaving.)
06:16:44  <rowbit>Daily usage stats: [developer: 221, free: 645]
06:16:45  <rowbit>Hourly usage stats: [developer: 5, free: 19]
06:23:43  * thlorenzjoined
06:30:18  * wolfeidaujoined
06:33:01  * wolfeidauquit (Remote host closed the connection)
06:37:51  * thlorenzquit (Ping timeout: 272 seconds)
07:04:03  <groundwater>okay finally got sub-second CPU sampling working
07:04:16  <groundwater>using dtrace
07:09:54  <jesusabdullah>sounds cool
07:16:45  <rowbit>Hourly usage stats: [developer: 1, free: 155]
07:16:50  * mikolalysenkoquit (Ping timeout: 240 seconds)
07:29:06  * AvianFlujoined
07:37:18  * AvianFluquit (Read error: Connection reset by peer)
07:43:36  * mikolalysenkojoined
07:49:09  * mikolalysenkoquit (Ping timeout: 272 seconds)
07:53:03  * peutetrejoined
07:56:07  * AvianFlujoined
07:56:35  * AvianFluquit (Read error: Connection reset by peer)
07:57:03  * AvianFlujoined
08:10:10  * AvianFluquit (Read error: Connection reset by peer)
08:16:46  <rowbit>Hourly usage stats: [developer: 3, free: 139]
08:17:37  * AvianFlujoined
08:31:54  * grewebjoined
08:34:00  * groundwaterquit (Quit: My MacBook Pro has gone to sleep. ZZZzzz…)
08:34:09  <greweb>morning
08:35:42  * AvianFluquit (Remote host closed the connection)
08:36:34  <greweb>Any feedback on this: https://gist.github.com/gre/6975153 ?
08:44:22  * mikolalysenkojoined
08:49:51  * mikolalysenkoquit (Ping timeout: 272 seconds)
09:07:15  * ins0mniajoined
09:15:38  * ins0mniaquit (Read error: Connection reset by peer)
09:16:46  <rowbit>Hourly usage stats: [developer: 2, free: 30]
09:22:55  <ehd>greweb: answered
09:24:22  <greweb>ehd thanks
09:24:56  <greweb>now my issue is more that I want to keep the "library instanciation" for a given AudioContext (because you can create multiple audio context)
09:27:00  <greweb>and lib2 depends on lib1 but a lib2(ctx) must use the lib1(ctx) with the same ctx
09:29:41  * ITpro_quit (Ping timeout: 248 seconds)
09:32:02  * timoxley_joined
09:32:44  * timoxleyquit (Read error: Connection reset by peer)
09:33:01  * timoxley_changed nick to timoxley
09:37:55  * AvianFlujoined
09:41:07  <ehd>i see. it's tough… the cleanest thing is probably to pass in lib2(ctx) into lib1 instead of requiring it in lib1.
09:45:09  * mikolalysenkojoined
09:49:51  * mikolalysenkoquit (Ping timeout: 246 seconds)
09:51:42  * AvianFluquit (Read error: Connection reset by peer)
09:58:13  * AvianFlujoined
10:02:15  * ITpro_joined
10:02:52  * AvianFluquit (Ping timeout: 264 seconds)
10:16:45  <rowbit>Hourly usage stats: [developer: 1, free: 74]
10:29:08  * grewebquit (Remote host closed the connection)
10:31:41  * grewebjoined
10:40:31  * grewebquit (Remote host closed the connection)
10:44:33  * slaskisjoined
10:45:57  * mikolalysenkojoined
10:50:50  * mikolalysenkoquit (Ping timeout: 245 seconds)
11:03:01  * thlorenzjoined
11:11:23  * grewebjoined
11:14:45  * jolissjoined
11:15:49  * grewebquit (Ping timeout: 248 seconds)
11:16:40  * thlorenzquit (Ping timeout: 264 seconds)
11:16:46  <rowbit>Hourly usage stats: [developer: 2, free: 206]
11:18:36  * grewebjoined
11:19:42  * wolfeidaujoined
11:20:39  * wolfeidauquit (Remote host closed the connection)
11:22:29  * wolfeidaujoined
11:33:29  <foucist>what's the hourly usage about?
11:41:01  * slaskisquit (Ping timeout: 265 seconds)
11:44:42  * slaskisjoined
11:46:10  * grewebquit (Remote host closed the connection)
11:46:42  * mikolalysenkojoined
11:47:55  * greweb_joined
11:50:13  * insertcoffeejoined
11:52:04  * mikolalysenkoquit (Ping timeout: 264 seconds)
12:05:01  * jcrugzzquit (Ping timeout: 272 seconds)
12:07:09  * anoemijoined
12:07:29  * greweb_quit (Remote host closed the connection)
12:07:48  * wolfeidauquit (Remote host closed the connection)
12:13:17  * thlorenzjoined
12:16:46  <rowbit>Hourly usage stats: [developer: 1, free: 42]
12:26:31  * thlorenzquit (Ping timeout: 246 seconds)
12:38:25  * grewebjoined
12:43:33  * grewebquit (Ping timeout: 272 seconds)
12:47:25  * mikolalysenkojoined
12:48:09  * AvianFlujoined
12:52:00  * mikolalysenkoquit (Ping timeout: 240 seconds)
12:56:45  * grewebjoined
12:58:18  * jcrugzz_joined
13:03:34  * jcrugzz_changed nick to jcrugzz
13:08:30  * AvianFluquit (Read error: Connection reset by peer)
13:16:45  <rowbit>Hourly usage stats: [developer: 1, free: 106]
13:17:32  * AvianFlujoined
13:18:02  * yorickjoined
13:21:55  * fallsemojoined
13:23:10  * thlorenzjoined
13:30:00  * jcrugzzquit (Ping timeout: 245 seconds)
13:37:04  * thlorenzquit (Ping timeout: 264 seconds)
13:48:10  * mikolalysenkojoined
13:49:54  * fallsemoquit (Quit: Leaving.)
13:52:23  * brianloveswordsquit (Excess Flood)
13:52:45  * mikolalysenkoquit (Ping timeout: 246 seconds)
13:52:53  * kevino80joined
13:53:31  * brianloveswordsjoined
14:03:27  * anoemiquit (Quit: anoemi)
14:06:44  <AvianFlu>LOUDBOT'S REVENGE
14:06:45  <LOUDBOT>IM SO EXCITIED I FURGOT GRAMEMR
14:08:59  * heathquit (Quit: No Ping reply in 180 seconds.)
14:13:37  * heathjoined
14:13:37  * heathquit (Changing host)
14:13:38  * heathjoined
14:16:46  <rowbit>Hourly usage stats: [developer: 2, free: 83]
14:22:23  * Maciek416joined
14:22:55  * kevinswiberjoined
14:23:21  * crankquit (Remote host closed the connection)
14:23:39  <brianloveswords>hahah ogd (re: https://github.com/rvagg/dnt#what-about-mac-windows-solaris)
14:25:15  <mmalecki>hahahahhaha
14:25:20  <mmalecki>I love this
14:30:52  * thlorenzjoined
14:36:25  * grewebquit (Remote host closed the connection)
14:38:03  <ehd>picard gif in readme trumps everything
14:41:48  * fallsemojoined
14:42:05  * thlorenzquit (Remote host closed the connection)
14:42:38  * thlorenzjoined
14:42:57  <ehd>rvagg: docker is pretty mad science enabling. i made something in a browser that creates a tar file w/ Dockerfile & program.js and posts it to docker/build on every keypress from a text editor. a bit over the top but it works :P
14:45:15  * thlorenz_joined
14:46:24  * thlorenzquit (Read error: Connection reset by peer)
14:47:58  * grewebjoined
14:49:00  * mikolalysenkojoined
14:54:23  * mikolalysenkoquit (Ping timeout: 272 seconds)
14:55:10  * AvianFluquit (Remote host closed the connection)
15:09:19  * sgimenoquit (Quit: KVIrc 4.0.2 Insomnia http://www.kvirc.net/)
15:16:45  <rowbit>Hourly usage stats: [developer: 2, free: 77]
15:24:10  * crankjoined
15:33:30  * dguttmanjoined
15:43:51  * tmcwjoined
15:49:43  * mikolalysenkojoined
15:51:07  * ednapiranhajoined
15:53:09  * brycebarilquit (Ping timeout: 248 seconds)
15:54:35  * mikolalysenkoquit (Ping timeout: 245 seconds)
16:04:13  * jolissquit (Quit: joliss)
16:06:23  * kevino80quit (Remote host closed the connection)
16:08:04  * AvianFlujoined
16:11:17  * grewebquit (Remote host closed the connection)
16:14:58  <rowbit>substack, pkrumins: A developer is waiting in the queue for explorer/11.0
16:16:45  <rowbit>Hourly usage stats: [developer: 2, free: 149]
16:27:28  <rowbit>substack, pkrumins: Encoders down: 50.57.102.133 (dev-ie7-2)
16:35:51  * brycebariljoined
16:38:55  * slaskisquit (Quit: slaskis)
16:50:30  * mikolalysenkojoined
16:55:43  * mikolalysenkoquit (Ping timeout: 272 seconds)
16:59:54  * peutetrequit (Quit: peutetre)
17:00:29  * ferossquit (Quit: feross)
17:01:00  * slaskisjoined
17:02:03  * kevino80joined
17:15:22  * jergasonjoined
17:16:46  <rowbit>Hourly usage stats: [developer: 2, free: 63]
17:17:26  * groundwaterjoined
17:17:29  * slaskisquit (Quit: slaskis)
17:30:13  * kevinswiberquit (Remote host closed the connection)
17:34:01  * kevinswiberjoined
17:44:34  * thlorenz_quit (Remote host closed the connection)
17:45:07  * thlorenzjoined
17:47:04  * DTrejojoined
17:49:30  * thlorenz_joined
17:49:49  * thlorenzquit (Read error: Connection reset by peer)
17:50:37  * thlorenz_quit (Remote host closed the connection)
17:51:08  * mikolalysenkojoined
17:52:05  * dominictarr_joined
17:52:09  <dominictarr_>hij1nx, whats up?
17:57:08  * slaskisjoined
17:59:13  <hij1nx>dominictarr_: hey, you are no longer in ##leveldb?
18:00:40  <ogd>deserter!
18:00:48  <ogd>brianloveswords: https://github.com/maxogden/NYC-Building-Identification-Numbers--BINs- :D
18:07:16  <dominictarr_>hij1nx, ogd oh, hey - I've been running my own window manager, which means I've been closing applications more than before...
18:08:11  <dominictarr_>hij1nx, I think that guy is trying to do a slightly different thing
18:08:26  <dominictarr_>(exactly what I'm trying to figure out)
18:09:04  <dominictarr_>although, I'm pretty close to suggesting him call it a different name, since I suspect it's a different idea
18:09:40  <hij1nx>dominictarr_: i think the reason he started that is similar to a problem that i think is very important to fix
18:09:57  <hij1nx>dominictarr_: sublevel has a few limitations
18:10:08  <hij1nx>so, lets say you have 2000 sublevels
18:10:23  <hij1nx>this can get quite memory intensive
18:10:38  <ogd>sublevel is the new jquery
18:10:50  <hij1nx>lol
18:10:56  <ogd>just kidding i dont even know what that means
18:11:02  <dominictarr_>yeah, a sublevel is intended to be an analogy to a sql table
18:11:18  <dominictarr_>jquery is a monad
18:11:29  <hij1nx>a dog is a monda
18:11:41  <hij1nx>s/monda/monad/
18:11:53  <hij1nx>anyway, sure it can be like a table
18:11:59  * foucistpart
18:12:07  <hij1nx>but its practical to have many in a very large application
18:12:11  <dominictarr_>yeah, but some people want to use it just to manage ranges
18:12:34  <dominictarr_>like, just to group documents
18:12:36  <hij1nx>some people do yes, but some peopl want to build larger applications as well
18:12:56  <dominictarr_>right, but a table is for a *type*
18:13:10  <dominictarr_>you wouldn't want to have 2000 different types
18:13:25  <hij1nx>you actually may
18:13:30  <dominictarr_>like, posts from each user shouldn't get their own type
18:13:31  <hij1nx>for instance
18:14:00  <hij1nx>if i have document classifications, there maybe hundreds, each with sub classifications
18:14:20  <dominictarr_>that is a different sense of the word "type"
18:14:22  <hij1nx>cities in states even could result in a situation like this
18:14:45  <dominictarr_>this is a different problem,
18:14:45  <hij1nx>ah, so this is one problem
18:14:47  * mikolalysenkoquit (Ping timeout: 246 seconds)
18:14:51  <hij1nx>yes
18:14:55  <hij1nx>then multilevel
18:15:08  <hij1nx>cc juliangruber
18:15:09  <dominictarr_>one that looks similar to sublevel, but is not the problem sublevel addresses
18:16:02  <hij1nx>aren't they similar enough to be in the same solution?
18:16:10  * jxsonjoined
18:16:45  <rowbit>Hourly usage stats: [developer: 0, free: 52]
18:16:48  <dominictarr_>well, I think sublevel is more complicated that you need if you only want to solve this problem
18:16:50  <hij1nx>i mean i was x/y/docid, x/y/z/docid, thats sublevels
18:16:56  <dominictarr_>yeah
18:17:03  <juliangruber>what's the problem with using one of those prefixer modules?
18:17:07  * jergasonquit (Quit: jergason)
18:17:21  <dominictarr_>it's more like parameterized keys
18:17:48  <juliangruber>and if i see this correctly the memory growth of those is just the same as with level-sublevel
18:17:48  <hij1nx>prefixer modules are not the go-to for people entering this problem i think
18:17:52  <dominictarr_>like say we have keys:
18:18:00  <dominictarr_>USA: json about usa
18:18:11  <dominictarr_>USA: NY: json about NY state
18:18:21  <dominictarr_>USA: NY: NYC: json...
18:18:51  <hij1nx>juliangruber: thats what stagas said, that level-prefix has some of the same problems due to the general approach
18:18:58  <juliangruber>yeah
18:19:03  <hij1nx>https://github.com/stagas/sublevel/issues/1#issuecomment-29139937
18:19:11  <juliangruber>so the need to be nicer to js engines
18:19:25  * calvinfojoined
18:19:31  <dominictarr_>I think what is wanted is just a better way to handle prefix heirachies
18:19:51  <dominictarr_>sublevel is designed for creating indexes, and stuff like that
18:20:18  <juliangruber>yeah
18:20:19  <hij1nx>hmm, so what are the alternative design approaches here that would handle growth better
18:20:27  <dominictarr_>I think most of the time when we do createReadStream({start, end})
18:20:43  <juliangruber>db.createReadStream({ prefix: 'foo' }) would be faster but isn't composable
18:20:48  <dominictarr_>what you really want is createReadStream({prefix:...})
18:21:10  <dominictarr_>juliangruber, composable in what way?
18:21:29  <juliangruber>like you can't pass a sublevel to a module, you have to pass it a concatenated path string
18:21:41  <dominictarr_>oh, you mean that you can pass a prefix to another function...
18:21:56  <dominictarr_>but do you need to do that with prefixes?
18:22:11  <dominictarr_>maybe the best solution is to use a prefix thing with sublevel
18:22:40  <juliangruber>apis get bigger, e.g. levelFs(db, 'prefix') instead of levelFs(db.sublevel('prefix'))
18:23:18  <dominictarr_>well, levelFs is still the sort of thing that SHOULD use sublevel
18:23:18  * slaskisquit (Ping timeout: 246 seconds)
18:23:24  <juliangruber>that's just an example
18:23:28  <juliangruber>it could be any module
18:23:42  <hij1nx>juliangruber: also we should think of how any client can create a sublevel, i.e. multilevel
18:23:44  <juliangruber>you want to tell it where to store its data without overwriting any data that doesn't belong to it
18:23:56  <juliangruber>hij1nx: yeah with prefixes that's no problem at all
18:24:10  <juliangruber>the bigger problem I see is that all of that needs to be backed into multilevel
18:24:26  <juliangruber>multilevel should really only be levelup, not a set of curated modules + levelup
18:24:27  <dominictarr_>in level fs, how are directories handled?
18:24:48  <juliangruber>dominictarr_: currently with sublevels but i'm working on a version using level-blocked that only uses prefixes
18:24:58  <juliangruber>a real fs implementation using inodes
18:25:06  <dominictarr_>right. haha, nice
18:25:19  <juliangruber>:)
18:25:27  <hij1nx>juliangruber: woah nice
18:25:34  <juliangruber>i mean, passing prefixes to modules isn't bad at all
18:25:36  <juliangruber>it's less nice
18:25:44  <juliangruber>but at the same time requires way less magic
18:25:48  <dominictarr_>these are two different things
18:25:52  * jolissjoined
18:25:53  <dominictarr_>different abstractions
18:26:10  <brianloveswords>ogd: yesssssssss
18:26:21  <dominictarr_>we just don't have a compelling explaination of the distinction
18:26:23  <hij1nx>dominictarr_: are they differnt enough?
18:26:27  <dominictarr_>yes
18:26:45  <dominictarr_>as different as transform (meat grinder) and duplex (telephone)
18:27:11  * slaskisjoined
18:27:19  <brianloveswords>ogd: did you come across a way to associate these with addresses?
18:27:29  <juliangruber>on a conceptual level they are different enough, but maybe not on a practical one
18:27:33  <dominictarr_>the main thing is that the nodes in prefixe trees are something you want to create dynamically
18:27:50  <dominictarr_>and quite often, by the user
18:27:55  <hij1nx>dominictarr_: i guess im thinking differently because what i want is a bucket with a name
18:28:00  <juliangruber>another way to look at it: what would we gain/sacrifice if we only used prefixes?
18:28:38  <hij1nx>or rather a hierarchy of buckets
18:28:48  <dominictarr_>and nested buckets, but also, the ability to request the contained buckets
18:28:55  <dominictarr_>traverse the whole tree
18:29:09  <hij1nx>stream segments
18:29:26  <dominictarr_>ie. the nested buckets are streamable, and not private
18:29:35  <hij1nx>yes
18:29:52  <dominictarr_>with country/state/city that makes sense
18:29:57  <juliangruber>my spider sense says we need something more higherlevel, direct key manipulation with special ascii characters is just doomed to fail
18:30:07  <dominictarr_>with data/update_seq
18:30:10  <dominictarr_>or data/index
18:30:16  <dominictarr_>that doesn't make sense
18:30:45  <dominictarr_>juliangruber, hij1nx what if you just specified the key as an array
18:31:01  <juliangruber>yeah that's way better!
18:31:07  <dominictarr_>[country, state, city] = json
18:31:13  * thlorenzjoined
18:31:28  <dominictarr_>but also [country, state] = json
18:31:36  * jergasonjoined
18:31:42  <hij1nx>querying that as text would be awkward, but pasting it as json would be slower, no?
18:31:44  <dominictarr_>and you could have ways to stream [country ...]
18:31:53  <dominictarr_>or just an exact key,
18:32:00  <dominictarr_>or just keys at one level
18:32:15  <dominictarr_>oh, you could probably stream the data like JSONStream
18:32:23  <juliangruber>well it doesn't have to be strictly hirarchical
18:32:47  <juliangruber>like you could store [contry, state, city] but not [country, state]
18:32:49  <dominictarr_>well, under the hood it will be, because of how it's sorted
18:32:59  <dominictarr_>sure
18:33:04  <juliangruber>ok
18:33:16  <juliangruber>and we can already do that with levelup
18:33:16  <hij1nx>it would be awesome to have a query lang like "*.foo.bar"
18:33:33  * groundwaterquit (Quit: My MacBook Pro has gone to sleep. ZZZzzz…)
18:33:35  <juliangruber>or rather `foo.bar.*` :P
18:33:36  <hij1nx>db.createReadStream('foo.*.bar')
18:33:44  <juliangruber>otherwise you need automatic index creation
18:33:51  <dominictarr_>yeah, you could always have [country, state] empty, but you could also have it... and treat it like
18:33:51  <hij1nx>juliangruber: i know :(
18:34:13  <dominictarr_>if you have well defined key patterns, it would be very easy to index groups
18:34:18  <juliangruber>that's why sql is so awesome, you just say what you want and in most cases it can give you your data fast enough
18:35:02  <juliangruber>hij1nx: i had * queries in leveled
18:35:05  <hij1nx>juliangruber: yeah but thats because there are a lot of pre optimizations that the server is churning
18:35:16  <juliangruber>yeah the server is ultra fucking smart :D
18:35:29  <hij1nx>we need an ultra smart leveldb server! :D
18:35:32  <juliangruber>:D
18:35:34  <juliangruber>no :D
18:35:35  <juliangruber>:P
18:35:37  <hij1nx>hahaha
18:35:44  * groundwaterjoined
18:35:50  <juliangruber>so far manual indexing works well
18:35:51  <dominictarr_>hmm, you could just stream the whole db, but build the indexes the user queries
18:36:07  <dominictarr_>so it's slow the first time, but then it's fast.
18:36:08  <juliangruber>dominictarr_: mmmh yes
18:36:24  <juliangruber>that would be a sweet module
18:36:39  <hij1nx>sql servers often build "best execution plans" and indexes based on what is being queried and how frequently
18:36:42  <juliangruber>so how would you query?
18:37:09  <juliangruber>i guess you'd need something like the mongo query language so it can be smart about it
18:37:33  <dominictarr_>I think putting * in the key would be very good actually
18:37:45  <juliangruber>and {a..b}
18:37:50  <juliangruber>just use brace expansion!
18:37:54  <dominictarr_>that is more expensive
18:38:01  <juliangruber>why?
18:38:09  <juliangruber>that's { start: 'a', end: 'b' }
18:38:11  <dominictarr_>because you have to check everything in the middle
18:38:26  <dominictarr_>oh, I thought you meant something different
18:38:35  <dominictarr_>yes
18:38:39  <dominictarr_>like
18:38:39  <hij1nx>ok but so how do we get hierarchy for mutlilevel, because thats something people want
18:38:43  <juliangruber>more like the fs glob matching that brace expansion
18:38:57  <dominictarr_>yeah
18:39:02  <juliangruber>that's a tough cookie
18:39:36  <juliangruber>the { prefix: 'foo' } think would work
18:39:39  <dominictarr_>well, I think this would work with multilevel already.
18:39:54  * mikolalysenkojoined
18:40:13  <dominictarr_>also, you could do [room, *] for chat
18:40:23  <dominictarr_>[room, ts, user] = message
18:40:40  <hij1nx>for cohesiveness, there should be a "sublevel" type thing, API wise, it's what people understand
18:40:48  <dominictarr_>then [room, {lastOnline...now}, *]
18:41:12  <hij1nx>dominictarr_: i like where that is going
18:41:34  <dominictarr_>... this approach allows you to embrace ranges... which is one of level's greatest strengths
18:41:39  <hij1nx>you dont need square brackets
18:41:55  <dominictarr_>so, you should be able to stream a range, and listen on a range
18:41:56  <Raynos>dominictarr_: that only works because * is on the end right?
18:42:12  <dominictarr_>Raynos, correct
18:42:17  <Raynos>[room, *, raynos] wouldn't give me all chats by
18:42:17  <hij1nx>Raynos: it would be very complex otherwise
18:42:20  <juliangruber>hij1nx: brackets bc it's an array
18:42:21  <Raynos>myself.
18:42:31  <dominictarr_>Raynos, it would
18:42:36  <hij1nx>juliangruber: but that would be awkaward
18:42:40  <dominictarr_>but it would read all the chats and filter them
18:42:43  <juliangruber>why?
18:42:50  <hij1nx>just make it a dsl
18:43:01  <hij1nx>because [foo, bar] VS [foo, bar]
18:43:13  <juliangruber>{ keyEncoding: 'json' }
18:43:14  <hij1nx>as exact keys
18:43:27  <hij1nx>but then you would need to parse
18:43:29  <juliangruber>db.put(['foo', 'bar'], 'value')
18:43:33  <dominictarr_>could make it the same as JSONStream
18:43:41  <hij1nx>i wonder how much perf impact that has
18:43:45  <hij1nx>maybe its not much
18:44:00  <juliangruber>we can make it faster afterwards by adding a custom key encoding
18:44:01  <hij1nx>a utf8 key is faster than a json key right?
18:44:05  <juliangruber>yup
18:44:22  <dominictarr_>also, json doesn't sort right.
18:44:26  <hij1nx>but, obviously a json key is more powerful in terms of checks
18:44:39  <juliangruber>true
18:44:45  <juliangruber>so a custom key encoding it is
18:44:51  <hij1nx>so maybe a json-like key
18:44:53  <hij1nx>not json
18:44:57  <dominictarr_>bytewise would work
18:45:08  <hij1nx>foo, {a...b}, *
18:45:10  <dominictarr_>but it would be nicer if it was readable
18:45:37  <juliangruber>dominictarr_ tools could support bytewise
18:46:04  * jxsonquit (Remote host closed the connection)
18:46:09  <dominictarr_>hij1nx, one approach would be to take js values like ["foo", {gt: "a", lt: "b"}, true]
18:46:29  * jxsonjoined
18:46:39  <dominictarr_>and also have a string syntax that is more sugary, but actually just compiles to the js objects
18:46:54  <dominictarr_>"foo.{a..b}.*"
18:47:02  <juliangruber>yeah true
18:47:11  <dominictarr_>or may slashes "foo/{a..b}/*"
18:47:19  <dominictarr_>so it's like globs/fs
18:47:29  <hij1nx>yeh
18:47:32  <hij1nx>i like that
18:47:48  <hij1nx>a good file system is a most impressive database
18:47:50  <juliangruber>so the . has a single meaning
18:48:17  <juliangruber>how would we compose then?
18:48:32  <juliangruber>prefix + '/foo/{a..b}/*'
18:48:38  <juliangruber>like path prefixing
18:48:49  <juliangruber>or with join(prefix, '/foo/{a..b}/*')
18:48:53  <juliangruber>we could just use the path module
18:48:55  <juliangruber>:O
18:49:01  <hij1nx>hah!
18:49:30  <hij1nx>acutally,there could be a lot o advantage to going this direction
18:49:52  <juliangruber>it's easier for beginners as they could imagine directories
18:50:16  <hij1nx>and its a well defined problem
18:50:17  <juliangruber>and brace expansion is a common tool too
18:50:22  <juliangruber>yes
18:51:44  <dominictarr_>yeah, I wrote sublevel to make implementing map-reduce cleaner
18:52:16  <dominictarr_>but most people don't have that problem
18:52:21  <juliangruber>mhm
18:52:29  <juliangruber>what's the current state with custom encodings?
18:52:42  <dominictarr_>they are in, arn't they?
18:52:46  <juliangruber>idk :D
18:52:55  <juliangruber>i thought you made that pull request
18:52:55  <dominictarr_>I remember that getting merged
18:52:59  <dominictarr_>yeah
18:54:22  <dominictarr_>okay guys, good discussion... I'm going to bed. it's 3am here
18:54:25  <juliangruber>woot
18:54:53  <juliangruber>https://github.com/rvagg/node-levelup#custom_encodings
18:58:27  <juliangruber>dominictarr_: sleep well!
19:03:21  <mikolalysenko>chrisdickinson: ping
19:03:53  * dominictarr_quit (Ping timeout: 245 seconds)
19:09:01  * dguttmanquit (Quit: dguttman)
19:12:22  * jergason_joined
19:14:18  * jergasonquit (Ping timeout: 245 seconds)
19:14:18  * jergason_changed nick to jergason
19:16:45  <rowbit>Hourly usage stats: [developer: 0, free: 74]
19:31:05  * fotoverite_joined
19:32:03  * insertcoffeequit (Ping timeout: 272 seconds)
19:33:25  * fotoveritequit (Ping timeout: 272 seconds)
19:33:27  * fotoverite_changed nick to fotoverite
19:34:03  * grewebjoined
19:42:38  * anvakajoined
19:49:05  * slaskisquit (Quit: slaskis)
19:57:23  * grewebquit (Remote host closed the connection)
20:05:51  * grewebjoined
20:07:15  <Domenic_>thlorenz: what isn't working about sinon and browserify?
20:07:29  <Domenic_>looks fine from the source code, and has worked for me in the past (although things might have changed since then)
20:07:45  <thlorenz>somehow causes brfs not found in my case
20:07:54  <thlorenz>if I just to require('sinon')
20:07:59  <Domenic_>brfs?!?
20:08:23  <thlorenz>yeah it's very odd -- maybe a browserify issue, but I had different problems a long time ago too
20:08:38  <Domenic_>seems like a browserify issue, yeah, if brfs is involved
20:08:45  * Domenic_is not a big brfs fan
20:08:58  <Raynos>thlorenz: sinon :(
20:08:59  <thlorenz>Domenic_: here is the workaround I had to do https://github.com/thlorenz/ses-core/blob/master/utils/test-support.js#L37
20:09:33  <thlorenz>and believe me I tried and my colleague ran into issues last week again
20:09:36  <Domenic_>weird, it's worked fine for me in the past
20:09:43  <Domenic_>i'll try again
20:09:49  <thlorenz>so I tried to see if browserify-shim could fix it, but couldn't get it to work
20:09:50  * slaskisjoined
20:10:14  <thlorenz>Domenic_: that'd be cool, post sample code somewhere if you can make it work plz, would love to have it for future reference
20:10:23  <thlorenz>make sure to use latest browserify
20:11:40  <Domenic_>thlorenz: hmm I am getting an error on if (!this.sinon && commonJSModule) {
20:11:41  * jergasonquit (Quit: jergason)
20:11:56  <thlorenz>:) I guess we all get different errors
20:12:02  <thlorenz>you did npm install it right?
20:12:41  <thlorenz>cause in that case it adds an extra pkg folder which I used in my workaround
20:12:45  <Domenic_>yeah npm install sinon beefy
20:12:51  <Domenic_>require("sinon")
20:13:04  <thlorenz>ah, ok, well good luck would love to see this working
20:16:46  <rowbit>Hourly usage stats: [developer: 76, free: 56]
20:18:19  <Domenic_>wtf published spy.js is different from repo spy.js
20:18:56  <thlorenz>Domenic_: :) that's what I said it packages it up differently including an extra pkg folder
20:19:08  <Domenic_>thlorenz: I don't care about the pkg folder, I care about the lib folder
20:19:12  <jesusabdullah>/!\ ATTENTION /!\ I just got laid off. Any/all job leads appreciated. /!\ ATTENTION /!\
20:19:14  <Domenic_>browserify shouldn't worry about silly pkg folders
20:19:18  <Domenic_>it should use original node source
20:19:31  <thlorenz>Domenic_: yes, whatever the main.js points to
20:19:57  <thlorenz>but that causes problems - just tried to warn you with the pkg, that repo code is not same ;)
20:20:21  <jesusabdullah>Domenic_: you know anyone hiring? ;)
20:20:37  <Domenic_>jesusabdullah: willing to move to nyc? ;)
20:21:06  <jesusabdullah>Domenic_: maybe. I'd have to visit first.
20:21:14  <jesusabdullah>Domenic_: I *do* want to visit
20:21:42  <thlorenz>jesusabdullah: yeah, come visit, while you are here you could visit us (Conde Nast) as well -- always hiring seems like
20:21:49  <jesusabdullah>Word
20:22:00  <jesusabdullah>well, I have severance through the year
20:22:00  <Domenic_>thlorenz: it is a browserify problem
20:22:07  <jesusabdullah>It'd be nice if I could line up some interviews over there
20:22:13  <Domenic_>browserify does not make this === module.exports like node does
20:22:16  <thlorenz>Domenic_: ah, ok - I wasn't entirely sure
20:22:27  <thlorenz>yeah this is the window/global
20:22:38  <Domenic_>or in strict mode, it doesn't exist
20:22:53  <thlorenz>like it needs to be in the browser and since sinon is assuming it's running with node, like I said
20:23:13  <Domenic_>no in the browserify environment it should be `module.exports` like in node
20:23:18  <Domenic_>you should emulate node in that fashion
20:23:19  <thlorenz>so browserify actually does the right thing to adapt to the browser environment ?
20:23:44  <Domenic_>no browserify does the wrong thing
20:23:47  <Domenic_>it does not emulate node correctly
20:24:20  <Domenic_>man the browserify issue tracker is such a clusterfuck, so shameful
20:24:25  <thlorenz>ah, but you know browserify-shim does exactly that, make sure that 'this' is the window, since some of these suckers assume to run on script level ;)
20:25:17  <thlorenz>Domenic_: good find! I wonder how many modules will now break (since they may depend on this being the window)
20:25:33  <Domenic_>hopefully more will just work.
20:25:35  <Domenic_>substack: https://github.com/substack/node-browserify/issues/532
20:25:42  <thlorenz>maybe that's why they changed that? i.e. so you can just require a jquery plugin and it can do this.$ ?
20:26:22  <Domenic_>that doesn't make any sense
20:26:35  <Domenic_>jquery plugins can't be required without browserify shim anyway
20:26:55  <thlorenz>why not? if I have jquery in the page?
20:27:08  <thlorenz>then requiring it will just run it and make it attach itself to $.fn
20:27:19  <thlorenz>that's all I need to happen, no need to export it
20:27:23  <Domenic_>hmm i guess
20:27:38  <thlorenz>I'm just wondering if that may be a reason why they changed it
20:28:21  <Domenic_>i would guess laziness
20:28:25  <Domenic_>i doubt it was changed
20:28:27  <Domenic_>just forgotten
20:30:24  <thlorenz>Domenic_: I'm not that sure - lots of PRs make it into browserify, could be someons fixed something to make his use case work ;)
20:30:42  * dguttmanjoined
20:38:23  * jxsonquit (Remote host closed the connection)
20:39:26  * jxsonjoined
20:39:36  * kevino80quit (Remote host closed the connection)
20:42:55  * mikolalysenkoquit (Ping timeout: 245 seconds)
20:43:17  * sorensen_joined
20:44:21  * jxsonquit (Ping timeout: 272 seconds)
20:44:44  * wolfeidaujoined
20:47:30  * anvakaquit (Ping timeout: 245 seconds)
20:51:14  <ogd>Domenic_: PR should be pretty easy for that eh?
20:55:41  <thlorenz>Domenic_: thanks for taking the time to report this - I'm so swamped with trying to get browserify-shimn v3 out, I didn't take the time :(
20:56:17  <Domenic_>ogd: yeah, just, no PRs at work, and also, that issue tracker is so neglected, i'm discouraged from submitting prs
20:56:58  <rowbit>substack, pkrumins: A developer is waiting in the queue for explorer/11.0
20:59:28  <rowbit>substack, pkrumins: A developer is waiting in the queue for explorer/11.0
20:59:50  <Domenic_>weird there's an *extra closure* in the browser-packed file
20:59:51  * grewebquit (Remote host closed the connection)
21:03:26  * dguttmanquit (Quit: dguttman)
21:05:44  * mikolalysenkojoined
21:08:16  <ogd>Domenic_: you cant send PRs from your job?
21:09:32  <Domenic_>ogd: yes, can't bill open source time to clients
21:09:42  <ogd>Domenic_: also yea semes like browserify needs more maintainers, there were 0 issues and 0 pull reqs when v2 came out
21:10:13  <ogd>Domenic_: ah didnt realize you were doing client work now, i thought you were salaried or whatever
21:16:35  <jesusabdullah>Domenic_: got an email from lab49, thanks
21:16:46  <rowbit>Hourly usage stats: [developer: 5, free: 56]
21:22:21  <mikolalysenko>ogd: it might also be that browserify doesn't have many issues that need fixing...
21:24:04  <mikolalysenko>chrisdickinson: regarding semantic/control flow analysis for javascript, I think this is an idea that has a lot of potential applications
21:24:14  <chrisdickinson>mikolalysenko: yes!
21:24:23  <mikolalysenko>like instrumenting code, doing type inference, and model checking
21:24:41  <chrisdickinson>& dead code elimination
21:24:44  <mikolalysenko>yeah
21:24:57  <mikolalysenko>you could also use it to do stuff like instrument code to make sure that run time is bounded
21:25:10  <chrisdickinson>or being able to selectively run tests based on what code actually changed
21:25:15  <mikolalysenko>ie prevent infinite loops by inserting checks at each loop and function cal
21:25:17  <mikolalysenko>yeah
21:25:26  <mikolalysenko>or also being able to do stuff like valgrind style memory/leak checking
21:25:35  * slaskisquit (Quit: slaskis)
21:25:36  <mikolalysenko>you could track the origin and lifetime of each closure/object
21:26:17  <mikolalysenko>it would also be possible to generate type inference data for better autocompletion in tools
21:26:24  * chrisdickinsonnods
21:26:32  <mikolalysenko>like you could get a list of properties for an object or whatever when you require something
21:27:00  <mikolalysenko>and you could actually do real model checking/semantic analysis instead of the kind of crappy stuff that passes for linting today in the js community
21:27:15  * chrisdickinsonnods
21:27:18  <mikolalysenko>for example, it would be neat to try making a version of BLAST that works on commonjs modules
21:27:35  <mikolalysenko>http://mtc.epfl.ch/software-tools/blast/index-epfl.php
21:27:41  <chrisdickinson>(or allow for better collaboration -- being able to say that user A on branch X is committing changes that will affect your work on branch Y so you should chat about it ahead of merge time)
21:27:53  <mikolalysenko>yeah, lots of possibilities
21:28:08  <mikolalysenko>the key enabling thing though is to get some form of control flow analysis implemented on top of esprima
21:28:24  <mikolalysenko>and the standard approach to this today is to smash the program into static single assignment form
21:28:43  <mikolalysenko>ssa is basically like a control flow graph, except it has the nice property that each variable is assigned to only once
21:29:00  <mikolalysenko>which makes it much easier to represent the state of the program (since it is effectively a functional model of the code)
21:29:08  <mikolalysenko>so you can do type inference, etc. much more easily
21:29:13  <chrisdickinson>i've heard it described as three address codes
21:29:23  <chrisdickinson>but that might actually be a different approach to the problem
21:29:24  <mikolalysenko>that is part of it
21:29:33  <mikolalysenko>actually control flow graphs kind of work like that already
21:29:38  <chrisdickinson>since a 3ac could potentially reassign to existing variables
21:29:44  <mikolalysenko>but the neat thing with ssa is that each variable is assigned only once
21:29:47  * chrisdickinsonnods
21:29:54  <mikolalysenko>so its type/value never changes
21:30:04  <mikolalysenko>which makes it much easier to do static analysis and model checking on it
21:30:17  <mikolalysenko>with regular control flow graphs, variables can get munged around
21:30:28  <mikolalysenko>and it is hard to do stuff like code movement or register allocation
21:30:34  <mikolalysenko>and harder to trace out the state of the code
21:30:49  <mikolalysenko>but they are closely related forms
21:31:13  <mikolalysenko>and having a simplified ssa form for javascript would make all kinds of analysis much easier to do
21:31:50  <mikolalysenko>but the thing with ssa form is that it isn't like there is one ultimate ssa notation for everything, lots of systems use different ssa representations internally
21:32:10  <mikolalysenko>so one of the challenges for javascript is you'd have to cook something up which worked well with the language
21:33:17  <mikolalysenko>I think though you could probably reduce stuff to some small subset of operations, like access property, call function, apply some binary arithmetic
21:33:33  <mikolalysenko>or create closure/object
21:33:44  * jxsonjoined
21:33:55  <mikolalysenko>and I think it should be doable actually
21:34:14  <mikolalysenko>I kind of messed around with this idea in this project: https://github.com/mikolalysenko/specialize
21:34:23  <mikolalysenko>but it isn't a very good example of how to do things imo
21:34:53  <mikolalysenko>basically that was a proof of concept to do inlining automatically in javascript, and it works though it also turns out that it isn't even necessary in chrome anyway
21:36:46  <mikolalysenko>anyway, what are your thoughts?
21:39:23  <mikolalysenko>(sorry, didn't mean to go on rambling like that.)
21:39:33  * DTrejoquit (Remote host closed the connection)
21:40:24  <mikolalysenko>another point too is that afaik, there are no model checkers for js yet: http://en.wikipedia.org/wiki/List_of_model_checking_tools
21:40:35  * jergasonjoined
21:40:35  * jergasonquit (Client Quit)
21:40:38  <mikolalysenko>which is kind of shocking since it is such an important and widely used language
21:41:03  * jergasonjoined
21:41:10  * jergasonquit (Remote host closed the connection)
21:41:29  * jergasonjoined
21:41:45  * jcrugzzjoined
21:47:57  * kevino80joined
21:48:13  <mikolalysenko>also found this thing: http://soft.vub.ac.be/soft/edu/thesis/proposals1314/js_model_checker
21:48:19  <mikolalysenko>but no code/papers yet
21:51:53  <mikolalysenko>there are a few issues though that I can see with analyzing javascript though
21:51:57  * jergason_joined
21:52:11  <mikolalysenko>the first is the "with" statement, since once you throw that in there all bindings for variables become totally dynamic...
21:52:29  <rowbit>substack, pkrumins: Encoders down: 50.57.102.133 (dev-ie7-2)
21:52:30  <mikolalysenko>so I don't really see how to do control flow analysis around one of those...
21:52:43  <mikolalysenko>the second is "eval" which similarly can inject variables into the ambient scope
21:52:59  <mikolalysenko>outside that though, the rest of the stuff should be manageable I think
21:53:03  * jergasonquit (Ping timeout: 245 seconds)
21:53:03  * jergason_changed nick to jergason
21:53:15  <mikolalysenko>at least as far as control flow analysis is concerned
21:58:35  * dguttmanjoined
22:01:38  <mikolalysenko>oh, the other tricky one is the try{...} catch{...} block, since control flow would be really non-local
22:02:21  <mikolalysenko>but I think it is probably more manageable than "with"
22:02:43  * dguttmanquit (Client Quit)
22:03:46  * dguttmanjoined
22:04:24  * wolfeidauquit (Remote host closed the connection)
22:08:45  <chrisdickinson>ah, sorry, had to go to a meeting really quick
22:08:46  * chrisdickinsonreads
22:09:18  * jcrugzzquit (Ping timeout: 245 seconds)
22:09:54  <chrisdickinson>yeah, `with` and `direct eval` would make analyzing the code nearly impossible
22:11:10  <mikolalysenko>chrisdickinson: also the paper you might want to read is this - http://citeseer.ist.psu.edu/viewdoc/summary?doi=10.1.1.3.6773
22:11:38  <chrisdickinson>ooo
22:12:01  <mikolalysenko>I think it has a pretty good interpretation of what ssa is really about
22:12:17  * Maciek416_joined
22:12:24  <mikolalysenko>basically it is a representation of the program as a collection of functions which are connected via continuation passing style
22:13:30  * chrisdickinsonnods
22:13:41  <mikolalysenko>anyway, as a roadmap for how to implement all of this stuff, I think one way to do it would be to develop an ssa compiler alongside a simple interpreter
22:13:58  * jcrugzzjoined
22:14:03  <mikolalysenko>so you could check the correctness of the implementation by comparing it directly to the native javascript
22:14:37  <mikolalysenko>the goal would be to make an ssa form that had as few special cases/constructs as possible so the interpreter could be very small
22:15:02  * dguttmanquit (Quit: dguttman)
22:15:34  <jesusabdullah>uuuuuugh
22:15:41  <jesusabdullah>Why am I so stresssssed by this
22:16:45  <rowbit>Hourly usage stats: [developer: 90, free: 19]
22:17:52  <mikolalysenko>chrisdickinson: this paper is also kind of helpful http://grothoff.org/christian/teaching/2007/3353/papers/ssa.pdf
22:19:21  <mikolalysenko>and this one: http://www.cs.indiana.edu/~achauhan/Teaching/B629/2006-Fall/CourseMaterial/1998-notices-appel-ssa_fnprog.pdf
22:19:28  <rowbit>substack, pkrumins: A developer is waiting in the queue for explorer/11.0
22:19:59  * chrisdickinsonbookmarks all
22:21:28  <rowbit>substack, pkrumins: A developer is waiting in the queue for explorer/11.0
22:21:43  <chrisdickinson>i've basically only encountered the concept via the superancient green dragon book, and reading about optimizers on andy wingo's blog
22:21:55  * tilgovijoined
22:21:56  <chrisdickinson>http://upload.wikimedia.org/wikipedia/en/b/bb/Green_Dragon_Book_(front).jpg (was in powells one day and it was for sale for cheap, so had to pick it up)
22:22:08  <mikolalysenko>chrisdickinson: yeah, it is a pretty well known and classic idea
22:22:23  <mikolalysenko>almost every compiler/interpreter today uses it internally
22:22:28  <rowbit>substack, pkrumins: A developer is waiting in the queue for explorer/11.0
22:23:00  <mikolalysenko>the functional intepretation though is due to appell who also popularized the idea
22:23:17  <jesusabdullah>fuuuck I forgot how stressful job hunting issss
22:23:19  <mikolalysenko>as one way to think about ssa form is that it is kind of like a functionalized version of an imperative program
22:23:26  <jesusabdullah>>_< >_< >_<
22:24:14  <jesusabdullah>*sigh* I'm gonna be a wreck all day :(
22:24:41  * DTrejojoined
22:24:41  * Maciek416quit (Remote host closed the connection)
22:24:49  * Maciek416_changed nick to Maciek416
22:25:03  * jcrugzzquit (Ping timeout: 272 seconds)
22:25:07  * Maciek416_joined
22:26:11  <mikolalysenko>chrisdickinson: oh! one last paper http://www.cs.rice.edu/~keith/EMBED/dom.pdf
22:26:18  <chrisdickinson>:D
22:27:48  * yorickquit (Quit: quit.)
22:27:49  <mikolalysenko>another thing to think about too is that it would be good to maintain the correspondence between the ssa representation and the esprima graph
22:28:10  * kevino80quit (Remote host closed the connection)
22:28:14  <mikolalysenko>especially for analysis and update operations
22:28:39  <mikolalysenko>for example, you might not necessarily want to rewrite an entire program if you are only modifying a few operations to perform instrumentation
22:28:59  <rowbit>substack, pkrumins: A developer is waiting in the queue for explorer/11.0
22:29:05  <chrisdickinson>yes!
22:29:26  * Maciek416_quit (Ping timeout: 240 seconds)
22:29:27  <chrisdickinson>mikolalysenko: i definitely want to persist links back from SSA operations to the AST that generated them
22:29:41  <mikolalysenko>yeah
22:29:57  <chrisdickinson>ideally you should be able to be able to ask (using cssauron) for an ast node, and then ask that node (via the SSA graph) what other AST nodes it depends on
22:30:50  <mikolalysenko>or use the ssa form to do type inference, and then go back to the place some variable/method was defined in the code
22:30:56  <chrisdickinson>a good demo being to query for a given identifier in the middle of a function, and then use the SSA to synthesize a function that returns the value of that identifier at that point in the program
22:30:57  <mikolalysenko>for tooling/interactive code searching
22:31:13  <mikolalysenko>yeah! that would be awesome
22:31:45  <mikolalysenko>another crazier idea: use ssa form to automatically make data structures persistent via the dpll algorithm
22:31:59  <rowbit>substack, pkrumins: A developer is waiting in the queue for explorer/11.0
22:32:36  <chrisdickinson>iiiinteresting
22:32:43  <chrisdickinson>i haven't heard of the dpll algorithm
22:32:50  <jesusabdullah>chrisdickinson: who do you work for again?
22:32:59  <chrisdickinson>jesusabdullah: urban airship in portland or
22:33:20  <jesusabdullah>I don't remember what UA does
22:33:33  <jesusabdullah>but to be up-front: Are you hiring? :v :v
22:33:37  <jesusabdullah>Cause YOU seem cool
22:33:41  <chrisdickinson>haha :)
22:33:44  <jesusabdullah>maybe UA is too
22:34:00  <chrisdickinson>yep, we're hiring for a JS dev, actually!
22:34:28  <chrisdickinson>(and also shucks!)
22:34:50  <mikolalysenko>chrisdickinson: here is the link on the dpll method btw http://courses.csail.mit.edu/6.851/spring12/lectures/L01.html
22:35:13  <mikolalysenko>basically it lets you implement functional/persistent data structures in optimal O(1) space/time complexity
22:35:23  <jesusabdullah>shit data structures
22:35:30  <jesusabdullah>Totally fucked when it comes to data structures.
22:35:34  <mikolalysenko>here is the pdf: http://www.cs.cmu.edu/~sleator/papers/making-data-structures-persistent.pdf
22:35:36  <jesusabdullah>chrisdickinson: go on
22:35:59  <mikolalysenko>err dsst, not dpll
22:36:10  <mikolalysenko>the dpll is for constraint satisfication, not persistence...
22:36:12  <mikolalysenko>(d'oh)
22:36:29  <chrisdickinson>jesusabdullah: we do analytics and push notifications for mobile devices
22:37:07  <chrisdickinson>with an emphasis on building a friendly interface for non-technical users to send, schedule, and track results of notifications
22:37:22  * defunctzombie_zzchanged nick to defunctzombie
22:37:25  <jesusabdullah>mikolalysenko: oh, of course, right how could I have forgotten
22:37:28  <jesusabdullah>defunctzombie: where do YOU work?
22:37:38  <jesusabdullah>chrisdickinson: that sounds kinda neat, what's the backend like?
22:37:41  <defunctzombie>jesusabdullah: courseoff.com
22:37:45  <defunctzombie>jesusabdullah: that is my baby
22:37:54  <chrisdickinson>python/django; a lot of the heavy-lifting services are in java
22:37:59  <jesusabdullah>defunctzombie: I see! I'll look more closely
22:38:07  <jesusabdullah>chrisdickinson: ah, so js is on the front, I see
22:38:10  <chrisdickinson>yep
22:38:20  <jesusabdullah>chrisdickinson: how do you do your front-end apps then?
22:38:26  <chrisdickinson>frontend is modular JS -- we use require.js at the moment but are switching to browserify
22:38:29  <rowbit>substack, pkrumins: A developer is waiting in the queue for explorer/11.0
22:38:31  <chrisdickinson>no framework at the moment
22:38:31  <jesusabdullah>oh, neat
22:38:35  * kevinswiberquit (Remote host closed the connection)
22:38:36  <chrisdickinson>lots of streams :)
22:38:41  <jesusabdullah>fun :D
22:38:45  <chrisdickinson>we use dominictarr's `through` a lot :)
22:39:00  <jesusabdullah>yeah, I did too before the whole confusing streams2 thing
22:39:11  <chrisdickinson>basically we do a kind of degenerate FRP on the frontend using streams
22:39:56  <pkrumins>foucist: it's about how many people use browserling hourly
22:40:17  <jesusabdullah>degenerate? haha
22:40:36  <jesusabdullah>That reminds me, I was thinking scuttlebutts on the browser are probably pretty sweet
22:41:13  <chrisdickinson>here's a talk i gave about our JS setup: https://speakerdeck.com/chrisdickinson/js-at-urban-airship
22:41:15  <chrisdickinson>ooo yeah
22:41:25  <chrisdickinson>we have application state streams
22:41:49  <chrisdickinson>which are currently backed by "just objects", but you could back 'em with scuttlebutts instead
22:42:13  <chrisdickinson>(basically aggregating last known state of a bunch of child streams into a single "state" object which is then consumed by validators or renderers)
22:42:47  <jesusabdullah>word
22:42:54  <jesusabdullah>I've always wanted to do front-end that way
22:42:58  <jesusabdullah>never had a chance to
22:46:15  * thlorenzquit (Remote host closed the connection)
22:47:06  * wolfeidaujoined
22:47:33  * mikolalysenkoquit (Ping timeout: 248 seconds)
22:50:06  * dguttmanjoined
22:51:26  * defunctzombiechanged nick to defunctzombie_zz
22:54:41  * anvakajoined
22:56:14  <Raynos>chrisdickinson: do you use browserify in production yet?
22:56:53  <chrisdickinson>~ish, our CI is now rejiggered to transform all of our code to commonjs format before browserifying, and we have a feature flipper in place so you can switch a user between requirejs and browserify mode
22:58:06  * chrisdickinsonbrbs
23:00:47  <jesusabdullah>does anyone have luke's email?
23:02:42  <jesusabdullah>chrisdickinson: holy shit this is really well-organized
23:02:52  <jesusabdullah>chrisdickinson: and you were able to evolve a shitty monolithic codebase piecemeal?
23:03:01  <jesusabdullah>chrisdickinson: that's nuts, color me impressed
23:03:01  * yorick_joined
23:03:05  * mikolalysenkojoined
23:07:51  <grncdr>I swear I've found it before, but not my searches are turning up nothing
23:08:06  <grncdr>is there a *simple* header parser out there that isn't a connect middleware?
23:08:32  <grncdr>I just want to feed an "Accept" header into a function and get an array of accepted content types back
23:10:40  * juliangruberquit (Quit: ZNC - http://znc.in)
23:11:24  * yorick_changed nick to yorick
23:11:28  * tmcwquit (Remote host closed the connection)
23:11:48  <Raynos>grncrd: negotiator
23:12:14  <Raynos>grncdr: https://github.com/Raynos/media-types/blob/master/index.js#L18
23:13:00  * tmcwjoined
23:13:25  <jesusabdullah>why are you parsing headers if you're using connect?
23:13:39  <jesusabdullah>parsing headers happens in core http no?
23:13:54  <grncdr>I'm not using connect
23:14:13  <grncdr>hence my annoyance with "connect middleware" being a thing for what should be a simple function
23:14:42  <grncdr>also, thanks Raynos, I had seen Negotiator but I missed the part where you don't have to tell it the available types :)
23:14:51  * tmcwquit (Remote host closed the connection)
23:15:15  <jesusabdullah>but why would you be needing to parse headers *anyway*?
23:15:23  <jesusabdullah>if you use core http you should have them
23:15:28  <jesusabdullah>req.headers no?
23:15:34  <grncdr>you only get a string for each header though
23:15:45  <grncdr>and accept headers (and some others) are complex little languages of their own
23:16:03  <jesusabdullah>oh, yeah
23:16:08  <jesusabdullah>and those are all middlewares?
23:16:16  <grncdr>not negotiator thankfully
23:16:16  <jesusabdullah>seems like a silly thing to put that much ceremony into
23:16:20  <jesusabdullah>well that's good
23:16:28  <grncdr>yeah the first couple I looked at were
23:16:41  <jesusabdullah>weird
23:16:46  <rowbit>Hourly usage stats: [developer: 16, free: 38]
23:16:51  <grncdr>and I even poked at their source to see if they exported their parsing functions without the middleware and they didn't
23:16:55  <grncdr>double :(
23:17:25  <grncdr>anyways I'm happy now :)
23:17:31  <Raynos>grncdr: I'm sure you'll love https://github.com/Raynos/http-framework
23:18:10  <Raynos>I have a nice demo https://github.com/Raynos/http-framework/blob/master/examples/content-negotiation/server.js
23:18:28  <grncdr>ah that's very nice
23:19:01  <daleharvey>is there any way to easily run local binaries in npm run instead of "./node_modules/jshint/bin/jshint somestuff.js" inside package.json
23:19:20  <grncdr>daleharvey: https://github.com/grncdr/npm-exec
23:19:26  <grncdr>but it might be kind of broken right now
23:19:30  <grncdr>(sorry)
23:19:40  <grncdr>also there is another PR against npm that does it
23:19:55  <ogd>daleharvey: you can just put 'jshint somestuff.js' in package.json
23:20:17  <ogd>daleharvey: you just cant type 'npm run 'jshint somestuff.js'' orwhategver
23:20:19  <grncdr>depending on your needs, export PATH=./node_modules/.bin:$PATH will probably work as well
23:20:35  <Raynos>daleharvey: `PATH = $PATH:./node_modules/.bin`
23:20:37  <ogd>daleharvey: but you dont need to do ./node_modules/jshint/bin/jshint if its in a script entry in package.json already
23:20:49  <Raynos>daleharvey: you can also do `./node_modules/.bin/jshint`
23:21:12  <grncdr>so
23:21:15  * dguttmanquit (Quit: dguttman)
23:21:18  <grncdr>lot's of options ;)
23:21:20  <ogd>if scripts.start is "jshint somestuff.js" then "npm start" will work properly without needing jshint to be in $PATH
23:21:42  <grncdr>that's a really weird use of "npm start"...
23:21:48  <Raynos>npm will put ./node_modules/.bin in PATH for you for all the scripts when using `npm run`
23:21:59  <ogd>grncdr: yea i was using it as an example,
23:22:05  <daleharvey>yeh actually this just works ("jshint": "jshint src/pouch.js")
23:22:06  <daleharvey>cheers
23:22:11  <grncdr>also `npm run` doesn't accept extra args which really limits it's usefulness
23:22:14  <grncdr>daleharvey: yes
23:22:21  <grncdr>that will work wonderfully ;)
23:22:31  <ogd>grncdr: you just put stuff in your package.json instead of puttig it in via CLI arguments
23:22:46  <grncdr>ogd: yeah, I'm just saying that limits the usefulness
23:22:51  <daleharvey>ogd: not really the same thing
23:22:59  <grncdr>e.g. if a second source file is added, you have to go back and edit package.json
23:23:00  * maksimlinjoined
23:23:29  <grncdr>gah, I should really be working on my npm-exec/bashful stuff...
23:23:50  <grncdr>daleharvey: are you de-grunting pouchdb?
23:24:13  <daleharvey>likely
23:24:32  * joliss_joined
23:24:35  * jolissquit (Ping timeout: 272 seconds)
23:24:35  * joliss_changed nick to joliss
23:30:24  * dguttmanjoined
23:35:05  * tmcwjoined
23:40:54  * timoxleyquit (Remote host closed the connection)
23:42:43  * calvinfoquit (Quit: Leaving.)
23:47:35  * thlorenzjoined
23:49:35  * st_lukejoined
23:51:18  <Raynos>Does anyone know a cleaner way to do file downloads from a HTTP server ? ( https://github.com/Raynos/http-framework/blob/master/examples/downloads/server.js )
23:52:32  * timoxleyjoined
23:53:14  <ogd>Raynos: whats the diff btw routes and routes-router
23:53:53  <Raynos>ogd: routes-router returns a function(req, res) { router.match(...).fn(req, res) } ( https://github.com/Raynos/routes-router/blob/master/index.js#L55 )
23:54:12  <ogd>Raynos: ahhh
23:54:12  <Raynos>with routes you have to manually call .match(req.url) and manually call the fn and handle 404 manually and bla bla
23:54:36  <Raynos>also does domains by default if opt in and is a central place to configure a 404 & 500 handler
23:55:55  * thlorenzquit (Ping timeout: 252 seconds)
23:56:01  <Raynos>so the problem with the downloads example is I think I want to push the content-disposition header into mikeal's filed
23:56:07  <Raynos>and have him deal with the dance :D
23:56:29  <ogd>Raynos: i think filed has a hardcoded list of content types?
23:56:46  <Raynos>it does mime lookup on the extension
23:56:54  <Raynos>but filed doesnt set the content-disposition header
23:57:13  <Raynos>the problem is you cant server a content-disposition header & a 404 at the same time. so filed's 404 handler needs to remove the content-disposition header
23:57:39  <ogd>ah
23:57:53  <Raynos>i might just add that on its own
23:58:32  <ogd>Raynos: seems like that whole /files/* callback should be a module called serve-files or something
23:58:46  <Raynos>thats probably a lot easier
23:58:46  <ogd>Raynos: p.s. i am really liking http-framework so far
23:58:57  <Raynos>oh wait