PourOver: A library for simple, fast filtering and sorting in the browser
nytimes.github.io
nytimes.github.io
http://www.nytimes.com/interactive/2014/02/02/fashion/red-ca...
I opened the dev tools to inspect the traffic and code, and this pops up in the console:
0000000 000 0000000
111111111 11111111100 000 111111111
00000 111111111111111111 00000 000000
000 1111111111111111111111111100000 000
000 1111 1111111111111111100 000
000 11 0 1111111100 000
000 1 00 1 000
000 00 00 1 000
000 000 00000 1 000
00000 0000 00000000 1 00000
11111 000 00 000000 000 11111
00000 0000 000000 00000 00000
000 10000 000000 000 0000
000 00000 000000 1 000
000 000000 10000 1 0 000
000 1000000 00 1 00 000
000 1111111 1 0000 000
000 1111111100 000000 000
0000 111111111111111110000000 0000
111111111 111111111111100000 111111111
0000000 00000000 0000000
NYTimes.com: All the code that's fit to printf()
We're hiring: http://nytimes.com/careers
....You sneaky audience-targeting bastardsThis gave me a chuckle. I was at a hackathon that the NYTimes sponsored a few years ago, and my group used almost this exact joke for our project, an ncurses reader for browsing the New York Times in the terminal[0].
I don't know who thought to put this in the source code, but I'd find it very amusing if they got the inspiration from hidden slogan from a hackathon project. Kind of like the old competitions in the 50s/60s to create company jingles.
If you must know, I was in the console while developing a tiny userscript to add a link to images to open the superJumbo version of the image in a new tab.
http://gojs.net/temp/pourover.html
It just takes the queries and uses the resulting data to make some nodes in GoJS (Disclaimer: a Diagramming library I develop. Not free, but easy to set up with this kind of data and see stuff fast).
If I had more time I'd make it prettier. The results are just visual representations of the data results getting filtered. Its very easy to take PourOver's example collections and data-bind some stuff to them (color of the nodes is data-bound to monster gender, etc). I'm sure it can't be hard to do the same in other data-bound visualization libraries.
This is very cool. I'll try to make a much prettier example tonight.
A lot of folks are asking for a demo and, you're right. I should have included one. My apologies. I'll get to working on one as soon as I can.
In the meantime, I encourage readers to check out the source for http://www.nytimes.com/interactive/2014/02/02/fashion/red-ca... That's probably the clearest "demo" of PourOver at the moment.
More to come!
I didn't see any contact info on your profile to let you know that the proportion of folks here using Ghostery² or Disconnect³ is probably higher than normal. Installing one will reveal how things break when JavaScript libraries [usually orthogonal to page functionality] are blocked.
--
Would you ever add some of the Crossfilter functionality, to make it easy for people to plug in their own data to PourOver?
Given both library's emphasis on speed, it looks like I have something to benchmark against!
In Ember that might look like this:
Ember.ArrayController.extend({
filterA: Ember.computed.filter('fieldName1', function comparator() {}),
filterB: Ember.computed.filter('fieldName2', function comparator() {}),
joined: Ember.computed.union('filterA', 'filterB'),
filtered: Ember.computed.uniq('joined'),
sorted: Ember.computed.sort(function comparator() {})
});If I wanted to add "roman" mythology to that filter I would imagine something like:
var mythologies = ["greek", "norse"];
// ... create a collection with filters
mythologies.push("roman");
PourOver.makeExactFilter("mythology", mythologies);
But you don't get that last statement for free, nor the one where you join it into a collection, nor do I see a way to replace the previous mythologies filter. Any time you need to reprocess a filter you've got to run it through a series of imperative actions triggered from one of the events, and possibly throw away the collection and regenerate it (if you can't remove disjoint filters).I would be pushing for a Object.observe/dirty checking/get-set version of this to take PourOver to the next level of utility. (?/Angular/Ember)
There are a few links to projects at the nyt that has used these two libraries.
Does anyone know of any JS libraries that allow for Excel-like interaction? However I am looking for something that just implements the presentation layer.
The problem I am running into is that the libraries that do exist conflate the presentation and data layers and try to do everything for you. In other words, they make the assumption that all data will be downloaded to the client and then manipulated on the client. These libraries do not fit my use case.
Also "Pagination strategies with PouchDB" http://pouchdb.com/2014/04/14/pagination-strategies-with-pou...
[0]: https://directory.app.net/app/255/pourover/ [1]: https://alpha.app.net/nytopinion
[0] - http://openrefine.org/
This might be a bit embarrassing ... but a couple of years ago, Dan Sinker came by and asked a few of the developers in the newsroom to talk about exactly that question.
Here's me: https://www.youtube.com/watch?v=k3HanxEFFlk
Here's David Nolen (although he won't be around for much longer ;) https://www.youtube.com/watch?v=qOdoCqoqXlU
Here's Tiff Fehr: https://www.youtube.com/watch?v=8GOWLNWifxc